在某些环境中,系统管理员想要允许极少数使用者在可以传输档案到 Linux 机器中,但是不允许使用 SSH 。要实现这一目的,我们可以使用 SFTP,并为其构建 chroot 环境。
SFTP & chroot 背景:
SFTP 是指 SSH 档案传输协议(SSH File Transfer protocol)或安全档案传输协议(Secure File Transfer Protocol),它提供了可信资料流下的档案访问、档案传输以及档案管理功能。当我们为 SFTP 配置 chroot 环境后,只有被许可的使用者可以访问,并被限制到他们的家目录中,换言之:被许可的使用者将处于牢笼环境中,在此环境中它们甚至不能切换它们的目录。
在本文中,我们将配置 RHEL 6.X 和 CentOS 6.X 中的 SFTP Chroot 环境。我们开启一个使用者帐号 ‘Jack’,该使用者将被允许在 Linux 机器上传输档案,但没有 ssh 访问许可权。
步骤:1 建立组
[root@localhost ~]# groupadd sftp_users
步骤:2 分配附属组 (sftp_users) 给使用者
如果使用者在系统上不存在,使用以下命令建立(LCTT 译注:这里给使用者指定了一个不能登入的 shell,以防止通过 ssh 登入):
[root@localhost ~]# useradd -G sftp_users -s /sbin/nologin jack
[root@localhost ~]# passwd jack
对于已经存在的使用者,使用以下 usermod 命令进行修改:
[root@localhost ~]# usermod –G sftp_users -s /sbin/nologin jack
注意:如果你想要修改使用者的预设家目录,那么可以在 useradd 和 usermod 命令中使用 ‘-d’ 选项,并设定合适的许可权。
步骤:3 现在编辑配置档案 “/etc/ssh/sshd_config”
# vi /etc/ssh/sshd_config
#comment out the below line and add a line like below
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
# add Below lines at the end of file
Match Group sftp_users
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory %h
ForceCommand internal-sftp
此处:
Match Group sftp_users – 该引数指定以下的行将仅仅匹配 sftp_users 组中的使用者
ChrootDirectory %h – 该引数指定使用者验证后用于 chroot 环境的路径(预设的使用者家目录)。对于使用者 Jack,该路径就是/home/jack 。
ForceCommand internal-sftp – 该引数强制执行内部 sftp,并忽略任何~/.ssh/rc 档案中的命令。
重启 ssh 服务
# service sshd restart
步骤:4 设定许可权:
[root@localhost ~]# chmod 755 /home/jack
[root@localhost ~]# chown root /home/jack
[root@localhost ~]# chgrp -R sftp_users /home/jack
如果你想要允许 jack 使用者上传档案,那么建立一个上传资料夹,设定许可权如下:
[root@localhost jack]# mkdir /home/jack/upload
[root@localhost jack]# chown jack. /home/jack upload/
步骤:5 现在尝试访问系统并进行测试
尝试通过 ssh 访问系统
正如下图所示,使用者 jack 通过 SFTP 登入,而且因为 chroot 环境不能切换目录。
现在进行上传和下载测试,如下图:
正如上图所示,jack 使用者的上传下载功能都工作得很好。