2012年2月3日 星期五

透過OpenSSH使用SFTP登入時將帳戶設為chroot


#不允許使用者登入 Shell 進行操作 (使用者只能使用 SFTP 傳輸檔案 )
#不允取使用者建立 SSH 通道 (SSH Tunnel 或稱 TCP Forwarding)
#不允取使用者建立 X11 Forwarding
#登入後透過 chroot 限制存取目錄

要達到以上需求,必須修改 OpenSSH 的設定檔,並建立一個擁有者為 root 的 Chroot 目錄,以下是設定步驟:

1. 新增一個 SFTP 專用的群組
在這裡我們先建立一個 sftponly 群組(也可以建立其他你想要的名稱)
addgroup sftponly

2. 修改 OpenSSH 的設定檔
編輯 "/etc/ssh/sshd_config" 檔案,找到 Subsystem 設定:

Subsystem sftp /usr/lib/openssh/sftp-server internal-sftp

修改成:

Subsystem sftp internal-sftp

然後在設定檔最後加上以下設定,其中 ChrootDirectory 設定的 %u 代表使用者帳號:

Match group sftponly
         ChrootDirectory /home/%u
         X11Forwarding no
         AllowTcpForwarding no
         ForceCommand internal-sftp

3. 建立新使用者,並加入 sftponly 群組,並指定的家目錄 (Home Directory)需和上述Chroot指定的家目錄相同。

adduser sftpuser

在 sshd_config 設定檔中有宣告只要符合 sftponly 群組的使用者都套用 ChrootDirectory 的設定,因此須將該使用者加入到 sftponly 群組中:

adduser sftpuser sftponly

4. 修正使用者帳戶的家目錄權限
由於 chroot() 的特殊限制,這個要 chroot() 目錄的擁有者必須為 root,該目錄的權限也必須設定為 755 :

chown root.root /home/sftpuser
chmod 755 /home/sftpuser

這裡沒有設定正確將無法成功登入,會出現如以下錯誤: ( /var/log/auth.log )

sshd[9326]: pam_unix(sshd:session): session opened for user sftpuser by (uid=0)
sshd[9433]: fatal: bad ownership or modes for chroot directory "/home/sftpuser"
sshd[9526]: pam_unix(sshd:session): session closed for user

5. 在使用者目錄下建立允許上傳檔案的目錄,並賦予適當的目錄權限
 chroot() 過的目錄擁有者必須為 root 且目錄權限為 755,所以使用者登入後無法上傳任何檔案到這個目錄,若要讓使用者能上傳檔案,必須先幫使用者建立好適當的目錄與設定權限:

cd /home/sftpuser
mkdir upload
chown sftpuser.sftpuser upload