我将把Ansible引入到我的数据中心,并且正在寻找一些安全的最佳实践,以find控制机器的位置以及如何pipe理SSH密钥。
问题1:控制机器
我们当然需要一台控制机器。 控制机器上保存有公用的SSH密钥。 如果攻击者能够访问控制机器,则可能访问整个数据中心(或由Ansiblepipe理的服务器)。 那么,在数据中心还是远程控制机器(例如,远程连接到数据中心的笔记本电脑)中安装专用控制器会更好吗?
如果最好的做法是使用我的笔记本电脑(当然可能会被盗,但是我可以将我的公钥安全地保存在云端,或者在便携式encryption设备上离线保存),如果我需要使用某些networking接口Ansible和Ansible Tower,Semaphore,Rundeck或Foreman一样,需要在集中式机器上安装到数据中心? 如何保护它,避免它成为“单一攻击点”?
问题2:SSH密钥
假设我需要使用Ansible来完成一些需要由root执行的任务(比如安装软件包或类似的东西)。 我认为最好的做法是不要在受控服务器上使用root用户,而要使用sudo权限为Ansible添加普通用户。 但是,如果Ansible几乎需要完成所有任务,则需要通过sudo访问每个命令。 那么,什么是最好的select:
~/.ssh/authorized_keys 堡垒主机(可控制的中心)属于一个单独的子网。 它不应该直接从外部访问,它不应该直接从托pipe服务器访问!
您的笔记本电脑是所有的安全性最低的设备。 一个愚蠢的邮件,一个愚蠢的闪存漏洞,一个愚蠢的客人无线上网,它得到pwned。
对于服务器,根本不允许通过ssh进行root访问。 许多审计嘲笑这一点。
为了安全起见,让每个pipe理员在每个目标服务器上使用自己的个人帐户,并让他们使用密码sudo。 这样两个人之间没有密码共享。 你可以检查谁在每个服务器上做了什么。 如果个人帐户允许使用密码login,仅使用SSH密钥,或者同时使用两者,则由您决定。
澄清ansible不需要使用单个目标login名 。 每个pipe理员可以并且应该有个人目标login名。
一个侧面说明:尽量不要创build一个叫做某个词的账户(如“ansible”或“admin”或“cluster”或“management”或“operator”)。 有密码的帐户唯一的好名字是人的名字,如“jkowalski”。 只有一个人可以负责通过账户完成的行为,并负责不正确地保护他们的密码,“可靠”不能。
>问题1:控制机器
在Userify(完全公开:我们实际上提供了pipe理ssh密钥的软件),我们一直在处理这个问题,因为我们也运行着最大的SSH密钥仓库。 我们通常推荐使用本地安装,而不是使用云,因为您已经增加了控制权,减less了您的表面面积,您可以真正将其locking到已知的可信networking。
重要的是要记住,在这样一个适当的系统中, 实际上不应该有任何可以泄露给攻击者的重要的秘密 。 如果有人驾驶叉车进入你的数据中心,走开你的服务器,除了一些严重哈希的密码,可能是一些高度encryption的文件,以及一些没有相应私钥的公钥以外,他们不会得到很多。 换句话说,不是那么多。
正如你指出的那样,这里真正的威胁向量是攻击者获得对该机器的控制并使用它来部署他们自己的用户帐户和(公共)密钥时发生的事情 。 几乎每个云平台(例如:Linode)都有这个风险。 您应该最大限度地集中精力防止访问控制面板,这意味着最小化攻击面(只暴露几个端口,尽可能locking这些端口),最好使用针对特权升级和各种攻击的软件( SQL注入,XSS,CSRF等)启用2FA / MFA访问控制平面,并尽可能集中locking控制平面。
那么,在数据中心还是远程控制机器(例如,远程连接到数据中心的笔记本电脑)中安装专用控制器会更好吗?
在安全的数据中心内安装专用控制机器肯定会更好 ,因为您可以将其隔离并locking,以防止/最小化被盗或未授权访问的风险。
如果最好的做法是使用我的笔记本电脑(当然可能会被盗,但是我可以将我的公钥安全地保存在云端,或者在便携式encryption设备上离线保存), 如果我需要使用某些networking接口 Ansible和Ansible Tower,Semaphore,Rundeck或Foreman一样,需要在集中式机器上安装到数据中心?
您不需要运行任何Web界面或辅助控制平面来pipe理您的密钥(甚至是Userify),直到您有足够大的空间开始进入pipe理问题,这是因为大量的用户和跨服务器的不同级别的授权或需要额外手动为您的用户谁可能没有知识或访问Ansible更新密钥。 Userify起初并不仅仅是一堆shell脚本(现在他们会是Ansible,可能是!),并且没有任何错误,直到你开始需要额外的pipe理控制和简单的方法让人们pipe理/旋转他们自己的钥匙。 (当然,如果你明白的话,请看Userify!)
如何保护它,避免它成为“单一攻击点”?
那么当然,请查看networking上的所有资源来locking事情,但最重要的是从一个安全的基础开始:
1.从一开始就以安全为出发点来devise解决scheme。 select传统上问题较less的技术(即数据库或语言),然后在安全的情况下进行编码。 清理所有传入的数据,即使是来自可信用户。 偏执狂是一种美德。
最终,一切都被打破了。 发生这种情况时最大限度地减less损害:正如您已经指出的那样,尽量减less秘密材料的处理。
3.保持简单。 不要做最新的奇特的东西,除非你确定它会显着地,可证实地提高你的安全性。 例如,我们selectX25519 / NaCl(libsodium)作为我们的encryption层(我们对静止和运动中的所有内容进行encryption),因为它最初是由我们信任的人(DJB等人)devise和编写的,并被世界审查像Schneier和Google的安全团队这样的着名研究人员。 如果更新,则使用趋于简单化的事物,因为简单性使隐藏深层的错误变得更加困难。
4.符合安全标准。 即使你不属于像PCI或HIPAA安全规则这样的安全机制,也要仔细阅读这些标准,并弄清楚如何达到这些标准,或者至less有很强的补偿控制。 这将有助于确保您真正达到“最佳实践”。
5.进行外部/独立渗透testing,并运行错误奖励 ,以确保您正在持续遵循这些最佳实践。 一切都看起来很棒,直到你得到一些聪明和高度积极的人,一旦完成,你会对你的解决scheme有很大的信心。
问题2:SSH密钥什么是最好的select:让Ansible使用root用户(其公钥保存在
~/.ssh/authorized_keys/让Ansible用户通过sudo指定一个密码运行每个命令由每个使用Ansible来控制服务器的系统pipe理员来知道)
尽量避免在服务器上使用密码,即使是sudo。 这是处理秘密,最终会破坏你的安全(你不能真正改变机器之间的sudo密码很容易,你必须存储在某个地方,密码意味着你不能真正做到服务器到服务器的自动化而且,如果你在默认情况下离开SSH,那么这些密码可能会被强制使用,这使得密钥有些没有意义,并且避免使用root用户,特别是远程login。
使用sudo访问创build一个专用于Ansible的非特权用户/让Ansible用户通过sudo运行每个命令,而不指定任何密码
究竟。 一个非特权用户,你可以使用sudoangular色来审计回合理的。 理想情况下,使用sudo访问(无密码)创build专用于服务器到服务器/可靠通信的标准用户。 (在RHEL服务器上,您可能需要从/ etc / sudoers中删除RequireTTY;这是一个configuration错误,不会增加安全性,但会导致远程pipe理问题,但在以后的RHEL版本中将会修复此问题。一个tty)
…注意,如果你使用的是Userify,我build议这样做的方法是创build一个Userify用户(如果你有多个控制机器,你也可以通过项目甚至服务器组来分解),生成控制服务器上的SSH密钥,并在其Userifyconfiguration文件页面中提供其公钥。 (这个文本框本质上变成了/home/ansible/.ssh/authorized_keys )。 您应该保持系统帐户与其他服务器到服务器系统帐户(如远程备份帐户,秘密pipe理等)分开。然后邀请您的人员,他们也可以创build和pipe理自己的密钥,并且一切都保持分离。 但是,就像locking一个Ansible控制服务器一样,尝试以相同的方式locking您的Userify服务器(或者您部署的任何解决scheme)。
任何其他提示?
我认为你一定要用正确的方式去问正确的问题。 如果你想讨论这种事情,给我发电子邮件(userify首先点姓),无论你最终追求什么方向,我都会很高兴聊天。 祝你好运!
答案1:控制机器
有一点,你可以使用笔记本电脑连接到威盛堡垒主机的服务器。 就像是:
Host private1 IdentityFile ~/.ssh/rsa_private_key ProxyCommand ssh user@bastion -W %h:%p Host bastion IdentityFile ~/.ssh/bastion_rsa_key
更多关于堡垒主机
那里有堡垒服务器的钥匙,然后是它后面的主机的一个单独的钥匙。 (我个人会使用gpg-agent / ssh-agent)
答案2:authentication
我不确定具体的最佳实践与其他任何ssh连接的最佳实践有什么不同。但是,不是,您想要像自己一样运行,而不是服务帐户而不是根帐户。
以下authentication的组合:
其他想法:
最后,你没有提到任何有关窗口。 所以我只能假设你没有使用这个。 然而在这种情况下,我会使用委托选项让您的笔记本电脑使用堡垒主机(delegate_to: bastion.hostname.fqdn )和kerberos / bastion.hostname.fqdn https与kerberos票据。
如果你错过了这个计算的最佳实践, 绝不要做任何事情,总是使用命名账户