我试图保护我的k8s群集,并且我正在寻找对k8s的客户端身份验证授权支持。我的要求是我希望能够向k8s apiserver唯一地标识自己(例如客户端),但到目前为止我读到的关于客户端身份验证的所有内容都不是解决方案。
我的理解是服务器只会确保提供的客户端证书实际上是由证书颁发机构签名的。如果黑客获得由同一个证书颁发机构签署的另一个证书(在我的组织中难以做到)并使用它与我的服务器通信怎么办?似乎流行的业务流程如Swarm和k8s支持这个选项,并将其称为最安全,所以必须有这样做的理由。有人可以解释一下吗?
答案 0 :(得分:3)
不仅验证证书是由CA授权的。客户端证书还包含Common Name (CN),可与简单ABAC Authorization一起使用,以限制对特定用户或组的访问。
获得签名证书也不容易。 IMO对根CA的访问应该非常有限,并且应该可以理解谁可以签署证书以及何时签署证书。理想情况下,根CA应该在离线主机上生存。
除此之外,听起来CA也用于其他目的。如果是这样,您可以考虑为客户端身份验证创建单独的根证书。您可以通过在apiserver上为--client-ca-file
和--tls-ca-file
设置不同的CA文件,为服务器证书使用其他CA.这样,您可以限制谁能够创建客户端证书,并仍然可以与组织的CA(可能已在所有组织计算机上分发)验证服务器身份。
如上所述,Kubernetes还有一些其他的身份验证方法。 static token file和static password file的缺点是秘密必须以明文形式存储在磁盘上。此外,每次更改都必须重新启动apiserver。
Service account tokens被指定为在群集中运行的应用程序使用。
OpenID可能是客户端证书的安全替代方案,但AFAIK设置起来更加困难。特别是当没有OpenID服务器的时候。
我对其他身份验证方法了解不多,但看起来它们似乎是为了与现有的单点登录服务集成。