一、創建sftp服務數據目錄及相關測試用戶
[root@localhost ~]# mkdir -pv /data/sftp/ #sftp數據目錄 [root@localhost ~]# chown root:root -R /data/sftp/ #一定要是root用戶,否則無法chroot [root@localhost ~]# chmod 755 -R /data/sftp/ #權限最低需要保證普通用戶可以進入 [root@localhost ~]# groupadd sftp #sftp服務組,sftp服務可以設置匹配組或單個用戶來設置,如果是單個用戶可以忽略 [root@localhost ~]# useradd -d /data/sftp/user1 -m -g sftp -s /sbin/nologin user1 [root@localhost ~]# id user1 [root@localhost ~]# echo "123456" |passwd --stdin user1 #添加密碼。測試環境從簡,生產不建議此密碼,可以通過網頁 https://suijimimashengcheng.51240.com/ 或mkpasswd命令生產(需要安裝expect軟件包)
二、修改sshd服務配置文件,以組的方式管理sftp用戶權限
修改前配置
修改后:
配置解釋:
Subsystem sftp internal-sftp #使用sftp服務使用系統自帶的internal-sftp Match Group sftp #匹配sftp組的用戶,如果要匹配多個組,多個組之間用逗號分割 ChrootDirectory /data/sftp/%u #用chroot將用戶的根目錄指定到/data/sftp/%u,%u代表用戶名,這樣用戶就只能在/data/sftp/%u下活動 ForceCommand internal-sftp #強制執行內部sftp,並忽略任何~/.ssh/rc文件中的命令 AllowTcpForwarding no #不允許轉發TCP協議,默認是yes,如果用戶可以shell訪問則建議為yes X11Forwarding no #是否允許進行 X11 轉發。默認值是"no",設為"yes"表示允許。如果允許X11轉發並且sshd(8)代理的顯示區被配置為在含有通配符的地址(X11UseLocalhost)上監聽。那么將可能有額外的信息被泄漏。由於使用X11轉發的可能帶來的風險,此指令默認值為"no"。需要注意的是,禁止X11轉發並不能禁止用戶轉發X11通信,因為用戶可以安裝他們自己的轉發器。如果啟用了 UseLogin ,那么X11轉發將被自動禁止。
重啟服務,可能出現的錯誤:
[root@localhost ~]# systemctl restart sshd #重啟服務 Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details. [root@localhost ~]# tail /var/log/messages Jul 4 14:13:01 localhost systemd: Starting Session 3553 of user root. Jul 4 14:13:53 localhost systemd: Stopping OpenSSH server daemon... Jul 4 14:13:53 localhost systemd: Starting OpenSSH server daemon... Jul 4 14:13:53 localhost sshd: /etc/ssh/sshd_config line 145: Directive 'UseDNS' is not allowed within a Match block #報錯信息 Jul 4 14:13:53 localhost systemd: sshd.service: main process exited, code=exited, status=255/n/a Jul 4 14:13:53 localhost systemd: Failed to start OpenSSH server daemon. Jul 4 14:13:53 localhost systemd: Unit sshd.service entered failed state. Jul 4 14:13:53 localhost systemd: sshd.service failed. Jul 4 14:14:01 localhost systemd: Started Session 3554 of user root. Jul 4 14:14:01 localhost systemd: Starting Session 3554 of user root.
這是因為UseDNS 在我們的sftp設置塊下方,按我上面的配置就沒有此問題了。
三、客戶端連接測試
1.服務端為該用戶目錄授權
[root@localhost ~]# cd /data/sftp/ [root@localhost sftp]# ll 總用量 0 drwx------ 2 user1 sftp 62 2019-07-04 05:12 user1 [root@localhost sftp]# chown root:root user1 [root@localhost sftp]# chmod 755 user1/ [root@localhost sftp]# cd user1/ [root@localhost user1]# mkdir upload [root@localhost user1]# chown user1:sftp upload/
2.客戶端測試連接
[root@localhost ~]# sftp user1@172.16.150.135 #注意連接的用戶名 user1@172.16.150.135's password:
Connected to 172.16.150.135. sftp> ls upload sftp> cd upload/ sftp> mkdir test sftp> rmdir test sftp> help #查看命令幫助 Available commands: bye Quit sftp cd path Change remote directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own' df [-hi] [path] Display statistics for current directory or filesystem containing 'path'
可能出現的報錯:
packet_write_wait: Connection to 172.16.150.135 port 22: Broken pipe Couldn't read packet: Connection reset by peer
出現以上報錯,通常是因為用戶的目錄權限有問題,這也是sftp服務最容易出現問題的地方。我們只要抓住以下兩個要點(原則)
由ChrootDirectory指定的目錄開始一直往上到系統根目錄為止的目錄擁有者都只能是root 由ChrootDirectory指定的目錄開始一直往上到系統根目錄為止都不可以具有群組寫入權限
四、根據單個用戶配置(其他參照組配置即可)
Match User zara_sftp #使用User關鍵字 后面接用戶名 ChrootDirectory /data/sftp/zara_sftp #用戶數據目錄,注意權限 X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp