Secret Manager의 보안 비밀 사용

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

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

시작하기 전에

  • API Cloud Build and Secret Manager 사용 설정

    API 사용 설정

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

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

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

필수 IAM 권한

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

  1. Google Cloud Console에서 Secret Manager 페이지를 엽니다.

    Secret Manager 페이지로 이동

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

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

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

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

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

  7. 저장을 클릭합니다.

Secret Manager에서 UTF-8 보안 비밀에 액세스하도록 빌드 구성

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

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

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

    다음 빌드 구성 파일 예시는 Secret Manager에 저장된 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: 보안 비밀을 저장한 Google Cloud 프로젝트의 ID입니다.
    • DOCKER_USERNAME_SECRET_NAME: Docker 사용자 이름에 해당하는 보안 비밀 이름입니다. Google Cloud Console의 Secret Manager 페이지에서 보안 비밀 이름을 가져올 수 있습니다.
    • DOCKER_USERNAME_SECRET_VERSION: Docker 사용자 이름의 보안 비밀 버전입니다. Google Cloud Console의 Secret Manager 페이지에서 보안 비밀 이름을 클릭하여 보안 비밀 버전을 가져올 수 있습니다.
    • DOCKER_PASSWORD_SECRET_NAME: Docker 비밀번호에 해당하는 보안 비밀 이름입니다. Google Cloud Console의 Secret Manager 페이지에서 보안 비밀 이름을 가져올 수 있습니다.
    • DOCKER_PASSWORD_SECRET_VERSION: Docker 비밀번호의 보안 비밀 버전입니다. Google Cloud Console의 Secret Manager 페이지에서 보안 비밀 이름을 클릭하여 보안 비밀 버전을 가져올 수 있습니다.
  3. 빌드 구성 파일을 사용하여 명령줄을 사용하여 빌드를 시작하거나 트리거를 사용하여 빌드를 자동화합니다.

예시: 스크립트 및 프로세스에서 보안 비밀 액세스

secretEnv 필드는 보안 비밀 값을 환경에 추가합니다. 스크립트 또는 프로세스의 환경 변수를 통해 이 값에 액세스할 수 있습니다.

YAML

steps:
- name: python:slim
  entrypoint: python
  args: ['main.py']
  secretEnv: ['MYSECRET']
availableSecrets:
  secretManager:
  - versionName: projects/$PROJECT_ID/secrets/mySecret/versions/latest
    env: 'MYSECRET'

JSON

{
  "steps": [
  {
    "name": "python:slim",
    "entrypoint": "python",
    "args": [
        "main.py"
    ],
    "secretEnv": [
        "MYSECRET"
    ]
}
],
"availableSecrets": {
  "secretManager": [
    {
        "versionName": "projects/$PROJECT_ID/secrets/mySecret/versions/latest",
        "env": "MYSECRET"
    }
  ]
}
}

다음 main.py 콘텐츠는 보안 비밀의 처음 5자를 출력합니다.

import os
print(os.environ.get("MYSECRET", "Not Found")[:5], "...")

예시: Docker에 인증

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

예시: GitHub pull 요청 만들기

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

  • GitHub 토큰을 만듭니다.
  • Secret Manager에 GitHub 토큰을 저장합니다.
  • 빌드 구성 파일에서 다음을 수행합니다.
    • 모든 빌드 steps 이후 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: 보안 비밀을 저장한 Google 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 요청입니다.

Secret Manager에서 비UTF-8 보안 비밀에 액세스하도록 빌드 구성

  1. 빌드 구성 파일에 Secret Manager의 보안 비밀 버전에 액세스하는 빌드 단계를 추가하고 파일에 저장합니다. 다음 빌드 단계에서는 secret-name에 액세스하고 이를 decrypted-data.txt라는 파일에 저장합니다.

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt"
        ]
      }
      ]
    }
    
  2. 빌드 단계에 복호화된 데이터가 포함 된 파일을 사용합니다. 다음 코드 스니펫은 decrypted-data.txt를 사용하여 비공개 Docker 레지스트리에 로그인합니다.

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    - name: gcr.io/cloud-builders/docker
      entrypoint: 'bash'
      args: [ '-c', 'docker login --username=my-user --password-stdin < decrypted-data.txt']
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > password.txt"
         ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=my-user --password-stdin < decrypted-data.txt"
         ]
      }
      ]
    }
    
  3. 빌드 구성 파일을 사용하여 명령줄을 사용하여 빌드를 시작하거나 트리거를 사용하여 빌드를 자동화합니다.

다음 단계