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

云服务器_集群负载均衡_多少钱

小七 141 0

与厨师一起使用HashiCorp的保险库

组织在基础设施中集成Vault by HashiCorp时面临的一个常见挑战是如何使用配置管理工具从Vault获取机密。这篇博客文章详细介绍了一些使用Chef从保险库中检索机密的技术,但是这些主题可以广泛应用于任何配置管理软件,如Puppet或Ansible。»概述对于以下每种技术,我们将研究两种不同的使用Vault的秘密检索场景。第一个场景涉及从Vault generic secret后端检索静态机密。以下是来自通用机密后端的一些示例数据:$vault读取密码/vpn键值租期2592000密码b@c0n时用户名sethvargoVault的通用秘密后端可以看作是一个加密的密钥值存储。上面的"vault读取"命令显示了如何组织数据。我们可以在检索机密时引用这些命名对。通用机密不会过期,但可以随时撤销。第二个场景涉及使用Vault PostgreSQL secret后端从Vault检索动态PostgreSQL凭据。Vault配置为Postgres的根凭证,然后使用这些根凭证生成唯一的租用凭证。配置完成后,我们可以生成如下新的凭证集:$vault read postgresql/creds/readonly键值租赁_id postgresql/creds/readonly/c888a097-b0e2-26a8-b306-fc7c84b98f07租期3600密码34205e88-0de1-68b7-6267-72d8e32c5d3d用户名root-1430162075-7887当我们读取此路径时,Vault将动态生成一组新的凭据,用于使用给定的SQL连接到Postgres。返回的凭据具有关联的租约,应用程序有责任在租约过期或Vault将吊销它们之前续订凭据。使用Vault检索和更新机密的推荐模式如下:»方法1:在运行时读取机密我们建议将Vault与任何配置管理工具一起使用的方法是将机密检索和更新移动到运行时过程中,而不是构建时过程中。如果您正在使用Chef和Packer构建工件,或者您没有定期运行Chef,那么这一点尤其有用。在这种情况下,传统的配置管理用于安装一个工具,该工具在运行时管理与Vault的交互—conver Template。consur模板是一个静态二进制文件,可以从consur、Vault或两者中检索数据。尽管命名很不幸,consur模板并不要求您使用consur。为consur模板提供一个输入模板、输出目标和一个可选的任意命令,以便在模板内容发生更改时执行。准备一点"meta",因为我们将使用Chef模板来呈现conver模板模板,该模板将作为运行时进程开始,以呈现应用程序的配置。厨师职责:安装conver模板二进制文件添加conver模板upstart配置领事模板的职责:从保险库取回秘密将机密写入磁盘并管理应用程序配置生命周期办理续租这篇文章将只包含相关的代码片段,但是完整的配方和支持文件可以作为GitHub的主旨来使用Chef。Chef recipe从HashiCorp releases服务下载consur模板,解压缩并提取到/usr/local/bin中,为consur模板配置创建"dot-d"目录,并配置upstart来管理服务。现在consur模板已经安装并作为服务运行,我们需要创建consur模板模板,它将呈现应用程序配置。由于这是一个虚构的应用程序,让我们假设我们的应用程序接受这样的配置文件:[配置]用户名="…"密码="…"我们需要将值填充到。。。带着保险库的秘密。下面是我们如何使用consur Template的模板语言来实现这一点:{{使用vault"postgresql/creds/readonly"}}[配置]用户名={。数据.用户名}}"密码={。数据.密码}}"{{end}}此模板将随应用程序一起提供,因此假设它已经存在于system/opt/my app中/配置.ctmpl. 接下来,我们必须告诉conver Template解析这个模板并在另一端输出配置。该配置如下所示:#食谱/模板/我的应用程序-盐酸ct模板{source="/opt/我的应用程序/配置.ctmpl"目的地="/opt/my app/config"command="服务我的应用程序重新加载"}一旦将此文件放入/etc/consur template.d中,consur template将开始读取位于/opt/my app的模板/配置.ctmpl,将结果呈现到/opt/my app/config,并在内容更改时重新加载服务。无论Chef是在运行时还是在构建时使用,秘密管理完全由conver模板来完成。»优势秘密永远不会触及厨师厨师不需要定期跑步Chef不需要与Vault交互非常喜欢"下载、安装、服务、模板"模式»缺点Go的模板语言添加了间接寻址»方法2:在配置时读取机密将Vault与配置管理工具一起使用的另一种常见方法是在converge阶段填充机密。对于Chef来说,最简单的方法是使用vaultrubygem,但是vault也有一个jsonhttpapi,并且许多客户端库都是针对其他语言的。#食谱/食谱/默认.rb信用证=Vault.logical.read("机密/vpn")模板"/etc/vpn/config"dosource"我的vpn-配置erb"所有者"vpn""vpn"组模式"0600"敏感真实变量(:用户名=>信用数据[:用户名],:密码=>信用数据[:密码],)结束在本例中,Chef run查询Vault服务器中的"secret/vpn"值,并将"username"和"password"处的值作为变量传递到模板中。»优势很"像厨师"最低进入壁垒工作原理与数据包或加密数据包非常相似»缺点无法处理租约吊销事件无法处理机密更新很容易变得陈腐无法使用需要续租的机密(请继续阅读)虽然这种方法对于存储在通用后端中的机密可能很有效,但它不能处理动态生成的机密。下面是一个相对类似的Chef方法,它从我们配置的动态Postgresql后端提取凭证,并将其放入应用程序配置中:#食谱/食谱/默认.rb信用证=Vault.logical.read("postgresql/creds/readonly")模板"/opt/my app/config"执行来源"我的-应用程序配置"所有者"我的应用程序"组"我的应用程序"模式"0600"敏感真实变量(:db_用户名=>信用数据[:用户名],:db_密码=>信用数据[:密码],)结束假设您已通过Vault的正确身份验证,并具有从该路径读取的权限,则Chef运行将成功完成。然而,Chef并没有更新这些秘密的机制。与一般秘密后端不同,动态后端持有的租约必须在TTL过期之前续订。如果该机密的租约在租约到期前未续订,则Vault将吊销该机密。即使保险库处于脱机状态,凭证也是使用Postgres的VALID UNTIL子句创建的,因此数据库也将代表我们撤消凭证,而无需续订。这是一个很难尝试和诊断的bug,因为它只会在租约到期之前的预定时间间隔内没有运行Chef时发生。如果您没有定期运行Chef(也许您正在使用Chef和Packer来构建AMIs或Docker容器),那么在启动应用程序之前,这些机密可能会过期。这就是为什么我们认为机密是"运行时"配置,而不是"构建时"配置。即使定期执行Chef,每次Chef运行都将创建一组新的凭证。这意味着应用程序将在每次迭代时收到一组新的Postgres凭据。但这不仅会造成一个未使用的保险库中的秘密记录,而且会使GRE的许多未使用的事件变得复杂。虽然这些条目将由Vault清理,但应用程序将不断收到一组新的凭据,Chef将重新启动应用程序。»方法3:自定义资源和提供程序如果您愿意编写Ruby和自定义Chef扩展,那么使用自定义资源和提供者(或LWRP)是检索和管理HashiCorp的Vault和Chef机密的好方法。这种技术依赖于通知来控制流。厨师配方代码如下所示:#食谱/食谱/默认.rb保险库密码"postgresql/creds/readonly"do通知:create,"template[/config]",:立即结束模板"/config"执行来源"我的-应用程序配置"所有者"我的应用程序"组"我的应用程序"模式"0600"真敏感变量惰性{{:用户名=>node.run_statepostgresql/creds/readonly"].data[:用户名],:密码=>node.run_statepostgresql/creds/readonly"].data[:密码],}}行动:没什么结束首先,您将注意到有一个新资源vault_secret,它接受路径作为name参数。此资源通知我们的模板创建(或更新,如果它已经存在)。模板保持相对不变,只是添加了action:nothing和检索机密的方式稍有改变。需要注意的是lazy的使用-这一点很重要,因为节点的运行状态在检索到机密之后才会填充。完整的LWRP代码可以在这里找到。此自定义资源在读取或续订保管库机密时激发通知。只有在机密不存在或机密租约续订失败时,才应进行读取。在这两种情况下,都需要重新呈现模板。然而,这个LWRP没有将整个秘密持久化到node对象中,而是将秘密管理责任推送到通知中