Sftp chroot howto

我之前在服务器上应用 Ftp chroot,那设置起来相对简单。但 Ftp service 不是服务器预装的,通常我会装 proftpd 或 vsftpd。

这次我想为什么不用服务器预装的 Sftp service?我有点钻了牛角尖—— Sftp 比 Ftp 好在哪?更安全?似乎这增加的安全性对我来说毫无意义。少占点硬盘空间?空余字节多着呢。总之,我想到了就想把它用起来。

首先新建一个用户组,sftponly,只要是这个组的用户 Sftp 登录后都会被 chroot。


groupadd sftponly

然后把需要 chroot 的用户都加到 sftponly 组


usermod -a -G sftponly user1

如果是新用户,则在创建的时候直接参组。


useradd -U -G sftponly -s /sbin/nologin -d /path/to/user1_home user1

然后要保证 /path/to/user1_home 这个目录及所有各级父目录的属主是 root,属性 755。user1 在他的 home directory 下是没有写权限的,不能由他自己创建文件或文件夹。这也容易理解,因为他被 chroot 以后,他的 home directory 看上去是系统根目录,普通用户当然不能在根目录这一级有写权限。这时需要 root 事先为 user1 创建好若干文件夹,如 /path/to/user1_home/documents、/path/to/user1_home/pictures,并将 documents、pictures 的属主指定为 user1。

然后我按网上的指点依样画瓢,在 /etc/ssh/sshd_config 里添加了这几行:


Match Group sftponly
    ForceCommand internal-sftp
    ChrootDirectory %h

然后重启 sshd service


service sshd restart

理论上这时 user1 已经可以在 Sftp 登录是被 chroot,限定在他的 home directory。但是 user1 怎么都登录不了,碰到的错误是:

Connection closed by server with exitcode 1

原来,在我的 /etc/ssh/sshd_config 里有这么一行


Subsystem       sftp    /usr/libexec/openssh/sftp-server

这是服务器预装时的配置,可能不是所有的服务器都这样,但有一定的普遍性。

这说明,Sftp 子系统是由 /usr/libexec/openssh/sftp-server 支持的。而在被 chroot 的 user1 看来,是没有 /usr/libexec/openssh/sftp-server 这个文件的。怎么办?两个办法:

办法一:将那一行改为


Subsystem     sftp    internal-sftp

办法二:在 user1 的 home directory 下建一个副本 %h/usr/libexec/openssh/sftp-server,只是简单的文件拷贝。

 

Leave a Reply

Your email address will not be published. Required fields are marked *