linux

【sftp】Linux 上将ssh和sftp服务分离

2023-10-11  本文已影响0人  Bogon

一、实验背景

1、基于对线上服务器的保密和安全,不希望开发人员直接登录线上服务器,因为登录服务器的权限太多难以管控,如直接修改代码、系统配置等,希望能限制开发人员ssh登录机器,但是通过ftp/sftp上传代码文件。

2、项目中一些模块会调用sftp客户端程序,上传文件到服务器,实现相关功能,需要搭建好sftp服务端。

  1. 默认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
  1. Windows FTP 工具验证
image.png

无法直接上传文件到 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

上一篇下一篇

猜你喜欢

热点阅读