用terraform上传GCP服务账户的公钥

232 阅读3分钟

希望你已经看到了Ryan Canty的一篇很好的文章《停止下载谷歌云服务账户密钥》,今天有很多创建服务账户密钥的替代品

但想象一下,你正处于早期的云采用阶段,你还没有准备好涉及OIDC供应商和工作负载身份池。同时,内部应用/服务器需要一种方法来验证谷歌云的API。最不安全的方式是允许工程师生成服务账户密钥,这可能会导致这些密钥通过内部信使或邮箱从一个用户飞到另一个用户。一个稍微好一点的方法是集中生成密钥,只允许通过GitOps+Terraform提供密钥,这样你就有一个干净的 "集成 "服务账户管理历史。但这种方法仍然有一些注意事项。

  • 密钥没有过期时间
  • 钥匙材料是在Terraform状态下写入的
  • 钥匙需要被转移到终端应用/服务器上
  • 每个能访问terraform管道的人都能访问钥匙。

有一个更好的方法,可以处理上述所有问题。

通过terraform上传公共RSA密钥来管理服务账户密钥

这个例子展示了如何通过手动生成OpenSSL的密钥对并将密钥的公共部分上传到GCP来管理IAM服务账户密钥。它有以下好处。

部署

要运行这个例子,首先要克隆资源库,并改变到例子文件夹。如果你喜欢使用Cloud Shell,这个链接将为你运行Git克隆,并切换到正确的文件夹,这样你就可以跳过下面的初始步骤。

git clone 

清理例子的密钥。

rm -f /public-keys/data-uploader/

为服务账户生成新的密钥。

mkdir keys && cd keys

部署服务账户和密钥。

注意:我们只使用钥匙的公共部分进行部署,理想情况下,钥匙的私人部分不应该离开它生成和将要被消耗的服务器。

cd ..

从terraform输出中提取JSON凭证模板,并将密钥的私有部分放入模板中。

terraform show -json | jq '.values.outputs."sa-credentials".value."data-uploader"."public_key.pem" | fromjson' > data-uploader.json

测试

验证服务账户的JSON凭证是否有效。

gcloud auth activate-service-account --key-file prisma-security.json

清理。

terraform destroy -var project_id=$GOOGLE_CLOUD_PROJECT

避免服务账户密钥总是更好的,但在现实生活中,我们仍然被迫依赖它们。通过文章中展示的方法,我们缓解了与服务账户密钥管理相关的大部分安全问题,例如。

  • 密钥在消费者服务器上生成和存储,并且永远不会离开它
  • 密钥的过期时间由用户设定
  • 密钥的私人部分不存储在terraform状态或代码中
  • GitOps和terraform为 "集成 "的密钥管理提供了一个中央玻璃平面


用terraform为GCP服务账户上传公钥最初发表于Google Cloud - Communityon Medium,人们通过强调和回应这个故事继续对话。