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/.sshchmod 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 目录上的公钥授权的主要内容,如果未能解决你的问题,请参考以下文章

linux系统创建SFTP用户及设置其chroot权限

linux系统创建SFTP用户及设置其chroot权限

创建一个 SFTP 用户只访问一个目录。 [关闭]

阿里云中oss挂载到sftp

ssh及sftp配置

将多个文件从一个目录移动到远程 sftp 服务器上的另一个目录