我们有大约 2500 台 Linux 服务器。我们有一个 Jumpstart 服务器,可以通过它通过 SSH 连接到任何服务器以执行与系统管理员相关的任务。我们部署了一个私钥,并将匹配的公钥部署到所有服务器,但这是一个巨大的安全威胁。
我们希望为每台服务器部署不同的密钥,但这会产生大量密钥,难以管理。请建议处理大量服务器和密钥的正确方法。
答案1
FreeIPA 的 SSH 密钥管理相当不错。我在家里使用它很成功,但许多企业在生产中使用它(freeipa-users 邮件列表非常活跃)。它是基于 Red Hat 身份管理解决方案的上游免费软件项目。在 freeipa-users 邮件列表中也有 Red Hat 开发人员进行管理和帮助。
基本上,它是适用于 Unix/Linux 环境的类似 Active Directory 的服务。它还可以与 AD 同步。它具有 *nix 原生功能,如 NFS 自动挂载、集中式 sudo 策略等。
每个用户都可以将其 SSH 密钥添加到其 FreeIPA 配置文件中。然后可以将 sshd 配置为使用 sssd 包提供的 AuthorizedKeysCommand,该包将配置为查询 FreeIPA 服务器。结合 sudo 策略,您可以获得特权升级和审计(谁使用了 sudo)。
作为一个 RedHat 项目,在 Fedora 或 CentOS 上安装只需一行代码,但我已经成功安装并配置了 Debian 机器作为 FreeIPA 客户端。不过,我将身份验证服务器安装在 Fedora Server 上,这是其原生支持的平台。
答案2
我认为在各处使用相同 SSH 密钥的问题是缺乏责任感。
相反,我会让每个用户拥有自己的 SSH 密钥,并使用集中式身份验证和授权系统。
这样,公钥甚至不需要分发到目标系统,并且可以存储在中央目录服务中,例如免费IPA。
除了获得责任之外,您还可以定义细粒度的基于角色的访问控制 (RBAC) 策略。
答案3
对于 2500 台主机,你可能已经有一个配置管理系统,但你可以使用SaltStack如果你没有。我们有这个用于 root 身份验证:
user1auth:
ssh_auth:
- present
- user: root
- source: salt://resources/ssh_keys/user1
user2auth:
ssh_auth:
- present
- user: root
- source: salt://resources/ssh_keys/user2
跳转主机上不需要有私钥,登录时使用代理转发即可:ssh -A root@host
。
还有其他系统(例如Pupet、cfengine)。
答案4
将公钥复制到您登录的所有服务器通常是使用 SSH 的方式。如果您所做的是在 jumpstart 服务器上创建私钥/公钥对并复制民众密钥到~/.ssh/authorized_keys
您想要 ssh 进入的主机上的文件,那么这是(部分)可接受的通过 ssh 确保远程登录安全的方法。进一步确保 ssh 安全的其他注意事项包括:
- 改变
/etc/ssh/sshd_config
并设置PasswordAuthentication No
并PubkeyAuthentication yes
- 改变
LogLevel
然后监视/etc/ssh/sshd_config
异常。VERBOSE
/var/log/auth.log
- 编辑
/etc/security/access.conf
以仅允许来自特定 IP 的用户登录 - 编辑
/etc/pam.d/login
并设置account required pam_access.so
以启用您所做的更改access.conf
为每台服务器部署不同的密钥似乎意味着你想要一个不同的民众在每个服务器上输入密钥~/.ssh/authorized_keys
。我不清楚这样做的原因,但如果必须这样做,我会在 Jumpstart 服务器上创建一个文本文件,每行一个主机。使用循环for
解析文件并运行ssh-keygen -f $line_from_file
以为每个主机创建一个密钥对。您也可以使用相同的for
循环通过 ssh 进入每个主机并将公钥添加到~/.ssh/authorized_keys
使用sed -i
或类似的东西中。