何为SFTP
SSH 文件传输协议(SSH File Transfer Protocol)或者说是安全文件传输协议(Secure File Transfer Protocol)。是一个独立的 SSH 封装协议包,通过安全连接以相似的方式工作。
SFTP比FTP更可取:因为它具有最基本的安全特性和能利用SSH连接的能力,FTP是一种不安全的协议,只能在有限的情况下或在您信任的网络上使用,如果是放在internet上的服务,web要用https,FTP要用sftp,否则稽核时肯定是缺失。
另:在Linux只需要配置就可以使用sftp,因为默认的Linux都会安装SFTP服务的,不过OpenSSH-Server版本最好高于4.8p1
设定步骤
查看OpenSSH版本
ssh -V
OpenSSH_8.0p1, OpenSSL 1.1.1g FIPS 21 Apr 2020
SFTP 配置
1. 创建用户组 sftp
groupadd sftp
2. 创建用户sfcsftp
useradd -g sftp -s /sbin/nologin -d /home/sftp/sfcsftp sfcsftp
-g 加入到sftp组
-s 禁止登录
-d 指定用户的登入目录
3. 设置sfcsftp密码
passwd sfcsftp
输入两次密码
4. 创建用户ftp文件目录
cd /home
mkdir sftp
mkdir /home/sftp/sfcsftp
4.1 修改文件夹 拥有者
chown -R sfcsftp:sftp /home/sftp/sfcsftp
-R 递归修改子目录
5. 修改ssh的配置文件 /etc/ssh/sshd_config
修改sshd_config如下:
注释原来的Subsystem设置
#Subsystem sftp /usr/libexec/openssh/sftp-server
启用internal-sftp
Subsystem sftp internal-sftp
限制用户SFTP访问的根目录
限制sfcsftp用户的根目录
AllowGroups sftp
#Match Group sftp
AllowTcpForwarding no
X11Forwarding no
ChrootDirectory /home/sftp
ForceCommand internal-sftp
6. 重启SSH服务
systemctl restart sshd
7. 测试sftp
sftp shsfc@192.168.1.2
sfcsftp@192.168.1.2's password:
Connected to sfcsftp@192.168.1.2.
sftp> exit
8. 主要Log
查看ssh版本
[root@iZ2fg4gfn99zb4hG ~]# ssh -V
OpenSSH_8.0p1, OpenSSL 1.1.1g FIPS 21 Apr 2020
添加group sftp
[root@iZ2fg4gfn99zb4hG ~]# groupadd sftp
groupadd: group 'sftp' already exists
修改sfcsftp
[root@iZ2fg4gfn99zb4hG ~]# usermod -g sftp -s /sbin/nologin -d /home/sftp/sfcsftp sfcsftp
[root@iZ2fg4gfn99zb4hG ~]# id sfcsftp
uid=1000(sfcsftp) gid=1000(sftp) groups=1000(sftp)
設定sfcsftp密碼
[root@iZ2fg4gfn99zb4hG ~]# passwd sfcsftp
Changing password for user sfcsftp.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
創建sfcsftp文件夾
[root@iZ2fg4gfn99zb4hG ~]# cd /home
[root@iZ2fg4gfn99zb4hG home]# mkdir sftp
[root@iZ2fg4gfn99zb4hG home]# mkdir /home/sftp/sfcsftp
[root@iZ2fg4gfn99zb4hG home]# ll
drwxr-xr-x 3 root root 21 May 31 20:55 sftp
授權
[root@iZ2fg4gfn99zb4hG home]# chown -R sfcsftp:sftp /home/sftp/sfcsftp
[root@iZ2fg4gfn99zb4hG home]# ll
total 0
drwxr-xr-x 3 root root 21 May 31 20:55 sftp
[root@iZ2fg4gfn99zb4hG home]# cd sftp
[root@iZ2fg4gfn99zb4hG sftp]# ll
total 0
drwxr-xr-x 2 sfcsftp sftp 6 May 31 20:55 sfcsftp
编辑/etc/ssh/sshd_config
10. 总结sshd_config编辑的内容
# override default of no subsystems
#Subsystem sftp /usr/libexec/openssh/sftp-server註釋掉這一行
Subsystem sftp internal-sftp #添加這一行使用sftp服務,使用系统自带的internal-sftp
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
#AllowGroups sftp root
#Match user sfcsftp
#AllowTcpForwarding no
#X11Forwarding no
#ChrootDirectory /home/sftp
#ForceCommand internal-sftp 第一次這些信息設置在此處,但workBench不能以root登陆服务器
UseDNS no
AddressFamily inet
SyslogFacility AUTHPRIV
PermitRootLogin yes
PasswordAuthentication yes
#如果下面的信息直接寫在UseDNS no下面,systemctl restart sshd時會報錯,具體的看tail /var/log/messages
Match Group sftp #我們自己創建了sftp Group,匹配sftp组的用户,如果要匹配多个组,多个组之间用逗号分割
ChrootDirectory /home/sftp #用Chroot将用户的根目录指定到/home/sftp/%u,%u代表用户名,这样用户就只能在/home/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转发将被自动禁止
如果再創建一個sftp用戶,例如:mysftp
useradd -g sftp -s /sbin/nologin -M mysftp
chown -R mysftp:sftp /home/sftp/mysftp
passwd mysftp
不管是用mysftp 還是sfcsftp,都能看到這兩個文件夾,並且也能下載,但上傳時,各自只能上傳到各自的文件夾,而我们的目的是sftpdir文件夹
如果想各自只能訪問各自的文件夾,如果僅僅在 ChrootDirectory /home/sftp/%u 是無效的並且sftp也不能訪問了
也許把Match user sfcsftp,mysftp 和ChrootDirectory /home/sftp/%u搭配可以,待驗證---結果是:不行
最終解決辦法:
1.先創建以用戶名命名的文件夾:/home/sftp/mysftp
2.再把此文夾夾授權給root:chown root:root /home/sftp/mysftp/
3.再創建sftpdir文件夾:mkdir /home/sftp/mysftp/sftpdir
4.再把此文夾夾授權給mysftp和sftp群組:chown mysftp.sftp /home/sftp/mysftp/sftpdir
5.再變更文件夾權限::chmod 775 /home/sftp/mysftp/sftpdir
6.修改sshd_config,只要把ChrootDirectory /home/sftp 改為/home/sftp/%u即可
7.當然要重啟sshd:systemctl restart sshd
如此:各自只能看到各自的根目錄,例如mysftp,在這裡只能上傳文件或覆蓋原文件,不能刪除文件,不能創建新的文件夾
但在sftpdir可以上傳可以刪除可以創建文件夾等操作
最终/etc/ssh/sshd_config文件行尾的一些信息:
UseDNS no
AddressFamily inet
SyslogFacility AUTHPRIV
PermitRootLogin yes
PasswordAuthentication yes
Match Group sftp
ChrootDirectory /home/sftp
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no