OIDC로CircleaCI에서HashiCorp Vault와 인증+비밀방문Orb을 간단히 써보십시오

이것을 써 보았다.
https://circleci.com/developer/orbs/orb/smaeda-ks/orb-hashicorp-vault-cli
이걸 사용하면 CircleaCI 환경 변수에 정적으로 저장된 비밀 졸업을 할 수 있다.

CircleaCI 지원 OIDC


요즘 지지를 받고 있는 것 같아요.
https://circleci.com/changelog/#oidc-tokens-in-jobs
https://circleci.com/docs/2.0/openid-connect-tokens/
GiitHub Actions와 GiitLab에서는 이전부터 지원되어 왔으며, GiitHub Action의 예는 이전에도 글에 기록되어 있습니다.
https://zenn.dev/jrsyo/articles/e954e907dcedeb
이번에는 CircleaCI, Orb로 같은 워크플로우를 구현합니다.

Organization ID 확인


Vault 측에서 OIDC의 설정을 구성하기 위해 사용해야 하는 CircleaCI 계정의 Organization ID입니다.Organization ID를 확인하려면 CircleaCI의 콘솔에서 Organization Settings 페이지까지 확인할 수 있습니다.

※ Context를 하나 이상 만들지 않으면 Organization ID가 표시되지 않습니다.

Vault 설정


기본적으로 저번에 썼어요. GiitHub Actions OIDC 때와 동일합니다.

JWT Auth Method 사용


$ vault auth enable jwt
Success! Enabled jwt auth method at: jwt/
활성화된 JWT authmethod config의 bound_issueroidc_discovery_url 필드를 설정합니다.방금 확인한 Organization ID가 필요합니다.자신의 물건으로 바꾸세요${CIRCLECI_ORG_ID}.
$ vault write auth/jwt/config \
  bound_issuer="https://oidc.circleci.com/org/${CIRCLECI_ORG_ID}" \
  oidc_discovery_url="https://oidc.circleci.com/org/${CIRCLECI_ORG_ID}"
Success! Data written to: auth/jwt/config

JWT auth backend role 만들기


$ vault write auth/jwt/role/circleci-dev -<<EOF
{
  "role_type": "jwt",
  "user_claim": "sub",
  "bound_claims": {
    "aud": "${CIRCLECI_ORG_ID}"
  },
  "policies": ["circleci-dev"],
  "ttl": "1h"
}
EOF
이용 가능한 클라임의 종류는 GiitHub 등에 비해 적은 것 같지만 일람표는 아래에서 확인할 수 있다.
https://circleci.com/docs/2.0/openid-connect-tokens/
이번 예aud에는 bound_claims 조건에만 포함되며, 자신의 Orgnization ID로부터 요청이 들어왔다면 모두 수용한다.조건을 더 줄이려면 oidc.circleci.com/project-id로 대체할 수 있고 특정 프로젝트 ID로부터의 요청과 같은 제어만 믿을 수 있다.
이번에 상세한 내용을 생략했지만 상기 예에서 policies에서 지정한 바와 같이 circleci-dev 이 ACL Policy는 별도로 존재하고 목적의 secret path에 필요한perrmission은 정확한grant의 전제 조건이다.
$ vault kv put secret/circleci/dev password=foo

$ vault policy write circleci-dev -<<EOF
path "secret/data/circleci/dev" {
  capabilities = ["read"]
}
EOF

실제 Orb 사용


그러면 실제 워크플로우에서Vault까지 OIDC 인증을 통해 임의의 비밀을 얻으려고 시도한다.
description: |
  Install Vault binary, authenticate using OIDC, and get secrets.
usage:
  version: 2.1
  orbs:
    orb-hashicorp-vault-cli: smaeda-ks/orb-hashicorp-vault-[email protected]
  jobs:
    my-job:
      machine: true
      steps:
        - checkout
        # Install Vault
        - orb-hashicorp-vault-cli/install
        # Authenticate using OIDC and obtain token
        # This will automatically set VAULT_TOKEN env variable
        - orb-hashicorp-vault-cli/auth-oidc:
            vault-address: "http://localhost:8200"
            vault-role: "circleci-dev"
        - run:
            name: Get secret
            command: |
              # export secret using $BASH_ENV
              # so it can be referenced by subsequent steps within the job
              FOO=$(vault kv get -field=password secret/circleci/dev)
              echo "export SECRET_FOO=${FOO}" >> $BASH_ENV
  workflows:
    use-my-orb:
      jobs:
        - my-job
이번에 제작된 Orb는 installauth-oidc 두 가지 지령만 제공한다.install 명령을 사용한 후 현재 사용되고 있는 excutor에서Vault의 실행 파일을 다운로드하여 경로를 통과합니다.이렇게 하면 이후 stepvault에서 명령을 사용할 수 있다.auth-oidc 명령을 사용한 후,Circleci에서 추출한 JWT 토큰을 사용하여 원격Vault와 인증하여token을 획득한다.이때 획득한token은 자동으로 환경 변수VAULT_TOKEN로 설정되므로 auth-oidc를 실행한 후 Vault에 로그인한 상태vault에서 명령을 사용할 수 있습니다.
또한 vault-addressvault-role는 Required 매개 변수이기 때문에 지정해야 합니다.vault-role 미리 작성된 JWT auth backend의 role을 지정합니다.이번 경우circleci-dev죠.Namespace 등도 유상 Vault를 사용할 때 지정을 선택할 수 있습니다. 자세한 내용은 설명서를 참조하십시오.
https://circleci.com/developer/orbs/orb/smaeda-ks/orb-hashicorp-vault-cli#commands-auth-oidc
이 두 명령을 실행한 후 상기 예에서 마지막 step에서 secret/circleci/dev path에 저장된 password 데이터를 얻었다.실제 워크플로우에서 이것은 후속 step부터 사용하죠.

기타


이번에 제작된 Orb은 제 개인적인 Namespace와 관련이 있습니다. Circleci에서 verify를 받은 것이 아니기 때문에 CircleaCI의 org 설정에서 Orb의 사용을 인정하지 않은 것을 미리 허가해야 합니다.

좋은 웹페이지 즐겨찾기