SFTP+OpenSSH+ChrootDirectory设置
账户设置
SFTP的账户直接使用Linux操作系统账户,我们可以用useradd
命令来创建账户。
首先建立3个要管理的目录:
1 2 3 |
mkdir /home/sftp/homepage mkdir /home/sftp/blog mkdir /home/sftp/pay |
创建sftp组和www、blog、pay账号,这3个账号都属于sftp组:
1 2 3 4 5 6 7 8 9 10 11 12 |
groupadd sftp useradd -M -d /home/sftp -G sftp www useradd -M -d /home/sftp/blog -G sftp blog useradd -M -d /home/sftp/pay -G sftp pay # 将blog账户也加到apache组 useradd -M -d /home/sftp/blog -G apache blog #设置3个账户的密码密码 passwd www passwd blog passwd pay |
至此账户设置完毕。
SSH设置
首先要升级OpenSSH的版本。只有4.8p1及以上版本才支持Chroot。
设置sshd_config。通过Chroot限制用户的根目录。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
vim /etc/ssh/sshd_config #注释原来的Subsystem设置 Subsystem sftp /usr/libexec/openssh/sftp-server #启用internal-sftp Subsystem sftp internal-sftp #限制www用户的根目录 Match User www ChrootDirectory /home/sftp ForceCommand internal-sftp #限制blog和pay用户的根目录 Match Group sftp ChrootDirectory %h ForceCommand internal-sftp |
完成这一步之后,尝试登录SFTP:
1 2 3 4 5 6 |
sftp www@abc.com #或者 ssh www@abc.com #如果出现下面的错误信息,则可能是目录权限设置错误,继续看下一步 #Connection to abc.com closed by remote host. #Connection closed |
权限设置
要实现Chroot功能,目录权限的设置非常重要。否则无法登录,给出的错误提示也让人摸不着头脑,无从查起。我在这上面浪费了很多时间。
目录权限设置上要遵循2点:
- ChrootDirectory设置的目录权限及其所有的上级文件夹权限,属主和属组必须是root;
- ChrootDirectory设置的目录权限及其所有的上级文件夹权限,只有属主能拥有写权限,也就是说权限最大设置只能是755。
如果不能遵循以上2点,即使是该目录仅属于某个用户,也可能会影响到所有的SFTP用户。
1 2 |
chown root.root /home/sftp /home/sftp/homepage /home/sftp/blog /home/sftp/pay chmod 755 /home/sftp /home/sftp/homepage /home/sftp/blog /home/sftp/pay |
由于上面设置了目录的权限是755,因此所有非root用户都无法在目录中写入文件。我们需要在ChrootDirectory指定的目录下建立子目录,重新设置属主和权限。以homepage目录为例:
1 2 3 |
mkdir /home/sftp/homepage/web chown www.sftp /home/sftp/homepage/web chmod 775 /home/sftp/homepage/web |
要实现web服务器与blog账户互删文件的权限需求,需要设置umask,让默认创建的文件和目录权限为775即可。将下面的内容写入.bashrc中:
1 |
umask 0002
|
至此,我们已经实现了所有需要的功能。