Sadece sftp-SSH kullanıcılarını evlerine nasıl koyabilirim?


123

Sunucuma bir istemci erişimi vermek istiyorum, ancak bu kullanıcıları giriş dizinleriyle sınırlamak istiyorum. Görmelerini istediğim herhangi bir dosyaya bağlanacağım.

Adlı bir kullanıcı oluşturdum bobve onu yeni bir gruba ekledim sftponly. Ev dizinleri var /home/bob. /bin/falseSSH oturumlarını durdurmak için kabuklarını değiştirdim . İşte onların /etc/passwdçizgi:

bob:x:1001:1002::/home/bob:/bin/false

Ayrıca /etc/ssh/sshd_config, aşağıdakileri içerecek şekilde değiştirdim :

Match Group sftponly
        ChrootDirectory /home/%u
        ForceCommand internal-sftp
        AllowTcpForwarding no

Onlar gibi giriş yapmaya çalıştığımda, işte görüyorum

$ sftp bob@server
bob@server's password: 
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

Dışarı yorum yaparsanız ChrootDirectoryçizgiyi ben SFTP olabilir ama sonra sunucu üzerinden başıboş var. Bunun ChrootDirectory /homeişe yaradığını buldum , ancak hala herhangi bir ana dizine erişmelerini sağlıyor. Açıkça denedim ChrootDirectory /home/bobama bu da işe yaramadı.

Neyi yanlış yapıyorum? Nasıl sınırlandırabilir bobiçin /home/bob/?

----DÜZENLE-----

Tamam, şimdi baktım /var/log/auth.logve şunu gördüm:

May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session opened for user bob by (uid=0)
May  9 14:45:48 nj sshd[5091]: fatal: bad ownership or modes for chroot directory component "/home/bob/"
May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session closed for user bob

Orada neler olup bittiğinden tam olarak emin değilim, ancak kullanıcı dizininde bir sorun olduğunu gösteriyor. İşte ls -h /homeçıktı:

drwxr-xr-x 26 oli      oli      4096 2012-01-19 17:19 oli
drwxr-xr-x  3 bob      bob      4096 2012-05-09 14:11 bob

2
ChrootDirectory /home/%uDeğiştirilebileceğine inanıyorum ChrootDirectory %h.
Franck Dernoncourt

Yanıtlar:


119

Tüm bu acı, burada açıklanan çeşitli güvenlik sorunlarından dolayıdır . Temel olarak chroot dizininin sahibi olması gerekir rootve herhangi bir grup yazma erişimi olamaz. Güzel, hoş. Yani aslında bir hücrede içine chroot'u açmak gerekiyor ve içinde o sizin düzenlenebilir içeriğe sahip olabilir.

sudo chown root /home/bob
sudo chmod go-w /home/bob
sudo mkdir /home/bob/writable
sudo chown bob:sftponly /home/bob/writable
sudo chmod ug+rwX /home/bob/writable

Ve bam, giriş yapıp yazabilirsiniz /writable.


3
Gerçekten yararlı teşekkür ederim. Yine de iki problem. 1.) Yazamama rağmen, tüm dosya sistemine göz atabilirim. 2.) Kabuğu / bin / false olarak değiştirmek SFTP'yi tamamen önler. Yanlış bir şey mi yapıyorum?
kim3er

1
Teşekkür ederim! Bu konuyla ilgili diğer pek çok makale bu ayrıntıyı kaçırıyor ve bazıları sunucunun ssh bağlantılarını kabul etmemesini sağlıyor (EC2'deyken bu berbat bir durum ... ve tek yol bu).
Tom Harrison Jr

4
kim3er: Bunun nedeni, kullanıcının kabuğunu / sbin / nologin - / bin / false olarak ayarlamanız gerektiğidir.

8
Ayrıca, chroot klasörünüze yönlendiren tüm klasörlerin sahip olması gerektiğini unutmayın root. Bu örnekte /homeayrıca kök tarafından sahiplenilmelidir.
Shiki

2
14.04'te, Subsystem sftp /usr/lib/openssh/sftp-serverçizgiyi Subsystem sftp internal-sftp -f AUTH -l VERBOSEbu işe başlamadan önce değiştirmek zorunda kaldım .
partofthething

57

Bir SFTP dizinini chroot etmek için,

  1. Bir kullanıcı oluşturun ve sahibi olmak için kök zorlayın

    cd /home
    mkdir john
    useradd -d /home/john -M -N -g users john
    sudo chown root:root /home/john
    sudo chmod 755 /home/john
    
  2. / Etc / ssh / sshd_config dosyasındaki alt sistem konumunu değiştirin:

    #Subsystem sftp /usr/lib/openssh/sftp-server
    Subsystem sftp internal-sftp
    

    ve dosyanın sonunda bir kullanıcı bölümü oluşturun (Subsystem satırından sonra yerleştirilirse ssh yeniden doğabilir):

    Match User john
        ChrootDirectory /home/john
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no
    

3
bu işe yaramadı. Örnekte, kullanıcı dizine johnkilitlenir /home/john. 755dizine izin verdiniz . Böylece sahibi (4) okudu, (2) yazdı ve uyguladı (1), grup okudu (4) ve uyguladı (1). aynı zamanda sahibi ve grubu olarak ayarladınız root, yani johndiğerine aittir. o zaman okudu ve yürüttü (4 + 1 = 5). Demek ki John'u yazma imtiyazı olmayan bir dizine kilitledin. bu nasıl düzeltilir? ayrıcalıkları değiştirmek, 757hatta 777oturum açmayı keser. grubun veya sahibin john olarak değiştirilmesi de girişleri sonlandırır.
Daniel

ayrıca dikkat: / etc / ssh / sshd_config dosyasında config'ler sırayla okunur. Dolayısıyla, Genel olarak kullanıcılar için bir kuralınız varsa ve bunlardan birinin üzerine yazmak istiyorsanız, kullanıcıya özel kuralı en üste yerleştirmeniz yeterlidir.
rwenz3l

Başka bir kullanıcının giriş klasöründeki bir SFTP dizinini chroot etmek istiyorum. Ben /home/userx/sftproot/uploadsuserx ve / home / sftpuse de sftpuser var. Chroot'u root'a /home/usex/sftprootait olacak şekilde ayarladım : root ve chmod 755. /home/usex/sftproot/uploadssftpuser: sftpuser tarafından boğuldu. Yukarıdaki ilk soru ile aynı hatayı alıyorum. Chft ve tüm üst klasörlerin sftp'nin çalışması için root: root'a ait olmaları gerekir mi?
Primoz Rome

6

Bütün günüm ahududu üzerinde bir ağ payı almaya çalışırken geçirdim. Kullanıcıyı tüm dosya sisteminde gezinmek, ssh oturum açma erişimine izin vermemek ve ağ paylaşımına yazma erişimine sahip olmak için kilitlemek istedim.

Ve işte nasıl çalıştığım:

İlk önce bir kullanıcı oluşturdum:

sudo useradd netdrive

Sonra düzenlenmiş /etc/passwdve /bin/falsekullanıcı için olduğundan emin olun böylece satır:

netdrive:x:1001:1004:Net Drive User,,,:/home/netdrive:/bin/false

Eklenecek /etc/ssh/sshd_configşekilde düzenledim :

Match User netdrive
  ChrootDirectory /home/netdrive
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no

Değiştirilen giriş dizini sahibi ve izinleri:

sudo chown root:root /home/netdrive/
sudo chmod 755 /home/netdrive/

Tamam tüm bunlardan sonra kullanarak sshfsancak salt okunur modda bağlanabildim . Yazılabilir bir klasör almak için ne yapmalıydım:

sudo mkdir -p /home/netdrive/home/netdrive/
sudo chown netdrive:netdrive /home/netdrive/home/netdrive/
sudo chmod 755 /home/netdrive/home/netdrive/

Bu, başka bir değişiklik yapmadan çalıştı. Çevrimiçi olarak birçok diğer çözümler grubuna değil , kullanıcıya yazılabilir izinlerim olduğunu unutmayın . Sorunsuz bir şekilde dosya / klasör oluştur / sil / düzenle / yeniden adlandırmayı başardım.

Chroot yapılandırması nedeniyle netdrive kullanıcısı sshfsile erişirken , sadece sunucunun dizininde saklanan şeyleri mükemmel görürüm . Tekrarlanan dizin yapısı benim için temiz bir chroot ssh yazılabilir bir çözüm elde etmem için çalıştı ./home/netdrive//home/netdrive/home/netdrive/

Şimdi yaşadığım sorunları aşağıda açıklayacağım:

Muhtemelen aşağıdaki paragrafları yürütmemelisiniz :

Yukarıdaki çözümlere baktıktan sonra (ve internette bile acl (erişim kontrol listeleri) kullanılan pek çok kişi) , hala çalıştıramadım çünkü sonraki işim:

Aşağıdaki vermedi DEĞİL iş için beni:

sudo mkdir /home/netdrive/writable/
sudo chown netdrive:netdrive /home/netdrive/writable/
sudo chmod 755 /home/netdrive/writable/

Çünkü netdrive kullanıcısı, /home/netdrive/writable/klasöre sahip olmasına ve izinlere sahip olmasına rağmen , hala bu dizine yazamadı . Sonra yaptım: sudo chmod 775 / home / netdrive / writable / Ve şimdi bir dizin oluşturabilir ve silebilirim, ancak grup yazılabilir izinler olmadan oluşturulduğundan düzenleyemedim. İşte net insanlar üzerinde gördüklerim aclonu düzeltmek için kullanıyor. Ancak kurmak zorunda kaldığımdan acl, daha sonra bağlama noktalarını vb. Yapılandırdığımdan memnun değildim . Ayrıca , aynı kullanıcının sahip olduğu bir klasöre yazmak için neden grup iznine ihtiyacım olduğunu da bilmiyorum .

Anlaşılan bazı sebeplerden dolayı /home/netdrive/home/netdriveson netdriveklasöre sahip olmak ve sahiplik etmek her şeyi grup izinleriyle uğraşmadan çalıştırabildim .


1

Bu makaleyi takip ettim ama işe yaramadı. Bu değişikliği yaptıktan sonra çalışmaya başladı (yukarıdaki cevaplarda önerildi):

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

Artı, altında kullanıcı tarafından yazılabilir alt dizini olan kökün sahip olduğu ana dizini yarattı (yukarıda açıklandığı gibi).

Bu cevapla eklemek istediğim yeni ve kullanışlı şey,% h işlevini kullanıcı giriş dizini olarak belirleyerek yapılandırmayı basitleştirebilmenizdir:

ChrootDirectory %h

Bu bağlantı sayesinde onu keşfettim .

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.