CentOS7 分离SSH和SFTP服务
目的:为了安全,只让某个用户只能连sftp, 不能连ssh,包括其它用户也不能ssh过来
系统内开启ssh服务和sftp服务都是通过/usr/sbin/sshd这个后台程序监听22端口,而sftp服务作为一个子服务,是通过/etc/ssh/sshd_config
配置文件中的Subsystem实现的,如果没有配置Subsystem参数,则系统是不能进行sftp访问的。
1. 复制SSH相关文件,作为sftp的配置文件
cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/sftpd.service
2. 拷贝/etc/pam.d/目录下的sshd文件,放到同目录,命名为:sftpd
cp /etc/pam.d/sshd /etc/pam.d/sftpd
3. 拷贝/etc/ssh/目录下的sshd_config文件,放到同目录,命名为:sftpd_config
cp /etc/ssh/sshd_config /etc/ssh/sftpd_config
4. 对service和rcsftpd进行软连接
ln -s /usr/sbin/service /usr/sbin/rcsftpd
5. 对sshd和sftpd进行软连接
ln -sf /usr/sbin/sshd /usr/sbin/sftpd
6. 拷贝/etc/sysconfig/目录下的sshd文件,放到同目录,命名为:sftp
cp /etc/sysconfig/sshd /etc/sysconfig/sftp
7. 拷贝/var/run/目录下的sshd.pid文件,放到同目录,命名为:sftpd.pid
cp /var/run/sshd.pid /var/run/sftpd.pid
二.修改复制好的配置文件
1. 修改/etc/systemd/system/目录下sftpd.service文件
vi /etc/systemd/system/sftpd.service
[Unit]
Description=sftpd server daemon
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sftp
ExecStart=/usr/sbin/sftpd -f /etc/ssh/sftpd_config
2. 修改/etc/ssh/目录下的sftpd_config文件
vi /etc/ssh/sftpd_config
AllowUsers sftpuser test@192.168.1.1 //只充许指定的用户连接,但在设了/bin/false只能sftp
Port 2222
PermitRootLogin no #38行
PidFile /var/run/sftpd.pid #116行
注释
#Subsystem sftp /usr/libexec/openssh/sftp-server并添以下5行
Subsystem sftp internal-sftp
ChrootDirectory /data/MINISTRY_IIT/ftphome
Match User sftpuser
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
3.清空/var/run/目录下的sftpd.pid文件内容
> /var/run/sftpd.pid
4.添加sftp的专用账户
useradd -g sftp -s /sbin/nologin -M sftpuser
passwd sftpuser
usermod -s /bin/false sftpuser
(pass: sftp168#)
5.重启sftpd服务
systemctl daemon-reload
systemctl start sftpd
三 . 测试
如果你链接服务器的时候出现下面的提示:
Write failed: Broken pipe Couldn’t read packet: Connection reset by peer
这个问题的原因是ChrootDirectory的权限问题,你设定的目录必须是root用户所有,
否则就会出现问题。所以请确保sftp用户根目录的所有人是root, 权限是 750 或者 755。
注意以下两点原则:
目录开始一直往上到系统根目录为止的目录拥有者都只能是 root,用户组可以不是 root。
目录开始一直往上到系统根目录为止都不可以具有群组写入权限