如何配置独立的SFTP服务?
- By : Will
- Category : FTP & SFTP & FTPS
1 基础知识
1.1 概念
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。
1.2 功能
可以为传输文件提供一种安全的加密方法。
1.3 特点
– SFTP 与 ftp 有着几乎一样的语法和功能。
– SFTP 为 SSH的一部分,是一种传输档案至 Blogger 伺服器的安全方式。
– SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作
– SFTP安全性非常高
– SSH软件已经包含SFTP安全文件传输子系统
1.4 缺点
– 传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多
1.5 客户端工具
1.5.1 windows客户端
Core FTP,FileZilla, WinSCP,Xftp
1.5.2 linux客户端
sftp username@remote ip(or remote host name)
2 最佳实践
2.1 环境概述
host name = sftp.cmdschool.org
ip address = 10.168.0.169
OS = centos 8.x x86_64
关于OS的安装和基本配置,请参阅如下文档,
2.2 创建独立的SFTP服务
2.2.1 定制独立的SFTP服务配置
ln -s /usr/sbin/sshd /usr/sbin/sftpd cp /etc/pam.d/sshd /etc/pam.d/sftpd cp /etc/ssh/sshd_config /etc/ssh/sftpd_config vim /etc/ssh/sftpd_config
配置修改如下,
Port 115 PidFile /var/run/sftpd.pid #Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp -l INFO -f AUTH Match Group sftponly ChrootDirectory /data/sftp/%u AllowTcpForwarding no ForceCommand internal-sftp -u 0007 X11Forwarding no
需要注意的是,
– 参数“-u 0007”声明“umask”为“0007”
根据以上的定义,我们添加用户的数据根目录,
mkdir -p /data/sftp/
根据以上的定义,我们添加sftp专用的用户组,
groupadd sftponly
根据以上的定义,我们需要增加定制端口的SELinux相应配置,
semanage port -a -t ssh_port_t -p tcp 115
或者,你可以干脆关闭SELinux,
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config setenforce 0
然后,我们可以通过如下命令测试配置,
/usr/sbin/sshd -f /etc/ssh/sftpd_config
然后,可以使用如下命令查看进程倾听的端口,
netstat -antp | grep sshd
可见如下显示,
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1075/sshd tcp 0 0 0.0.0.0:115 0.0.0.0:* LISTEN 7124/sshd tcp6 0 0 :::22 :::* LISTEN 1075/sshd tcp6 0 0 :::115 :::* LISTEN 7124/sshd #...
测试完毕后,你可以通过如下命令退出倾听,
kill -HUP 7124
2.2.2 定制独立的SFTP服务脚本
cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/sftpd.service vim /etc/systemd/system/sftpd.service
脚本修改如下,
[Unit] Description=SFTP server daemon After=network.target sshd-keygen.service auditd.service sshd.service Wants=sshd-keygen.target [Service] Type=simple EnvironmentFile=-/etc/sysconfig/sftpd ExecStart=/usr/sbin/sftpd -D -f /etc/ssh/sftpd_config $OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
配置保存后,需要使用如下命令重载使配置生效,
systemctl daemon-reload
然后,你可以使用如下命令启动服务或配置自启动,
systemctl start sftpd.service systemctl stop sftpd.service systemctl restart sftpd.service systemctl status sftpd.service systemctl enable sftpd.service
2.2.3 配置防火墙
firewall-cmd --permanent --add-service sftp firewall-cmd --reload firewall-cmd --list-all
2.3 禁用SSHD服务的SFTP服务
2.3.1 修改配置文件
vim /etc/ssh/sshd_config
需要注解掉如下配置,
#Subsystem sftp /usr/libexec/openssh/sftp-server
2.3.2 重启服务使配置生效
systemctl restart sshd.service
2.4 测试SFTP与SSH服务
2.4.1 创建密码验证的SFTP用户
useradd sftpUser01 -g sftponly -M -d /myhome -s /bin/false echo sftpPassword | passwd --stdin sftpUser01 mkdir -p /data/sftp/sftpUser01/myhome chown root:root /data/sftp/sftpUser01 chmod -R 755 /data/sftp/sftpUser01 chown sftpUser01:sftponly /data/sftp/sftpUser01/myhome
2.4.2 测试22端口的SSH服务登录
ssh sftpUser01@sftp.cmdschool.org
可见如下显示,
Activate the web console with: systemctl enable --now cockpit.socket Last login: Fri Dec 3 10:51:43 2021 from 10.168.0.8 Connection to sftp.cmdschool.org closed.
然后,以上是测试SSH登录,接着我们测试SFTP登录,
sftp sftpUser01@sftp.cmdschool.org
可见如下显示,
sftpUser01@sftp.cmdschool.org's password: subsystem request failed on channel 0 Couldn't read packet: Connection reset by peer
2.4.3 测试115端口的SFTP服务登录
ssh -p 115 sftpUser01@sftp.cmdschool.org
可见如下显示,
Activate the web console with: systemctl enable --now cockpit.socket Last login: Fri Dec 3 10:52:44 2021 from 10.168.0.8 Connection to sftp.cmdschool.org closed.
然后,以上是测试SSH登录,接着我们测试SFTP登录,
sftp -P 115 sftpUser01@sftp.cmdschool.org
可见如下显示,
sftpUser01@sftp.cmdschool.org's password: Connected to sftp.cmdschool.org. sftp>
2.5 添加公钥证书认证登录(可选)
2.5.1 修改配置文件
vim /etc/ssh/sftpd_config
配置修改如下,
Port 115 PidFile /var/run/sftpd.pid #Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp -l INFO -f AUTH Match Group sftponly ChrootDirectory /data/sftp/%u AllowTcpForwarding no AuthorizedKeysFile /etc/ssh/sftpd_authorized_keys/%u/.ssh/authorized_keys ForceCommand internal-sftp -u 0007 X11Forwarding no
另外,如果需要禁用密码认证,请配置如下参数(可选),
PasswordAuthentication no
配置修改后,我们需要重启服务使配置生效,
systemctl restart sftpd.service
根据以上配置,我们需要创建证书存储目录,
mkdir /etc/ssh/sftpd_authorized_keys
2.5.2 创建用户秘钥的存储目录
mkdir -p /etc/ssh/sftpd_authorized_keys/sftpUser01/.ssh chown sftpUser01:sftponly /etc/ssh/sftpd_authorized_keys/sftpUser01/.ssh chmod 700 /etc/ssh/sftpd_authorized_keys/sftpUser01/.ssh
2.5.3 创建用户秘钥
cd /etc/ssh/sftpd_authorized_keys/sftpUser01/.ssh/ ssh-keygen -t rsa -P 'sftpPassword' -f sftpUser01_rsa
以上“P”参数如果传空值则不加密,范例如下,
cd /etc/ssh/sftpd_authorized_keys/sftpUser01/.ssh/ ssh-keygen -t rsa -P '' -f sftpUser01_rsa
创建后,可以使用如下命令查看创建的公钥和私钥秘钥对,
ls -l /etc/ssh/sftpd_authorized_keys/sftpUser01/.ssh/
可见如下显示,
total 8 -rw------- 1 root root 1831 Dec 3 14:43 sftpUser01_rsa -rw-r--r-- 1 root root 407 Dec 3 14:43 sftpUser01_rsa.pub
2.5.4 部署SFTP服务端认证的公钥
cd /etc/ssh/sftpd_authorized_keys/sftpUser01/.ssh/ cat sftpUser01_rsa.pub > authorized_keys chmod 600 authorized_keys chown sftpUser01:sftponly authorized_keys
2.5.5 部署和使用SFTP Linux客户端认证的私钥
cd /etc/ssh/sftpd_authorized_keys/sftpUser01/.ssh/ scp sftpUser01_rsa 10.168.0.8:~/sftpUser01_rsa ssh 10.168.0.8 chmod 600 ~/sftpUser01_rsa
证书复制到Linux客户端后,我们可以使用如下命令范例使用,
sftp -P 115 -i ~/sftpUser01_rsa sftpUser01@sftp.cmdschool.org
可见如下显示,
Connected to sftp.cmdschool.org. sftp>
2.5.6 创建FileZilla客户端认证的私钥
yum install -y epel-release yum install -y putty
putty安装后,可以使用如下命令转换证书,
cd /etc/ssh/sftpd_authorized_keys/sftpUser01/.ssh/ puttygen -O private sftpUser01_rsa -o sftpUser01_rsa.ppk scp sftpUser01_rsa.ppk 10.168.0.8:~/sftpUser01_rsa.ppk
另外,客户端下载请参阅如下链接,
https://filezilla-project.org/download.php?type=client
如何使用,请参阅如下链接,
https://filezillapro.com/docs/v3/basic-usage-instructions/ssh-private-keys-for-sftp/
2.6 配置审核日志(可选)
2.6.1 确认Audio服务启动
systemctl status auditd
2.6.2 增加Audio规则
vim /etc/audit/rules.d/sftp.rules
加入如下配置,
-a exit,always -F dir=/data/sftp/ -F perm=rwxa
2.6.3 重启系统是配置生效
reboot
2.6.4 确认配置生效
auditctl -l
可见如下输出,
-w /data/sftp/ -p rwxa
然后,可以使用如下命令监视日志,
tail -f /var/log/audit/audit.log
如果上传文件“tightvnc-2.8.27-gpl-setup-64bit.msi”,可见如下日志,
# type=PATH msg=audit(1638840364.668:278): item=1 name="/myhome/tightvnc-2.8.27-gpl-setup-64bit.msi" inode=7864324 dev=fd:02 mode=0100600 ouid=1000 ogid=1000 rdev=00:00 nametype=CREATE cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0OUID="sftpUser01" OGID="sftponly" #
另外,如果日志不够详细,可以调整日志的级别解决,
Subsystem sftp internal-sftp -l VERBOSE -f AUTH
2.7 其他操作(可选)
2.7.1 配置用户磁盘额度
2.7.2 配置防止暴力破解的安全防护
参阅文档
========================
用户手册
——————–
https://www.openssh.com/manual.html
SSHD配置参数
——————-
https://man.openbsd.org/sshd_config
sftp-server的配置参数
———————-
https://man.openbsd.org/sftp-server
sftp的使用
———————-
https://man.openbsd.org/sftp
Linux Audit
——————
https://linux.die.net/man/8/auditd
https://linux.die.net/man/8/auditctl
https://linux.die.net/man/7/audit.rules
https://github.com/Neo23x0/auditd/blob/master/audit.rules
没有评论