我已經編寫了以下運行良好的腳本。它會建立一個 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