如何部署sftptool的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 环境概述
2.1.1 环境信息
host name = sftp.cmdschool.org
ip address = 192.168.0.50
public domain name = sftp.cmdschool.org
OS = centos 8.x x86_64
2.1.2 NTP配置
vim /etc/chrony.conf
修改如下配置,
server 192.168.0.250 iburst
然后,我们还建议设置时区,
timedatectl set-timezone Asia/Shanghai
2.1.3 安装需要的软件包
dnf install -y putty bc expect bzip2
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 990 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
根据以上的定义,我们添加用户的数据根目录,
mkdir -p /data/sftp/
根据以上的定义,我们添加sftp专用的用户组,
groupadd sftponly
根据以上的定义,我们需要增加定制端口的SELinux相应配置,
semanage port -a -t ssh_port_t -p tcp 990
或者,你可以干脆关闭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:990 0.0.0.0:* LISTEN 7124/sshd tcp6 0 0 :::22 :::* LISTEN 1075/sshd tcp6 0 0 :::990 :::* 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-port 990/tcp 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 775 /data/sftp/sftpUser01 chown sftpUser01:sftponly /data/sftp/sftpUser01/myhome
2.4.2 测试22端口的SSH服务登录
ssh sftpUser01@sftp.cmdschool.org
可见如下显示,
sftpUser01@sftp.cmdschool.org's password: Register this system with Red Hat Insights: insights-client --register Create an account or view all your systems at https://red.ht/insights-dashboard Could not chdir to home directory /myhome: No such file or directory 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 Connection closed. Connection closed
2.4.3 测试990端口的SFTP服务登录
ssh -p 990 sftpUser01@sftp.cmdschool.org
可见如下显示,
sftpUser01@sftp.cmdschool.org's password: This service allows sftp connections only. Connection to sftp.cmdschool.org closed.
然后,以上是测试SSH登录,接着我们测试SFTP登录,
sftp -P 990 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 990 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 2655 Oct 17 04:46 sftpUser01_rsa -rw-r--r-- 1 root root 577 Oct 17 04:46 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 id_rsa client.cmdschool.org:~/sftpUser01_rsa ssh client.cmdschool.org chmod 600 ~/sftpUser01_rsa
证书复制到Linux客户端后,我们可以使用如下命令范例使用,
sftp -P 990 -i ~/sftpUser01_rsa sftpUser01@sftp.cmdschool.org
可见如下显示,
Connected to sftp.cmdschool.org. sftp>
2.5.6 创建FileZilla客户端认证的私钥
cd /etc/ssh/sftpd_authorized_keys/sftpUser01/.ssh/ puttygen -O private sftpUser01_rsa -o sftpUser01_rsa.ppk scp sftpUser01_rsa.ppk client.cmdschool.org:~/sftpUser01_rsa.ppk
另外,客户端下载请参阅如下链接,
https://filezilla-project.org/download.php?type=client
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.3 确认配置生效
auditctl -l
可见如下输出,
-w /data/sftp/ -p rwxa
然后,可以使用如下命令监视日志,
tail -f /var/log/audit/audit.log
另外,如果没有生效,可以调整日志的级别解决,
Subsystem sftp internal-sftp -l VERBOSE -f AUTH
2.7 配置用户磁盘限额度
2.7.1 安装配额软件包
dnf install -y quota
2.7.2 启用文件系统配额
vim /etc/fstab
加入如下配置,
UUID=8d478795-c02c-439c-9342-0e720ab19043 /data ext4 defaults,usrquota,grpquota 0 0
配置修改后,请使用如下命令重新挂载文件系统,
mount -o remount /data
2.7.3 初始化配额数据库文件
quotacheck -cug /data/
– 参数“c”声明跳过旧配额文件重新扫描并创建配额数据库文件
– 参数“u”声明统计系统用户的配额数据
– 参数“g”声明统计系统组的配额数据
如果遇到如下错误提示,
quotacheck: Cannot remount filesystem mounted on /data read-only so counted values might not be right. Please stop all programs writing to filesystem or use -m flag to force checking.
请按照以上提示增加“-m”参数声明不要尝试以只读方式重新挂载文件系统,
quotacheck -cugm /data/
2.7.4 启用磁盘配额
quotaon /data/
2.7.5 定义用户配额
setquota -u sftpUser01 8388608 8388608 0 0 /dev/mapper/ds-data
以上配置解析如下,
– 1G大约是1024*1024
– 列1声明该用户的blocks软限制(“0”则无限制)
– 列2声明该用户的blocks硬限制(“0”则无限制)
– 列3声明该用户的inodes软限制(“0”则无限制)
– 列4声明该用户的inodes硬限制(“0”则无限制)
2.8 配置日志保存时间
2.8.1 修改配置
vim /etc/logrotate.conf
配置修改如下,
# see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 52 # create new (empty) log files after rotating old ones create # use date as a suffix of the rotated file dateext # uncomment this if you want your log files compressed #compress # RPM packages drop log rotation information into this directory include /etc/logrotate.d # system-specific logs may be also be configured here.
2.9 邮件客户配置
2.9.1 安装邮件投递代理(MTA)
dnf install -y postfix
2.9.2 安装邮件发送的客户端(MUA)
dnf install -y mailx
2.9.3 修改配置文件
cp /etc/postfix/main.cf /etc/postfix/main.cf.default vim /etc/postfix/main.cf
需要在配置文件末尾加入如下配置,
myhostname = sftp.cmdschool.org myorigin = cmdschool.org relayhost = 192.168.0.168 inet_interfaces = loopback-only mydestination = local_transport = error:local mail delivery is disabled
参数的作用如下,
– 参数“myhostname”声明postfix运行的主机名称
– 参数“myorigin”声明发件人的本地域名
– 参数“relayhost”声明smtp邮件中继服务器(范例中smtp根据IP地址验证,没有开启用户名和密码验证)
– 参数“inet_interfaces”声明发送邮件的网卡接口,范例指定回环接口
– 参数“mydestination”声明本机邮件的目标域名(即本地接收邮件域,如“cmdschool.org”),范例为空即不接收
– 参数“local_transport”声明本地邮件分发,范例“error:local mail delivery is disabled”为禁用本地分发
2.9.4 重启服务并配置服务开机启动
systemctl restart postfix systemctl status postfix systemctl enable postfix
2.10 安装sftptool ldap客户端
2.10.1 安装软件包
dnf install -y openldap-clients
2.10.2 测试与LDAP服务端的通讯
ldapsearch -x -h 389ds.cmdschool.org -p 389 -D "cn=directory manager" -w 389dspwd -b "ou=people,dc=cmdschool,dc=org" "(&(|(objectclass=person))(|(uid=m012345)))"
如果能正常显示如下界面则LDAP服务可用,
2.11 部署目录自动挂载
2.11.1 安装软件包
dnf install -y autofs
2.11.2 创建挂在配置
echo '/- /etc/auto.sftp' >> /etc/auto.master vim /etc/auto.sftp
2.12 部署sftptool
2.12.1 下载sftptool
wget https://github.com/tanzhenchao/sftptool/blob/main/sftptool.sh
注:以上地址提供完整的源代码,如果不能下载请使用浏览器下载
2.12.2 部署sftptool
cp sftptool.sh /bin/sftptool chmod +x /bin/sftptool
部署完成后,可以按如下命令测试部署,
sftptool
可见如下显示,
Usage: /usr/bin/sftptool {user|home|ca|passwd|quota|mount|log|ldap|backup}
2.12.4 修改sftptool参数
vim /bin/sftptool
修改如下配置,
authorizedKeysRootDir="/etc/ssh/sftpd_authorized_keys" authorizedKeysName="authorized_keys" sftpDataDir="/data/sftp" mailBox="/var/mail" mailFrom="sftpService@cmdschool.org" logAudit="/var/log/audit/audit.log" logAlert="/var/log/sftp/alert.log" logChange="/var/log/sftp/change.log" logMessage="/var/log/sftp/message.log" logDisable=true backupDir="/backup/sftp" quotaPath="/dev/mapper/ds-data" sftpGroupName="sftponly" sftpHomeName="myhome" sftpUserInfoFileName="userInfo" defaultQuota="8GB" ldapHost="389ds.cmdschool.org" ldapPort="389" ldapBindDN="cn=directory manager" ldapPasswd="389dspwd" ldapBaseDN="ou=people,dc=cmdschool,dc=org" defaultExpires="180" alertDays="30" alertFrequency="10" autoMastConf="/etc/auto.master" autoSftpConf="/etc/auto.sftp"
2.12.4 创建sftptool的计划任务
crontab -e
加入如下配置,
* */1 * * * /usr/bin/sftptool ca expire all check * */1 * * * /usr/bin/sftptool ca expire all flush
注意以上配置有如下作用,
– 计划任务用户检查并提前一个月提醒用户账号即将过期,提醒条件是<30天,每隔10天提醒一次
– 计划任务根据用户证书的过期时间禁用或启用用户证书(禁用后用户无法登录)
没有评论