嘗試僅在一個使用者的 chroot 監獄中設置 SFTP
希望你們能提供幫助,看看我是否在這裡做了一些奇怪的事情,我正在嘗試使用我設置的使用者登錄,FileZilla 向我顯示:
Command: open "///@///" Command: Pass: ******** Status: Connected to /// Error: Connection closed by server with exitcode 1 Error: Could not connect to server
所以,我進入了 auth.log,我看到了這個:
Feb 12 11:08:49 sshd[12056]: Accepted password for /// from /// port /// ssh2 Feb 12 11:08:49 sshd[12056]: pam_unix(sshd:session): session opened for user /// by (uid=0) Feb 12 11:08:50 sshd[12164]: subsystem request for sftp by user /// Feb 12 11:08:50 sshd[12056]: pam_unix(sshd:session): session closed for user ///
這是相關使用者的密碼條目:
///:x:666:666:///,,,:/chroot:/usr/bin/rssh
如果我嘗試自己執行 rssh,我會得到
Allowed commands: sftp
它似乎設置正確。至於我設置為主文件夾的文件夾,它歸使用者所屬的組“sftp”所有。顯然我在這裡做錯了,所以任何關於我應該嘗試接近解決方案的提示都值得讚賞。
編輯:如果我將 /usr/bin/rssh 更改為 /bin/bash,它工作正常,但使用者仍然可以瀏覽整個系統,這並不理想。基本上,我希望使用者直接進入一個目錄,在那裡做他們想做的任何事情,就讀寫文件而言,但不能進入文件系統,執行其他二進製文件等等。
1.創建一個新組
創建一個名為 sftpusers 的組。只有屬於該組的使用者才會被自動限制在該系統上的 SFTP chroot 環境中。
# groupadd sftpusers
2.創建使用者(或修改現有使用者)
假設您要創建一個使用者 guestuser,該使用者應僅被允許在 chroot 環境中執行 SFTP,並且不應被允許執行 SSH。
以下命令創建 guestuser,將該使用者分配給 sftpusers 組,將 /incoming 作為主目錄,將 /sbin/nologin 設置為 shell(這將不允許使用者 ssh 並獲得 shell 訪問權限)。
# useradd -g sftpusers -d /incoming -s /sbin/nologin guestuser # passwd guestuser
驗證使用者是否已正確創建。
# grep guestuser /etc/passwd guestuser:x:500:500::/incoming:/sbin/nologin
如果您想修改現有使用者並使他僅成為 sftp 使用者並將他放入 chroot sftp 監獄,請執行以下操作:
# usermod -g sftpusers -d /incoming -s /sbin/nologin john
在相關說明中,如果您必須將文件從 Windows 傳輸到 Linux,請使用前 7 個 sftp 客戶端列表中提到的任何一個 sftp 客戶端。
- 在 sshd_config 中設置 sftp-server 子系統
您應該指示 sshd 將 internal-sftp 用於 sftp(而不是預設的 sftp-server)。
修改 /etc/ssh/sshd_config 文件並註釋掉以下行:
#Subsystem sftp /usr/libexec/openssh/sftp-server
接下來,將以下行添加到 /etc/ssh/sshd_config 文件中
Subsystem sftp internal-sftp
它應該如下所示:
# grep sftp /etc/ssh/sshd_config #Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp
- 為組指定 Chroot 目錄
您只想將某些使用者(即屬於 sftpusers 組的使用者)放在 chroot 監獄環境中。在 /etc/ssh/sshd_config 的末尾添加以下行
Match Group sftpusers ChrootDirectory /sftp/%u ForceCommand internal-sftp
在上面:
- 匹配組 sftpusers – 這表示以下行將僅匹配屬於組 sftpusers 的使用者
- ChrootDirectory /sftp/%u – 這是使用者通過身份驗證後將用於 chroot 的路徑。%u 表示使用者。因此,對於 john,這將是 /sftp/john。
- ForceCommand internal-sftp – 這會強制執行 internal-sftp 並忽略 ~/.ssh/rc 文件中提到的任何命令。
- 創建 sftp 主目錄
由於我們在上面將 /sftp 指定為 ChrootDirectory,因此創建此目錄(它相當於您的典型 /home 目錄)。
# mkdir /sftp
現在,在 /sftp 下,為屬於 sftpusers 組的使用者創建單獨的目錄。即只允許執行 sftp 並處於 chroot 環境中的使用者。
# mkdir /sftp/guestuser
因此,/sftp/guestuser 相當於 / 用於 guestuser。當guestuser sftp 到系統並執行“cd /”時,他們將只看到“/sftp/guestuser”下目錄的內容(而不是系統的真正/)。這就是 chroot 的力量。
因此,在此目錄 /sftp/guestuser 下,創建您希望使用者看到的任何子目錄。例如,創建一個傳入目錄,使用者可以在其中 sftp 他們的文件。
# mkdir /sftp/guestuser/incoming
6.設置適當的權限
要使 chroot 正常工作,您需要確保在剛剛在上面創建的目錄上正確設置了適當的權限。
將所有者設置為使用者,並將組設置為 sftpusers 組,如下所示。
# chown guestuser:sftpusers /sftp/guestuser/incoming
傳入目錄的權限如下所示。
# ls -ld /sftp/guestuser/incoming drwxr-xr-x 2 guestuser sftpusers 4096 Dec 28 23:49 /sftp/guestuser/incoming
/sftp/guestuser 目錄的權限如下所示
# ls -ld /sftp/guestuser drwxr-xr-x 3 root root 4096 Dec 28 23:49 /sftp/guestuser # ls -ld /sftp drwxr-xr-x 3 root root 4096 Dec 28 23:49 /sftp
7.重啟sshd並測試Chroot SFTP
重啟sshd:
# service sshd restart
測試 chroot sftp 環境。正如您在下面看到的,當 gusetuser 執行 sftp 並執行“cd /”時,他們只會看到傳入目錄。
# sftp guestuser@thegeekstuff.com guestuser@thegeekstuff's password: sftp> pwd Remote working directory: /incoming sftp> cd / sftp> ls incoming
當 guestuser 將任何文件從 sftp 傳輸到 /incoming 目錄時,它們將真正位於系統上的 /sftp/guestuser/incoming 目錄下。