一、環境:
CentOS 6.8
使用 FileZilla 進行 sftp 連接
二、背景
給外包的工作人員提供我司服務器的某一目錄的訪問(包括讀寫)權限,方便他們部署代碼文件。
之所以是某一目錄的訪問,是因為 SFTP 的用戶登錄后,默認是能看到整個系統的文件目錄,這樣很不安全。
題外話:如果是針對 ftp 的用戶權限管理,推薦使用 vsftpd,可通過 yum 直接安裝。
三、正文
1、創建新用戶
adduser sftpuser1
useradd 和 adduser 的區別
useradd 只會添加一個用戶,並沒有創建它的主目錄,除了添加一個新用戶之外什么都沒有。這個用戶甚至不能登錄,因為沒有密碼。所以這里選擇 adduser。
2、設置該用戶密碼
passwd sftpuser1
回車后再輸入密碼即可
3、禁止該用戶登錄 SSH
因為我們只想該用戶使用 SFTP,並不需要該用戶能登錄 SSH,威脅安全。
usermod -s /bin/false sftpuser1
將sftpuser1的 shell 改成 /bin/false。
4、修改該用戶的家目錄
usermod -d /data/wwwroot/user1/ sftpuser1
這樣每次用戶訪問服務器都會默認打開/data/wwwroot/user1/,但還是可以跳出這個訪問其它目錄,需要進行下面一步的操作。
5、設置 sshd_config:
打開sshd_config文件
vi /etc/ssh/sshd_config
找到 Subsystem sftp 這一行,修改成:
Subsystem sftp internal-sftp
UsePAM yes
Match user sftpuser1
ForceCommand internal-sftp
ChrootDirectory /data/wwwroot/user1/
將上面的 sftpuser1 和 /data/wwwroot/user1/ 替換成你需要的。
多個用戶請重復配置這三行:
Match user sftpuser2
ForceCommand internal-sftp
ChrootDirectory /data/wwwroot/user2/
這樣可以為不同的用戶設置不同的限制目錄。
6、重新啟動 sshd 服務:
/etc/init.d/sshd restart
現在用 SFTP 軟件使用sftpuser1用戶登錄,就可以發現目錄已經被限定、鎖死在/data/wwwroot/user1/了。
四、可能遇到的問題
1、修改sshd_config文件后重啟 sshd,報錯:Directive 'UseDNS' is not allowed within a Match block
語法錯誤,原因未知,只需要把兩段配置的位置互調就不報錯了。
修改前:
Subsystem sftp internal-sftp
UsePAM yes
Match user sftpuser1
ForceCommand internal-sftp
ChrootDirectory /data/wwwroot/user1/
UseDNS no
AddressFamily inet
PermitRootLogin yes
SyslogFacility AUTHPRIV
PasswordAuthentication yes
修改后:
UseDNS no
AddressFamily inet
PermitRootLogin yes
SyslogFacility AUTHPRIV
PasswordAuthentication yes
Subsystem sftp internal-sftp
UsePAM yes
Match user sftpuser1
ForceCommand internal-sftp
ChrootDirectory /data/wwwroot/user1/
注:當你出現這個錯誤的時候,sftp 肯定是連不上了。如果你習慣用 FileZilla 去修改配置文件,那么此時你得不情願的切換到
shell,去用 vi/vim 去修改它了。
2、新用戶通過 sftp 訪問時,權限不全,只能讀不能寫
我試着用 root 賬號去把該用戶的家目錄權限改成 777,但是會出現該用戶 sftp 登陸不了的情況。(報錯:Server unexpectedly closed network connection)
google 了原因如下:
給新用戶的家目錄的權限設定有兩個要點:
1、由 ChrootDirectory 指定的目錄開始一直往上到系統根目錄為止的目錄擁有者都只能是 root
2、由 ChrootDirectory 指定的目錄開始一直往上到系統根目錄為止都不可以具有群組寫入權限(最大權限 755)
如果違反了上面的兩條要求,那么就會出現新用戶訪問不了 sftp
的情況。
所以/data/wwwroot/user1/及上級的所有目錄屬主一定要是
root,並且組權限和公共權限不能有寫入權限,如果一定需要有寫入權限,那們可以在/data/wwwroot/user1/下建立 777 權限的文件夾。
mkdir /data/wwwroot/user1/upload
chown -R sftpuser1:root /data/wwwroot/user1/upload
這樣sftpuser1用戶就可以在/data/wwwroot/user1/upload里隨意讀寫文件了。
