TDLR:我遇到了一个难题,根据用户主目录的权限,我可以让 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。对于非 sftpus 用户,我希望拒绝访问端口 2299。
好的,我创建了一个用户“user1”,其主目录为 /sftp-data/user1,shell 为 /sbin/nologin。我创建了 /sftp-data/user1/.ssh/authorized_keys,并用公共 ssh 密钥填充了该密钥。/sftp-data 由 root 拥有,权限为 700。/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 的 DEBUG 日志记录。使用 ChrootDirectory 指令,/sftp-data/user1 由 root 拥有,SSH 身份验证失败,我在 /var/log/secure 中看到以下内容:
debug1:无法打开授权密钥'/sftp-data/user1/.ssh/authorized_keys':权限被拒绝
ps 清楚地显示 root 正在运行 sshd 进程。
答案1
您的ChrootDirectory
是/sftp-data/user1
,必须由 root 拥有。它是:
# 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 已将用户更改为 user1 并放弃权限,因此 user1 无法进入较低级别的目录。为此,目录需要搜索权限 ( a+x
)。
chmod a+x /sftp-data/user1
现在,user1 可以进入子目录,并且该.ssh
目录应该是可读的。
答案2
我认为这主要是文件夹权限问题。我认为/sftp-data/user1/.ssh
和其下面的目录必须归 拥有user1
,但听起来它们归 拥有root
。请尝试以下操作root
:
验证公钥是否/sftp-data/user1/.ssh/authorized_keys
准确。之后,我认为您可能需要更改以下权限:
chmod 700 /sftp-data/user1/.ssh
chmod 600 /sftp-data/user1/.ssh/authorized_keys
chown root:sftpusers /sftp-data
chown -R user1:user1 /sftp-data/user1/.ssh
重新启动 SSH,我想您就可以开始了。