在团队中管理SSH密钥的最佳实践是什么?


42

我与具有以下特征的小型团队(少于10个)的开发人员和管理员合作:

  • 团队的大多数成员都拥有> 1台个人计算机,其中大多数是便携式的
  • 团队成员通常可以使用sudo访问10-50台服务器

我认为这对于大多数初创公司和中小型企业IT团队来说都是很典型的。

在这样的团队中管理SSH密钥的最佳实践是什么?

您是否应该为整个团队共享一个密钥?

每个人都应该在共享帐户(每台服务器上的“ ubuntu”)上拥有自己的密钥吗?

单独的帐户?

每个团队成员是否应该为自己的每台笔记本电脑或台式机都保留一个单独的密钥?

Answers:


33

在我公司,我们使用LDAP在所有机器上拥有一组一致的帐户,然后使用配置管理工具(在我们当前的示例中为cfengine)authorized_keys在所有服务器上为每个用户分发文件。密钥文件本身(以及其他系统配置信息)保存在git存储库中,这样我们就可以查看密钥何时来来去去。cfengine还sudoers使用LDAP目录中的用户和组分发文件,该文件控制谁有权在每个主机上以root用户身份运行内容。

我们的生产服务器上完全禁用了密码身份验证,因此SSH密钥身份验证是必需的。政策鼓励为每台笔记本电脑/台式机/任何设备使用单独的密钥,并在所有密钥上使用密码短语,以减少丢失/被盗笔记本电脑的影响。

我们还有一个堡垒主机,该堡垒主机用于访问生产网络上的主机,从而使我们在该网络上具有非常严格的防火墙规则。大多数工程师都具有一些特殊的SSH配置,以使其透明:

Host prod-*.example.com
     User jsmith
     ForwardAgent yes
     ProxyCommand ssh -q bastion.example.com "nc %h %p"

在此设置中,添加新密钥或删除旧密钥需要一些仪式。我认为,要添加新的密钥,最好是保留审计线索并对所有人可见的操作。但是,由于涉及到的开销,我认为人们有时会在不再需要旧密钥时忽略了它,我们没有真正的方法来跟踪它,只能在员工离开公司时进行清理。在招募新工程师时,还会产生一些额外的摩擦,因为他们需要生成一个新密钥,并将其推出到所有主机上才能完全生产。

但是,最大的好处是为每个用户使用单独的用户名,这使我们可以在需要时轻松进行更精细的访问控制,并为每个用户提供一个显示在审核日志中的身份,这在尝试跟踪用户名时非常有用。生产问题返回到sysadmin操作。

在这种设置下,拥有对生产主机采取行动的自动化系统很麻烦,因为它们的“众所周知”的SSH密钥可以用作备用访问路径。到目前为止,我们仅使这些自动化系统的用户帐户具有执行其工作所需的最小访问权限,并接受恶意用户(必须已经是具有生产访问权限的工程师)也可以同样地执行这些操作,匿名使用应用程序的密钥。


这是一个很好的答案!后续问题:您使用cfengine分发.authorized_keys。您是否研究了将SSH公钥直接存储在LDAP服务器中的任何方法?他们大多需要修补sshd,这感觉很脆弱。
Evan Prodromou 2013年

我和厨师做了类似的事情。
gWaldo 2013年

1
@EvanProdromou我已经在LDAP中设置了SSH公钥,但是这比它值得的麻烦要多得多,因为我必须自己维护最新的SSH软件包,而这恰好是一些SSH漏洞的发生时间
Daniel Lawson

1
Sudo规则和SSH密钥也可以放在LDAP中,可以使用SSSD进行设置。链接:sudo.ws/sudoers.ldap.man.htmlaccess.redhat.com/knowledge/docs/zh-CN/Red_Hat_Enterprise_Linux/…–
fuero

我喜欢你ProxyCommand ssh -q在那儿!没看过。我不愿安装堡垒服务器,但如果它对最终用户透明,那么我可能会全力以赴。谢谢马丁!
the0ther

6

就个人而言,我喜欢每个员工在专用的ssh堡垒机器上拥有一把钥匙的想法,他们在上面拥有基本的用户帐户。该用户帐户具有1个ssh密钥,可授予对他们需要使用的所有服务器的访问权限。(这些其他服务器也应进行防火墙保护,以便仅启用从堡垒机的ssh访问)

然后,在他们的日常工作机器,笔记本电脑,平板电脑等上,他们可以自行选择在它们之间使用一个键还是多个键。

作为该网络上的系统管理员,您需要照顾的密钥数量最少(每个开发人员一个),可以轻松监视通过网络的ssh访问(因为所有路由都通过堡垒机),并且开发人员是否需要多个密钥或仅他们在自己的计算机之间共享一台计算机,这并不是什么大问题,因为您只有一台计算机要更新。(除非堡垒的ssh密钥被盗用,否则ut tbh比其中一个用户密钥要少得多)


5

我遇到这样的情况,我需要为40个开发人员组成的团队提供SSH密钥访问〜120个远程客户服务器。

我通过迫使开发人员通过单个“跳转主机”进行连接来控制访问。从该主机,我生成了私钥/公钥,并将其推送到客户服务器。如果开发人员需要从便携式计算机进行访问,则可以在本地系统上使用相同的密钥对。


2

我个人会与每个用户一起使用,那么您将立即拥有问责制,并且更容易设置限制-我不知道其他人的想法吗?


2

我听说过但没有用过的一种方法是让每个用户拥有一个软件包(例如.deb,.rpm),其中包含他们的ssh公钥配置以及他们想要自定义的任何dotfile(.bashrc ,.profile,.vimrc等)。签名并存储在公司存储库中。该软件包还可以负责创建用户帐户,或者可以补充创建帐户(cfengine / puppet等)或中央身份验证系统(如LDAP)的其他功能。

这些软件包然后通过您喜欢的任何机制(cfengine / puppet等,cron作业)安装到主机上。一种方法是拥有一个元包,该元包依赖于每个用户的包。

如果要删除公共密钥而不是用户,那么将更新每用户软件包。如果要删除用户,则删除程序包。

如果您具有异构系统,并且必须同时维护.rpm和.deb文件,那么我可以看到这有点烦人,尽管诸如Alien之类的工具可能会使这更容易些。

就像我说的那样,我自己还没有这样做。这种方法给我带来的好处是,它补充了中央LDAP系统和用户帐户的集中管理功能,因为它使用户可以轻松地更新其程序包以包含其.vimrc文件,例如,而无需对该文件进行管理通过诸如木偶之类的工具,用户可能无法访问。


1

您应该采取更安全的方法,并强制每个用户(对于每个设备)使用单独的密钥。

如果您在用户之间共享密钥(即使您是一个很小的团队),则撤消密钥会对其他所有人造成不便。

如果您允许员工为所有设备配备一把钥匙,那么他们可以选择可以与该设备连接的服务器。例如,一台便携式笔记本电脑可能仅限于一台或两台服务器,但是办公室的台式机可以访问所有服务器。



-4

一个方法可能是通过NFS通过/ home共享设置NIS服务器。这与服务器中的sudo相结合,并且仅允许您想要通过ssh配置访问每个服务器的用户。

这样,您团队的每个成员仅使用一个用户及其密钥来访问所有服务器。Sudo和一个用于管理任务的密码。

问候,

拉斐尔


1
1)启用NIS是一个安全漏洞。2)拥有一个密码和帐户违反了可追溯性和责任制。
Deer Hunter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.