linux下ssh配置之开放sftp文件传输但限制ssh登录配置过程
- ssh配置之开放sftp文件传输但限制ssh和其他shell登录的配置过程
- 配置前背景
- 配置步骤
- 总结
ssh配置之开放sftp文件传输但限制ssh和其他shell登录的配置过程
最近,我司部门最近和翼支付结算的对账文件传输协议需要从ftp协议更换为sftp协议,变更过程中需要限制账号不能ssh登录服务器进行shell操作。
具体需求如下:
- 用户sftpuser只能使用sftp登录,拒绝ssh、ftp、telnet等方式登录
- 用户登录默认根目录为/sftpdata/sftpuser01,其父层目录不可见。
- 登录后子目录download内所有文件与子目录,仅允许下载,不允许上传和修改。
- 登录后子目录can_any内所有文件与子目录,可允许下载、上传和修改操作。
账号都是操作系统创建的账号,结合网上查找的资料在测试服务器完成需求过程如下:
配置前背景
操作系统:
1 2 3 4 5 6 | [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版本:
1 2 | [root@zxkf1 ~]# ssh -V OpenSSH_8.2p1, OpenSSL 1.0.2t 10 Sep 2019 |
配置步骤
-
创建相关目录
1[root@zxkf1 ~]# mkdir /sftpdata -
创建用户
1
2
3
4
5
6
7[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配置文件进行修改,修改配置文件内容如下
1
2
3
4
5
6
7
8
9[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服务
1
2
3[root@zxkf1 sftpdata]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]尝试使用软件登录过程中发现以下错误
-
设置sftp的账号目录权限
1
2
3
4
5
6[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没有关闭导致的。1
2
3
4
5[root@zxkf1 ~]# getenforce //查看selinu状态 显示开启
Enforcing
[root@zxkf1 ~]# setenforce 0 //临时关闭selinu,永久关闭
[root@zxkf1 ~]# getenforce
Permissive关闭后尝试登录显示正常
-
删除隐藏的文件和文件夹并创建相关业务目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33[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测试内容
传输文件到本地显示正常
![登录失败](https://img-blog.csdnimg.cn/20200407164543933.png)
传输到服务器文件测试失败 以下是can_any测试内容
此目录新建文件正常
上传和下载文件都成功
总结
本次试验是单个用户,后续将测试已组为用户的Sftp限制登录试验