はじめに
2023年1月にCircleCIでセキュリティインシデントが発生し、Environment Variableの変更を余儀なくされました。
https://circleci.com/blog/january-4-2023-security-alert/
手作業で結構辛かったので、OIDCを利用してAWSに接続するように変更したいと思います。
Circleで必要な情報を取得する
- CircleCIの
Organization Settings
にあるOrganization ID
をメモっておきます。
Terraformでopenid_connectを作成する
必要なのは以下の3つです。
-
aws_iam_openid_connect_provider
でOPENIDコネクトプロバイダーを作成する -
aws_iam_role
でCircleCI側に設定するRoleを作成する -
aws_iam_role_policy_attachment
やaws_iam_role_policy
でCircleCIで実行する内容をRoleに権限を追加する(今回だとECRにアップしたいので、AmazonEC2ContainerRegistryPowerUser
としている)
locals {
circleci_organization_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"
circleci_thumbprint = "9e99a48a9960b14926bb7f3b02e22da2b0ab7280" # CircleCIはこれが固定値
}
resource "aws_iam_openid_connect_provider" "default" {
url = "https://oidc.circleci.com/org/#{local.circleci_organization_id}"
client_id_list = [local.circle_organization_id]
thumbprint_list = [local.circleci_thumbprint]
}
resource "aws_iam_role" "default" {
name = "circleci_role"
description = "CircleCI identify Provider Role"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::${data.aws_caller_identity.self.account_id}:oidc-provider/oidc.circleci.com/org/${local.circleci_organization_id}"
},
"Action": "sts:AssumeRoleWithWebIdentity"
}
]
}
EOF
}
resource "aws_iam_role_policy_attachment" "ecr_power_user" {
policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPowerUser"
role = aws_iam_role.default.name
}
CircleCI側の設定
- 注意点しては、aws-cliのバージョンが4.0.0以上にする必要があります。
orbs:
aws-cli: circleci/aws-cli@4.0.0
jobs:
build:
steps:
- aws-cli/setup:
role_arn: arn:aws:iam::${AWS_ACCOUNT_ID}:role/circleci_role