目前越来越多的FTP客户端软件开始支持SSH协议上传和下载文件,这种协议方式就是SFTP。
SFTP的优势主要有两点,一是不需要再配置个FTP服务端;二是SSH协议是安全传输,上传和下载是经过加密的。
使用ChrootDirectory限定sftp用户在自己的家目录下有两种方式,基于User和Group
一、基于User
1.创建sftp用户
# useradd -s /sbin/nologin -d /opt/sftp03 sftp03
# ll /opt/
total 0
drwx------ 2 sftp03 sftp03 62 Apr 24 18:20 sftp03
2.ssh配置
[root@sftp sftp]#vim /etc/ssh/sshd_config
#注释掉原有Subsystem,添加新的Sbusystem配置
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
#在添加如下配置
Match User taxue,sftp
ChrootDirectory %h
ForceCommand internal-sftp
重启sshd服务
[root@sftp sftp]# systemctl restart sshd
3.client登入验证
[root@kvm-201 ~]# sftp sftp03@192.168.1.136
sftp03@192.168.1.136's password:
packet_write_wait: Connection to 192.168.1.136 port 22: Broken pipe
Couldn't read packet: Connection reset by peer
登入报错,ssh里设置了ChrootDirectory %h 限定家目录
原因:是用户ChrootDirectory配置的主目录权限问题导致,并非网络的原因,需特别注意这两点:
-
ChrootDirectory所指向的文件夹,属主必须是root,属组是sftp用户所属的用户组。
-
ChrootDirectory所指向的文件夹到系统根路径上的所有途径文件夹,属主都必须是root,且权限不允许有群组用户写入权限,即权限只能为700或750或755
4.修改sftp03家目录属性
解决:修改sftp03家目录权限755 属主root 属组root或sftp03
# chown root /opt/sftp03
# chmod 755 /opt/sftp03
drwxr-xr-x 3 root sftp03 75 Apr 24 18:13 sftp03
二、基于Group
1. 创建sftp用户,配置家目录及权限
[root@sftp sftp]# mkdir /home/sftp
[root@sftp sftp]# groupadd sftp
[root@sftp sftp]# useradd -g sftp -d /home/sftp/silent -s /sbin/nologin silent
[root@sftp sftp]# passwd silent
[root@sftp sftp]# chown root /home/sftp/silent/
2.配置sshd_config
[root@sftp sftp]# vim /etc/ssh/sshd_config
#注释掉下面这一行:
Subsystem sftp /usr/libexec/openssh/sftp-server
#在sshd_config最后加入下面这几行:
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /home/sftp/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
3.重启sshd
[root@sftp sftp]# systemctl restart sshd
4.client登入验证
[root@gitbook ~]# sftp silent@192.168.1.136
silent@192.168.1.136's password:
Connected to 192.168.1.136.
sftp>
三、sshd_config相关配置解析
参考:https://www.cnblogs.com/zqifa/p/ssh-2.html
关于 SFTP 服务的设定项目!
Subsystem sftp /usr/lib/ssh/sftp-server #(我未使用该配置)
Match
引入一个条件块。块的结尾标志是另一个 Match 指令或者文件结尾。
如果 Match 行上指定的条件都满足,那么随后的指令将覆盖全局配置中的指令。
Match 的值是一个或多个"条件-模式"对。可用的"条件"是:User, Group, Host, Address 。
只有下列指令可以在 Match 块中使用:AllowTcpForwarding, Banner,
ForceCommand, GatewayPorts, GSSApiAuthentication,
KbdInteractiveAuthentication, KerberosAuthentication,
PasswordAuthentication, PermitOpen, PermitRootLogin,
RhostsRSAAuthentication, RSAAuthentication, X11DisplayOffset,
X11Forwarding, X11UseLocalHost
X11Forwarding
是否允许进行 X11 转发。默认值是"no",设为"yes"表示允许。
如果允许X11转发并且sshd(8)代理的显示区被配置为在含有通配符的地址(X11UseLocalhost)上监听。
那么将可能有额外的信息被泄漏。由于使用X11转发的可能带来的风险,此指令默认值为"no"。
需要注意的是,禁止X11转发并不能禁止用户转发X11通信,因为用户可以安装他们自己的转发器。
如果启用了 UseLogin ,那么X11转发将被自动禁止。
AllowTcpForwarding
是否允许TCP转发,默认值为"yes"。
禁止TCP转发并不能增强安全性,除非禁止了用户对shell的访问,因为用户可以安装他们自己的转发器。
ForceCommand
强制执行这里指定的命令而忽略客户端提供的任何命令。这个命令将使用用户的登录shell执行(shell -c)。
这可以应用于 shell 、命令、子系统的完成,通常用于 Match 块中。
这个命令最初是在客户端通过 SSH_ORIGINAL_COMMAND 环境变量来支持的。
ChrootDirectory
指定身份验证后chroot(2)到的目录的路径名 。在会话启动时,sshd(8)会检查路径名的所有组件都是root拥有的目录,其他任何用户或组均不可写。chroot之后, sshd(8)将工作目录更改为用户的主目录。参数 ChrootDirectory接受在所描述的令牌 TOKENS部。在ChrootDirectory必须包含必要的文件和目录,以支持用户的会话。对于交互式会话,这至少需要一个shell(通常为sh(1))和基本 / dev节点,例如 null(4), zero(4), stdin(4), stdout(4), stderr(4)和 tty(4)设备。对于使用SFTP的文件传输会话,如果使用进程内sftp-server,则无需对环境进行其他配置,尽管使用日志记录的会话可能需要/ dev / log在某些操作系统的chroot目录中(有关详细信息,请参见 sftp-server(8))。
为了安全起见,防止目录层次结构被系统上的其他进程(尤其是监狱外的进程)修改是非常重要的。配置错误会导致sshd(8)无法检测到的不安全环境。
默认值为none,表示不使用 chroot(2)。
网友评论