sftp 是 Secure File Transfer Protocol 的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP 为 SSH 的一部分,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的 FTP 要低得多,如果您对网络安全性要求更高时,可以使用 SFTP 代替 FTP。
一、sftp 搭建
1.创建 sftp 组
groupadd sftp
# -g 用户组; -d 指定家目录; -s 不登陆; -M 不创建家目录
useradd -g sftp -d /data/sftp/sftpuser -s /sbin/nologin sftpuser
echo 123456 | passwd --stdin sftpuser
2.修改 sshd_config 配置
vim /etc/ssh/sshd_config
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
<!-- more -->
# 下面两项是与安全有关
AllowTcpForwarding no
X11Forwarding no
Match Group sftp
这一行是指定以下的子行配置是匹配 sftp 用户组的。Match user userA,userB 则是匹配用户。ChrootDirectory /data/sftp/%u
设定属于用户组 sftp 的用户访问的根文件夹。%h 代表用户 home 目录,%u 代表用户名。ForceCommand internal-sftp
该行强制执行内部 sftp,并忽略任何~/.ssh/rc
文件中的命令。AllowTcpForwarding no
是否允许 TCP 转发,默认值为 "yes", 禁止 TCP 转发并不能增强安全性,除非禁止了用户对 shell 的访问,因为用户可以安装他们自己的转发器。X11Forwarding no
是否允许进行 X11 转发。默认值是 "no",设为 "yes" 表示允许。如果允许 X11 转发并且sshd(8)
代理的显示区被配置为在含有通配符的地址(X11UseLocalhost)
上监听。那么将可能有额外的信息被泄漏。由于使用 X11 转发的可能带来的风险,此指令默认值为"no"。需要注意的是,禁止 X11 转发并不能禁止用户转发 X11 通信,因为用户可以安装他们自己的转发器。
3.权限设置
要实现 Chroot 功能, 目录权限的设置非常重要 。否则无法登录,给出的错误提示也让人摸不着头脑,无从查起。我在这上面浪费了很多时间。
ChrootDirectory:定义了用户通过认证以后的 chroot 目录,此目录及其所有子目录的属主必须是 root,且这些目录只有 root 帐号可以进行写操作,其他任何组和帐号都不可写。chroot 以后,sshd 会将用户的工作目录转到 chroot 目录中用户自己的主目录。如果 ChrootDirectory 定义的目录下没有相应的 /home/username
目录,则会直接转到 chroot 的 / 目录下。
chown root:root /data/sftp/sftpuser
chmod 755 /data/sftp/sftpuser
目录权限设置上要遵循2点:
- ChrootDirectory 设置的目录权限及其所有的上级文件夹权限,属主和属组必须是 root;
- ChrootDirectory 设置的目录权限及其所有的上级文件夹权限,只有属主能拥有写权限,权限最大设置只能是 755。
4.建立 SFTP 用户可写目录
由于 /data/sftp/sftpuser
的用户是 root,其它用户都没有写的权限,所有要有该目录下新建一个目录用于文件的上传下载。
mkdir -p /data/sftp/sftpuser/upload
chown sftpuser:sftp /data/sftp/sftpuser/upload
chmod 755 /data/sftp/sftpuser/upload
5.测试
sftp -P2022 sftpuser@172.16.16.126
sftp> pwd
Remote working directory: /upload
sftp> lls
1 anaconda-ks.cfg zookeeper.out
sftp> put anaconda-ks.cfg
Uploading anaconda-ks.cfg to /upload/anaconda-ks.cfg
anaconda-ks.cfg 100% 1839 39.4KB/s 00:00
二、SFTP 配置
1.MaxStartups 1000:30:3000
同时允许几个尚未登入的联机画面,所谓联机画面就是在你 ssh 登录的时候,没有输入密码的阶段
MaxStartups 10:30:100 # start:rate:full
- start:表示未完成认证的连接数
- rate:当未完成认证的连接数超过 start 时,rate/100 表示新发起的连接有多大的概率被拒绝连接。
- full:如果未完成认证的连接数达到 full,则新发起的连接全部拒绝。
查看 sshd 配置参数:
sshd -T | grep -i startup
2.maxsessions 1000
同一地址的最大连接数,也就是同一个 IP 地址最大可以保持多少个链接。
如下以上两个参数配置不正确,可能出现如下错误:
ssh_exchange_identification: Connection closed by remote host
三、踩过的坑
问题 1: Couldn't read packet: Connection reset by peer
sftp 输入密码后报错:
[root@sdw1 ~]# sftp sftpuser@sdw1
sftpuser@sdw1's password:
packet_write_wait: Connection to 192.168.2.111 port 22: Broken pipe
Couldn't read packet: Connection reset by peer
[root@sdw1 ~]# sftp sftpuser@sdw1
sftpuser@sdw1's password:
Connected to sdw1.
原因:/data/sftp/sftpuser(ChrootDirectory)
的用户必须为 root,参考 sftp 安装 (3)
chown root:sftp /data/sftp/sftpuser
问题 2: remote readdir("/"): Permission denied
sftp 登陆成功后,没有读的权限
sftp> ls
remote readdir("/"): Permission denied
原因:/data/sftp/sftpuser(ChrootDirectory)
组 sftp 必须要有读的权限,参考 sftp 安装 (3)
chmod 755 /data/sftp/sftpuser
本文转载自binarylei的《SFTP 安装与配置》