#創建sftp組:
groupadd sftp
#創建一個用戶sftpuser:
useradd -g sftp -s /bin/false sftpuser
#提示:
/etc/group 文件包含所有組
/etc/shadow /etc/passwd 系統存在的所有用戶名
#設置sftpuser用戶的密碼,會要求你輸入兩次密碼確認:
passwd sftpuser
#創建一個sftp的上傳目錄:
mkdir /datas/www
#修改用戶sftpuser所在的目錄:
usermod -d /datas/www sftpuser
#配置sshd_config:
vi /etc/ssh/sshd_config
#找到如下這行,並注釋掉
#Subsystem sftp /usr/libexec/openssh/sftp-server
#添加如下幾行(如果添加之后出現問題,則添加到最后)
Subsystem sftp internal-sftp #這行指定使用sftp服務使用系統自帶的internal-sftp Match User sftpuser #這行用來匹配用戶 ChrootDirectory /datas/www #用chroot將用戶的根目錄指定到/datas/www ,這樣用戶就只能在/datas/www下活動 AllowTcpForwarding no ForceCommand internal-sftp #指定sftp命令
為什么用 internal-sftp 而不用默認的 sftp-server,這是因為: 這是一個進程內的 sftp 服務,當用戶 ChrootDirectory 的時候,將不請求任何文件; 更好的性能,不用為 sftp 再開一個進程。
#保存退出
#設定Chroot目錄權限:
chown -R root:root /datas/www chmod 755 /datas/www
#建立SFTP用戶登入后可寫入的目錄:
mkdir /datas/www/sftpuser chown -R sftpuser:sftp /datas/www/sftpuser/ chmod 755 /datas/www/sftpuser/
#重啟sshd服務:
service sshd restart
#測試是否能正常登陸:
sftp -P 22122 ftpuser@127.0.0.1
#關閉SElinux:
vi /etc/sysconfig/selinux #找到如下這行 SELINUX=enforcing #修改為 SELINUX=disabled
#保存退出
#這里討論了為什么要關閉這功能:https://www.zhihu.com/question/20559538
常見問題:
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/
參考資料:http://www.cnblogs.com/xjnotxj/p/6912471.html
2、如果你鏈接服務器的時候出現下面的提示:
> Write failed: Broken pipe
> Couldn't read packet: Connection reset by peer
這個問題的原因是ChrootDirectory的權限問題,你設定的目錄必須是root用戶所有,否則就會出現問題。所以請確保sftp用戶根目錄的所有人是root, 權限是 750 或者 755。注意以下兩點原則:
-
目錄開始一直往上到系統根目錄為止的目錄擁有者都只能是 root,用戶組可以不是 root。
-
目錄開始一直往上到系統根目錄為止都不可以具有群組寫入權限
- 上面2點一定注意,仔細檢查。我就是因為這個問題,導致一直有這個問題。仔細檢查配置后,解決問題。
參考資料:
https://segmentfault.com/a/1190000008578734
http://www.cnblogs.com/kgdxpr/p/3623369.html
http://blog.csdn.net/xinxin19881112/article/details/46831311