보안 비밀 관리자의 보안 비밀 사용

이 페이지에서는 Cloud Build에 비밀번호 및 API 키와 같은 민감한 정보를 포함하는 방법을 설명합니다.

보안 비밀 관리자는 API 키, 비밀번호, 기타 민감한 정보를 안전하게 저장하는 Google Cloud 서비스입니다. 빌드에 민감한 정보를 포함하려면 보안 비밀 관리자에 정보를 저장한 다음 보안 비밀 관리자의 정보에 액세스하도록 빌드를 구성하면 됩니다.

시작하기 전에

  • Cloud Build and Secret Manager API를 사용 설정합니다.

    API 사용 설정

  • 이 가이드의 명령줄 예시를 사용하려면 Cloud SDK를 설치하고 구성합니다.

  • 보안 비밀 관리자에 보안 비밀을 저장했는지 확인합니다. 자세한 내용은 보안 비밀 만들기를 참조하세요.

    • 보안 비밀의 보안 비밀 이름과 보안 비밀 버전을 적어 둡니다. 보안 비밀에 액세스하도록 Cloud Build를 구성하려면 이 정보가 필요합니다.

필수 IAM 권한

Cloud Build 서비스 계정에 보안 비밀에 대한 보안 비밀 관리자 보안 비밀 접근자(roles/secretmanager.secretAccessor) IAM 역할을 부여합니다.

  1. Google Cloud Console에서 보안 비밀 관리자 페이지를 엽니다.

    보안 비밀 관리자 페이지로 이동

  2. 빌드에서 사용할 보안 비밀의 체크박스를 선택합니다.

  3. 아직 열려 있지 않으면 정보 패널 표시를 클릭하여 패널을 엽니다.

  4. 패널의 권한에서 구성원 추가를 클릭합니다.

  5. 새 구성원 텍스트 상자에 PROJECT_NUMBER@cloudbuild.gserviceaccount.com 형식의 Cloud Build 서비스 계정 이메일 주소를 입력합니다. PROJECT_NUMBER빌드를 실행 중인 프로젝트의 프로젝트 번호입니다. 프로젝트 설정 페이지에서 프로젝트 번호를 찾을 수 있습니다.

  6. 역할 선택 드롭다운 메뉴에서 보안 비밀 관리자 보안 비밀 접근자를 선택합니다.

  7. 저장을 클릭합니다.

보안 비밀 관리자에서 보안 비밀에 액세스하도록 빌드 구성

  1. 프로젝트 루트 디렉터리에서 이름이 cloudbuild.yaml 또는 cloudbuild.json인 빌드 구성 파일을 만듭니다.

  2. 빌드 구성 파일에서 다음 안내를 따릅니다.

    • availableSecrets 필드를 추가하여 보안 비밀에 사용할 보안 비밀 버전과 환경 변수를 지정합니다. 빌드 하나에 보안 비밀을 두 개 이상 지정할 수 있습니다.
    • 보안 비밀을 지정하려는 빌드 단계에서 다음을 수행합니다.
      • 빌드 단계에서 bash 도구를 사용하려면 bash를 가리키는 entrypoint 필드를 추가합니다. 보안 비밀의 환경 변수를 참조해야 합니다.
      • 환경 변수를 지정하는 secretEnv 필드를 추가합니다.
      • args 필드에서 -c 플래그를 첫 번째 인수로 추가합니다. -c 다음에 전달하는 문자열은 모두 명령어로 취급됩니다. -c로 bash 명령어 실행에 대한 자세한 내용은 bash 문서를 참조하세요.
      • args 필드에 보안 비밀을 지정할 때 $$ 프리픽스가 있는 환경 변수를 사용하여 보안 비밀을 지정합니다.

    다음 빌드 구성 파일 예시는 보안 비밀 관리자에 저장된 Docker 사용자 이름과 비밀번호를 사용하여 Docker에 로그인하는 방법을 보여줍니다.

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      entrypoint: 'bash'
      args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
      secretEnv: ['USERNAME', 'PASSWORD']
    availableSecrets:
      secretManager:
      - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
        env: 'PASSWORD'
      - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
        env: 'USERNAME'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    위 명령어의 자리표시자 값을 다음으로 바꿉니다.

    • PROJECT_ID: 보안 비밀을 저장한 Cloud 프로젝트의 ID입니다.
    • DOCKER_USERNAME_SECRET_NAME: Docker 사용자 이름에 해당하는 보안 비밀 이름입니다. Cloud Console의 보안 비밀 관리자 페이지에서 보안 비밀 이름을 가져올 수 있습니다.
    • DOCKER_USERNAME_SECRET_VERSION: Docker 사용자 이름의 보안 비밀 버전입니다. Cloud Console의 보안 비밀 관리자 페이지에서 보안 비밀 이름을 클릭하여 보안 비밀 버전을 가져올 수 있습니다.
    • DOCKER_PASSWORD_SECRET_NAME: Docker 비밀번호에 해당하는 보안 비밀 이름입니다. Cloud Console의 보안 비밀 관리자 페이지에서 보안 비밀 이름을 가져올 수 있습니다.
    • DOCKER_PASSWORD_SECRET_VERSION: Docker 비밀번호의 보안 비밀 버전입니다. Cloud Console의 보안 비밀 관리자 페이지에서 보안 비밀 이름을 클릭하여 보안 비밀 버전을 가져올 수 있습니다.
  3. 빌드 구성 파일을 사용하여 빌드를 수동으로 시작하거나 트리거를 사용하여 빌드를 자동화합니다.

예: Docker에 인증

Docker 이미지와 상호작용하기 전에 빌드가 Docker에 인증해야 합니다. 예를 들어 빌드에서 비공개 이미지를 가져오고 비공개 또는 공개 이미지를 Docker Hub에 푸시하려면 Docker 인증이 필요합니다. 이러한 경우 Docker 사용자 이름과 비밀번호를 보안 비밀 관리자에 저장한 다음 보안 비밀 관리자에서 사용자 이름과 비밀번호에 액세스하도록 Cloud Build를 구성할 수 있습니다. 이 작업을 수행하는 방법은 Docker Hub 이미지와 상호작용을 참조하세요.

예: GitHub pull 요청 생성

보안 비밀 관리자의 민감한 정보에 액세스하도록 빌드를 구성하려는 또 다른 예는 빌드에 대한 응답으로 GitHub pull 요청을 만드는 것입니다. 방법은 다음과 같습니다.

  • GitHub 토큰을 만듭니다.
  • 보안 비밀 관리자에 GitHub 토큰을 저장합니다.
  • 빌드 구성 파일에서 다음을 수행합니다.
    • availableSecrets 필드를 추가하여 GitHub 토큰에 사용할 보안 비밀 버전과 환경 변수를 지정합니다.
    • GitHub pull 요청을 만드는 명령어를 호출하는 빌드 단계를 추가합니다.
  • GitHub 앱 트리거를 만들고 빌드 구성 파일을 사용하여 트리거를 호출합니다.

다음 구성 파일 예시는 GitHub 토큰을 사용하여 GitHub pull 요청을 만드는 방법을 보여줍니다.

YAML

steps:
- name: 'launcher.gcr.io/google/ubuntu1604'
  id: Create GitHub pull request
  entrypoint: bash
  args:
  - -c
  - curl -X POST -H "Authorization:Bearer $$GH_TOKEN" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME/pulls -d '{"head":"HEAD_BRANCH","base":"BASE_BRANCH", "title":"NEW_PR"}'
  secretEnv: ['GH_TOKEN']
availableSecrets:
  secretManager:
  - versionName: projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest
    env: GH_TOKEN

JSON

{
  "steps": [
  {
    "name": "launcher.gcr.io/google/ubuntu1604",
    "id": "Create GitHub pull request",
    "entrypoint": "bash",
    "args": [
      "-c",
       "curl -X POST -H \"Authorization:Bearer $$GH_TOKEN\" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME -d '{\"head\":\"HEAD_BRANCH\",\"base\":\"BASE_BRANCH\", \"title\":\"NEW_PR\"}'
    ],
    "secretEnv": ['GH_TOKEN']
}
],
"availableSecrets": {
  "secretManager": [
  {
    "versionName": "projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest",
    "env": "GH_TOKEN"
  }
  ]
}
}

위 명령어의 자리표시자 값을 다음으로 바꿉니다.

  • PROJECT_ID: 보안 비밀을 저장한 Cloud 프로젝트의 ID입니다.
  • GITHUB_USERNAME: 저장소 소유자의 GitHub 사용자 이름입니다.
  • REPO_NAME: GitHub 저장소의 이름입니다.
  • HEAD_BRANCH: 변경사항이 구현되는 브랜치의 이름입니다. 동일한 네트워크에 있는 교차 저장소 pull 요청의 경우 username:branch와 같은 사용자의 head 네임스페이스를 입력합니다.
  • BASE_BRANCH: 변경사항을 가져올 브랜치의 이름입니다. 현재 저장소의 기존 브랜치여야 합니다. 다른 저장소의 베이스로 병합을 요청하는 하나의 저장소에 pull 요청을 제출할 수 없습니다.
  • GH_TOKEN_SECRET_NAME: GitHub 토큰에 해당하는 보안 비밀 이름입니다.
  • NEW_PR: 만들려는 새 pull 요청입니다.

다음 단계