실습 설정 안내 및 요구사항
계정과 진행 상황을 보호하세요. 이 실습을 실행하려면 항상 시크릿 브라우저 창과 실습 사용자 인증 정보를 사용하세요.

안전한 소프트웨어 배포: 챌린지 실습

실습 20분 universal_currency_alt 크레딧 5개 show_chart 중급
info 이 실습에는 학습을 지원하는 AI 도구가 통합되어 있을 수 있습니다.
이 콘텐츠는 아직 휴대기기에 최적화되지 않음
최상의 경험을 위해 데스크톱 컴퓨터에서 이메일로 전송된 링크를 사용하여 방문하세요.

GSP521

Google Cloud 사용자 주도형 실습 로고

개요

챌린지 실습에서는 특정 시나리오와 일련의 작업이 주어집니다. 단계별 안내를 따르는 대신, 과정의 실습에서 배운 기술을 사용하여 스스로 작업을 완료하는 방법을 알아내 보세요. 이 페이지에 표시되어 있는 자동 채점 시스템에서 작업을 올바르게 완료했는지 피드백을 제공합니다.

챌린지 실습을 진행할 때는 새로운 Google Cloud 개념에 대한 정보가 제공되지 않습니다. 학습한 기술을 응용하여 기본값을 변경하거나 오류 메시지를 읽고 조사하여 실수를 바로잡아야 합니다.

100점을 받으려면 시간 내에 모든 작업을 성공적으로 완료해야 합니다.

이 실습은 안전한 소프트웨어 배포 과정에 등록한 수강생에게 권장됩니다. 챌린지에 도전할 준비가 되셨나요?

챌린지 시나리오

Cymbal Bank의 소프트웨어 엔지니어인 여러분은 새로운 웹 애플리케이션을 클라우드에 안전하게 배포하는 업무를 맡고 있습니다. 이 애플리케이션은 민감한 고객 데이터를 다루기 때문에 보안이 무엇보다 중요합니다. 여러분의 목표는 엄격한 보안 표준을 준수하는 동시에 컨테이너화된 애플리케이션을 빌드, 스캔, 서명, 배포하는 강력하고 자동화된 파이프라인을 구현하는 것입니다. 이 챌린지에서 여러분은 샘플 애플리케이션에서 Artifact Registry, Binary Authorization, Cloud Build와 같은 Google Cloud 서비스를 사용하여 이 목표를 달성합니다.

테스트 주제

  • Artifact Registry 저장소 만들기: 스캔과 프로덕션을 위해 Docker 이미지를 저장할 Artifact Registry 저장소를 설정합니다.
  • Docker 이미지 푸시: Cloud Build를 통해 Docker 이미지를 빌드하고 Artifact Registry에 푸시하여 취약점 스캔을 수행합니다.
  • Binary Authorization 설정: 증명자와 키로 Binary Authorization을 구성하여 이미지 서명 정책을 적용합니다.
  • 취약점 스캔 보기: Artifact Registry 내에서 취약점 스캔 결과를 검토하여 잠재적인 보안 위험을 식별하고 이해합니다.
  • 안전한 CI/CD 파이프라인 만들기: 이미지 빌드, 취약점 스캔, 이미지 서명을 자동화하는 Cloud Build 파이프라인을 빌드합니다.
  • 검토 및 수정: 심각한 취약점으로 인해 빌드가 실패한 원인을 분석하고 애플리케이션 코드의 문제를 수정합니다.
  • 재빌드 및 배포: 수정된 코드로 CI/CD 파이프라인을 다시 실행하고 Cloud Run에 성공적으로 배포되었는지 확인합니다.

설정 및 요건

실습 시작 버튼을 클릭하기 전에

다음 안내를 확인하세요. 실습에는 시간 제한이 있으며 일시중지할 수 없습니다. 실습 시작을 클릭하면 타이머가 시작됩니다. 이 타이머는 Google Cloud 리소스를 사용할 수 있는 시간이 얼마나 남았는지를 표시합니다.

실무형 실습을 통해 시뮬레이션이나 데모 환경이 아닌 실제 클라우드 환경에서 실습 활동을 진행할 수 있습니다. 실습 시간 동안 Google Cloud에 로그인하고 액세스하는 데 사용할 수 있는 새로운 임시 사용자 인증 정보가 제공됩니다.

이 실습을 완료하려면 다음을 준비해야 합니다.

  • 표준 인터넷 브라우저 액세스 권한(Chrome 브라우저 권장)
참고: 이 실습을 실행하려면 시크릿 모드(권장) 또는 시크릿 브라우저 창을 사용하세요. 개인 계정과 학습자 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.
  • 실습을 완료하기에 충분한 시간(실습을 시작하고 나면 일시중지할 수 없음)
참고: 이 실습에는 학습자 계정만 사용하세요. 다른 Google Cloud 계정을 사용하는 경우 해당 계정에 비용이 청구될 수 있습니다.

작업 1. API 사용 설정 및 환경 설정

안전한 CI/CD 파이프라인을 빌드하기 전에 필요한 Google Cloud API를 사용 설정하고 개발 환경을 설정해야 합니다. 이렇게 해야 필요한 모든 서비스와 도구에 액세스할 수 있습니다.

  1. 이 실습에 필요한 API를 사용 설정합니다.
gcloud services enable \ cloudkms.googleapis.com \ run.googleapis.com \ cloudbuild.googleapis.com \ container.googleapis.com \ containerregistry.googleapis.com \ artifactregistry.googleapis.com \ containerscanning.googleapis.com \ ondemandscanning.googleapis.com \ binaryauthorization.googleapis.com
  1. Cloud Shell에서 다음 명령어를 실행하여 샘플 Python, Docker, Cloud Build 파일을 다운로드합니다.
mkdir sample-app && cd sample-app gcloud storage cp gs://spls/gsp521/* .
  1. 스캔용과 프로덕션용인 Artifact Registry 저장소 두 개를 만듭니다. 저장소의 이름을 각각 artifact-scanning-repoartifact-prod-repo로 지정합니다.

스캔 저장소는 취약점 스캔 전에 Docker 이미지를 저장하는 데 사용되며, 프로덕션 저장소는 이미지가 서명되고 배포 준비가 완료된 후에 이미지를 저장합니다.

목표를 확인하려면 내 진행 상황 확인하기를 클릭합니다.

API를 사용 설정하고 Artifact Registry를 설정합니다.

작업 2. Cloud Build 파이프라인 만들기

이 작업에서는 Docker 이미지를 빌드하고 Artifact Registry에 푸시하는 기본 Cloud Build 구성을 만들어 CI/CD 파이프라인의 기반을 마련합니다. 이 초기 단계를 거치면 실습 후반부에 이미지의 취약점을 스캔할 수 있습니다.

  1. 먼저 Cloud Build 서비스 계정에 다음 역할을 추가합니다.

    • roles/iam.serviceAccountUser
    • roles/ondemandscanning.admin
  2. Cloud Shell 편집기에서 sample-app/cloudbuild.yaml 파일을 엽니다.

  3. TODO 완료: 이미지 이름 자리표시자(<image-name>)를 작성합니다. 이를 위해 artifact-scanning-repo 저장소를 참조해야 하며, 이미지 이름은 sample-image여야 합니다. 리전을 사용해야 합니다.

  4. 빌드를 제출합니다.

  5. artifact-scanning-repo 저장소에 푸시한 이미지를 확인하고 스캔 결과에 여러 개의 심각 취약점이 표시되는지 확인합니다.

목표를 확인하려면 내 진행 상황 확인하기를 클릭합니다.

Cloud Build 파이프라인을 만듭니다.

작업 3. Binary Authorization 설정

컨테이너 배포에 대한 엄격한 보안 정책을 적용하기 위해 Binary Authorization을 활용합니다. 이 서비스를 사용하면 누가 어떤 이미지를 어떤 조건으로 배포할 수 있는지 정의할 수 있습니다. 이 작업에서는 증명자, 메모, KMS 키 등 Binary Authorization의 필수 구성요소를 만들고 구성합니다. 이렇게 하면 CI/CD 파이프라인에 Binary Authorization을 통합할 준비가 됩니다.

증명자 만들기

  1. Cloud Shell에서 JSON 파일을 만듭니다. 이 파일은 증명 힌트가 포함된 증명자 메모를 정의합니다. 증명 힌트의 human_readable_name은 'Container Vulnerabilities attestation authority'로 설정되어야 합니다.

  2. Container Analysis API를 사용하여 ID가 vulnerability_note인 새 메모를 만듭니다. 메모의 세부정보는 이전 단계에서 만든 메모 파일에 정의되어 있어야 합니다. API 요청에 적절한 인증을 포함하고 적절한 Content-Type 헤더를 설정해야 합니다.

  3. Container Analysis API를 사용하여 방금 만든 증명자 메모의 세부정보를 가져옵니다. API 요청에 적절한 인증이 포함되어야 합니다.

  4. gcloud 명령줄 도구를 사용하여 새로운 Binary Authorization 증명자를 만듭니다. 증명자 ID는 vulnerability-attestor여야 하며, 이전에 만든 증명자 메모와 연결되어야 합니다.

  5. gcloud 명령줄 도구를 사용하여 기존의 모든 Binary Authorization 증명자를 나열합니다. 방금 만든 증명자가 목록에 포함되어 있는지 확인합니다.

  6. 만들어진 증명자 메모에서 Binary Authorization 서비스 계정에 roles/containeranalysis.notes.occurrences.viewer 역할을 부여하는 IAM 정책을 구성합니다. 그런 다음 Container Analysis API를 사용하여 메모에 이 IAM 정책을 설정합니다.

KMS 쌍 생성

이 섹션에서는 증명에 서명하기 위한 KMS 키 쌍을 생성합니다.

  1. 다음 단계에 따라 키 관리를 설정합니다.

    • 키를 저장할 global 위치에 binauthz-keys라는 이름의 KMS 키링을 만듭니다.
    • 이 키링 내에서 새로운 비대칭 서명 키 쌍을 생성합니다. 이 키의 이름을 lab-key로 지정하고 버전 1인지 확인합니다.
  2. 다음 단계에 따라 키를 증명자에 연결합니다.

    • gcloud 명령줄 도구를 사용하여 lab-key(버전 1)를 Binary Authorization 증명자와 연결합니다. 키를 참조할 때 global 위치와 binauthz-keys 키링을 지정해야 합니다.

Binary Authorization 정책 업데이트

  1. 정책 수정: 기본 규칙에 대한 증명 요구사항을 적용하도록 Binary Authorization 정책을 조정합니다.

  2. 증명자 통합: 이전에 만든 vulnerability-attestor를 정책 구성의 일부로 포함합니다.

목표를 확인하려면 내 진행 상황 확인하기를 클릭합니다.

증명자, KMS 쌍을 만들고 정책을 업데이트합니다.

작업 4. 취약점 스캔을 지원하는 Cloud Build CI/CD 파이프라인 만들기

이제 작업 2에서 만든 기본 파이프라인에 중요한 보안 기능을 추가하여 파이프라인을 개선합니다. 여기에는 컨테이너 이미지의 잠재적인 약점을 식별하는 취약점 스캔과 이미지 무결성을 보장하는 이미지 서명이 포함됩니다. 이 작업에서는 취약점 스캔과 이미지 서명을 CI/CD 파이프라인에 통합하여 더욱 강력하고 안전하게 만듭니다.

Cloud Build 서비스 계정에 필요한 역할 추가

  1. 프로젝트에서 Cloud Build 서비스 계정에 다음 IAM 역할을 부여합니다.

    • roles/binaryauthorization.attestorsViewer
    • roles/cloudkms.signerVerifier
    • roles/containeranalysis.notes.attacher
    • roles/iam.serviceAccountUser
    • roles/ondemandscanning.admin
  2. 또한 Compute Engine 기본 서비스 계정에도 cloudkms.signerVerifier 역할이 있는지 확인합니다.

커스텀 빌드 설치 단계

  1. Cloud Build의 커스텀 빌드 단계를 사용하여 증명 프로세스를 간소화합니다. Google은 프로세스를 간소화하기 위해 도우미 함수가 포함된 커스텀 빌드 단계를 제공합니다. 사용하려면 먼저 컨테이너에 커스텀 빌드 단계의 코드를 빌드하고 Cloud Build로 푸시해야 합니다. 이렇게 하려면 다음 명령을 실행합니다.
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git cd cloud-builders-community/binauthz-attestation gcloud builds submit . --config cloudbuild.yaml cd ../.. rm -rf cloud-builders-community

Cloud Build 파이프라인 업데이트

이 섹션에서는 취약점 스캔, 심각도 검사, 이미지 서명, Cloud Run에 대한 배포를 포함하도록 Cloud Build 파이프라인을 완성합니다. 아래 제공된 코드는 파이프라인의 부분적인 구현입니다. 파이프라인을 완성하려면 누락된 부분을 채워야 합니다.

  1. TODO 완료: 다음을 포함하여 파이프라인의 누락된 부분을 채웁니다.
    • 취약점 스캔을 위해 Artifact Registry에서 이미지 위치를 지정합니다. artifact-scanning-repo 저장소에서 이미지를 스캔합니다.
    • 취약점 검사에 적절한 심각도 수준을 설정합니다. CRITICAL 취약점이 발견되면 파이프라인은 실패할 것입니다.
    • 올바른 증명자 및 KMS 키 정보를 사용해 이미지 서명 단계를 구성합니다. 증명자 이름은 vulnerability-attestor이고 키 버전은 lab-key 버전 1의 전체 경로입니다.
    • 프로덕션용으로 이미지에 다시 태그하고 프로덕션 저장소에 푸시합니다. 이 목적을 위해서는 artifact-prod-repo 저장소를 사용해야 합니다.
    • Cloud Run에 이미지를 배포합니다. 이 단계에는 artifact-prod-repo 저장소의 프로덕션 이미지를 사용합니다.
참고: 이 실습의 두 번째 작업에서 cloudbuild.yaml 파일의 첫 몇 가지 TODO를 이미 작성했습니다. 나머지 자리표시자는 나머지 TODO의 올바른 값으로 바꾸어야 합니다.

cloudbuild.yaml

steps: # TODO: #1. 빌드 단계. <image-name> 자리표시자를 올바른 값으로 바꿉니다. - id: "build" name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', '<image-name>', '.'] waitFor: ['-'] # TODO: #2. Artifact Registry에 푸시합니다. <image-name> 자리표시자를 올바른 값으로 바꿉니다. - id: "push" name: 'gcr.io/cloud-builders/docker' args: ['push', '<image-name>'] # TODO: #3. 취약점 스캔을 실행합니다. <image-name> 자리표시자를 올바른 값으로 바꿉니다. - id: scan name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: - '-c' - | (gcloud artifacts docker images scan \ <image-name> \ --location us \ --format="value(response.scan)") > /workspace/scan_id.txt # TODO: #4. 스캔 결과를 분석합니다. CRITICAL 취약점이 발견되는 경우 빌드가 실패합니다. # <correct vulnerability> 자리표시자를 올바른 값으로 바꿉니다. 대소문자를 구분합니다. - id: severity check name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: - '-c' - | gcloud artifacts docker images list-vulnerabilities $(cat /workspace/scan_id.txt) \ --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq <correct vulnerability>; \ then echo "Failed vulnerability check for <correct vulnerability> level" && exit 1; else echo \ "No <correct vulnerability> vulnerability found, congrats !" && exit 0; fi # TODO: #5. 이전 심각도 검사에 통과한 경우에만 이미지에 서명됩니다. # <image-name>, <attestor-name>, <key-version> 자리표시자를 올바른 값으로 바꿉니다. # 참고로, <key-version>은 키 버전의 **전체** 경로여야 합니다. - id: 'create-attestation' name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest' args: - '--artifact-url' - '<image-name>' - '--attestor' - '<attestor-name>' - '--keyversion' - '<key-version>' # TODO: #6. 프로덕션용 이미지에 태그를 다시 지정하고 최신 태그를 사용하여 프로덕션 저장소에 푸시합니다. # <image-name> 및 <production-image-name> 자리표시자를 올바른 값으로 바꿉니다. - id: "push-to-prod" name: 'gcr.io/cloud-builders/docker' args: - 'tag' - '<image-name>' - '<production-image-name>' - id: "push-to-prod-final" name: 'gcr.io/cloud-builders/docker' args: ['push', '<production-image-name>'] # TODO: #7. Cloud Run에 배포합니다. <image-name> 및 <your-region> 자리표시자를 올바른 값으로 바꿉니다. - id: 'deploy-to-cloud-run' name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: - '-c' - | gcloud run deploy auth-service --image=<image-name> \ --binary-authorization=default --region=<your-region> --allow-unauthenticated # TODO: #8. <image-name> 자리표시자를 빌드 단계의 값으로 바꿉니다. images: - <image-name>
  1. 빌드 트리거:

    • 생성된 Cloud Build 구성을 제출하여 빌드 프로세스를 시작합니다.
    • 빌드를 제출할 때는 작업 중인 리전에 주의하세요.
  2. 빌드 실패 관찰:

    • Google Cloud 콘솔에서 Cloud Build 기록 페이지로 이동합니다.
    • 방금 트리거한 빌드를 찾아 상태를 확인합니다.
    • CRITICAL 심각도 취약점이 있어서 빌드가 실패하는지 확인합니다.
참고: 빌드는 CRITICAL 심각도 취약점으로 인해 실패해야 합니다. 다음 작업에서 이 문제를 해결할 것입니다.

목표를 확인하려면 내 진행 상황 확인하기를 클릭합니다.

CI/CD 파이프라인에 취약점 스캔을 통합합니다.

작업 5. 취약점 수정 후 CI/CD 파이프라인 재배포

실제 시나리오에서는 취약점 스캔을 통해 해결해야 하는 문제가 드러나는 경우가 많습니다. 이 작업에서는 중요한 취약점으로 인해 빌드가 실패하는 시나리오를 시뮬레이션합니다. 이 작업에서는 빌드 실패를 분석하고, 취약점을 식별하며, 애플리케이션의 종속 항목을 업데이트하여 취약점을 수정합니다. 그런 다음 Cloud Build 파이프라인을 다시 트리거하여 빌드가 심각한 취약점 없이 성공적으로 완료되는지 확인합니다.

  1. Dockerfile 업데이트: python:3.8-alpine 기본 이미지를 사용하도록 Dockerfile을 수정합니다. Flask, Gunicorn, Werkzeug 종속 항목을 다음 버전으로 업데이트합니다.

    • Flask: 3.0.3
    • Gunicorn: 23.0.0
    • Werkzeug: 3.0.4
  2. 빌드 다시 트리거: 업데이트된 Cloud Build 구성을 제출하여 새 빌드를 시작합니다.

  3. 빌드 성공 여부 확인: Cloud Build 기록 페이지에서 빌드가 CRITICAL 취약점 이슈 없이 성공적으로 완료되는지 확인합니다.

  4. 테스트를 위해 Cloud Run 서비스에 대한 인증되지 않은 액세스를 허용하여 배포를 검증할 수 있도록 다음 명령어를 실행합니다. <your-region>을 서비스를 배포한 리전으로 바꿉니다.

gcloud beta run services add-iam-policy-binding --region=<your-region> --member=allUsers --role=roles/run.invoker auth-service 참고: 이 명령어는 테스트 목적으로만 사용해야 하며 프로덕션 환경에서 사용해서는 안 됩니다.
  1. 배포 검증: Cloud Run 서비스 URL에 액세스하여 애플리케이션이 배포되고 올바르게 작동하는지 확인합니다.

목표를 확인하려면 내 진행 상황 확인하기를 클릭합니다.

취약점을 수정하고 CI/CD 파이프라인을 재배포합니다.

수고하셨습니다

수고하셨습니다. 이 실습에서 웹 애플리케이션을 빌드, 스캔, 서명하고 클라우드에 배포하는 보안 CI/CD 파이프라인을 성공적으로 구현했습니다. 이 실습 경험을 통해 클라우드에서 안전한 애플리케이션을 빌드하고 배포하는 데 필요한 필수 기술을 갖추고, 개발 워크플로에 보안 권장사항을 통합하며, 소프트웨어 배포 프로세스의 무결성을 보장할 수 있게 되었습니다.

안전한 소프트웨어 배포 기술 배지

다음 단계/더 학습하기

이 실습에서 다룬 주제에 관해 자세히 알아보려면 다음 리소스를 확인하세요.

Google Cloud 교육 및 자격증

Google Cloud 기술을 최대한 활용하는 데 도움이 됩니다. Google 강의에는 빠른 습득과 지속적인 학습을 지원하는 기술적인 지식과 권장사항이 포함되어 있습니다. 기초에서 고급까지 수준별 학습을 제공하며 바쁜 일정에 알맞은 주문형, 실시간, 가상 옵션이 포함되어 있습니다. 인증은 Google Cloud 기술에 대한 역량과 전문성을 검증하고 입증하는 데 도움이 됩니다.

설명서 최종 업데이트: 2025년 12월 10일

실습 최종 테스트: 2024년 9월 4일

Copyright 2026 Google LLC. All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.

시작하기 전에

  1. 실습에서는 정해진 기간 동안 Google Cloud 프로젝트와 리소스를 만듭니다.
  2. 실습에는 시간 제한이 있으며 일시중지 기능이 없습니다. 실습을 종료하면 처음부터 다시 시작해야 합니다.
  3. 화면 왼쪽 상단에서 실습 시작을 클릭하여 시작합니다.

시크릿 브라우징 사용

  1. 실습에 입력한 사용자 이름비밀번호를 복사합니다.
  2. 비공개 모드에서 콘솔 열기를 클릭합니다.

콘솔에 로그인

    실습 사용자 인증 정보를 사용하여
  1. 로그인합니다. 다른 사용자 인증 정보를 사용하면 오류가 발생하거나 요금이 부과될 수 있습니다.
  2. 약관에 동의하고 리소스 복구 페이지를 건너뜁니다.
  3. 실습을 완료했거나 다시 시작하려고 하는 경우가 아니면 실습 종료를 클릭하지 마세요. 이 버튼을 클릭하면 작업 내용이 지워지고 프로젝트가 삭제됩니다.

현재 이 콘텐츠를 이용할 수 없습니다

이용할 수 있게 되면 이메일로 알려드리겠습니다.

감사합니다

이용할 수 있게 되면 이메일로 알려드리겠습니다.

한 번에 실습 1개만 가능

모든 기존 실습을 종료하고 이 실습을 시작할지 확인하세요.

시크릿 브라우징을 사용하여 실습 실행하기

이 실습을 실행하는 가장 좋은 방법은 시크릿 모드 또는 시크릿 브라우저 창을 사용하는 것입니다. 개인 계정과 학생 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.