一、最近接到一个项目组的需求搭建文件服务器,需求如下
1、用户:amovs、upload、download
2、组:amovs、dataload、download
3、具体需求是upload和download的家目录都为同一个目录dataload
4、upload能上传也就是能读能写、download用户只能下载
5、amovs因需要进行批量自动化删除日志等操作,所以对于dataload目录权限需要读、写权限
6、并且upload和download只能使用sftp软件上传和下载文件使用,不能作为登录用户
详细规划了一下用户和组的关系如下:
amovs属于dataload组,家目录为/amovs
upload为属于dataload组 /data/dataload
download属于download组 /data/dataload
二、搭建环境如下:
Red Hat Enterprise Linux Server release 6.7 (Santiago)
具体搭建步骤:
1、查看ssh相关版本
[root@iccsdb02 /]# rpm -qa | grep ssh
openssh-clients-5.3p1-111.el6.x86_64
openssh-server-5.3p1-111.el6.x86_64
ksshaskpass-0.5.1-4.1.el6.x86_64
libssh2-1.4.2-1.el6_6.1.x86_64
openssh-5.3p1-111.el6.x86_64
2、创建相关组和用户
[root@iccsdb02 /]# groupadd -g 601 amovs
[root@iccsdb02 /]# groupadd -g 602 dataload
[root@iccsdb02 /]# groupadd -g 603 download
[root@iccsdb02 /]# useradd -u 601 -g amovs -G dataload -d /amovs amovs
[root@iccsdb02 /]# useradd -u 602 -s /bin/false -g dataload -d /data/dataload upload
[root@iccsdb02 /]# useradd -u 603 -s /bin/false -g download -d /data/dataload download
3、编辑/etc/ssh/sshd_config 更为为如下:
#注释掉这行
#Subsystem sftp /usr/libexec/openssh/sftp-server
添加如下配置
Subsystem sftp internal-sftp #指定使用sftp服务使用系统自带的internal-sftp
#Match Group dataload #如何限制组就改成这样 这里也可以使用用户Match User,用逗号隔开
Match User upload、download #我这里的需求是控制用户所以就配置成这样
ChrootDirectory /data #此目录实际上传目录的上级目录,例如这里实际存储文件位置是/data/dataload
#用chroot将指定用户的根目录,chroot的详细含义请参考如下链接:
ForceCommand internal-sftp #指定sftp命令
X11Forwarding no #这两行,如果不希望该用户能使用端口转发的话就加上,否则删掉
AllowTcpForwarding no
注意:
要实现Chroot功能,目录权限的设置非常重要。否则无法登录,给出的错误提示也让人无语。
基本上报错都是这样的
# sftp [email protected]
Connecting to 192.168.56.102...
[email protected]'s password:
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer
目录权限设置这里从网上找到了3条总结测试如下:
1、ChrootDirectory设置的目录权限及其所有的上级文件夹权限,属主和属组必须是root:root
这里我的/data 属组为root:root 而/data/dataload 属组为upload:dataload ,具体如下
[root@iccsdb02 ~]# ls -ld /data
drwxr-xr-x 3 root root 4096 5月 23 17:27 /data
[root@iccsdb02 data]# ls -ld /data/dataload/
drwxrwxr-x 4 upload dataload 4096 5月 23 18:11 /data/dataload/
2、ChrootDirectory设置的目录权限及其所有的上级文件夹权限,只有属主能拥有写权限,也就是说权限最大设置只能是755
这条没试出来
3、ChrootDirectory %h 如果选择了这种模式,用户的home目录必须是root:root 权限,它的上级目录页必须是root:root,否则就会报错。
[root@iccsdb02 /]# ls -ld /amovs/
drwxr-xr-x 3 amovs amovs 4096 5月 23 16:00 /amovs/
[root@iccsdb02 /]# chown root:root /amovs
[root@iccsdb02 /]# ls -l /amovs/
drwxr-xr-x 3 root root 4096 5月 23 16:39 data
这里设置完了以后还出现了一个问题就是通过sftp软件上传后的文件属性是644的,也就是amovs用户删除不了upload 用户的上传的文件,这说明上传文件的权限并没有走系统用户umask,通过查了一些资料修改PAM值并测试成功了。
一,查看并开启ssh的PAM功能,
运行命令看看 ldd /usr/sbin/sshd | grep libpam.so支持PAM
[amovs@iccsdb02 20170523]$ ldd /usr/sbin/sshd | grep libpam.so
libpam.so.0 => /lib64/libpam.so.0 (0x00007fce94f79000)
编辑/etc/ssh/sshd_config
UsePAM yes #这默认是开启的,没有开的话开启了
二,编辑/etc/pam.d/sshd,(具体说明参照PAM),加上umask那一行。
#%PAM-1.0
auth required pam_sepermit.so
auth include password-auth
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session optional pam_keyinit.so force revoke
session include password-auth
session optional pam_umask.so umask=0002
重启sshd服务就可以了
测试如下: