OIDC 지원!영구적인 AWS Access Key를 취소할 수 있습니다!

GiitHub Actions는 OpenID Connect를 사용하는 Cloud Provider를 이전부터 인증할 수 있었지만, 며칠 전 마침내CircleaCI에서도 OIDC 지원🎉
이렇게 하면 AWS에서 발행하는 영구적인 Access 키를 취소할 수 있습니다!

이용 방법


1. CircleaCI의 Context 만들기 Organization ID 확인


1.1 Context 제작


이번을 위해서 AWS용 Context를 만들자.
환경 변수 설정은 나중에 수행됩니다.

1.2 Organization ID 확인


CircleaCI의 Organization ID는 https://app.circleci.com/의 Organization Settings>Contexts에서 얻을 수 있습니다.
이전에 Context를 만들지 않은 경우 Organization ID가 표시되지 않습니다.
▶Organization ID 유지

▶ context를 한 번도 만들지 않은 상태에서 Organization ID를 표시하지 않음

2. OIDC identity provider 만들기


  • 탐색 패널의 ID 공급자(Identity providers)에 액세스합니다.
  • 오른쪽 위에 있는 공급자 추가(Add provider)를 클릭합니다.

  • 각 입력 형식에 다음 정보를 입력하고 공급자를 추가합니다.

  • <organization-id>은 1입니다.상자의 ID입니다.)
    공급자 유형(Provider type)
    OpenID Connect
    공급자 URL(Provider URL)
    IAM 콘솔
    개체

    3. CircleaCI에 사용되는 IAM Role 만들기


    (IAM 스크롤 막대를 만드는 방법은 자세히 언급되지 않았습니다.)
    IAM 역할에 설정된 신뢰할 수 있는 엔티티는 웹 ID(Web Identity)를 선택하고, ID 공급자는 "2. OIDC identity provider 만들기"를 선택하여 ID 공급자를 만듭니다.
  • 신뢰 정책은 다음과 같다.
  • {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Federated": "arn:aws:iam::<AWS account id>:oidc-provider/oidc.circleci.com/org/<organization-id>"
                },
                "Action": "sts:AssumeRoleWithWebIdentity"
            }
        ]
    }
    
    제작된 롤의 ARN은 잠시 후 사용하기 때문에 컨트롤하는 게 좋다.

    4. 1.1 제작된 Context에서 환경 변수 설정


    Name
    Value
    AWS_REGION
    <사용 영역>(예: ap-northeast-1)
    AWS_IAM_ROLE_ARN
    arn:aws:iam:::role/

    5. .circleci/config.만들다


    다음 기술을 통해 AWS 인증이 가능하고 aws sts get-caller-identity에서 AWS의AccentID 등을 취득할 수 있다.
    https://oidc.circleci.com/org/ 이것은 필자가 즉석에서 만든 것이다.circleaci/aws-Colorb에서는 지원받을 수 있으나 지원될 때까지 잠정 대책으로 투박한 orb를 만들었다.(문서를 전혀 쓰지 못해서 죄송합니다.)
    ※ 직접 사용해 보세요.
    version: 2.1
    
    orbs:
      aws-cli: circleci/aws-[email protected]
      aws-configure-with-oidc: l060ki/aws-configure-with-[email protected]
    
    jobs:
      build:
        docker:
          - image: cimg/python:3.10
        environment:
          AWS_REGION: ap-northeast-1
        steps:
          - aws-configure-with-oidc/assume-role:
              role-arn: AWS_IAM_ROLE_ARN # context に設定した IAM Role の ENV の名前
          - run:
              name:
              command: |
                aws sts get-caller-identity
    
    workflows:
      build-and-test:
        jobs:
          - build:
              context:
                - aws-oidc-deploy
    
    ▶ 실행 결과


    Assium Role이 특정 Project(Repository)에만 허용되는 경우


    참조l060ki/[email protected]에서 알 수 있듯이 sub에는 프로젝트-id가 포함되어 있다.이 기능을 사용하면 Assume Role이 특정 프로젝트의 가능성만 얻으려면 다음과 같은 신뢰 정책 수정을 통해 실현할 수 있다.
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Federated": "arn:aws:iam::<AWS account id>:oidc-provider/oidc.circleci.com/org/<organization-id>"
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                    "StringLike": {
                        "oidc.circleci.com/org/<organization-id>:sub": [
                            "org/<organization-id>/project/<project-id>/*"
                        ]
                    }
                }
            }
        ]
    }
    

    최후


    CircleaCI는 OIDC를 지원하므로 AWS IAM User의 Access Key를 폐기할 수 있으므로 키 변환이 필요하지 않습니다.

    좋은 웹페이지 즐겨찾기