Autopilot 모드에서 권한이 있는 워크로드 승인 제어

클러스터에 워크로드의 허용 목록을 설치하여 Google Kubernetes Engine (GKE) Autopilot 모드에서 권한이 있는 워크로드를 실행할 수 있습니다. 이 문서에서는 다음 작업을 수행하는 방법을 보여줍니다.

  • Autopilot 모드에서 특정 권한이 있는 워크로드만 실행하도록 GKE를 구성합니다.
  • 권한이 있는 워크로드의 허용 목록을 설치합니다.

이 문서는 다음 유형의 역할을 대상으로 합니다.

  • 서드 파티 워크로드가 클러스터에서 실행되려면 허용 목록이 필요하고 GKE에서 승인한 소스에서 가져와야 한다고 확인하려는 보안 엔지니어
  • 클러스터에서 서드 파티 워크로드를 사용 설정하여 애플리케이션팀 차단을 해제하려는 플랫폼 엔지니어

다음 개념에 익숙해야 합니다.

Autopilot의 권한이 있는 워크로드 정보

Autopilot 모드는 보안 상태를 개선하기 위해 워크로드에 기본 제약 조건 집합을 적용합니다. 이러한 제약 조건을 수정하여 해당 워크로드에 상응하는 허용 목록 을 설치하여 특정 권한이 있는 워크로드를 실행할 수 있습니다. 기본적으로 Autopilot을 사용하면 Autopilot 파트너 및 특정 오픈소스 프로젝트의 허용 목록을 설치할 수 있습니다. 자격 요건을 충족하는 GKE 고객은 Cloud Storage 버킷에 업로드하는 고객 소유의 권한이 있는 워크로드에 대한 허용 목록을 만들 수도 있습니다.

각 허용 목록은 특정 권한이 있는 워크로드와 일치하는 파일입니다. 권한이 있는 워크로드를 실행하려면 다음을 수행합니다.

  1. 특정 경로에서 허용 목록을 설치할 수 있도록 클러스터를 구성합니다. 기본적으로 Autopilot 파트너 및 승인된 오픈소스 프로젝트의 모든 허용 목록이 지원됩니다.
  2. 허용 목록을 설치하고 허용 목록을 최신 상태로 유지하는 클러스터에서 AllowlistSynchronizer 를 만듭니다.

권한이 있는 워크로드 및 허용 목록의 버그 및 기능 요청

권한이 있는 워크로드의 소유자는 워크로드와 허용 목록을 만들고 개발하고 유지보수해야 합니다. 권한이 있는 워크로드 또는 허용 목록에 버그가 발생하거나 기능 요청이 있는 경우 해당 소유자에게 문의하세요.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면 gcloud components update 명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.

요구사항

  • AllowlistSynchronizer 커스텀 리소스를 사용하려면 GKE 버전 1.32.2-gke.1652000 이상이 필요합니다.
  • 클러스터에서 실행하려는 권한이 있는 워크로드를 알고 있어야 합니다.
  • 클러스터의 허용 목록 경로 구성을 수정하려면 클러스터에서 GKE 버전 1.35 이상을 실행해야 합니다.

클러스터의 허용 목록 경로 구성

이 섹션에서는 승인된 경로 집합에서 허용 목록 설치를 지원하도록 클러스터를 구성하는 방법을 보여줍니다. 기본적으로 Autopilot은 GKE 파트너 및 승인된 오픈소스 프로젝트의 허용 목록 설치를 지원합니다. 개별 클러스터의 기본 구성을 수정할 수 있습니다. 조직 정책을 사용하여 전체 조직, 폴더, 또는 프로젝트에 승인된 허용 목록 소스를 지정할 수도 있습니다.

  1. 클러스터에 추가할 허용 목록 파일의 경로를 식별합니다. 클러스터를 만들거나 업데이트할 때 여러 경로를 지정할 수 있습니다. 경로 대신 빈 문자열을 지정하여 모든 소스의 허용 목록 설치를 사용 중지할 수도 있습니다. 지정할 수 있는 경로에 대한 자세한 내용은 허용 목록 경로를 참조하세요.

  2. 클러스터의 승인된 허용 목록 소스를 제어하려면 다음 명령어와 같이 Autopilot 또는 Standard 클러스터를 만들거나 업데이트할 때 --autopilot-privileged-admission 플래그를 사용합니다.

    gcloud container clusters create-auto CLUSTER_NAME \
        --location=LOCATION \
        --autopilot-privileged-admission=ALLOWLIST1_PATH,ALLOWLIST2_PATH,...
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 새 클러스터의 이름입니다.
    • LOCATION: 클러스터 컨트롤 플레인의 위치입니다(예: us-central1).
    • ALLOWLIST1_PATH,ALLOWLIST2_PATH,...: 허용 목록 파일 또는 디렉터리의 쉼표로 구분된 목록입니다. 예를 들면 gke://*,gs://my-agent/privileged-logging-agent.yaml입니다. 빈 문자열 ("")을 지정하여 모든 소스의 허용 목록 설치를 사용 중지할 수도 있습니다.

--autopilot-privileged-admission 플래그를 지정하지 않고 기존 클러스터를 업데이트하면 해당 클러스터의 기존 경로 구성이 변경되지 않습니다. 클러스터를 업데이트할 때마다 이 플래그를 지정할 필요는 없습니다.

클러스터 생성 또는 업데이트 작업이 완료되면 AllowlistSynchronizers를 만들어 지정된 경로에서 허용 목록을 설치할 수 있습니다.

새 AllowlistSynchronizer 만들기

권한이 있는 워크로드를 실행하려면 해당 허용 목록 파일의 경로를 YAML 파일의 AllowlistSynchronizer 사양에 추가합니다. 그런 다음 AllowlistSynchronizer를 클러스터에 배포합니다.

  1. 텍스트 편집기에서 새 YAML 파일을 만듭니다.
  2. 다음 콘텐츠를 YAML 파일에 추가합니다.

    apiVersion: auto.gke.io/v1
    kind: AllowlistSynchronizer
    metadata:
      name: ALLOWLIST_SYNCHRONIZER_NAME
    spec:
      allowlistPaths:
      - ALLOWLIST1_PATH
      - ALLOWLIST2_PATH
    

    다음을 바꿉니다.

    • ALLOWLIST_SYNCHRONIZER_NAME: 새 동기화 담당자 이름입니다. 허용 목록에서 지원하는 워크로드나 팀을 식별하는 설명이 포함된 이름을 선택합니다.
    • ALLOWLIST1_PATH, ALLOWLIST2_PATH, ...: 설치하려는 허용 목록 파일 또는 디렉터리의 경로 목록입니다(예: GKE 승인 허용 목록의 다음 예시).

      allowlistPaths:
      - Gke-Org/accelerators/*
      - Wiz/wiz-sensor/v1/wiz-sensor-v1.yaml
      

      또는 고객 소유 허용 목록의 다음 예시:

      allowlistPaths:
      - my-agent/log-collector/*
      - my-agent/privileged-logging-agent.yaml
      

      클러스터 구성은 클러스터의 허용 목록 경로 구성 섹션 에 설명된 대로 지정하는 경로를 지원해야 합니다. 또한 각 AllowlistSynchronizer에는 GKE 승인 허용 목록만 포함되거나 고객 소유 허용 목록만 포함되어야 합니다.

  3. 고객 소유 Cloud Storage 버킷에서 허용 목록을 설치하는 경우 AllowlistSynchronizer에 spec.projectNumberspec.bucketName 필드를 추가합니다. 자세한 내용은 AllowlistSynchronizer CustomResourceDefinition을 참조하세요.

  4. YAML 파일을 클러스터에 배포합니다.

    kubectl apply -f PATH_TO_YAML_FILE
    

    PATH_TO_YAML_FILE을 이전 단계에서 만든 YAML 파일의 경로로 바꿉니다.

    AllowlistSynchronizer 컨트롤러는 지정된 경로의 허용 목록 파일을 클러스터에 설치합니다.

  5. 동기화 담당자가 Ready 상태를 보고할 때까지 기다립니다.

    kubectl wait --for=condition=Ready allowlistsynchronizer/ALLOWLIST_SYNCHRONIZER_NAME \
        --timeout=60s
    

허용 목록 설치 및 권한이 있는 워크로드 배포를 지속적 통합 및 지속적 배포 (CI/CD) 파이프라인에 통합할 수도 있습니다. 해당 워크로드를 배포하기 전에 허용 목록이 성공적으로 설치될 때까지 기다리도록 워크플로를 구성합니다.

기존 AllowlistSynchronizer 업데이트

기존 AllowlistSynchronizer를 업데이트하여 허용 목록 파일을 추가하거나 삭제할 수 있습니다. 다음과 같은 상황에서 기존 동기화 담당자를 업데이트할 수 있습니다.

  • 워크로드 소유자가 이름이 다른 새 허용 목록 파일을 추가합니다.
  • 관련 허용 목록을 그룹화하는 기존 동기화 담당자에 새 워크로드 허용 목록을 추가하려고 합니다.
  • 더 이상 해당 워크로드를 사용하지 않으려 하기 때문에 동기화 담당자에서 허용 목록을 삭제하려고 합니다.

기존 AllowlistSynchronizer 객체를 업데이트하려면 다음을 수행합니다.

  1. 클러스터의 기존 동기화 담당자를 나열합니다.

    kubectl get allowlistsynchronizer
    
  2. 텍스트 편집기에서 업데이트하려는 동기화 담당자의 사양을 엽니다.

  3. spec.allowlistPaths 필드를 업데이트하여 허용 목록 파일 경로를 추가, 수정 또는 삭제합니다.

  4. 텍스트 편집기를 저장하고 닫습니다.

  5. 업데이트된 구성을 클러스터에 적용합니다.

    kubectl apply -f PATH_TO_YAML_FILE
    

    PATH_TO_YAML_FILE을 이전 단계에서 업데이트한 YAML 파일의 경로로 바꿉니다.

업데이트된 동기화 담당자 구성을 배포하면 AllowlistSynchronizer 객체 상태에 있는 managedAllowlistStatus.generation 필드가 1씩 증가합니다. 그러면 AllowlistSynchronizer 컨트롤러에서 변경사항을 적용합니다.

허용 목록 동기화 상태 모니터링

AllowlistSynchronizer를 설치하거나 기존 동기화 담당자를 업데이트한 후에 동기화 상태를 모니터링할 수 있습니다. 이 상태는 허용 목록 파일의 설치, 삭제, 수정뿐만 아니라 발생할 수 있는 오류를 추적하는 데 도움이 됩니다.

동기화의 일반적인 상태를 모니터링하려면 다음 명령어를 실행합니다.

kubectl get allowlistsynchronizer ALLOWLIST_SYNCHRONIZER_NAME -o yaml

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

...
status:
  conditions:
  - type: Ready
    status: "False"
    reason: "SyncError"
    message: "some allowlists failed to sync: example-allowlist-1.yaml"
    lastTransitionTime: "2024-10-12T10:00:00Z"
    observedGeneration: 2
  managedAllowlistStatus:
    - filePath: "gs://path/to/example-allowlist-2.yaml"
      generation: 1
      phase: Installed
      lastSuccessfulSync: "2024-10-10T10:00:00Z"
    - filePath: "gs://path/to/example-allowlist-1.yaml"
      phase: Failed
      lastError: "Initial install failed: invalid contents"
      lastSuccessfulSync: "2024-10-08T10:00:00Z"

이 예시 출력에서 example-allowlist-1.yaml 허용 목록은 동기화에 실패했고 example-allowlist-2.yaml 허용 목록은 성공적으로 설치되었습니다. 이러한 필드에 대한 설명은 AllowlistSynchronizer 상태를 참조하세요.

클러스터에 허용 목록이 있는지 확인

클러스터에 허용 목록이 있는지 확인하려면 다음 명령어를 실행합니다.

kubectl get workloadallowlist

출력은 클러스터에 설치된 허용 목록의 목록입니다. 출력에 사용하려는 허용 목록이 포함되어 있는지 확인합니다.

권한이 있는 워크로드 배포

허용 목록이 설치되면 클러스터에 해당 워크로드를 배포할 수 있습니다. 워크로드 소유자는 워크로드의 설치 안내도 제공해야 합니다. Autopilot 파트너 목록과 문서 링크는 Autopilot 파트너를 참조하세요.

비공개 이미지 미러 저장소 사용

소유한 비공개 저장소에서 권한이 있는 워크로드의 컨테이너 이미지를 미러링할 수 있습니다. 워크로드에서 이러한 미러링된 이미지를 실행하려면 다음 요구사항을 모두 충족해야 합니다.

  • 미러링된 이미지의 SHA-256 다이제스트는 공개적으로 제공되는 워크로드의 이미지 다이제스트와 일치해야 합니다.
  • 지정하는 SHA-256 이미지 다이제스트는 클러스터와 동기화되는 WorkloadAllowlist 객체에 있어야 합니다.

워크로드에서 미러링된 이미지를 지원하는 경우 해당 워크로드의 허용 목록 사양에는 해당 워크로드의 허용 목록 사양에 있는 containers.imageDigests 필드의 이미지 다이제스트 목록이 포함됩니다. 일반적으로 이 필드에는 사용 가능한 컨테이너 이미지 버전마다 별도의 다이제스트가 있습니다. 이 이미지 다이제스트 목록을 보려면 다음을 수행합니다.

  1. 클러스터에 허용 목록이 있는지 확인합니다.
  2. 설치된 허용 목록의 사양을 가져옵니다.

    kubectl get workloadallowlist ALLOWLIST_NAME -o yaml
    

    ALLOWLIST_NAME을 설치된 허용 목록의 이름으로 바꿉니다. 예를 들면 company-name-solution-v1.0.0입니다.

    이 기능을 지원하는 워크로드의 경우 출력은 다음과 유사합니다. imageDigests 필드에는 허용된 다이제스트 목록이 있습니다.

    # lines omitted for clarity
    - containerName: pause-container1
      imageDigests:
      - cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
      - 932ea160d395f3d7f76c0c17a52a63c4cfe1836a900f1058b6bc20b16fd10d23
    

    출력에 imageDigests 필드가 포함되지 않거나 사용하려는 출시의 다이제스트가 목록에 없는 경우 워크로드 소유자에게 직접 문의하여 허용 목록을 업데이트해 달라고 요청하세요. 워크로드 소유자가 허용 목록에 이미지 다이제스트를 추가하면 클러스터의 허용 목록 동기화 담당자가 업데이트된 허용 목록을 자동으로 설치합니다.

  3. 지원되는 이미지 다이제스트 중 하나를 워크로드 매니페스트에 추가합니다.

예를 들어 파트너의 공개적으로 사용 가능한 포드 사양에 있는 다음 이미지를 살펴보겠습니다.

...
  containers:
  - name: pause-container1
    image: partner-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

다이제스트가 공개적으로 사용 가능한 다이제스트와 일치하는 경우 미러링된 이미지를 사용할 수 있습니다(예: 다음 예시).

...
  containers:
  - name: pause-container1
    image: my-private-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

이전 예시와 마찬가지로 이미지 필드에 SHA-256 다이제스트를 포함해야 합니다. 다이제스트가 일치하지 않으면 미러링된 이미지가 실행되지 않습니다. 파트너 이미지를 미러링할 때 이미지 다이제스트를 보존하려면 crane, ORAS 또는 skopeo와 같은 도구를 사용하는 것이 좋습니다.

권한이 있는 워크로드 삭제

클러스터에서 권한이 있는 워크로드가 실행되도록 허용하지 않으려면 AllowlistSynchronizer에서 해당 허용 목록의 경로를 삭제합니다. 동기화 담당자가 허용 목록을 제거합니다.

동기화 담당자를 업데이트하는 대신 클러스터에서 WorkloadAllowlist 객체를 삭제하면 동기화 담당자가 허용 목록을 다시 설치합니다. AllowlistSynchronizer에서 경로를 삭제해야 합니다.

허용 목록을 제거하려면 다음을 수행합니다.

  1. 허용 목록을 관리하는 AllowlistSynchronizer의 YAML 매니페스트에서 제거하려는 허용 목록의 경로를 삭제합니다. 자세한 내용은 기존 AllowlistSynchronizer 섹션 업데이트를 참조하세요.
  2. 허용 목록이 제거되었는지 확인하려면 클러스터의 WorkloadAllowlist 객체 목록을 가져옵니다.

    kubectl get workloadallowlist
    

    출력에서 삭제하려는 허용 목록이 표시되지 않는지 확인합니다.

  3. 클러스터에서 워크로드를 삭제합니다. 자세한 내용은 워크로드 제공업체 문서를 참조하세요.

클러스터에서 허용 목록 설치 방지

특정 클러스터에 권한이 있는 워크로드 허용 목록이 설치되지 않게 하려면 클러스터를 만들거나 업데이트할 때 --autopilot-privileged-admission 플래그에 빈 문자열 ("")을 지정합니다.

  • 클러스터의 특정 허용 목록 경로를 사용 중지하려면 클러스터를 만들거나 업데이트할 때 해당 허용 목록의 경로를 생략합니다.

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --autopilot-privileged-admission=ALLOWLIST1_PATH,ALLOWLIST2_PATH,...
    

    ALLOWLIST1_PATH,ALLOWLIST2_PATH,...를 허용 목록 소스의 쉼표로 구분된 목록으로 바꿉니다. 사용 중지하려는 경로를 생략합니다.

  • 기존 클러스터의 모든 허용 목록을 사용 중지하려면 승인된 경로로 빈 문자열을 지정합니다.

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --autopilot-allowlist-paths=""
    

문제 해결

동기화 또는 워크로드 배포가 실패하면 권한이 있는 Autopilot 워크로드 배포 문제 해결을 참조하세요.

다음 단계