【sftp】Linux 上将ssh和sftp服务分离
一、实验背景
1、基于对线上服务器的保密和安全,不希望开发人员直接登录线上服务器,因为登录服务器的权限太多难以管控,如直接修改代码、系统配置等,希望能限制开发人员ssh登录机器,但是通过ftp/sftp上传代码文件。
2、项目中一些模块会调用sftp客户端程序,上传文件到服务器,实现相关功能,需要搭建好sftp服务端。
- 默认linux的ssh和sftp端口都是22,有时候为了安全考虑,我们只想给某些用户sftp传输文件,不想他们拥有ssh的权限,这该怎么做呢?
二、实验环境
系统操作: CentOS7.5 Mininal
IP : 192.168.1.103
三、sftp服务简介
sftp是Secure FileTransferProtocol的缩写,安全文件传送协议,可以为传输文件提供一种安全的加密方法。
1)sftp 与 ftp 有着几乎一样的语法和功能
2)SFTP 为 SSH的一部分,是一种传输文件至服务器的安全方式
3)SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作
4)SFTP安全性非常高
5)SSH软件已经包含SFTP安全文件传输子系统
四、 配置 sftp ,分离ssh和sftp
1、配置分离
默认情况下,linux的ssh和sftp服务都是用的sshd_config文件,所以我们需要配置文件分离,先拷贝配置,root用户执行命令:
# cp /etc/ssh/sshd_config /etc/ssh/sftpd_config
修改配置
# vi /etc/ssh/sftpd_config
## 设置sftp端口
Port 20022
在#MaxStartups 10:30:100下方添加3行(可选)
## 最大并发数调整为1000
## 调整sftp连接数,默认值是10,所以如果用的人比较多,则需要酌情调整
MaxStartups 1000:30:1000
在#PermitRootLogin yes的下面增加2行(可选)
## 不允许root用户登录sftp
PermitRootLogin no
在#PidFile /var/run/sshd.pid的下面增加1行(必选)
## 设置sftp进程文件
PidFile /var/run/sftpd.pid
注释Subsystem sftp /usr/libexec/openssh/sftp-server,并在其下方增加13行(必选)
## 指定使用sftp服务使用系统自带的internal-sftp
Subsystem sftp internal-sftp
## 匹配sftp的用户组
Match Group sftpusers
## 禁止用户使用端口转发
X11Forwarding no
## 禁止用户使用端口转发
AllowTcpForwarding no
## 只能用于sftp登录
ForceCommand internal-sftp
## 限制用户的根目录
ChrootDirectory /opt/sftp/chroot
image.png
2、服务分离
默认情况下,sftp是ssh的子服务,所以我们需要先拷贝ssh的服务文件作为sftp使用,root用户执行命令:
# cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/sftpd.service
# cp /etc/pam.d/sshd /etc/pam.d/sftpd
# cp /etc/sysconfig/sshd /etc/sysconfig/sftp
修改配置:
将Description=OpenSSH server daemon改成Description=sftpd server daemon
将EnvironmentFile=/etc/sysconfig/sshd改成EnvironmentFile=/etc/sysconfig/sftp
将ExecStart=/usr/sbin/sshd -D $OPTIONS改成ExecStart=/usr/sbin/sftpd -f /etc/ssh/sftpd_config
# cat /etc/systemd/system/sftpd.service
#@@@@@@@@@@@@@@@@@@@@#
[Unit]
Description=sftpd server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sftp
ExecStart=/usr/sbin/sftpd -f /etc/ssh/sftpd_config
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
#@@@@@@@@@@@@@@@@@@@@#
3、软连接
# ln -sf /usr/sbin/service /usr/sbin/rcsftpd
# ln -sf /usr/sbin/sshd /usr/sbin/sftpd
4、生成sftp进程号文件
# touch /var/run/sftpd.pid
5、取消22端口的sftp功能
注释/etc/ssh/sshd_config文件的 Subsystem sftp /usr/libexec/openssh/sftp-server
注释后sshd的22端口只能用于ssh登录,无法用于文件上传下载
# sed -i 's/Subsystem/#Subsystem/g' /etc/ssh/sshd_config
image.png
6 创建用户组、用户,修改目录权限
我们需要创建一个用户组,专门用于sftp用户
# groupadd sftp
创建一个用户test,附加到sftp组,不允许登录操作系统
# useradd -G sftp -s /bin/false test
# passwd --stdin test <<< "Test@123"
# mkdir -p /opt/sftp/chroot
# mkdir -p /opt/sftp/chroot/upload
# chown root:test /opt/sftp/chroot
# chown test:sftp /opt/sftp/chroot/upload
# chmod 750 /opt/sftp/chroot
# chmod 700 /opt/sftp/chroot/upload
7、启动sftp服务
关闭 selinux
# sed -i's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
# setenforce 0
关闭selinux,否则无法启动sftpd服务
image.png# systemctl daemon-reload
# systemctl restart sshd
# systemctl start sftpd
# # systemctl start sftpd
# systemctl enable sftpd
image.png
五、验证
1 命令行验证
# sftp -P 20022 test@192.168.0.107
The authenticity of host '[192.168.0.107]:20022 ([192.168.0.107]:20022)' can't be established.
ECDSA key fingerprint is SHA256:D4ryTkMhQLs5eKz0cHQYVX/39D0cyojHfPZH+2MgOPw.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[192.168.0.107]:20022' (ECDSA) to the list of known hosts.
test@192.168.0.107's password:
Connected to 192.168.0.107.
sftp>
sftp> ls
upload
sftp>
sftp> cd upload
sftp>
sftp> ls -l
-rw-r--r-- 1 1000 1001 1925949 Oct 12 11:58 haproxy-2.2.16-4.tar.gz
# yum -y install sshpass
# sshpass -p "Test@123" sftp -P 20022 test@192.168.0.107
Connected to 192.168.0.107.
sftp>
sftp> ls -l
drwx------ 2 1000 1000 37 Oct 12 11:58 upload
sftp>
sftp> cd upload/
sftp>
sftp> ls -l
-rw-r--r-- 1 1000 1001 1925949 Oct 12 11:58 haproxy-2.2.16-4.tar.gz
image.png
# sshpass -p "Test@123" sftp -r -P 20022 test@192.168.0.107:/upload/haproxy-2.2.16-4.tar.gz /tmp/
Connected to 192.168.0.107.
Fetching /upload/haproxy-2.2.16-4.tar.gz to /tmp/haproxy-2.2.16-4.tar.gz
image.png
- Windows FTP 工具验证
无法直接上传文件到 upload 同级目录,需要进入upload目录
image.png image.png image.png六、参考
Linux ssh和sftp服务分离
https://mp.weixin.qq.com/s/dt6AC-XvXMyJc1d7sPbUWg
CentOS7.x上sftp的安装配置
https://www.jianshu.com/p/7d78f0fb7044
sftp 上传下载 命令介绍
https://www.cnblogs.com/satire/p/14656990.html
使用SFTP上传文件到Linux云服务器
https://help.aliyun.com/zh/ecs/use-cases/use-sftp-to-upload-files-to-a-linux-instance
如何使用Linux sftp命令传输文件
https://www.myfreax.com/how-to-use-linux-sftp-command-to-transfer-files
sftp批量下载文件的shell脚本
https://codeantenna.com/a/kAXz0J0shE
sftp非交互式下载文件夹 一行命令即可
https://blog.csdn.net/qq_42778369/article/details/128808520
shell实例:获取FTP/SFTP远程文件
https://www.jianshu.com/p/0864e98c6dba
Bash脚本,sftp只下载文件到同一目录下
https://www.qiniu.com/qfans/qnso-62807997