背景:
因工作上要接收外部機構發來的文件,采取FTP的方式保密性差,SFTP方式則采取了加密了傳輸,安全性更好。因此需要搭建SFTP服務,首選Linux環境,本文使用Centos7來演示。
一、操作步驟
環境:
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@localhost ~]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
1. 創建用戶組和用戶
[root@localhost ~]# groupadd sftp --創建用戶組 [root@localhost ~]# useradd -g sftp -s /sbin/nologin sftp1 --創建用戶 [root@localhost ~]# passwd sftp1 Changing password for user sftp1. New password: [root@localhost ~]# mkdir -p /data/sftp/sftp1 [root@localhost ~]# usermod -d /data/sftp/sftp1 sftp1 --指定用戶默認目錄
2. 修改ssh服務配置
[root@localhost ~]# vi /etc/ssh/sshd_config -- 在末尾添加 #Subsystem sftp /usr/libexec/openssh/sftp-server --這里注釋掉 # Example of overriding settings on a per-user basis #Match User anoncvs # X11Forwarding no # AllowTcpForwarding no # PermitTTY no # ForceCommand cvs server
--從這里開始增加
Subsystem sftp internal-sftp Match Group sftp --匹配用戶組 ChrootDirectory /data/sftp/%u --限定了訪問目錄 X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp
3. 設置目錄權限
[root@localhost ~]# chown root:sftp /data/sftp/sftp1 --設置root為目錄所有者 [root@localhost ~]# chmod 755 /data/sftp/sftp1 --不能超過755,sftp1可讀可執行、不可寫(也可設置為644) [root@localhost ~]# mkdir /data/sftp/sftp1/upload [root@localhost ~]# chown sftp1:sftp /data/sftp/sftp1/upload –-設置sftp1為目錄所有者 [root@localhost ~]# chmod 755 /data/sftp/sftp1/upload --sftp1可讀可寫可執行 [root@localhost ~]# systemctl restart sshd.service –-重啟sshd服務,讓sshd_config配置生效
4.檢測登錄是否正常
[root@localhost ~]# sftp sftp1@127.0.0.1 sftp1@127.0.0.1's password: Connected to 127.0.0.1. sftp> exit --成功!
-- 也可以在windows上也可以用winscp驗證登錄
二、常見報錯
1. Permmission Denied
原因:(1)密碼錯誤;(2)目錄權限設置有問題
2. Broken pipe. Couldn't read packet...
原因:目錄權限設置問題。可以用將訪問用戶的用戶組改為root,看是否還會報錯,如果不報錯,則就是之前目錄權限設置的問題。
三、特殊需求
1. 增加SFTP訪問端口
出於安全角度考慮,有外部機構提出不能使用默認22端口,要額外新增訪問端口。這里以新增22345端口為例,只需要再次修改sshd配置文件就可以。
[root@localhost ~]# vi /etc/ssh/sshd_config
-- 中間位置 # If you want to change the port on a SELinux system, you have to tell # SELinux about this change. # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER # # Port 22 --這一行取消注釋,保留22端口用於內部遠程控制 Port 22345 --端口增加22345
-- 如果開啟了防火牆,還需要額外放行端口
[root@localhost ~]# netstat –nlptu [root@localhost ~]# firewall-cmd --permanent --add-port=22345/tcp --防火牆放行 success [root@localhost ~]# systemctl restart firewalld --重啟防火牆
最后用WinSCP訪問新端口22345驗證鏈接。
2. 用戶登錄的默認路徑可以直接上傳文件
默認情況下,用戶登錄的第一層目錄是不能操作的,我們會創建一個upload子目錄,把所有者賦予用戶,用戶要上傳文件必須要進入upload子目錄進行。
現在有機構提出要登錄后直接可上傳文件,去掉進入子目錄這一步。搜索網上資料,發現最簡單的方式是通過修改sshd配置文件中的ForceCommand internal-sftp參數。
-- 假設用戶sftpuser對應默認路徑/home/sftpuser,但僅在子目錄/home/sftpuser/upload下可上傳文件,我們可以讓其登錄后自動進入upload目錄。
[root@localhost ~]# vi /etc/ssh/sshd_config
-- 在最后添加
Match User sftpuser --匹配用戶sftpuser ChrootDirectory /home/sftpuser --用戶root目錄 AllowTCPForwarding no X11Forwarding no ForceCommand internal-sftp -d /upload --登錄后自動執行命令進入upload目錄,用戶仍可回到默認root目錄
3. 添加一個SFTP管理員用戶,可以訪問所有SFTP用戶目錄
隨着外部SFTP用戶增多,需要有個管理員用戶來統一查看所有用戶的文件。直接用root不安全,要新建用戶來實現。
-- 新建一個sftpadmin用戶,歸屬於root用戶組
[root@localhost ~]# useradd -g root sftpadmin --創建用戶 [root@localhost ~]# passwd sftpadmin
-- 修改sshd配置文件,配置sftpadmin用戶的默認root目錄為父目錄。假設用戶目錄為/data/sftpgroup01/sftpuser01,那么父目錄就是/data/sftpgroup01。 [root@localhost ~]# vi /etc/ssh/sshd_config Match User sftpadmin ChrootDirectory /data/sftpgroup01 --限定訪問目錄 ForceCommand internal-sftp X11Forwarding no AllowTcpForwarding no
參考:
https://blog.csdn.net/axing2015/article/details/83755143 --操作成功
https://blog.csdn.net/tingjie/article/details/80887463 --報錯如下,應該是目錄權限設置問題,待研究。
https://www.cnblogs.com/gz9218/p/85d25b3aeaea9b1f8455a889abedfdf2.html --報錯:同上
https://www.cnblogs.com/heqiuyong/p/11072829.html -- 修改SSH服務端口。
https://serverfault.com/questions/910789/chroot-sftp-possible-to-allow-user-to-write-to-current-chroot-directory --用戶登錄后的默認路徑可寫入