SFTP ChrootDirectory 限制用户根目录chroot


useradd -d /data/app/ app
passwd app
chmod 755 /data/
cd /data
chmod 755 app/
chown root:root app/

cat >>/etc/ssh/sshd_config <<EOF
Match User app
 ChrootDirectory /data/app/
 X11Forwarding no
 AllowTcpForwarding no
 ForceCommand internal-sftp
EOF
service sshd restart
vi /etc/passwd
app:x:1017:1018::/data/app/:/sbin/nologin

编译安装

今日升级了一下openssh,用了里面的自带chroot来实现SFTP的目录权限限制,只显示sftp用户家目录 详细如下:
首先升级openssh,目前版本是5.2p2,要使用ChrootDirectory需要4.8以上的版本:
./configure -prefix=/usr/ssh -sysconfdir=/etc/ssh -with-pam -with-kerberos5 -with-md5-passwords -with-tcp-wrapper
make
make install

编辑/etc/ssh/sshd_config
==1. 把需要使用sftp的用户在sshd里面做限制家目录==

把
Subsystem      sftp    /usr/libexec/openssh/sftp-server
替换为
Subsystem sftp internal-sftp
Match user by,fruit,fgslot,laya,ptas,pth5,texas
#Match group sftponly
  AuthorizedKeysFile /data/sftp/%u/.ssh/authorized_keys
  PasswordAuthentication yes
  ChrootDirectory /data/sftp/%u
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp

保存退出。
重启sshd 服务
/usr/ssh/sbin/sshd
(/etc/init.d/sshd restart)

==2. 添加用户,并且处理权限==

NAME=act
groupadd sftponly
useradd -m -s /sbin/nologin -d /home/sftp/$NAME $NAME
usermod -g sftponly $NAME
vi /etc/passwd
修改家目录:$NAME:x:1013:1013::/$NAME:/sbin/nologin
cd /home/sftp
chown -R root:sftponly $NAME
chmod 755 $NAME
mkdir $NAME/$NAME
chown $NAME:$NAME $NAME/$NAME
ln -s /home/sftp/$NAME/$NAME /home/test-php-1/data/www/fg/gamelist/public/global/list/$NAME
修改sshd配置限制用户家目录:vi /etc/ssh/sshd_config
service sshd restart

==由于chroot必须目录是只有root可写,所以我们 ChrootDirectory /home/%u 之后,必须把 /home/%u 改为root权限。==
用chroot将用户的根目录指定到%h,%h代表用户home目录,这样用户 就只能在用户目录下活动。也可用%u,%u代表用户名。

chown root:sftponly /home/%u;chmod 750 /home/%u

==而把用户根目录改成/sftp,其实就是在chroot以后自动进入/home/%u/sftp目录,该目录才是用户可写的==

  • 这里有个必须要注意的地方就是,用户Key验证的时候,读取的key文件是在还没有chroot之前就读取的,所以如果改变了用户根目录,默认ssh就回去/sftp/.ssh/authorizedkeys 里面读取公钥,这个目录当然是不存在的,所以我们要改变默认的key读取方式:AuthorizedKeysFile /home/%u/.ssh/authorizedkeys
  • 当然也有例外一种解决方法,就是在/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 里面了。