Ssh

嘗試僅在一個使用者的 chroot 監獄中設置 SFTP

  • February 12, 2013

希望你們能提供幫助,看看我是否在這裡做了一些奇怪的事情,我正在嘗試使用我設置的使用者登錄,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 客戶端。

  1. 在 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
  1. 為組指定 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 文件中提到的任何命令。
  1. 創建 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 目錄下。

引用自:https://serverfault.com/questions/477930