如何部署sftptool的sftp服务运行环境?

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天提醒一次
– 计划任务根据用户证书的过期时间禁用或启用用户证书(禁用后用户无法登录)

没有评论

发表回复

FTP & SFTP & FTPS
如何基于Oracle Linux 9.x实现SFTP邮件认证2FA?

1 前言 一个问题,一篇文章,一出故事。 笔者想实现SFTP的2FA以便增强SFTP服务的安全性,于 …

FTP & SFTP & FTPS
如何基于配置SFTP集成AD域?

1 前言 一个问题,一篇文章,一出故事。 笔者最近接到需要在SFTP集成AD的任务,于是整理此章节。 …

FTP & SFTP & FTPS
如何基于Oracle Linux 9.x配置独立的SFTP服务?

1 基础知识 1.1 概念 sftp是Secure File Transfer Protocol的缩 …