如何为具有智能密钥管理的支持者启用 ssh?

如何为具有智能密钥管理的支持者启用 ssh?

我的情况如下:

  • VPN 网络中有很多客户。
  • 每个支持者都有一台计算机,也位于 VPN 中。
  • 每个支持者都应该能够通过 ssh 登录所有系统。
  • 如果支持者离开公司,他就不能再登录客户端

我目前想到了以下解决方案:

  • 我们可以在所有客户端上使用相同的密码 - 但这显然是一个坏主意。
  • 我们可以在所有系统上存储每个支持者的公钥 - 但这很难维护。
  • 我们可以设置一个代理服务器,支持者首先连接到该服务器,然后该服务器能够通过密钥对等方式登录到客户端 - 但服务器可能会产生大量流量

我的问题:

针对这种情况,是否存在“最佳实践”或“标准解决方案”?也许是我不知道的工具? 我感觉我肯定忽略了一些东西。

答案1

通常,您希望能够让每个人对自己的行为负责,并且能够在他们的角色发生变化或离开公司时撤销他们的个人访问权限。您不希望做的只是撤销他们的个人凭证。

因此,您要尽可能避免共享凭证。

因为当默认管理员密码(每个人都知道并一直使用的密码)因为某个离职人员而必须更改时,这确实很不方便。重置该密码时,您可能会忽略一个或多个系统,而且通常情况下,该默认密码根本不会更改。

因此,理想情况下,所有需要管理的系统都配置为使用中央身份存储(例如 LDAP、Active Directory 等)。

在该中央身份存储中,每个人都有一个个人帐户,只有他们自己知道该帐户的密码。为了获得额外的权利,他们会获得一个或多个额外的组成员资格,并从这些成员资格中获得基于组的特权(sudo和其他权利)。因此,没有人需要管理员密码。

也许您想避免 ssh 登录的密码验证,而想使用 ssh 公钥验证。

OpenSSH 有一个鲜为人知的功能,称为AuthorizedKeysCommand它允许您配置您的 sshd 守护程序来运行特定的帮助程序来检索您通常存储和部署在用户文件中的公钥˜/.ssh/authorized_keys

该辅助程序可以查询数据库服务器、LDAP 服务器或任何可能适合您目的的服务器。

˜/.ssh/authorized_keys这避免了使用配置管理工具将密钥部署到文件或使用包含文件的(管理员/用户)主目录挂载网络共享的 常见替代方案˜/.ssh/authorized_keys

并且撤销所有地方的访问权限变得像从中央服务器中删除公钥一样简单。

请参阅此问答中的 LDAP 示例,当您已经将 LDAP 作为帐户的中央身份存储时,它很有用:使用 LDAP 进行 SSH 密钥验证


作为一个稍微简化的推导,您可以省略与中央身份存储的集成,该存储包含所有人的个人帐户和基于群组的访问权限。

这将为您提供一个共享帐户,您的所有支持人员都可以使用他们的个人私钥登录,前提是他们的公钥已集中注册并启用。删除他们的公共 ssh 密钥,他们的访问权限将被撤销。

  • 在每台需要管理的服务器上创建单个本地帐户。例如serverfault-support

  • 使用 NOPASSWD 选项为该帐户设置合适的sudo策略。不过,也许比这更严格一些:

    serverfault-support  ALL = NOPASSWD: AL
    
  • 将所有员工的公共 ssh 密钥收集到一个中心位置。

  • 生成(每当发生人员变动时)所需公钥的列表授权密钥格式

    ssh-ed25519 AAAAC3NzaB0x***...***== rob.smith@serverfault
    ssh-rsa AAAAB3NzaC1y***...***== rob.jones@serverfault
    

    细化:考虑添加额外的公钥选项例如,只允许在 VPN 中使用的 IP 地址范围内使用这些密钥,而不是在整个互联网上。

    from="10.80.0.0/14" ssh-ed25519 AAAAC3NzaB0x***...***== rob.smith@serverfault
    from="10.80.0.0/14" ssh-rsa AAAAB3NzaC1y***...***== rob.jones@serverfault
    
  • 请注意,公钥并不是特别敏感的数据,因此您可以将它们发布到一些方便的地方,例如https://www.example.com/current_authorized_keys

    细化:而不是静态列表,而是使用小型数据库后端和管理门户使该列表动态化。然后,您还可以限制输出以仅显示匹配的公钥:特定指纹和/或特定远程用户或更多,以提高安全性和性能。例如,考虑将到期日期附加到公钥,以要求您的员工定期生成新的密钥对以符合法规要求。

  • 在每台服务器上:设置一个Match指令以/etc/ssh/sshd_config启用AuthorizedKeysCommandserverfault-support 用户:

    # /etc/ssh/sshd_config
    # ...
    Match User serverfault-support
          PasswordAuthentication no
          AuthorizedKeysCommand /usr/bin/curl https://www.example.com/current_authorized_keys?user=%u&fingerprint=%f
          AuthorizedKeysCommandUser nobody
          AuthorizedKeysFile /dev/null
    

    该选项AuthorizedKeysFile /dev/null可防止用户成功将额外的密钥添加到本地~/.ssh/authorized_keys并绕过AuthorizedKeysCommand。

  • 您需要使用 ssh 指纹而不是用于登录的用户名来监控访问

  • 当我在启用了 SELinux 的系统上测试这一点时,需要进行一些策略更改。

相关内容