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],也希望有大佬能指点一二。