TDLR:我有一个 Catch 22,根据用户主目录的权限,我可以让 SSH 身份验证正常工作,或者用户目录限制,但不能同时进行。
顺便说一句,我真的很想推出自己的 SFTP 服务器。请不要推荐我尝试 AWS Transfer 服务或其他替代方案。谢谢。
以下是 /etc/ssh/sshd_config 中的相关(从默认更改)内容:
Subsystem sftp internal-sftp
Port 22
Port 2299
Match Group sftpusers LocalPort 2299
ChrootDirectory /sftp-data/%u
ForceCommand internal-sftp
Match Group sftpusers LocalPort 22
DenyGroups sftpusers
Match LocalPort 2299 Group *,!sftpusers
DenyUsers *
我希望端口 22 像 ssh 通常那样运行,但仅适用于非 sftp 用户。对于 sftp 用户,在“sftpusers”组中,我希望端口 2299 仅用作 sftp,而不是 ssh。对于非 sftpusers,我希望拒绝访问端口 2299。
好的,所以,我用主目录 /sftp-data/user1 和 shell /sbin/nologin 创建了一个用户“user1”。我创建了 /sftp-data/user1/.ssh/authorized_keys 并用公共 ssh 密钥填充了它。/sftp-data 由具有 700 权限的 root 拥有。/sftp-data/user1/.ssh 及以下为 user1 所有,/sftp-data/user1/.ssh/authorized_keys 的权限为 600。 /sftp-data/user1 的所有权/权限在这里受到质疑。更多内容如下。
我创建了用户组 sftpusers 并将 user1 添加到该组。但是,您通过 AWS 获得的内置 ec2-user 不是该组的成员。使用 ec2-user 进行测试效果很好:通过 ssh 访问,端口 22 正常工作,但无法访问端口 2299。
因此,使用 user1 进行测试是有趣的地方。User1 无法访问端口 22 - 太好了!在 user1 拥有 /sftp-data/user1 的情况下,ssh 公钥认证在端口 2299 上成功,但用户立即注销,此消息保存在 /var/log/secure 中:
Sep 2 19:21:38 ip-192-168-0-25 sshd[10369]: Accepted publickey for user1 from <ip-address redacted> port 61110 ssh2: ECDSA SHA256:<sha redacted>
Sep 2 19:13:23 ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): session opened for user user1 by (uid=0)
Sep 2 19:13:23 ip-192-168-0-25 sshd[9803]: fatal: bad ownership or modes for chroot directory "/sftp-data/user1" [postauth]
Sep 2 19:13:23 ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): session closed for user user1
当然,这是有道理的。Chroot 要求 /sftp-data/user1 由 root 拥有,权限为 700。所以,这样做,现在 sftp(ssh 密钥)身份验证失败。
Sep 2 19:41:00 ip-192-168-0-25 sshd[11693]: error: AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys user1 SHA256:<sha redacted> failed, status 22
顺便说一句,eic_run_authorized_keys 是 AWS 围绕标准 ssh 身份验证启用 AWS Instance Connect 的包装器。
对于额外的信用......如果上述问题不够具有挑战性,你能想出一个方案,我可以让特定的 sftp 用户访问特定的项目目录,而且只有那些,而不为每个项目创建一个组?从每个用户的主目录链接到项目目录会很棒。
@anx 要求的其他信息:
# getent passwd user1
user1:x:1001:1001::/sftp-data/user1:/sbin/nologin
# namei -l /sftp-data/user1/.ssh/authorized_keys
f: /sftp-data/user1/.ssh/authorized_keys
dr-xr-xr-x root root /
drwxr-xr-x root root sftp-data
drwx------ root root user1
drwx------ user1 sftpusers .ssh
-rw------- user1 sftpusers authorized_keys
我为 sshd 打开了调试日志记录。使用 ChrootDirectory 指令,/sftp-data/user1 由 root 拥有,并且 SSH 身份验证失败,我在 /var/log/secure 中看到了这一点:
debug1:无法打开授权密钥“/sftp-data/user1/.ssh/authorized_keys”:权限被拒绝
ps 清楚地告诉我 root 正在运行 sshd 进程。
你
ChrootDirectory
的 is/sftp-data/user1
,它必须由 root 拥有。它是:但是,此时 sshd 已经将用户更改为 user1 并删除了权限,因此 user1 无法下降到较低级别的目录。为此,该目录需要搜索权限 (
a+x
)。现在 user1 可以下降到子目录并且该
.ssh
目录应该是可读的。我认为这主要是文件夹权限问题。我认为它
/sftp-data/user1/.ssh
和它下面的目录必须由 拥有user1
,但听起来它们是由 拥有的root
。尝试以下操作root
:验证输入的公钥
/sftp-data/user1/.ssh/authorized_keys
是否准确。之后,我认为这些是您可能需要更改的权限:重新启动 SSH,我想你会很高兴的。