今日升级了一下openssh,用了里面的自带chroot来实现SFTP的目录权限限制,详细如下:
首先升级openssh,目前版本是5.2p2,要使用ChrootDirectory需要4.8以上的版本
centos下:
./configure –prefix=/usr –sysconfdir=/etc/ssh –with-pam –with-kerberos5 –with-md5-passwords –with-tcp-wrapper
make
make install
编辑/etc/ssh/sshd_config
把
Subsystem sftp /usr/libexec/openssh/sftp-server
替换为
Subsystem sftp internal-sftp
开启内部sftp server支持
增加:
AuthorizedKeysFile /home/%u/.ssh/authorized_keys
Match group sftponly
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
保存退出。
/etc/init.d/sshd restart
重启sshd 服务
假设user是ssmax
# chown root.root /home/ssmax
# usermod -d /sftp ssmax
# mkdir /home/ssmax/sftp
# chown ssmax.ssmax /home/ssmax/sftp
# groupadd sftponly
# adduser user sftponly
由于chroot必须目录是只有root可写,所以我们 ChrootDirectory /home/%u 之后,必须把 /home/%u 改为root权限。
而把用户根目录改成/sftp,其实就是在chroot以后自动进入/home/%u/sftp目录,该目录才是用户可写的
这里有个必须要注意的地方就是,用户Key验证的时候,读取的key文件是在还没有chroot之前就读取的,所以如果改变了用户根目录,默认ssh就回去/sftp/.ssh/authorized_keys 里面读取公钥,这个目录当然是不存在的,所以我们要改变默认的key读取方式:
AuthorizedKeysFile /home/%u/.ssh/authorized_keys
当然也有例外一种解决方法,就是在/home/%u下面,再建立 /home/%u/home/%u
这样key验证会在 /home/%u/.ssh/authorized_keys 下面进行
chroot登录后直接就进入 /home/%u/home/%u,但是这样的话,好像目录就太多层了,而且也很混乱,哈哈。
整个sftp的过程:
首先用key登录ssh:
查找AuthorizedKeysFile 指定的key文件,如果是相对路径,就查找当前登录用户根目录(/etc/passwd)下的.ssh/authorized_keys文件
登录ssh后chroot 到 ChrootDirectory 设置的目录,改目录必须是只有root可写。
chroot以后进入用户根目录,这个时候根目录还是读取(/etc/passwd)里面的设置,但是根是相对于ChrootDirectory 的存在了,比如ssmax的根目录是/home/ssmax,ChrootDirectory 也是/home/ssmax
这个时候用户的根目录就在 /home/ssmax/home/ssmax 里面了。
当然如果不用key的话就不用搞得这么复杂咯,哈哈。