我与具有以下特征的小型团队(少于10个)的开发人员和管理员合作:
- 团队的大多数成员都拥有> 1台个人计算机,其中大多数是便携式的
- 团队成员通常可以使用sudo访问10-50台服务器
我认为这对于大多数初创公司和中小型企业IT团队来说都是很典型的。
在这样的团队中管理SSH密钥的最佳实践是什么?
您是否应该为整个团队共享一个密钥?
每个人都应该在共享帐户(每台服务器上的“ ubuntu”)上拥有自己的密钥吗?
单独的帐户?
每个团队成员是否应该为自己的每台笔记本电脑或台式机都保留一个单独的密钥?
我与具有以下特征的小型团队(少于10个)的开发人员和管理员合作:
我认为这对于大多数初创公司和中小型企业IT团队来说都是很典型的。
在这样的团队中管理SSH密钥的最佳实践是什么?
您是否应该为整个团队共享一个密钥?
每个人都应该在共享帐户(每台服务器上的“ ubuntu”)上拥有自己的密钥吗?
单独的帐户?
每个团队成员是否应该为自己的每台笔记本电脑或台式机都保留一个单独的密钥?
Answers:
在我公司,我们使用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密钥可以用作备用访问路径。到目前为止,我们仅使这些自动化系统的用户帐户具有执行其工作所需的最小访问权限,并接受恶意用户(必须已经是具有生产访问权限的工程师)也可以同样地执行这些操作,匿名使用应用程序的密钥。
ProxyCommand ssh -q在那儿!没看过。我不愿安装堡垒服务器,但如果它对最终用户透明,那么我可能会全力以赴。谢谢马丁!
就个人而言,我喜欢每个员工在专用的ssh堡垒机器上拥有一把钥匙的想法,他们在上面拥有基本的用户帐户。该用户帐户具有1个ssh密钥,可授予对他们需要使用的所有服务器的访问权限。(这些其他服务器也应进行防火墙保护,以便仅启用从堡垒机的ssh访问)
然后,在他们的日常工作机器,笔记本电脑,平板电脑等上,他们可以自行选择在它们之间使用一个键还是多个键。
作为该网络上的系统管理员,您需要照顾的密钥数量最少(每个开发人员一个),可以轻松监视通过网络的ssh访问(因为所有路由都通过堡垒机),并且开发人员是否需要多个密钥或仅他们在自己的计算机之间共享一台计算机,这并不是什么大问题,因为您只有一台计算机要更新。(除非堡垒的ssh密钥被盗用,否则ut tbh比其中一个用户密钥要少得多)
我听说过但没有用过的一种方法是让每个用户拥有一个软件包(例如.deb,.rpm),其中包含他们的ssh公钥配置以及他们想要自定义的任何dotfile(.bashrc ,.profile,.vimrc等)。签名并存储在公司存储库中。该软件包还可以负责创建用户帐户,或者可以补充创建帐户(cfengine / puppet等)或中央身份验证系统(如LDAP)的其他功能。
这些软件包然后通过您喜欢的任何机制(cfengine / puppet等,cron作业)安装到主机上。一种方法是拥有一个元包,该元包依赖于每个用户的包。
如果要删除公共密钥而不是用户,那么将更新每用户软件包。如果要删除用户,则删除程序包。
如果您具有异构系统,并且必须同时维护.rpm和.deb文件,那么我可以看到这有点烦人,尽管诸如Alien之类的工具可能会使这更容易些。
就像我说的那样,我自己还没有这样做。这种方法给我带来的好处是,它补充了中央LDAP系统和用户帐户的集中管理功能,因为它使用户可以轻松地更新其程序包以包含其.vimrc文件,例如,而无需对该文件进行管理通过诸如木偶之类的工具,用户可能无法访问。
您应该采取更安全的方法,并强制每个用户(对于每个设备)使用单独的密钥。
如果您在用户之间共享密钥(即使您是一个很小的团队),则撤消密钥会对其他所有人造成不便。
如果您允许员工为所有设备配备一把钥匙,那么他们可以选择可以与该设备连接的服务器。例如,一台便携式笔记本电脑可能仅限于一台或两台服务器,但是办公室的台式机可以访问所有服务器。
几年前,Envy Labs编写了一个名为Keymaster的工具(与客户端Gatekeeper协作),可以为开发团队处理类似的事情。
在过去的两年中,这个项目并没有引起太多的热爱,但是您可能会修补一下它,或者让它重新焕发活力吗?
该仓库位于github:https://github.com/envylabs/keymaster
一个方法可能是通过NFS通过/ home共享设置NIS服务器。这与服务器中的sudo相结合,并且仅允许您想要通过ssh配置访问每个服务器的用户。
这样,您团队的每个成员仅使用一个用户及其密钥来访问所有服务器。Sudo和一个用于管理任务的密码。
问候,
拉斐尔