是否可以在没有 shell 访问权限的情况下授予用户 sftp 访问权限?如果是,它是如何实施的?

Sol*_*osa 32 sftp

我有一群用户只需要将文件上传到他们设置的 homedirs。我认为 sftp 就足够了,但我不希望他们通过 shell 登录。那么有可能吗?我的平台是centos 7,用户的homedirs被存储可以说/personal/$user

我使用这些设置创建了用户

useradd -m -d /personal/user1 -s /sbin/nologin
Run Code Online (Sandbox Code Playgroud)

为用户分配了密码,然后当我使用 sftp 登录机器时,它说无法连接。

mar*_*elm 44

我喜欢以下用于管理 SSH 访问的设置,我在工作中使用它来管理小型服务器上的一组用户。安全性和易于管理在我的优先事项列表中占据重要位置。

它的主要特点是通过 Unix 组成员身份轻松管理 SSH 权限,具有严格定义的权限,并且默认情况下是安全的。

配置

安装软件(可选但有用):

yum install members   # or apt install members
Run Code Online (Sandbox Code Playgroud)

添加组:

addgroup --system allowssh
addgroup --system sftponly
Run Code Online (Sandbox Code Playgroud)

在 中/etc/ssh/sshd_config,确保以下设置为No

PermitRootLogin no
PubkeyAuthentication no
PasswordAuthentication no
Run Code Online (Sandbox Code Playgroud)

在 末尾/etc/ssh/sshd_config,添加以下两节:

Match Group allowssh
    PubkeyAuthentication yes

Match Group sftponly
    ChrootDirectory %h
    X11Forwarding no
    AllowTcpForwarding no
    ForceCommand internal-sftp
Run Code Online (Sandbox Code Playgroud)

(编辑完文件后不要忘记重启SSH)

解释

那么,这一切有什么作用呢?

  • 它总是禁用 root 登录,作为额外的安全措施。
  • 它总是禁用基于密码的登录(弱密码对于运行 sshd 的服务器来说是一个很大的风险)。
  • 它只允许(公钥)allowssh组中的用户登录。
  • 中用户sftponly组无法得到通过SSH外壳,仅SFTP。

然后只需通过管理组成员身份来管理谁具有访问权限(这些更改会立即生效,无需重新启动 SSH)。members allowssh将显示允许通过 SSH 登录的members sftponly所有用户,并将显示所有仅限于 SFTP 的用户。

# adduser marcelm allowssh
# members allowssh
marcelm
# deluser marcelm allowssh
# members allowssh
#
Run Code Online (Sandbox Code Playgroud)

请注意,您的 sftp 用户需要同时是sftponly(以确保他们不会获得 shell)和allowssh(以首先允许登录)的成员。

更多信息

  1. 请注意,此配置不允许密码登录;所有账户都需要使用公钥认证。这可能是您使用 SSH 获得的最大的安全优势,因此我认为即使您必须现在开始,也值得付出努力。

    如果你真的不想要这个,那么也添加PasswordAuthentication yesMatch Group allowssh节中。这将允许用户使用公钥和密码进行身份验证allowssh。或者,您可以添加另一个组(和Match Group节)来有选择地授予用户基于密码的登录。

  2. 此配置将任何sftponly用户限制在其主目录中。如果您不希望那样,请删除该ChrootDirectory %h指令。

    如果您确实希望 chrooting 工作,重要的是用户的主目录(以及它上面的任何目录)root:root由 group/other所有并且不能由 group/other 写入。主目录的子目录可以是用户拥有和/或可写的。

    是的,用户的主目录必须是 root 用户拥有的并且对用户不可写。遗憾的是,这种限制是有充分理由的。根据您的情况,ChrootDirectory /home可能是一个不错的选择。

  3. 设置的外壳sftponly用户/sbin/nologin是既无必要,也有害于这种解决方案,因为SSH的ForceCommand internal-sftp覆盖用户的shell。

    使用/sbin/nologin可能有助于阻止他们通过其他方式(物理控制台、samba 等)登录。

  4. 此设置不允许root通过 SSH直接登录;这形成了额外的安全层。如果你真的需要直接root登录,修改PermitRootLogin指令。考虑将其设置为forced-commands-only, prohibit-password, and (作为最后的手段)yes

  5. 对于奖励积分,看看限制谁可以suroot;添加一个名为 的系统组wheel,并auth required pam_wheel.so/etc/pam.d/su.

  • 这应该是公认的答案。它提供了解决方案并分解了每个步骤背后的推理。 (2认同)

kem*_*tep 13

编辑您/etc/ssh/sshd_config的包含:

Match User [SFTP user]
ForceCommand internal-sftp
Run Code Online (Sandbox Code Playgroud)

重新启动sshd。如果您有多个用户,将它们全部放在 match user 行上,以逗号分隔,如下所示:

Match User User1,User2,User3
Run Code Online (Sandbox Code Playgroud)

配置sftp为不允许 shell 访问的关键是通过ForceCommand 选项限制用户。

  • @Sollosa 仅尝试使用 `Match User [SFTP user]` `ForceCommand internal-sftp`,而不使用 chroot。 (2认同)