보안 비밀 및 사용자 인증 정보 사용

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

빌드에 민감한 정보를 포함하기 전에 보안 비밀 관리자에 저장하거나 Cloud Key Management Service를 사용하여 암호화하고 Cloud Build에 암호화된 정보만 포함해야 합니다. 보안 비밀 관리자는 Cloud Build로 민감한 정보를 관리하는 데 권장되는 기술입니다. 기존 프로젝트의 경우 Cloud KMS를 계속 사용할 수 있지만 새 프로젝트에서는 보안 비밀 관리자를 사용합니다.

시작하기 전에

이 페이지에 설명된 gcloud 명령어를 실행하려면 gcloud 명령줄 도구를 설치합니다.

  • 이전에 이미 Cloud SDK를 설치했으면 gcloud components update를 실행하여 최신 버전인지 확인합니다.

보안 비밀 관리자 사용

보안 비밀 관리자는 API 키, 비밀번호, 기타 민감한 정보를 안전하게 저장하는 Google Cloud 서비스입니다.

보안 비밀 관리자에 데이터를 저장하고 Cloud Build에서 이 데이터를 사용하려면 다음 안내를 따르세요.

  1. Secret Manager API를 사용 설정합니다.

    Secret Manager API 사용 설정

  2. Cloud Build 서비스 계정에 Secret Accessor IAM 역할을 부여합니다.

    1. Cloud Console에서 IAM 페이지를 엽니다.

      IAM 페이지 열기

    2. 프로젝트를 선택하고 열기를 클릭합니다.

    3. 권한 테이블에서 @cloudbuild.gserviceaccount.com으로 끝나는 이메일을 찾고 연필 아이콘을 클릭합니다.

    4. Secret Manager Secret Accessor 역할을 추가합니다.

    5. 저장을 클릭합니다.

  3. 보안 비밀 관리자에 데이터를 저장합니다.

    1. Cloud Console에서 보안 비밀 관리자 페이지로 이동합니다.

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

    2. 보안 비밀 관리자 페이지에서 보안 비밀 만들기를 클릭합니다.

    3. 보안 비밀 만들기 페이지에서 이름 아래에 secret-name를 입력합니다.

    4. 보안 비밀 값 필드에 데이터를 입력합니다.

    5. 리전 섹션을 변경하지 않은 상태로 둡니다.

    6. 보안 비밀 만들기 버튼을 클릭합니다.

    gcloud 명령줄 도구를 사용하여 보안 비밀 관리자를 사용하는 방법은 보안 비밀 관리자 빠른 시작을 참조하세요. 특정 보안 비밀에 대한 액세스 권한을 부여하는 방법은 보안 비밀에 대한 액세스 관리를 참조하세요.

  4. 빌드 구성 파일에 보안 비밀 관리자의 보안 비밀 버전에 액세스하는 빌드 단계를 추가하고 파일에 저장합니다. 다음 빌드 단계에서는 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"
        ]
      }
      ]
    }
    
  5. 빌드 단계에 복호화된 데이터가 포함 된 파일을 사용합니다. 다음 코드 스니펫은 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"
         ]
      }
      ]
    }
    
  1. 빌드 구성 파일을 사용하여 빌드를 수동으로 시작하거나 트리거를 사용하여 빌드를 자동화합니다.

Cloud KMS 사용

Cloud KMS는 암호화 키를 관리 및 사용할 수 있게 해주는 Google Cloud 서비스입니다.

Cloud KMS를 사용하여 민감한 정보를 암호화하고 이 데이터를 빌드 구성 파일에 사용하려면 다음 안내를 따르세요.

  1. Cloud KMS API를 사용 설정합니다.

    Cloud KMS API 사용 설정

  2. Cloud Build 서비스 계정에 Cloud KMS CryptoKey Decrypter IAM 역할을 부여합니다.

    1. Cloud Console에서 Cloud Build 설정 페이지로 이동합니다.

      설정 페이지 열기

    2. Cloud KMS CryptoKey 복호화기 역할이 있는 행을 찾고 상태사용 설정됨으로 설정합니다.

  3. 터미널 창을 엽니다.

  4. keyring-name 이름을 사용해서 새 Cloud KMS key-ring을 만듭니다.

      gcloud kms keyrings create keyring-name --location global
    
  5. key-ring keyring-name에 대해 새 Cloud KMS key key-name을 만듭니다.

      gcloud kms keys create key-name \
          --location global --keyring keyring-name \
          --purpose encryption
    
  6. 암호화된 데이터를 사용하도록 Cloud Build를 구성합니다.

    • 암호화된 변수를 사용하려면 다음 안내를 따르세요.

      1. key-namekeyring-name을 사용하여 secret-name를 암호화합니다. 암호화된 값은 base64로 인코딩된 문자열입니다. secret-name에 공백 또는 줄바꿈과 같은 불필요한 문자가 포함되지 않았는지 확인합니다. -n 플래그는 echo에 종결형 줄바꿈을 포함하지 않도록 지시합니다.

         echo -n secret-name | gcloud kms encrypt --plaintext-file=- \
             --ciphertext-file=- --location=global --keyring=keyring-name \
             --key=key-name | base64
        
      2. 빌드 구성 파일에 secrets 필드를 추가하여 암호화된 값을 지정하고 CryptoKey를 사용하여 복호화합니다. 그런 다음 암호화된 변수를 사용할 빌드 단계에 secretEnv 필드를 추가하여 변수를 환경 변수로 지정합니다. secretEnv 필드에 변수 이름을 포함합니다. 변수 값이나 이름은 동일하지만 보안 비밀이 아닌 환경 변수를 지정하면 Cloud Build에서 오류가 발생합니다.

        YAML

         steps:
         - name: 'gcr.io/cloud-builders/docker'
           entrypoint: 'bash'
           args: ['-c', 'docker login --username=user-name --password=$$PASSWORD']
           secretEnv: ['PASSWORD']
         - name: 'gcr.io/cloud-builders/docker'
           args: ['push', 'user-name/myubuntu']
         secrets:
         - kmsKeyName: projects/project-id/locations/global/keyRings/keyring-name/cryptoKeys/key-name
           secretEnv:
             PASSWORD: 'encrypted-password'
        

        JSON

         {
           "steps": [
            {
              "name": "gcr.io/cloud-builders/docker",
              "entrypoint": "bash",
              "args": [
                "-c",
                "docker login --username=user-name --password=$$PASSWORD"
               ],
               "secretEnv": [
                 "PASSWORD"
                ]
            },
            {
              "name": "gcr.io/cloud-builders/docker",
              "args": [
                "push",
                "user-name/myubuntu"
               ]
            }
            ],
            "secrets": [
             {
               "kmsKeyName": "projects/project-id/locations/global/keyRings/keyring-name/cryptoKeys/key-name",
               "secretEnv": {
                 "PASSWORD": "encrypted-password"
                }
             }
             ]
         }
        
    • 암호화된 파일을 사용하려면 다음 안내를 따르세요.

      1. keyring-namekeyring-name을 사용해서 secrets.json라는 파일을 암호화합니다. 그러면 secrets.json.enc라는 암호화된 파일이 생성됩니다. secrets.json은 64KiB 이하여야 합니다.

         gcloud kms encrypt --plaintext-file=secrets.json \
             --ciphertext-file=secrets.json.enc \
             --location=global --keyring=keyring-name\
             --key=key-name
        
      2. 빌드 구성 파일에서 복호화된 secrets.json 파일과 상호작용하는 빌드 단계 앞에 gcloud Cloud Build를 호출하여 암호화 키로 secrets.json.enc를 복호화하는 빌드 단계를 추가합니다. 이 빌드 단계는 파일을 암호화하는 데 사용되는 명령어와 유사합니다.

        YAML

         steps:
         - name: gcr.io/cloud-builders/gcloud
           args:
           - kms
           - decrypt
           - --ciphertext-file=secrets.json.enc
           - --plaintext-file=secrets.json
           - --location=global
           - --keyring=keyring-name
           - --key=key-name
           # more steps here
        

        JSON

         {
           "steps": [
            {
              "name": "gcr.io/cloud-builders/gcloud",
              "args": [
                "kms",
                "decrypt",
                "--ciphertext-file=secrets.json.enc",
                "--plaintext-file=secrets.json",
                "--location=global",
                "--keyring=keyring-name",
                "--key=key-name"
              ]
            }
            ]
         }
        

        이 단계가 완료된 다음에는 이후의 모든 단계에서 해독된 secrets.json 파일을 사용할 수 있습니다. 예를 들어 이 파일의 보안 비밀을 사용하여 외부 종속 항목을 가져오거나 빌드하는 Docker 컨테이너 이미지에 비밀 토큰을 포함할 수 있습니다.

  7. 빌드 구성 파일을 사용하여 빌드를 수동으로 시작하거나 트리거를 사용하여 빌드를 자동화합니다.

다음 단계