我有一个带有 openssh 的 linux 主机,它允许用户使用公钥登录。
AuthenticationMethods publickey
但是现在我有一些用户需要使用 sftp 作为文件删除来访问主机。此外,这些用户将使用用户密码而不是密钥对。
我使所有这些用户都属于该组sftp_users
。
[email protected]:~$ id
uid=1005(an_sftp_user) gid=1007(an_sftp_user) groups=1007(an_sftp_user),1006(sftp_users)
[email protected]:~$ groups
an_sftp_user sftp_users
[email protected]:~$
现在我创建/etc/ssh/sshd_config.d/sftp_users.conf
root拥有的文件0644:
Match Group sftp_users
X11Forwarding no
AllowTcpForwarding no
AuthorizedKeysCommand /bin/true
AuthenticationMethods keyboard-interactive
PasswordAuthentication yes
ChrootDirectory /sftp-incoming
我想要这样做是允许组中的用户sftp_users
能够使用密码和访问权限进行连接/sftp-incoming
。
实际发生的情况是,我看到一个消息服务器端auth.log
仅表示连接已关闭,并且在客户端,我看到(使用sftp -v
)它尝试了它在其中找到的证书$HOME/.ssh
(我已经为这些测试禁用了我的 ssh-agent ) 但从不尝试密码登录。
确实,一行是这样的:
debug1: Authentications that can continue: publickey
所以不知何故,我的比赛没有得到满足或没有被看到。但我不清楚为什么。
有什么建议我哪里出错了吗?
更新
@Gogowitsch 的解决方案在很大程度上回答了这个问题,尤其是注释,它sftp-internal
是 openssh 内部的,因此不需要在我的 chroot 监狱中提供二进制文件。同样重要的是发现 chroot 要求目录链一直是 0755 root,所以我必须对一些权限进行排序。
他将配置全部放在一个sshd_config
文件中的建议也很有帮助。事实上,一旦它开始工作,将该块移回配置文件并使用Include
它来包含它会失败而不会出错。该块根本没有使用。我正在使用 8.2:
OpenSSH_8.2p1 Ubuntu-4ubuntu0.1, OpenSSL 1.1.1f 31 Mar 2020
声称支持Include
(自7.3p1起出现,显然于 2020 年 2 月 1 日承诺(2020 年 3 月 31 日之前)。
我看到了这些直接的问题:
Match Group sftp_users
文件的最后,/etc/ssh/sshd_server
而不是放在sshd_server.d
. 这是因为最后一个AuthenticationMethods
似乎赢了。AuthenticationMethods
包含.password
这显然是允许密码登录的原因。ChrootDirectory
指令时,您还必须在Match Group sftp_users
块中使用以下行: 这是因为它/sftp-incoming
成为所有命令的文件系统的实际根目录。默认情况下,SSH 服务器会尝试运行二进制文件,例如/usr/lib/openssh/sftp-server
. 从 chroot 文件系统的角度来看,可能没有任何这样的文件。潜在地,您还必须运行以下命令以确保
/sftp-incoming
“其他”(八进制 0750 中的最后一位)无法访问该目录:作为实验设置,我使用了以下内容
Dockerfile
:您可以使用以下命令启动在端口 2200 上运行的 sshd:
要使用 sftp 连接到它,请运行以下命令: