云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

域名注册_域名解析a记录_免费申请

小七 141 0

使用Vault和Banzai云保护Kubernetes部署

以下是BanzaiCloud高级软件工程师Nandor Kracser的一篇博客文章。banzaicloud是一家年轻的初创公司,其使命是使用Kubernetes过度简化并将云本地技术引入企业。在Banzai Cloud,我们正在构建一个开源的下一代平台作为服务,管道构建在Kubernetes之上。通过Pipeline,我们在所有主要的云提供商上提供大型的多租户Kubernetes集群,并向这些集群部署不同的工作负载。我们需要找到一种基于行业标准的方法,让我们的用户发布受保护的端点并与之交互,同时为我们支持的所有不同应用程序提供动态机密管理,所有这些都具有本地Kubernetes支持。经过几个概念的验证,我们选择了HashiCorp Vault。在这篇文章中,我们将重点介绍我们如何使用Vault,并对可用选项提供技术见解。管道API和保险库与Pipeline的主要交互是通过restfulapi(CLI,UI使用API),我们决定使用OAuth2和JWT承载令牌来保护它。OAuth2的主要优点是我们不必存储任何用户凭据,并且用户可以使用他们的首选提供者的现有帐户。另外,JWT令牌是自包含的,允许无状态身份验证,基于作用域访问受保护的资源。然而,这些代币不可能永远存在,需要可撤销和白名单,与Kubernetes合作,并能够以多租户的方式推送到不同的云提供商。对于我们的用例,Vault非常适合。首先,我们使用Vault的Kubernetes Auth方法集成,使用Kubernetes服务帐户令牌与Vault进行身份验证。Vault由Pipeline用于租赁ServiceAccount JWT令牌,使运行在同一Kubernetes集群中的所有其他应用程序能够调用Vault,并使用具有不同ttl的紧密作用域令牌。这些可撤销和白名单令牌存储在保险库的密钥/值机密引擎中。每次用户与管道API交互时,我们都使用Vault的内置缓存检查这些令牌,因此性能不会受到影响。在这个存储oauth2jwt承载令牌的特定场景中,我们使用密钥/值秘密引擎,但是我们还集成并使用了其他几个可插入的保险库引擎:对于秘密引擎,我们使用数据库来生成动态凭证和SSH,以便将动态SSH放入主机中;对于身份验证方法,我们使用Kubernetes和GitHub。有关如何使用Vault作为身份验证流的中心组件的概述,请查看下面的图表。有关使用Vault保护部署到Kubernetes的API的更多技术细节,请阅读我们的"使用OAuth2和Vault对管道用户进行身份验证和授权后"部分。动态凭据一旦使用JWT承载令牌保护了入站API调用,让我们看看Pipeline如何使用凭据将应用程序部署到Kubernetes。这些应用程序和集群本身都是动态的、可扩展的、删除的或基于不同sla重新调度的。集群应用程序之间的一个共同点是,它们与其他应用程序交互以交换(敏感)数据。为了简单起见,让我们从连接到数据库的应用程序的角度来看这一点。连接到数据库几乎总是需要密码或证书,因此用户必须通过配置将这些密码或证书传递给应用程序代码。首先,手动处理凭据和存储在配置、文件等中的安全性较低。第二,我们试图教育和推动我们的最终用户使用更安全的解决方案,他们永远不必通过这些证书。我们所有的部署都是通过Helm图表进行编排的,不幸的是,我们已经多次看到在部署过程中生成凭证或将凭证传递到图表中。由于我们已经将Vault作为Pipeline的核心部分,而且Vault确实支持动态机密,因此我们决定添加支持,并使动态机密成为所有受支持部署的现成解决方案。使用动态秘密的好处已经在Armon Dadgar的一篇很棒的博客文章Why We Need dynamic secrets中进行了描述。简而言之,为了加强安全性,每个应用程序都会获得一个指向请求服务的专用凭据,此凭据只属于请求的应用程序,并且具有固定的过期时间。因为凭据是专用的,所以可以跟踪哪个应用程序访问了服务,何时**.*撤销凭据很容易,因为它们是通过Vault集中管理的。因为Pipeline是在Kubernetes上运行的,所以我们可以首先应用Kubernetes服务帐户的身份验证来获取保险库令牌,然后我们可以根据配置的保险库角色交换MySQL凭据(用户名/密码)。有关事件顺序的详细信息,请参见此图:正如您在这个解决方案中看到的,Pipeline能够连接到MySQL,仅仅是因为它使用配置的Kubernetes服务帐户运行,并且在配置应用程序时不需要输入一个用户名/密码。实现上述数据库连接和保险库配置的动态秘密分配的代码可以在我们的开源项目银行保险库中找到。有关为部署到Kubernetes的应用程序使用动态机密的更多技术细节,请查看我们的另一篇文章。存储云提供商凭据Pipeline是基于Kubernetes构建的,它与云提供商无关。我们提供对AWS、GKE和AKS的支持(其中一些很快将成为GA)。为了将K8s集群和应用程序推送到云端,我们需要使用它们的api进行大量的云提供商交互,并且我们需要特定的云提供商凭证和角色来完成这些操作。这是一个非常微妙的问题,因为最终用户必须相信我们以非常安全的方式存储这些凭证,同时让用户完全控制何时以及如何撤销这些凭证。将这些凭证或角色存储在数据库中并没有给我们足够的信心,所以我们决定使用一个专门用于存储机密的系统—同样,欢迎使用保险库。动态SSH凭据现在,一旦我们将这些应用程序推送到不同的提供商,我们将为我们的最终用户提供全面的企业支持。同样,请注意,这些集群是完全动态的,很多时候它们是混合集群,而VM的底层正在发生变化。我们提供的大多数集群都基于spot或可抢占实例,因此更改VM的动态性很高。我们有一个名为Hollowtrees的系统,用于安全运行基于spot实例的Kubernetes集群,在这里我们密切关注spot实例市场的状态。我们对spot实例终止做出反应,有时我们用价格和稳定性更好的其他实例替换实例。拥有静态SSH密钥来访问这些集群(尤其是不能动态撤销它们)对于我们的客户和我们来说都不是一个选择。同时,出于调试目的,我们仍然需要访问Kubernetes下的vm。由于许多开发人员都在访问它们,而且vm每分钟都在来来往往,因此我们必须以非常动态的方式分发访问。为此,我们决定使用Vault的SSH Secret后端,它为访问我们的远程vm执行动态客户端密钥签名。如您所见,Vault已经有多个后端和引擎可用,通过简单的配置和一些代码,企业所需的大多数安全功能都可以快速实现。为了简单起见,我们在这里结束这篇文章,但是我们将继续发布关于如何密封和解封保险库以及其他一些在我们即将发布的帖子中的高级场景。同时,请查看我们的GitHub上的开源代码,并确保您浏览了Vault的优秀教程和示例。