SFTP用戶根目錄

SFTP用戶根目錄

我已經編寫了以下運行良好的腳本。它會建立一個 sftp 用戶,當用戶登入時,他們將進入該目錄/var/base/test1,其中他們無法在該目錄中寫入,需要輸入/var/base/test1/test1後才能寫入。

/var/base/test1/test1然而,這有點煩人,理想情況下我希望用戶在透過 ftp 登入時進入目錄。有沒有辦法促進這一點?如果我將 ChrootDirectory (在 sshd_config 中)更改為/var/base/test1/test1,則 ftp 使用者將無法再登入。

mkdir -p /var/base/test1/test1
chown root:root /var/base/test1
chown root:root /var/base
chmod 755 /var/base/test1
adduser --disabled-password --gecos test1
echo “test1:apassword” | chpasswd
chown test1:test1 /var/base/test1/test1
vim /etc/ssh/sshd_config
systemctl restart sshd

sshd_配置:

Match User test1
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/base/test1
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

答案1

簡短回答

這是不可能的,但可以/test1作為解決方法。

長答案

openssh要求ChrootDirectory通往它的所有路徑組件都是根擁有的並且其他任何人都不可寫。這是一種安全措施,可確保ChrootDirectory不會被惡意操縱,例如被完全其他地方的符號連結取代。如果該目錄ChrootDirectory或其任何父目錄不屬於 root 使用者或是群組或全域可寫的,則sshd拒絕登入。如果發生這種情況,您會在以下位置看到類似的內容/var/log/auth.log

Jun 10 07:54:01 ubuntu-bionic sshd[2251]: fatal: bad ownership or modes for chroot directory "/var/base/test1"
Jun 10 07:54:01 ubuntu-bionic sshd[2173]: pam_unix(sshd:session): session closed for user test1

錯誤訊息應該為您指明正確的方向。

這一點在《通知》上也有明確規定sshd_config 手冊頁

Chroot目錄
指定身份驗證後 chroot(2) 的目錄路徑名。在會話啟動時,sshd(8) 檢查路徑名的所有組成部分是否為 root 擁有的目錄,任何其他使用者或群組都無法寫入這些目錄。 chroot 後,sshd(8) 將工作目錄變更為使用者的主目錄。[...]

為了安全起見,防止目錄層次結構被系統上的其他進程(尤其是監獄以外的進程)修改是非常重要的。配置錯誤可能會導致 sshd(8) 無法偵測到的不安全環境。

解決方法

但是,您可以將使用者的主目錄設定為/test1( sudo usermod test1 -d /test1),這樣chroot應用程式後目錄將會變更為/var/base/test1/test1。這樣,使用者不需要更改到該目錄,但可以在該目錄中test1啟動會話。sftp

$ sftp -P 2222 test1@localhost
test1@localhost's password: 
Connected to localhost.
sftp> pwd
Remote working directory: /test1

相關內容