sftp chroot 目录上的公钥授权
Posted
技术标签:
【中文标题】sftp chroot 目录上的公钥授权【英文标题】:Public key authorization on sftp chroot directory 【发布时间】:2014-06-20 08:43:18 【问题描述】:我想将公钥授权添加到我的 sftp chroot 目录,但我总是得到:
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/test/.ssh/id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
Permission denied (publickey).
Couldn't read packet: Connection reset by peer
Chroot 之所以有效,是因为可以使用密码进行授权。 我在这个主机上有其他没有 chroot 的帐户,它可以使用这个密钥。 我试了很多次,还是不行。
在 auth.log 中的服务器上只有: 连接被 xxx [preauth] 关闭
这是我的目录:
ls -laR /sftp/
/sftp/:
total 12
drwxr-xr-x 3 root root 4096 May 3 16:55 .
drwxr-xr-x 23 root root 4096 May 3 14:46 ..
drwxr-xr-x 3 root root 4096 May 3 16:45 backup
/sftp/backup:
total 12
drwxr-xr-x 3 root root 4096 May 3 16:45 .
drwxr-xr-x 3 root root 4096 May 3 16:55 ..
drwxr-xr-x 3 backup sftpusers 4096 May 3 16:55 incoming
/sftp/backup/incoming:
total 12
drwxr-xr-x 3 backup sftpusers 4096 May 3 16:55 .
drwxr-xr-x 3 root root 4096 May 3 16:45 ..
drwx------ 2 backup sftpusers 4096 May 3 21:06 .ssh
/sftp/backup/incoming/.ssh:
total 12
drwx------ 2 backup sftpusers 4096 May 3 21:06 .
drwxr-xr-x 3 backup sftpusers 4096 May 3 16:55 ..
-rw------- 1 backup sftpusers 391 May 3 21:06 authorized_keys
我的用户:
backup:x:1002:1003::/incoming:/usr/sbin/nologin
我的 ssh 配置:
Match Group sftpusers
ChrootDirectory /sftp/%u
AuthorizedKeysFile /sftp/backup/incoming/.ssh/authorized_keys
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
请帮忙。
【问题讨论】:
【参考方案1】:问题已解决。
我已经改变了它: AuthorizedKeysFile /sftp/backup/incoming/.ssh/authorized_keys 到: AuthorizedKeysFile /sftp/%u/.ssh/authorized_keys
【讨论】:
感谢您的跟进。【参考方案2】:我尝试了这个解决方案(将 AuthorizedKeysFile 放入 Match 块中)并且 sshd -T
抱怨:
/etc/ssh/sshd_config line 153: Directive 'AuthorizedKeysFile' is not allowed within a Match block
(RHEL 6.6,openssh 5.3p1-104)
解决方案:authorized_keys 文件(以及用户的 .ssh 目录)必须存在于 /etc/passwd 定义的主目录位置,在 chroot 目录之外。
例如(使用 OP 用户名/uid): /etc/passwd:
backup:x:1002:1003::/home/backup:/sbin/nologin
创建目录/home/backup
,由root拥有
创建目录/home/backup/.ssh
,将所有权更改为备份,chmod 700 /home/backup/.ssh
将authorized_keys文件复制到/home/backup/.ssh
、chmod 400 authorized_keys
ls -laR /home
/home:
total 12
drwxr-xr-x 3 root root 4096 Jul 9 12:25 .
drwxr-xr-x 3 root root 4096 Sep 22 2014 ..
drwxr-xr-x 3 root root 4096 Jul 9 12:25 backup
/home/backup:
total 12
drwxr-xr-x 3 root root 4096 Jul 9 12:25 .
drwxr-xr-x 3 root root 4096 Jul 9 12:25 ..
drwx------ 3 backup sftpusers 4096 Jul 9 12:28 .ssh
/home/backup/.ssh:
total 12
drwx------ 3 backup sftpusers 4096 Jul 9 12:28 .
drwxr-xr-x 3 root root 4096 Jul 9 12:25 ..
-r-------- 3 backup sftpusers 391 Jul 9 12:29 authorized_keys
/etc/ssh/sshd_config 变为:
Match Group sftpusers
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
那么chroot目录结构是:
ls -laR /sftp/
/sftp/:
total 12
drwxr-xr-x 3 root root 4096 May 3 16:55 .
drwxr-xr-x 23 root root 4096 May 3 14:46 ..
drwxr-xr-x 3 root root 4096 May 3 16:45 backup
/sftp/backup:
total 12
drwxr-xr-x 3 root root 4096 May 3 16:45 .
drwxr-xr-x 3 root root 4096 May 3 16:55 ..
drwxr-xr-x 3 backup sftpusers 4096 May 3 16:55 incoming
drwxr-xr-x 3 root root 4096 May 3 16:55 home
/sftp/backup/incoming:
total 12
drwxr-xr-x 3 backup sftpusers 4096 May 3 16:55 .
drwxr-xr-x 3 root root 4096 May 3 16:45 ..
/sftp/backup/home:
total 12
drwxr-xr-x 3 root root 4096 May 3 16:55 .
drwxr-xr-x 3 root root 4096 May 3 16:45 ..
drwx------ 2 backup sftpusers 4096 May 3 21:06 backup
/sftp/backup/home/backup:
total 12
drwx------ 3 backup sftpusers 4096 May 3 21:06 .
drwxr-xr-x 3 root root 4096 May 3 16:55 ..
注意:/sftp/backup/home/backup
是空的,它只是用来提供一个看起来像非 chroot 的路径 /home/backup
-- .ssh
目录是 /home/backup/.ssh
不是 @987654336 @
【讨论】:
值得一提的是,SELinux 可以在 Redhat 发行版上咬你一口。我发现我需要运行restorecon -R /home/backup/.ssh
来修复我在 sshd 调试输出中看到的“权限被拒绝”错误。【参考方案3】:
Stephen Buchanan's answer(解决 RHEL6 无法在 Match 块中设置 AuthorizedKeys 的问题)将密钥拆分为 /home
,将内容拆分为 /sftp
,但可以将所有内容放在 /home
下。
您可以通过在用户的主目录下创建用户的 chroot 来做到这一点。例如,在sshd_config
中,将chroot 设置为/home/<user>/sftp
:
Match Group sftphome
ChrootDirectory /home/%u/sftp
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
和以前一样,确保/home/<user>
归根用户所有,并将 .ssh 密钥放在/home/<user>/.ssh
中,以便用户具有读取权限。现在创建/home/<user>/sftp/home/<user>
,所有目录都归root所有,除了最后一个<user>
,它应该归用户所有。最后,确保用户的主目录是/etc/passwd 中的/home/<user>
。
现在当用户登录时,根据/etc/passwd
在/home/<user>/.ssh
中查找ssh 密钥,在/home/<user>/sftp
中完成一个chroot,然后在/home/<user>
中完成一个cd
在 chroot 内部。也就是说,用户的远程工作目录将显示为/home/<user>
。
您可以选择在/home/<user>/sftp/home/<user>
下或/home/<user>/sftp
下的任何位置绑定挂载目录(从用户的角度来看是/
)。
可以省略sftp/
目录,创建/home/<user>/home/<user>
和chroot 到/home/<user>
,但这可能会造成混淆,因为.ssh
目录和任何其他文件都会在用户的/
中显示. sftp/
目录保持干净。
注意:实际上,如果缺少用户的主目录,sftp
通常只会将cd
转换为/
。您可能通过不在 chroot 中创建 /home/<user>
来滥用此属性,因此用户从 /
而不是 /home/<user>
开始。这有点脆弱,但可以派上用场。
【讨论】:
以上是关于sftp chroot 目录上的公钥授权的主要内容,如果未能解决你的问题,请参考以下文章