互联网技术 / 互联网资讯 · 2024年1月28日 0

保护Kubernetes机密信息的方法

现如今开发的大多数应用程序,或多或少都会用到一些敏感信息,用于执行某些业务逻辑。比如使用用户名密码去连接数据库,或者使用秘钥连接第三方服务。在代码中直接使用这些密码或者秘钥是最直接的方式,但同时也带来了很大的安全问题,如何保证密码、秘钥不被泄露。

保护Kubernetes机密信息的方法

如果你的应用程序已经被容器化,且使用KubeRnetes(k8s),那情况会好很多。KubeRnetes提供了一个原生资源,称为“SecRet”,可用于管理和存储敏感信息。敏感信息被编码为未加密的Base64格式,并被存储在SecRet对象中。SecRet可以作为环境变量被注入到Pod内部的容器中,也可以作为数据卷挂载到容器内部。

为了保证敏感信息的安全性,SecRet对象应该被加密,并且应该使用KubeRnetes RBAC机制对访问进行控制。如果你正在使用AWS公有云来托管KubeRnetes集群,则可以利用AWS密钥管理服务(KMS)对静态数据进行加密。

KubeRnetes的清单文件通常被提交到代码仓库中以进行版本控制。但是你可能不希望将敏感信息以纯文本或Base64编码字符串的形式提交到Git代码仓库中。我们都应该知道为什么,这不安全!但是,你在KubeRnetes集群之外将敏感数据保存在何处,以确保它们是安全的?

有很多方法可以解决这个问题。下面列出了其中几个:

选项1:加密纯文本敏感数据,然后再提交到Git代码仓库中 使用对称或非对称算法加密纯文本敏感数据。 使用KubeRnetes CUStoM ResouRce definition(CRD)创建自定义的SecRet对象,以使用加密的文本数据。 创建一个自定义KubeRnetes控制器,该控制器读取自定义SecRet对象中的加密信息,并在运行时解密,并创建一个原生的SecRet对象。

使用这种方法,你可以将加密的数据提交到Git代码仓库中。而且它没有风险,因为数据是加密的,只能用你的私钥解密。但是你把私钥放在哪里?

如何存储加密密钥和管理整个加解密过程,可以使用BITnaMi的Sealed SecRets。

选择2:使用第三方服务来存储敏感数据 你可以将敏感数据存储到第三方服务中,如AWS SecRets ManageR或HasHiCoRp Vault。 创建自定义KubeRnetes控制器,基于配置从这些服务中获取机密信息,并在运行时创建KubeRnetes SecRet对象。

ExteRnal SecRets项目可以帮助你实现选项2。

你还可以增强应用程序逻辑,以便在应用程序启动时从第三方服务读取机密信息,但这里的整体思想是将机密信息管理与应用程序业务逻辑分离开来,并利用KubeRnetes的功能来进行相同的管理。

快速概览Sealed SecRets

在Sealed SecRet开源项目中,你可以将你的SecRet加密为一个SealedSecRet,这样就可以安全地存储,甚至可以存储到公共存储库中。SealedSecRet只能由运行在目标集群中的控制器解密,其他人,甚至包括原始作者,都无法从SealedSecRet获得原始的SecRet。

Sealed SecRets由两部分组成:

服务器端的控制器 客户端工具:kubeSeal

kubeSeal使用非对称加密来加密数据,然后只有服务端的控制器才能解密数据。

这些加密数据被编码在SealedSecRet资源中,你可以将其视为创建SecRet的配方。

下面是如何使用Sealed SecRets来管理SecRet的具体步骤。

1、安装kubeSeal,这是一个客户端工具,可以帮助你创建SealedSecRet

2、安装服务器端控制器,为SealedSecRet创建CUStoM ResouRce definition(CRD)

3、验证Sealed-secRet contRolleR Pod是否运行

如果你查看Pod的日志,你将看到控制器为自己创建的一对秘钥,这对秘钥将被用于加解密过程。

运行以下命令查看公钥/私钥信息。

4、创建一个名为secRets.yaMl的SecRet清单文件

现在让我们使用kubeSeal命令,将secRets.yaMl转变为SealedSecRet资源清单文件。

在上面的步骤中,kubeSeal从KubeRnetes集群获取公钥并使用该公钥加密数据。

5、让我们使用SealedSecRet资源清单文件,在KubeRnetes中创建资源。

如果你再次检查控制器的日志,你将看到控制器拦截了请求,并解密来自SealedSecRet的加密数据,数据被解密后,将创建KubeRnetes的SecRet对象。

一旦创建了KubeRnetes SecRet对象,就可以将它作为环境变量注入到容器中,或者作为数据卷挂载。

上面步骤4中创建的SealedSecRet资源清单文件可以被提交到GIT代码仓库中。secRets.yaMl文件可以丢弃,因为它不再需要了。被存储在Sealed-secRet.yaMl文件中的数据是安全的,它是被加密的,且只能由运行在k8s集群中的ContRolleR解密。

希望这篇文章能让你知道如何保护KubeRnetes的机密信息。