
一般來說,在成功登入sftp
並執行put
命令後,我希望我的檔案傳輸到登入使用者的$HOME
目錄。這是開箱即用的,但我想將用戶限制sftp
在他們的$HOME
目錄中(例如,他們不能cd
升級任何級別)。
這是我使用的地方ChrootDirectory
- 根據文件(https://linux.die.net/man/5/sshd_config)
ChrootDirectory:指定驗證後 chroot(2) 的路徑。此路徑及其所有元件必須是 root 擁有的目錄,任何其他使用者或群組都不可寫入
我相信我已經正確設定了資料夾/權限。我認為文檔的下一句話沒有如預期般運作或表現。
chroot 後,sshd(8) 將工作目錄變更為使用者的主目錄。
修改sshd_config
為使用ChrootDirectory
並成功存取伺服器後,sftp
使用者工作目錄並沒有設定為使用者的$HOME目錄,實際上設定為上一層。 (例如,/home
而不是/home/userTest
)對於使用者來說,明顯的解決方法是cd 到下一級的正確目錄,但如果您使用一些簡單地將資料FTP 到當前工作目錄的自動化系統,這可能會產生很大的問題。
我將首先展示一般情況,然後對其進行修改以展示預設工作目錄行為在ChrootDirectory
引入後如何變化sshd_config
這按預期工作:
- 建立使用者(用於
-m
建立該使用者的主目錄):sudo useradd -m userTest
- 給用戶一個密碼:
sudo passwd userTest
- 注意
userTest
$HOME目錄:cat /etc/passwd
->userTest:x:1002:1004::/home/userTest:/bin/sh
- sftp 到您剛剛建立的使用者的伺服器:
sftp userTest@<your-server>
- 登入成功後記下工作目錄:
pwd
->Remote working directory: /home/userTest
上面的範例完全按照預期工作,唯一的問題是userTest
沒有鎖定到工作目錄並且可以cd ..
重置檔案系統。
幾個指南都對這個問題有相同的基本解決方案(https://linuxconfig.org/how-to-setup-sftp-server-on-ubuntu-20-04-focal-fossa-linux)
新增到前面的步驟
- 新增一個 sftp 群組(這將用作我們的
Match
區塊的密鑰sshd_config
):sudo addgroup sftp
- 將使用者加入
userTest
群組:sudo usermod -a -G sftp userTest
- 編輯
sshd_config
:sudo nano /etc/ssh/sshd_config
- 將以下行新增至文件末尾
Match group sftp
ChrootDirectory /home
ForceCommand internal-sftp
(這基本上意味著屬於該sftp
組的任何用戶都將受到ChrootDirectory
和ForceCommand
規則的約束)
儲存檔案並重新啟動 ssh: sudo systemctl restart ssh
驗證指定的目錄是否ChrootDirectory
符合上述文件中的要求: ls -ltr
-> drwxr-xr-x 4 root root 4096 Jun 10 09:02 home
(我相信這通過了)
再次使用新設定 sftp 來比較開箱即用設定的結果userTest
:sftp userTest@<your-server>
注意目前工作目錄:pwd
->Remote working directory: /
這並不是一個絕對的錯誤,我們期望工作目錄會改變......但是讓我們快速檢查當前工作目錄的內容:
ls -ltr
-> drwxr-x--- 3 1002 1004 4096 Jun 10 09:10 userTest
(!!!)
根據文件:
chroot 後,sshd(8) 將工作目錄變更為使用者的主目錄。
ls -ltr
向我們表明工作目錄不在userTest
主目錄中,它實際上比主目錄高一級。
有沒有一種配置方法ChrootDirectory
或其他方法可以使其按預期工作?
注意:ForceCommand
從 sshd_config 中刪除實際上會導致 11 年前關閉作為勘誤表的另一個問題?
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=681202