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

保护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的机密信息。

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.

登录免费注册