linux ssh sftp 端口分离

  • 一、简介
  • 二、分离ssh和sftp
  • 1、配置分离
  • 2、服务分离
  • 3、软连接
  • 4、生成sftp进程号文件
  • 5、取消22端口的sftp功能
  • 6、修改目录权限
  • 7、新增两个测试用户
  • 8、启动sftp服务
  • 9、重启sshd服务
  • 三、验证
  • 1、使用20022端口无法登陆ssh
  • 2、使用22端口无法登陆ssh
  • 3、使用22端口无法登陆sftp
  • 4、使用20022端口可以登陆sftp
  • 四、总结
  • 五、遗留问题


一、简介

默认linux的ssh和sftp端口都是22,有时候为了安全考虑,我们只想给某些用户sftp传输文件,不想他们拥有ssh的权限,这该怎么做呢?这篇博客我就讲讲如何将ssh和sftp的端口分离。

二、分离ssh和sftp

1、配置分离

默认情况下,linux的ssh和sftp服务都是用的sshd_config文件,所以我们需要配置文件分离,先拷贝配置,root用户执行命令:

cp /etc/ssh/sshd_config /etc/ssh/sftpd_config

修改配置

vi /etc/ssh/sftpd_config

在#Port 22的下面增加2行(必选)

# 设置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 /home/sftp

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

修改配置:

vi /etc/systemd/system/sftpd.service

将Description=OpenSSH server daemon改成Description=sftpd server daemon

Description=sftpd server daemon

将EnvironmentFile=/etc/sysconfig/sshd改成EnvironmentFile=/etc/sysconfig/sftp

# 配置文件从sshd改成sftp专用的
EnvironmentFile=/etc/sysconfig/sftp

将ExecStart=/usr/sbin/sshd -D $OPTIONS改成ExecStart=/usr/sbin/sftpd -f /etc/ssh/sftpd_config

# sftp服务绑定sftp、配置文件
ExecStart=/usr/sbin/sftpd -f /etc/ssh/sftpd_config

3、软连接

root执行命令

ln -sf  /usr/sbin/service  /usr/sbin/rcsftpd
ln -sf  /usr/sbin/sshd  /usr/sbin/sftpd

4、生成sftp进程号文件

root执行命令

touch /var/run/sftpd.pid

5、取消22端口的sftp功能

注释/etc/ssh/sshd_config文件的Subsystem sftp /usr/libexec/openssh/sftp-server
注释后的22端口只能用于ssh登录

# Subsystem     sftp    /usr/libexec/openssh/sftp-server

6、修改目录权限

目录权限设置原则:
ChrootDirectory设置的目录权限及其所有的上级目录权限,用户(user)和组(group)必须是root;
ChrootDirectory设置的目录权限及其所有的上级目录权限,只有用户(user)能拥有写权限,权限最大只能是755

# 需要设置ChrootDirectory的路径为root用户和root组
chown root:root /home/sftp

7、新增两个测试用户

用户组需要和/etc/ssh/sftpd_config文件中Match Group sftpusers一致,
用户目录需要在/etc/ssh/sftpd_config文件中ChrootDirectory /home/sftp目录下,

否则会出现很多棘手问题,密码自行设置

useradd -g sftpusers -d /home/sftp/test1 test1
passwd test1

useradd -g sftpusers -d /home/sftp/test2 test2
passwd test2

8、启动sftp服务

关闭selinux,否则无法启动sftpd服务

vi /etc/selinux/config

将SELINUX=enforcing改成SELINUX=permissive

SELINUX=permissive

使selinux生效

setenforce 0

重载配置

systemctl daemon-reload

启动服务

systemctl start sftpd

重启服务(如果需要的话)

systemctl restart sftpd

9、重启sshd服务

如果有执行第5点,则需要重启sshd服务

systemctl restart sshd

三、验证

1、使用20022端口无法登陆ssh

[root@localhost ~]# ssh -P 20022 test1@192.168.109.133
ssh: connect to host 20022 port 22: Invalid argument

2、使用22端口无法登陆ssh

[root@localhost ~]# ssh -P 22 test1@192.168.109.133
ssh: connect to host 22 port 22: Invalid argument

3、使用22端口无法登陆sftp

[root@localhost ~]# sftp -P 22 test1@192.168.109.133
test1@192.168.109.133's password: 
subsystem request failed on channel 0
Couldn't read packet: Connection reset by peer

4、使用20022端口可以登陆sftp

[root@localhost ~]# sftp -P 20022 test1@192.168.109.133
test1@192.168.109.133's password: 
Connected to 192.168.109.133.
sftp> 

# 查看文件夹(这里test1用户可以看到test2的目录,但是cd test2后会报无权限查看文件)
sftp> ls -ltr
drwx------    3 1001     1001           78 Dec  7 06:14 test1
drwx------    3 1002     1001          108 Dec  7 06:44 test2

# 进入test1目录可以看到test1用户的文件
sftp> cd test1
sftp> ls -ltr
-rw-r--r--    1 1001     1001          109 Dec  7 06:44 DEV.bat
-rw-r--r--    1 1001     1001            0 Dec  7 06:44 abc.txt
# 进入test2目录提示无权限查看文件
sftp> cd ../test2
sftp> ls -ltr
remote readdir("/test2"): Permission denied

其他用户组的用户可以使用22端口的ssh和sftp功能,这个就不演示了。

四、总结

以上就是博主在ssh和sftp分离时候的操作,博主新建一个虚拟机,按照上述步骤,一次成功。有不懂的可以在评论区留言。

五、遗留问题

ChrootDirectory这个属性,有其他博主说可以设置成%h或者%u,这个我测试出来有问题,总是报错:bad ownership or modes for chroot directory “/home/sftp/test1” [postauth],也希望有大佬能指点一二。