目前越来越多的FTP客户端软件开始支持SSH协议上传和下载文件,这种协议方式就是SFTP。而且在和企业数仓对接时,常使用这种方式,将数据文件及控制文件传送给数仓。
SFTP的优势主要有,一是不需要再配置个FTP服务端;二是SSH协议是安全传输,上传和下载是经过加密的。
安装部署
以下介绍笔者在案例云CentOS 7上配置sftp的步骤。
以下步骤使用root操作,后续会涉及到权限问题,以下预计会建一个sftp的用户组名为:sftp,建一个sftp的用户,名为:silent。
查看openssh的版本,查看openssh的版本,版本必须大于4.8p1,低于的这个版本需要升级。
ssh -V
创建用户组:sftp
groupadd sftp
准备sftp的目录,这里设置为/home/sftp,sftp组的用户目录都放在这里,同时创建一个silent用户的目录
mkdir /home/sftp mkdir /home/sftp/silent
创建一个sftp用户,用户名为silent,密码为xxx
useradd -g sftp -d /home/sftp/silent -s /sbin/nologin silent passwd silent xxx
配置sshd_config,文本编辑器编辑/etc/ssh/sshd_config,配置sftp信息并指定sftp目录。
# 编辑/etc/ssh/sshd_config vi /etc/ssh/sshd_config # 找到如下这行,用#符号注释掉, # Subsystem sftp /usr/libexec/openssh/sftp-server # 在文件最后面添加如下几行内容,然后保存。 Subsystem sftp internal-sftp Match Group sftp ChrootDirectory /home/sftp/silent X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp
设定Chroot目录权限,特别注意,各个目录的归属组关系和权限很重要,查看权限和归属关系的示例在后文。
- 权限要求:
- 由ChrootDirectory指定的目录开始一直往上到系统根目录为止的目录拥有者都只能是root
- 由ChrootDirectory指定的目录开始一直往上到系统根目录为止都不可以具有群组写入权限
- 注意:权限不不符合要求,则在使用“sftp silent@127.0.0.1”测试时会出现 “packet_write_wait: Connection to 127.0.0.1 port 22: Broken pipe”的问题。
- 如笔者sshd_config配置的是:/home/sftp/silent,则:
- home、sftp 文件的所有者/组应为:root/root,权限是755,
- silent目录归属应为:root/sftp,权限是755。
- 权限要求:
#一般只需关注最后新建的目录的归属和权限即可。
# 修改归属组为root/root及权限为755
chown root:sftp /data/sftp/silent
chmod 755 /home/sftp/silent
建立SFTP用户登入后可写入的目录,通过上述配置和重启,用户silent已经可以登录。但使用chroot指定根目录后,根是无法写入的,没有权限,所以要新建一个目录供silent上传文件。这个目录所有者为silent,所有组为sftp,所有者有写入权限,而所有组无写入权限。
mkdir /home/sftp/silent/upload chown silent:sftp /home/sftp/silent/upload chmod 755 /home/sftp/silent/upload
重启sshd服务
systemctl restart sshd
使用linux本机验证sftp环境
#用silent用户名登录,yes确定,回车输入密码。 sftp silent@127.0.0.1 #显示 sftp> 则sftp搭建成功。 Connected to 127.0.0.1. sftp>
使用FileZilla FTP Client验证SFTP服务器,在FileZilla FTP Client输入主机IP地址、用户名、密码、端口连接SFTP服务器,端口默认为22。
使用windows 命令窗口sftp指令调用:
sftp silent@ip
C:\Users\waiti>sftp silent@ip silent@ip's password: Connected to silent@ip. sftp>
附录
另:查看目录归属组使用ll指令,查看目录权限并用数字表示使用stat指令
# 查看归属关系 ll / ll /home ll /home/sftp # 查看权限的数值 stat -c %a /home stat -c %a /home/sftp stat -c %a /home/sftp/silent