繁体   English   中英

如何告诉teamcity代理,哪个aws账户运行terraform到

[英]How to tell teamcity agent, which aws account to run terraform to

我将 TeamCity 启动到一个 Kube.netes 集群中。 我有一个用于 TeamCity 服务器的部署和一个用于 TeamCity 构建代理的部署。 当我在 TeamCity 构建代理上运行 Terraform 时,它会在与托管 TeamCity Kube.netes 集群的 EC2 实例相同的 AWS 账户中创建资源。

我想运行一个构建,它在单独的 AWS 账户中创建 AWS 资源。 我的想法是将 AWS 访问密钥和密钥分配给 TeamCity 服务器并将它们传递给 TeamCity 构建代理,但我不知道工作流程将如何进行。

目前,我已经在构建中将 AWS 访问密钥和秘密密钥声明为环境变量,但它们没有传递给代理。 我的构建步骤只包含 3 行

terraform init
terraform plan
terraform apply -auto-approve

我处理了一个非常相似的情况。 当我们开始使用 AWS 时,我们并没有遵循关于我们的脚本如何向 AWS 进行身份验证的最佳实践。

我们在每个帐户中创建了用户,并将访问密钥和秘密密钥导出到我们的 TeamCity 构建自动化中,以允许我们的脚本在这些帐户的上下文中运行。

您最终会在不同的帐户中拥有多个用户,并且最终会为这些用户手动轮换密钥,然后在每次需要轮换密钥时更新 TeamCity 中的访问密钥和秘密密钥。

由于 TeamCity 构建代理服务器是 EC2 实例,AWS 中的最佳实践是在这种情况下使用角色而不是用户。 来自 AWS 文档:

在 Amazon EC2 实例上运行的应用程序需要凭据才能访问其他 AWS 服务。 要以安全方式向应用程序提供凭证,请使用 IAM 角色。 角色是拥有自己的一组权限的实体,但它不是用户或组。 角色也不像 IAM 用户那样拥有自己的永久凭证集。 对于 Amazon EC2,IAM 动态地为 EC2 实例提供临时凭证,这些凭证会自动为您轮换。

资料来源: https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#use-roles-with-ec2

在这种情况下,您应该做的是在每个帐户中创建一个角色,该角色有权创建 terraform 将构建的资源。 您将需要另一个角色用于 TeamCity 构建代理服务器,该角色应该能够承担在每个帐户中创建的角色。

假设您有两个帐户:

  1. AccountA 是您希望构建代理使用 terraform 运行构建资源的地方。
  2. AccountB 是您的构建代理运行的帐户。

你需要的是:

  1. AccountA 中有权创建资源的角色。
  2. AccountB 中的角色,授予 ec2 实例访问权限以承担上述角色。

AccountB 中角色的实例配置文件应分配给 TeamCity 构建代理服务器。 然后,构建代理服务器能够承担 AccountA 中的角色,并在该帐户的上下文中运行,并获得所需的权限,而无需硬编码访问权限和密钥。

您可以通过 Terraform 对任意数量的其他帐户重复此过程以在其中构建资源。

您必须将以下块添加到 terraform 脚本中的 aws 提供商,让 terraform 知道要承担什么角色:

provider "aws" {
assume_role {
role_arn = "arn:aws:iam::<ACCOUNTA>:role/<ROLENAME>"
}
}

以下是一些关于如何从 EC2 实例授予对不同账户中 S3 存储桶的访问权限的 AWS 文档: https://aws.amazon.com/premiumsupport/knowledge-center/s3-instance-access-bucket/

另一个涵盖 IAM Roes、EC2 实例配置文件和通过角色进行跨账户访问的有用文档页面位于: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html

最后一个链接正是您要执行的操作: https://blog.e-zest.com/aws-ec2-assume-role-with-terraform

当我想为 2 个单独的帐户添加两个注释时,我的 agent.yml 文件看起来像这样

规格:副本:1 选择器:匹配标签:应用程序:代理 Pod 模板:元数据:注释:iam.amazonaws.com/role:arn:aws:iam::account:role/accoun1-s3-role iam.amazonaws.com/角色:arn:aws:iam::account:role/account2-pods-s3-role

但是一旦我放了两个注释,我的 sts assume role for pod 就只显示我的第二个角色。 当我从 teamcity 运行构建时,出现此错误,找不到 aws 提供程序的有效凭证源

具有多个账户的 TeamCity + AWS 组织的安全最佳实践:

  • 使用 iam 角色而不是具有 API 密钥的用户帐户,尽可能少的特权,并将其作为代理实例配置文件附加
  • TeamCity 代理通常在跨多个项目共享的单个代理/多 AWS 账户部署中。 这意味着,任何人都可以轻松访问多个帐户。 一种解决方案 - 或者在每个帐户中构建一个专用代理,附加最少特权实例策略/IAM 角色并连接前槽。 将 gw 中转回 team-city 服务器,或者如果您有专用 CI/CD 帐户,则为每个帐户构建专用代理,提出标记策略并使用附加 ABAC 策略创建跨帐户 IAM 角色,以便只有特定实例能够在远程帐户中担任角色
  • 尽可能保护您的 CI/CD,使用最少的帐户权限,执行良好的网络策略,使用 edr、siem 等工具 - !!! 这是您最脆弱的资产之一,在您的组织中具有非常广泛的攻击面!!!
  • 避免使用 Jenkins 之类的工具,如果您搜索 CVE,它就像瑞士奶酪

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM