Port yönlendirme için kısıtlı bir SSH kullanıcısı nasıl oluşturulur?


106

ændrük , başkasıyla kolay bir SSH bağlantısı kurmak için ters bağlantı önerdi (uzaktan yardım için). Bunun çalışması için, bağlantıyı kabul etmek için ek bir kullanıcı gerekir. Bu kullanıcının bağlantı noktasını sunucu üzerinden iletebilmesi gerekir (sunucu vekil olarak davranır).

Yukarıda açıklanandan daha fazlasını hiçbir şey yapamayan sınırlı bir kullanıcıyı nasıl oluşturabilirim?

Yeni kullanıcı şunları yapmamalıdır :

  • kabuk komutlarını yürütün
  • dosyalara erişmek veya sunucuya dosya yüklemek
  • sunucuyu proxy olarak kullan (ör. web proxy)
  • Bir güvenlik duvarı nedeniyle başka türlü halka açık olmayan yerel hizmetlere erişin
  • sunucuyu öldür

Özetle, yalnızca SSH sunucusuna ayrıcalık olmadan bağlayabilen sınırlı bir SSH kullanıcısı nasıl oluşturabilirim, böylece bu bağlantıyı bilgisayarına bağlayabilirim?


Yanıtlar:


166

TL; DR - "Kısıtlamaları uygulama" cevabının en altına gidin

Kısıtlı kullanıcı ekleme iki bölümden oluşur: 1. Kullanıcı oluşturma 2. SSH arka planını yapılandırma (sshd)

Sshd'yi yapılandırma

SSH'nin olanaklarını bilmenin en iyi yeri ilgili kılavuz sayfalarını okumaktır:

SSH istemcisi nerede işlem yapabilir?

Bir şeyi kısıtlamadan önce, SSH'nin özelliklerini bilmeniz gerekir. Manuel sayfalara göz atma sonucu:

  • Shell komutları yürütme
  • Sftp üzerinden dosya yükleme
  • Liman yönlendirme
    • İstemci sunucuya bir (un) kullanılmış bağlantı noktası iletir
    • Sunucu, bağlantı noktasını istemciye iletir.
    • Sunucu, istemciye başka bir ana bilgisayarın bağlantı noktasını iletir (proxy-ish)
  • X11 yönlendirme (ekran yönlendirme)
  • Kimlik doğrulama aracısı iletme
  • Bir tünel cihazının iletilmesi

Gönderen Kimlik bölümünde sshd (8) manuel sayfa :

Müşteri başarıyla kimliğini doğrularsa, oturumu hazırlamak için bir iletişim kutusu girilir. Şu anda müşteri, takma ad ayırma, X11 bağlantılarını iletme, TCP bağlantılarını iletme veya kimlik doğrulama aracısı bağlantısını güvenli kanal üzerinden iletme gibi şeyler talep edebilir .

Bundan sonra müşteri ya bir kabuk ister ya da bir komutun yürütülmesini ister . İki taraf daha sonra oturum moduna girer. Bu modda, her iki taraf da herhangi bir zamanda veri gönderebilir ve bu veriler sunucu tarafındaki kabuk veya komuttan ve istemci tarafındaki kullanıcı terminalinden iletilir.

SSH özelliklerini kısıtlama seçenekleri

Davranış değiştiren dosyalar ve seçenekleri şunlardır:

  • ~/.ssh/authorized_keys - bağlanmasına izin verilen ve seçenek verilebilecek anahtarları içerir:
    • command="command"- Kullanıcı tarafından verilen komut (varsa) dikkate alınmaz. İstemcinin, açıkça yasaklanmadıkça, TCP ve / veya X11 iletme belirtebileceğini unutmayın . Bu seçeneğin kabuk, komut veya alt sistem yürütme için geçerli olduğunu unutmayın.
    • no-agent-forwarding - Bu anahtar kimlik doğrulama için kullanıldığında kimlik doğrulama aracısının iletilmesini yasaklar.
    • no-port-forwarding - Bu anahtar kimlik doğrulama için kullanıldığında, TCP iletmeyi yasaklar
    • no-X11-forwarding - "Bu anahtar kimlik doğrulaması için kullanıldığında X11 yönlendirmesini yasaklar."
    • permitopen="host:port" - Yerel 'ssh -L' bağlantı noktasını yalnızca belirtilen ana bilgisayara ve bağlantı noktasına bağlanabilecek şekilde sınırlayın.
  • ~/.ssh/environment- Bu dosya giriş sırasında ortama okunur (varsa). Ortam işleme varsayılan olarak devre dışıdır ve PermitUserEnvironment seçeneği ile kontrol edilir
  • ~/.ssh/rc - Kullanıcının giriş dizini erişilebilir olmadan çalıştırılacak başlatma rutinlerini içerir.
  • /etc/ssh/sshd_config - sistem genelinde yapılandırma dosyası
    • AllowAgentForwarding - ssh-agent (1) iletiminin izin verilip verilmeyeceğini belirtir.
    • AllowTcpForwarding
    • ForceCommand - "ForceCommand tarafından belirtilen komutun yürütülmesini zorlar, müşteri tarafından sağlanan herhangi bir komutu yok sayar ve varsa ~ / .ssh / rc komutunu çalıştırır. Komut, kullanıcının oturum açma kabuğunu -c seçeneği ile başlatır."
    • GatewayPorts - "Uzak ana makinelerin istemci için iletilen bağlantı noktalarına bağlanmasına izin verilip verilmeyeceğini belirtir. Varsayılan olarak, sshd (8) uzak bağlantı noktası iletimlerini geridöngü adrese bağlar. Bu, diğer uzak ana makinelerin yönlendirilmiş bağlantı noktalarına bağlanmasını önler. GatewayPorts, belirtmek için kullanılabilir sshd, uzak bağlantı noktalarının geridöngü olmayan adreslere bağlanmasına, böylece diğer ana bilgisayarların bağlanmasına izin vermelidir. "
    • PermitOpen:

      TCP port iletmeye izin verilen varış yerlerini belirtir. Yönlendirme şartnamesi aşağıdaki formlardan biri olmalıdır:

      PermitOpen host:port
      PermitOpen IPv4_addr:port
      PermitOpen [IPv6_addr]:port
      

      Çoklu boşluklar, boşluklarla ayrılarak belirlenebilir. 'Any' argümanı, tüm kısıtlamaları kaldırmak ve herhangi bir yönlendirme isteğine izin vermek için kullanılabilir. Varsayılan olarak tüm bağlantı noktası yönlendirme isteklerine izin verilir.

    • PermitTunnel- Tun (4) cihazının yönlendirilmesine izin verilip verilmeyeceğini belirtir. Varsayılan 'hayır'
    • X11Forwarding- X11 yönlendirmesine izin verilip verilmeyeceğini belirtir. Varsayılan 'hayır'

Kısıtlamaları uygulamak

Sistem genelinde yapılandırma dosyasının değiştirilmesi, /etc/ssh/sshd_configparola tabanlı kimlik doğrulaması uygulandığında veya kısıtlamaların ~/.ssh/authorized_keysyanlışlıkla kaldırılması durumunda bile yapılandırmanın uygulanmasına izin verir . Genel varsayılanları değiştirdiyseniz, seçeneklere uygun şekilde yorum yazmalısınız.

Match User limited-user
   #AllowTcpForwarding yes
   #X11Forwarding no
   #PermitTunnel no
   #GatewayPorts no
   AllowAgentForwarding no
   PermitOpen localhost:62222
   ForceCommand echo 'This account can only be used for [reason]'

Şimdi bir kullanıcı ekle:

sudo useradd -m limited-user

ForceCommandKabuk bir şey yapmaz gibi /bin/false(veya /bin/true) gibi bir kabuğa benzemezse seçenek atlanabilir /bin/false -c [command].

Artık istemci, sunucunun geridöngü adresindeki 62222 numaralı bağlantı noktasına SSH üzerinden bağlanabilir (genel IP adresini dinlemez)

Devre dışı bırakılması AllowTcpForwardingda kullanımına izin vermeyecek ve -Rböylelikle tek bir bağlantı noktasını iletmek için böyle kısıtlı bir hesabın kullanılmasını engelleyecektir. PermitOpen localhost:62222İstemci mutlu bir şekilde bağlanabildiği ve dinleyebildiği için sunucudaki 62222 numaralı bağlantı noktasının hiçbir zaman kullanılmadığını varsayar.

Sistem genelinde yapılandırma ve devre dışı parola tabanlı kimlik doğrulamasında TCP iletme işlemine izin verilirse, tuş başına ayarları da kullanabilirsiniz. Düzenleyin ~/.ssh/authorized_keysve önce gelecek seçenekleri eklemek ssh-(seçenekler ve arasında bir boşluk ssh-):

command="echo 'This account can only be used for [reason]'",no-agent-forwarding,no-X11-forwarding,permitopen="localhost:62222"

Doğrulamak

Beklendiği gibi çalıştığından emin olmak için bazı test durumlarının çalıştırılması gerekir. Aşağıdaki komutlarda, hostayarlanmadıysa, gerçek girişle değiştirilmelidir ~/.ssh/config. Komutun arkasında, istemcide veya sunucuda (belirtildiği gibi) yürütülmesi gereken bir komut gösterilir.

# connection closed:
ssh host
# connection closed (/bin/date is not executed):
ssh host /bin/date
# administratively prohibited (2x):
ssh host -N -D 62222 # client: curl -I --socks5 localhost:62222 example.com
ssh host -N -L 8080:example.com:80 # client: curl -I localhost:8080
sftp host
# should be possible because the client should forward his SSH server
ssh host -N -R 8080:example.com:80 # server: curl -I localhost:8080
# This works, it forwards the client SSH to the server
ssh host -N -R 62222:localhost:22
# unfortunately, the client can listen on that port too. Not a big issue
ssh host -N -L 1234:localhost:62222

Sonuç

Kontrol Listesi: SSH kullanıcısı şunları yapamaz:

  • kabuk komutlarını çalıştır - bitti
  • dosyalara erişmek veya sunucuya dosya yüklemek - yapılan
  • Sunucuyu proxy olarak kullan (ör. web proxy) - bitti
  • Güvenlik duvarı nedeniyle başka bir yerde halka açık olmayan yerel hizmetlere erişme - kısmen , istemci 62222 dışındaki bağlantı noktalarına erişemez, ancak sunucudaki 62222 bağlantı noktasını dinleyebilir ve bağlanabilir.
  • Sunucuyu öldür - bitti (bu kontrollerin SSH sunucusuyla sınırlı olduğunu unutmayın. Makinede savunmasız başka bir hizmetiniz varsa, olası bir saldırganın komut çalıştırmasına, sunucuyu öldürmesine vb. izin verebilir)

3
Bunun çalışması için, eklenen hesabın useraddkilidi açılmalıdır. Bu, şifreyi /etc/shadowbir yıldız işareti ( *) ile değiştirerek veya kullanarak bir şifre belirleyerek yapılabilir sudo passwd limited-user.
Lekensteyn

2
SFTP çalışır, çünkü SSH sunucusu sftp-serverkomutu çalıştırır . İle ForceCommand, bu komut artık yürütülmeyecek.
Lekensteyn

2
Ayrıca from=seçenek de faydalıdır authorized_keys. Anahtarın kullanımını, belirli bir IP adresi veya ana bilgisayar adı olan kaynaklarla sınırlandırmanıza olanak tanır. Örnek, from="1.1.1.1"ya da from="10.0.0.?,*.example.com". Tüm yetkili_bilgiler seçenekleri için kılavuzdaki "AUTHORIZED_KEYS DOSYA FORMATI" bölümüne bakın ( linux.die.net/man/8/sshd ).
Donn Lee,

2
"AllowTcpForwarding local" uzaktan iletmeyi yasaklar. (Bu cevap yazıldığında var olup olmadığını bilmiyorum.)
Simon Sapin

1
Bunun kalıcı ssh bağlantıları tarafından kırıldığını, bu nedenle bağlanırken dosyanızda olduğu gibi bir şeyin olmamasını Host * ControlMaster autounutmayın . İhtiyacınız olursa kullanın~/.ssh/configssh -Nssh -N -o ControlMaster=no
nh2

3

Bunun için birçok çözüm olduğuna ve önerdiğimden çok daha sağlam olduğuna eminim. Ancak, bu ihtiyaçlarınız için yeterli olabilir. Bunu yapmak için, kullanıcının ssh anahtarına dayalı kimlik doğrulaması yapabildiğini farz ediyorum (macun veya herhangi bir unix ssh bunu desteklemelidir).

  • Normalde yaptığınız gibi bir kullanıcı ekleyin ('adduser' veya başka bir araç)

  • .Ssh dir ve .ssh / yetkili_keys kullanıcılarını yaratın

your_user $ sudo -Hu ssh_forwarder /bin/bash

ssh_forwarder $ cd ~
ssh_forwarder $ mkdir .ssh
ssh_forwarder $ ( umask 066 && cat > .ssh/authorized_keys ) <<EOF
no-agent-forwarding,no-X11-forwarding,command="read a; exit" ssh-rsa AAAB3NzaC1y....2cD/VN3NtHw== smoser@brickies
EOF
  • Bu hesaba şifre erişimini devre dışı bırak.
your_user $ sudo usermod --lock ssh_forwarder

Şimdi, kullanıcının sisteminize girmesinin tek yolu uygun ssh anahtarına erişmektir ve ssh, neyi çalıştırmaya çalışırlarsa yapsın, onlar için "/ bin / bash -c" oku "yazacaktır. 'oku' sadece yeni bir satıra kadar okuyacak ve sonra kabuk çıkacak, böylece kullanıcının bağlantıyı kesmek için 'enter' tuşuna basması gerekiyor.

'Command =' içinde yapabileceğiniz birçok şey var. Daha man authorized_keysfazla bilgi için 'komut' bölümüne bakın ve arayın.

Enter tuşuna basmanın bağlantıyı öldürmesini istemiyorsanız, 'command =' girişi için aşağıdaki gibi bir şey kullanabilirsiniz:

command="f=./.fifo.$$ && mkfifo $f && trap \"rm -f $f\" EXIT && read a <$f && echo $a; exit;"

Bu sadece kullanıcıların giriş dizininde geçici bir ikilik yaratır ve ondan okumaya çalışır. Bu dosyaya hiçbir şey yazmayacak, bu yüzden bu süresiz olarak askıda kalacak. Ayrıca, bu bağlantıyı zorla sonlandırmak istiyorsanız, aşağıdaki gibi bir şey yapabilirsiniz:

 your_user$ echo GOODBYE | sudo tee ~ssh_forwarder/.fifo.*

Bu çok az kaynak kullanmalı ve bu betiğin içinde kabuğun sonlandırılmasıyla bitmeyecek hiçbir şey yanlış gidememelidir.

sleep 1h; echo You have been here too long. Good bye.

Kullanıcının uzak ( ssh -R) ( ) ama limit ( ssh -L) ilerde nasıl uzaktan ilerlemesine izin verebileceğinizi görmedim . Belki de 'permitopen' kullanılabilir. Googling çok yardımcı olmadı. 'Limana yönlendirme yok, permitremoteopen = 10001' gibi bir şeyin izin vermesi faydalı olabilir ssh -R 6901:localhost:6901.

Bu bir çözümdür. Kesinlikle iyileştirilebilir ve uzaktaki bağlantı noktalarının herhangi bir açılması incelenmelidir. Amacım, Büyükannemin LAN'ımla bağlantı kurmasına izin vermek, böylece ekranını görüntülemek için vnc kullanabilseydim ve bu anahtarlara erişim onunla sınırlıydı, şahsen kendimi makul derecede güvende hissedecektim. Bu bir işletme için olsaydı, daha ayrıntılı bir soruşturma gerekli olacaktır. Farkında olması gereken bir şey ssh -Nhiç bir kabuk istemediği için 'command =' kodu çalışmaz.

Diğer, muhtemelen daha güvenli mekanizmalar, kullanıcı için özel bir kabuk yaratmayı ve hatta görünüşe göre kilitlemeyi içerebilir.


3
Bu çok çılgınca görünüyor, bir kabuğun olması bile gerekmiyor çünkü hiçbir komutun yürütülmesi gerekmiyor. Seçenek için el kitabınassh bakın -N. Bunu başarmak için daha temiz bir yol olmalı.
Lekensteyn

Bu doğru. Ayrıca daha temiz bir çözüm görmeyi umuyorum. Bir 'permitremoteopen' seçeneği olsaydı onaylanmış_ anahtarların bağlantı noktası iletme ile birlikte oldukça iyi bir çözüm olacağını düşünüyorum.
Smoser

Bazı araştırmalar yaptım (yukarıya bakın). Yana ssh -Nhiç bir komut yürütmüyor, sorun yok command="something"oturumu kapatır.
Lekensteyn

Bir şey mi eksik? Tek chsh ssh_forwarder -s /bin/false gereken buydu.
typelogic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.