如何配置独立的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 环境概述

host name = sftp.cmdschool.org
ip address = 10.168.0.169
OS = centos 8.x x86_64
关于OS的安装和基本配置,请参阅如下文档,

如何安装部署CentOS或RHEL 8?

如何完成CentOS 7.x的基本服务?

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 配置防止暴力破解的安全防护

如何安装配置Fail2ban?

参阅文档
========================

用户手册
——————–
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

没有评论

发表回复

FTP & SFTP & FTPS
如何解决Windows SFTP命令的权限提示?

1 前言 一个问题,一篇文章,一出故事。 今天笔者使用windows系统如下命令连接sftp服务器时 …

Bash
如何实现SFTP自动上传下载?

1 前言 一个问题,一篇文章,一出故事。 笔者最近需要实现sftp自动上传下载,于是整理此文。 以下 …

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

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