SSH 키를 통해 빌드에서 GitHub 액세스


이 튜토리얼에서는 Cloud Build와 함께 Secret Manager를 사용하여 빌드에서 비공개 GitHub 저장소에 액세스하는 방법을 설명합니다. Secret Manager는 API 키, 비밀번호, 기타 민감한 정보를 안전하게 저장하는 Google Cloud 서비스입니다.

목표

  • GitHub SSH 키를 설정합니다.
  • 비공개 저장소의 배포 키에 공개 SSH 키를 추가합니다.
  • 보안 비밀 저장소에 비공개 SSH 키를 저장합니다.
  • Secret Manager에서 키에 액세스하고 이를 사용해서 비공개 저장소에 액세스하는 빌드를 제출합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • Secret Manager
  • Cloud Build

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API Cloud Build and Secret Manager 사용 설정

    API 사용 설정

  5. Google Cloud CLI를 설치합니다.
  6. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  7. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  8. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  9. API Cloud Build and Secret Manager 사용 설정

    API 사용 설정

  10. Google Cloud CLI를 설치합니다.
  11. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  12. 선택사항. 이 제품에 익숙해지려면 Secret Manager 빠른 시작을 완료하세요.

SSH 키 만들기

  1. 터미널 창을 엽니다.

  2. workingdir라는 이름의 새 디렉터리를 만들고 디렉터리로 이동합니다.

    mkdir workingdir
    cd workingdir
    
  3. 새 GitHub SSH 키를 만듭니다. 여기서 github-email은 GitHub 이메일 주소입니다.

    ssh-keygen -t rsa -b 4096 -N '' -f id_github -C github-email
    

    이 명령어는 SSH 키에 대한 암호 없이 workingdir/id_github에 새 SSH 키를 만듭니다. Cloud Build는 암호로 보호된 경우 SSH 키를 사용할 수 없습니다.

보안 비밀 저장소에 비공개 SSH 키를 저장합니다.

SSH 키를 생성하면 사용자 환경에 id_github 파일이 생성됩니다. 누구나 이 파일로 사용자의 계정에 인증할 수 있으므로 빌드에서 이를 사용하기 전에 Secret Manager에서 파일을 저장해야 합니다.

  1. Secret Manager에서 SSH 키를 저장하려면 다음 안내를 따르세요.

    1. Google Cloud 콘솔에서 Secret Manager 페이지로 이동합니다.

      Secret Manager 페이지로 이동

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

    3. 보안 비밀 만들기 페이지에서 이름에 보안 비밀 이름을 입력합니다.

    4. 보안 비밀 값 필드에서 업로드를 클릭하고 workingdir/id_github 파일을 업로드합니다.

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

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

그러면 id_github 파일이 Secret Manager에 업로드됩니다.

공개 SSH 키를 비공개 저장소의 배포 키에 추가

  1. GitHub에 로그인합니다.

  2. 오른쪽 위 모서리에서 프로필 사진을 클릭한 후 사용자 프로필을 클릭합니다.

  3. 프로필 페이지에서 저장소를 클릭한 후 저장소 이름을 클릭합니다.

  4. 저장소에서 설정을 클릭합니다.

  5. 사이드바에서 배포 키를 클릭한 후 배포 키 추가를 클릭합니다.

  6. 제목을 제공하고 workingdir/id_github.pub의 공개 SSH 키를 붙여넣습니다.

  7. 이 키에 저장소 쓰기 액세스 권한을 부여하려면 쓰기 액세스 허용을 선택합니다. 쓰기 액세스 권한이 있는 배포 키는 저장소에 대한 배포 밀어내기를 허용합니다.

  8. 키 추가를 클릭합니다.

  9. 디스크에서 SSH 키를 삭제합니다.

    rm id_github*
    

권한 부여

빌드 중 Secret Manager에 액세스할 수 있도록 Cloud Build 서비스 계정에 권한을 부여해야 합니다.

  1. Google Cloud 콘솔에서 IAM 페이지를 엽니다.

    IAM 페이지 열기

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

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

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

  5. 저장을 클릭합니다.

알려진 호스트에 공개 SSH 키를 추가합니다.

대부분의 머신에는 이름이 known_hosts인 파일이 포함됩니다. 여기에는 원격 호스트에 대해 알려진 키가 포함됩니다. 키는 종종 처음 연결할 때 원격 호스트에서 수집됩니다. 하지만 수동으로 키를 추가할 수도 있습니다. 이 파일의 키는 원격 호스트의 ID를 확인하고 명의 도용으로부터 보호하기 위해 사용됩니다.

Cloud Build가 GitHub에 연결하기 위해서는 Cloud Build의 빌드 환경에서 known_hosts 파일에 공개 SSH 키를 추가해야 합니다. 이렇게 하려면 임시 known_hosts.github 파일에 키를 추가한 후 known_hosts.github 내용을 Cloud Build의 빌드 환경에 있는 known_hosts 파일에 복사하면 됩니다.

workingdir 디렉터리에서 이름이 known_hosts.github인 파일을 만들고 이 파일에 공개 SSH 키를 추가합니다.

ssh-keyscan -t rsa github.com > known_hosts.github

다음 섹션에서는 빌드를 구성할 때 Cloud Build 구성 파일의 지침을 추가하여 known_hosts.github의 콘텐츠를 Cloud Build의 빌드 환경에 있는 known_hosts 파일에 복사합니다.

빌드 구성

빌드를 구성하려면 다음 단계를 따르세요.

  1. 두 단계로 cloudbuild.yaml이라는 빌드 구성 파일을 만듭니다. 첫 번째 gcloud 단계에서는 Secret Manager의 SSH 키에 액세스하여 이름이 ssh인 볼륨에 id_rsa로 저장합니다. known_hosts.github의 사본과 함께 저장합니다. 볼륨은 빌드 단계에서 파일을 유지하는 데 사용됩니다. 두 번째 git 단계에서는 id_rsa의 키를 사용하여 git@github.com:git-username/git-repository의 저장소에 연결합니다.

    # Access the id_github file from Secret Manager, and setup SSH
    steps:
    - name: 'gcr.io/cloud-builders/git'
      secretEnv: ['SSH_KEY']
      entrypoint: 'bash'
      args:
      - -c
      - |
        echo "$$SSH_KEY" >> /root/.ssh/id_rsa
        chmod 400 /root/.ssh/id_rsa
        cp known_hosts.github /root/.ssh/known_hosts
      volumes:
      - name: 'ssh'
        path: /root/.ssh
    
    # Clone the repository
    - name: 'gcr.io/cloud-builders/git'
      args:
      - clone
      - --recurse-submodules
      - git@github.com:GIT_USERNAME/GIT_REPOSITORY
      volumes:
      - name: 'ssh'
        path: /root/.ssh
    
    availableSecrets:
      secretManager:
      - versionName: projects/PROJECT_ID/secrets/SECRET_NAME/versions/latest
        env: 'SSH_KEY'
    

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

  • GIT_USERNAME: 저장소 소유자의 GitHub 사용자 이름입니다.
  • GIT_REPOSITORY: 액세스하려는 GitHub 저장소의 이름입니다.
  • PROJECT_ID: 보안 비밀을 저장한 Google Cloud 프로젝트의 ID입니다.
  • SECRET_NAME: Secret Manager에서 만든 보안 비밀의 이름입니다.

위 스니펫에 사용된 YAML 여러 줄 문자열에 대해 알아보려면 YAML 여러 줄을 참조하세요.

빌드 제출

빌드를 제출하려면 다음 명령어를 실행합니다.

gcloud builds submit --config=cloudbuild.yaml .

출력은 다음과 비슷합니다.

Creating temporary tarball archive of 3 file(s) totalling 4.1 KiB before compression.
Uploading tarball of [.] to [gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/[PROJECT-ID]/builds/871b68bc---].
Logs are available at [https://console.cloud.google.com/cloud-build/builds/871b68bc---?project=[PROJECT-ID]].
----------------------------- REMOTE BUILD OUTPUT ------------------------------
starting build "871b68bc-cefc-4411-856c-2a2b7c7d2487"

FETCHSOURCE
Fetching storage object: gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178
Copying gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178...
/ [1 files][  3.9 KiB/  3.9 KiB]
Operation completed over 1 objects/3.9 KiB.
BUILD
Step #0: Already have image (with digest): gcr.io/cloud-builders/gcloud
Starting Step #0
Finished Step #0
Step #1: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #1
Step #1: # github.com SSH-2.0-libssh_0.7.0
Finished Step #1
Step #2: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #2
Step #2: Cloning into '[REPOSITORY-NAME]'...
Step #2: Warning: Permanently added the RSA host key for IP address 'XXX.XXX.XXX.XXX' to the list of known hosts.
Finished Step #2
PUSH
DONE
-----------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                              IMAGES  STATUS
871b68bc-cefc-4411-856c-2a2b7c7d2487  XXXX-XX-XXT17:57:21+00:00  13S       gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz  -                                 SUCCESS

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하는 방법은 다음과 같습니다.

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

저장소에서 배포 키 삭제

  1. GitHub에서 저장소의 기본 페이지로 이동합니다.

  2. 저장소 이름 아래에서 설정을 클릭합니다.

  3. 왼쪽 사이드바에서 배포 키를 클릭합니다.

  4. 배포 키 페이지에서 저장소와 연결된 배포 키를 찾고 삭제를 클릭합니다.

다음 단계