使用 ssh 密钥、用户隔离(sftp 与 ssh)、不同端口和用户目录约束在 Amazon Linux 2 上设置 sftp

使用 ssh 密钥、用户隔离(sftp 与 ssh)、不同端口和用户目录约束在 Amazon Linux 2 上设置 sftp

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,我想您就可以开始了。

相关内容