linux下ssh配置之开放sftp文件传输但限制ssh登录配置过程
ssh配置之开放sftp文件传输但限制ssh和其他shell登录的配置过程
最近,我司部门最近和翼支付结算的对账文件传输协议需要从ftp协议更换为sftp协议,变更过程中需要限制账号不能ssh登录服务器进行shell操作。
具体需求如下:
- 用户sftpuser只能使用sftp登录,拒绝ssh、ftp、telnet等方式登录
- 用户登录默认根目录为/sftpdata/sftpuser01,其父层目录不可见。
- 登录后子目录download内所有文件与子目录,仅允许下载,不允许上传和修改。
- 登录后子目录can_any内所有文件与子目录,可允许下载、上传和修改操作。
账号都是操作系统创建的账号,结合网上查找的资料在测试服务器完成需求过程如下:
配置前背景
操作系统:
[root@zxkf1 ~]# lsb_release -a
LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
Description: CentOS release 6.5 (Final)
Release: 6.5
Codename: Final
ssh版本:
[root@zxkf1 ~]# ssh -V
OpenSSH_8.2p1, OpenSSL 1.0.2t 10 Sep 2019
配置步骤
-
创建相关目录
[root@zxkf1 ~]# mkdir /sftpdata
-
创建用户
[root@zxkf1 ~]# useradd -d /sftpdata/sftpuser01 -s /sbin/nologin sftpuser //创建用户 [root@zxkf1 ~]# passwd sftpuser //修改密码 Changing password for user sftpuser. New password: BAD PASSWORD: it is based on a dictionary word Retype new password: passwd: all authentication tokens updated successfully.
通过网上查看资料,新建用户的/etc/passwd用户的配置里/bin/false是最严格的禁止login选项,一切服务都不能用,/sbin/nologin只是不允许系统login,可以使用其他ftp等服务,nologin在这里符合使用场景,不允许用户进行登录shell操作,设置nologin合理
-
设置sftp的账号权限
配置sftp账号的权限需要对ssh配置文件进行修改,修改配置文件内容如下
[root@zxkf1 ~]# vi /etc/ssh/sshd_config # override default of no subsystems #Subsystem sftp /usr/libexec/openssh/sftp-server #注释掉此行并添加以下行 Subsystem sftp internal-sftp Match User sftpuser #此处设置控制的用户,也可以设置为组 ChrootDirectory /sftpdata/sftpuser01 X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp
配置完成后重启ssh服务
[root@zxkf1 sftpdata]# service sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ]
尝试使用软件登录过程中发现以下错误
-
设置sftp的账号目录权限
[root@zxkf1 ~]# cd /sftpdata/ //进入家目录 [root@zxkf1 sftpdata]# ll total 4 drwx------. 4 sftpuser sftpuser 4096 Apr 3 09:49 sftpuser01 [root@zxkf1 sftpdata]# chown root:root sftpuser01/ //设置家目录宿主 [root@zxkf1 sftpdata]# chmod 755 sftpuser01/ //设置读写执行为755/
-
关闭selinux(非常重要,踩坑时间最久的问题)
重新设置权限等后登录时还是会出现以下报错:
错误: Unknown eventType 37
错误: 读取目录列表失败
后查询各种资料,最后发现是linux上的selinu没有关闭导致的。[root@zxkf1 ~]# getenforce //查看selinu状态 显示开启 Enforcing [root@zxkf1 ~]# setenforce 0 //临时关闭selinu,永久关闭 [root@zxkf1 ~]# getenforce Permissive
关闭后尝试登录显示正常
-
删除隐藏的文件和文件夹并创建相关业务目录
[root@zxkf1 ~]# cd /sftpdata/sftpuser01/ [root@zxkf1 sftpuser01]# ls -la total 32 drwxr-xr-x. 4 root root 4096 Apr 3 09:49 . drwxr-xr-x. 3 root root 4096 Apr 3 09:49 .. -rw-r--r--. 1 sftpuser sftpuser 18 Jul 18 2013 .bash_logout -rw-r--r--. 1 sftpuser sftpuser 176 Jul 18 2013 .bash_profile -rw-r--r--. 1 sftpuser sftpuser 124 Jul 18 2013 .bashrc -rw-r--r--. 1 sftpuser sftpuser 500 May 7 2013 .emacs drwxr-xr-x. 2 sftpuser sftpuser 4096 Nov 12 2010 .gnome2 drwxr-xr-x. 4 sftpuser sftpuser 4096 Oct 26 2017 .mozilla [root@zxkf1 sftpuser01]# rm -rf .bash_logout [root@zxkf1 sftpuser01]# rm -rf .bash_profile [root@zxkf1 sftpuser01]# rm -rf .bashrc [root@zxkf1 sftpuser01]# rm -rf .emacs [root@zxkf1 sftpuser01]# rm -rf .gnome2 [root@zxkf1 sftpuser01]# rm -rf .mozilla [root@zxkf1 sftpuser01]# mkdir download //新建只能下载目录 [root@zxkf1 sftpuser01]# ll total 4 drwxr-xr-x. 2 root root 4096 Apr 7 11:59 download [root@zxkf1 sftpuser01]# cd download/ [root@zxkf1 download]# vi test.txt //创建测试下载账号 111 222 333 444 [root@zxkf1 sftpuser01]# mkdir can_any //新建上传下载修改目录 [root@zxkf1 sftpuser01]# chown sftpuser:sftpuser can_any/ [root@zxkf1 sftpuser01]# ll total 8 drwxr-xr-x. 2 sftpuser sftpuser 4096 Apr 7 17:00 can_any drwxr-xr-x. 2 root root 4096 Apr 7 15:36 download
-
目录传输测试
以下是download测试内容
传输文件到本地显示正常 传输到服务器文件测试失败 以下是can_any测试内容
此目录新建文件正常
上传和下载文件都成功
总结
本次试验是单个用户,后续将测试已组为用户的Sftp限制登录试验