在团队中pipe理SSH密钥的最佳做法是什么?

我与小团队(<10)的开发人员和pipe理员工作,具有以下特点:

  • 团队中的大多数成员都有一台以上的个人电脑,其中大部分都是便携式的
  • 团队成员可以访问10-50个服务器,通常使用sudo

我认为这对于大多数创业公司和中小型企业IT团体来说是非常典型的。

在这样的团队中pipe理SSH密钥的最佳做法是什么?

你应该为整个团队分享一把钥匙吗?

每个人都应该拥有自己的共享账号(每台服务器上的“ubuntu”)?

单独账户?

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

在我的公司,我们使用LDAP在所有机器上拥有一组一致的帐户,然后使用configurationpipe理工具(在我们的案例中是cfengine)为所有服务器上的每个用户分发authorized_keys文件。 密钥文件本身(以及其他系统configuration信息)保存在一个git仓库中,所以我们可以看到密钥的来去。 cfengine还会分发一个sudoers文件,用于控制谁有权在每个主机上以根用户身份运行LDAP目录中的用户和组。

密码validation在我们的生产服务器上完全禁用,所以SSH密钥validation是强制性的。 政策鼓励为每台笔记本电脑/台式机/任何设备使用单独的密钥,并在所有密钥上使用密码短语,以减less丢失/被盗的笔记本电脑的影响。

我们还有一个堡垒主机,用于访问生产networking上的主机,使我们能够在该networking上拥有非常严格的防火墙规则。 大多数工程师都有一些特殊的SSHconfiguration使其透明:

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

添加一个新的密钥或删除一个旧的密钥需要一些仪式在这个设置。 我认为,为了添加一个新的密钥,它最好是一个操作,留下审计线索,并且每个人都可以看到。 但是,由于涉及的开销,我认为人们有时会忽略掉不再需要的旧密钥,而且除了在员工离开公司时进行清理,我们没有办法进行跟踪。 当新工程师join时,它还会产生一些额外的摩擦,因为他们需要生成一个新的密钥,并在所有主机完全生产之前将其推出。

然而,最大的好处是为每个用户分别设置了一个用户名,这使得我们在需要的时候可以更轻松地进行更细粒度的访问控制,并为每个用户提供一个身份,显示在审计日志中,这对于追踪生产问题返回到系统pipe理员操作。

在这种设置下,让自动系统对生产主机采取行动是很麻烦的,因为他们的“公知的”SSH密钥可以作为一种替代的访问path。 到目前为止,我们只是让这些自动化系统的用户帐户只需要最小的访问权限来完成他们的工作,并且接受恶意用户(他们必须已经是一名具有生产访问权限的工程师)也可以执行同样的操作,匿名使用应用程序的密钥。

就我个人而言,我喜欢每个员工都有一个钥匙的想法,他们在一个专用的ssh堡垒机器上拥有一个基本的用户帐户。 该用户帐户有1个ssh密钥,授予他们需要使用的所有服务器的访问权限。 (这些其他服务器也应该被防火墙关掉,所以只有从堡垒机器启动ssh访问)

然后,在他们的日常工作机器,笔记本电脑,平板电脑等,他们可以做出自己的select之间有一个键或多个键。

作为该networking上的系统pipe理员,您拥有最less数量的密钥(每个开发人员一个),可以通过networking轻松监视ssh访问(因为它全部路由通过堡垒机器),并且如果开发人员需要多个密钥或只是一个他们在他们的机器之间共享这不是真正的问题,因为你只有一台机器来更新。 (除非堡垒ssh密钥受到危害,否则这比用户密钥中的一个更不可能)

我曾经遇到过这样的情况:我需要为一个由40位开发人员组成的团队提供SSH密钥访问权限,以供120个远程客户服务器使用。

我通过强迫开发者通过一个“跳转主机”来连接访问来控制访问。 从那个主机,我产生了私钥/公钥,并把它们推送到客户服务器。 如果开发人员需要使用笔记本电脑,则可以在本地系统上使用相同的密钥对。

我个人会和每个用户一起去,那么你就会立即有问责制并且更容易设置限制 – 我不知道别人怎么看?

我听说过的一个方法,但没有用我自己,每个用户都有一个包(例如,.deb,.rpm),其中包含他们的SSH公钥configuration,以及他们想要定制的任何点文件(.bashrc ,.profile,.vimrc等)。 这是签署并存储在公司存储库。 这个软件包还可以负责创build用户帐户,或者可以补充创build帐户(cfengine / puppet等)或中央authentication系统(如LDAP)的其他内容。

然后通过你喜欢的任何机制(cfengine / puppet etc,cron job)将这些包安装到主机上。 一种方法是有一个元数据包,它依赖于每个用户的包。

如果您想删除公钥,但不是用户,则更新每个用户包。 如果要删除用户,请删除该包。

如果你有异构的系统,并且必须同时维护.rpm和.deb文件,那么我可以看到这有点烦人,虽然像外星人这样的工具可能会使这一点更容易一些。

就像我说的,我自己并没有这样做。 这种方法对我的好处是,它补充了中央LDAP系统和用户帐户的集中pipe理,因为它允许用户轻松地更新他的包来包含他的.vimrc文件,例如,不必pipe理该文件通过木偶等工具,用户可能无法访问。

你应该采取更安全的路线,并强制每个用户有单独的密钥,并可能为每个设备。

如果你有用户共享的密钥—即使你是一个小团队—撤销一个密钥是给其他人带来不便。

如果您允许您的员工为其所有设备设置一个密钥,那么他们可以select可以连接到该设备的服务器。 例如,移动笔记本电脑可能被限制在一台或两台服务器上,但办公室的台式机可以访问所有的服务器。

几年前,Envy Labs编写了一个名为Keymaster(与客户Gatekeeper合作)的工具来为开发团队处理这样的事情。

这个项目在过去的两年里并没有太多的热爱,但是这个项目很有可能是可以修补的,也许可以恢复过来。

回购在github中可用: https : //github.com/envylabs/keymaster

一个aproach可以通过NFS设置/ home共享NIS服务器。 这与服务器中的sudo结合在一起,并通过sshconfiguration只允许你想要到每个服务器的用户。

这样你的团队的每个成员只使用一个用户和它的密钥来访问所有的服务器。 Sudo和pipe理任务的一个密码。

问候,

拉斐尔