온프레미스 클러스터 설정

이 문서에서는 Google Distributed Cloud의 일부로 생성된 온프레미스 클러스터에 Binary Authorization을 설정하는 방법을 알려줍니다. 그런 후 샘플 Binary Authorization 정책을 구성하는 방법을 보여줍니다.

시작하기 전에

  1. 클러스터에 지원되는 Google Distributed Cloud 버전이 있는지 확인합니다. Binary Authorization은 다음 환경을 지원합니다.

    베어메탈

    Google Distributed Cloud 1.14 또는 1.15 버전 1.16 이상의 경우 Binary Authorization을 클러스터 생성 또는 업데이트 중에 구성할 수 있습니다.

    VMware

    VMware용 Distributed Cloud(Google Distributed Cloud) 1.4 이상

  2. Binary Authorization 서비스는 일반 인터넷 연결을 통해 액세스할 수 있는 외부 IP 주소를 사용합니다. 사용자 클러스터가 엔드포인트 binaryauthorization.googleapis.com에 액세스할 수 있도록 HTTPS용 방화벽 규칙을 구성하세요.

    베어메탈

    Google Distributed Cloud 방화벽 규칙을 구성합니다.

    VMware

    Google Distributed Cloud 방화벽 규칙을 구성합니다.

  3. 중앙 집중식 Cloud 감사 로그를 사용하여 감사 로그 항목(Google Cloud 외부의 Binary Authorization 감사 로그 항목 등)을 보려면 클러스터 구성에서 Cloud 감사 로그를 구성해야 합니다.

    베어메탈

    Google Distributed Cloud에서 Cloud 감사 로그를 구성합니다.

    VMware

    Google Distributed Cloud에서 Cloud 감사 로그를 구성합니다.

  4. 다음과 같이 Binary Authorization API를 사용 설정해야 합니다.

    1. Google Cloud 콘솔로 이동합니다.

      API 사용 설정

    2. 프로젝트 드롭다운 목록에서 Fleet 호스트 프로젝트를 선택합니다. 사용자 클러스터 구성 파일의 gkeConnect 섹션에서 이를 찾을 수 있습니다. 이것은 사용자 클러스터를 Google Cloud에 연결하는 Google Cloud 프로젝트입니다.

Binary Authorization 설정

이 섹션에서는 온프레미스 클러스터에서 Binary Authorization을 설정합니다.

설치 환경 변수 지정

환경 변수를 지정하려면 다음을 수행합니다.

워크로드 아이덴티티 사용

  1. Fleet 호스트 프로젝트를 지정합니다.

    export PROJECT_ID=PROJECT_ID
    
  2. Fleet 멤버십 ID를 클러스터 ID로 설정합니다.

    gcloud container fleet memberships list 명령어를 실행하면 멤버십 ID가 NAME 열에 나열됩니다.

    export MEMBERSHIP_ID=CLUSTER_NAME
    

서비스 계정 키 사용

  1. Fleet 호스트 프로젝트를 지정합니다.

    export PROJECT_ID=PROJECT_ID
    

    사용자 클러스터 구성 파일의 gkeConnect 섹션에서 PROJECT_ID를 Google Cloud 프로젝트로 바꿉니다.

  2. 사용자 클러스터의 kubeconfig 파일의 경로를 지정합니다.

    export KUBECONFIG=PATH
    

    PATH를 사용자 클러스터 kubeconfig 파일 경로로 바꿉니다.

  3. Binary Authorization API 액세스 서비스 계정의 이름을 선택합니다.

    export SA_NAME=SERVICE_ACCOUNT_NAME
    

    SERVICE_ACCOUNT_NAME을 선택한 서비스 계정 이름으로 바꿉니다. Binary Authorization 모듈은 이 서비스 계정을 사용하여 Binary Authorization API에 액세스합니다.

  4. 이 가이드의 뒷 부분에서 다운로드하는 서비스 계정 키 파일의 경로를 지정합니다.

    export SA_JSON_PATH=SA_KEY_FILE_PATH
    

    SA_KEY_FILE_PATH를 서비스 계정의 JSON 키 파일 경로로 바꿉니다.

사용자 클러스터에 Binary Authorization 모듈 설치

Binary Authorization 모듈을 설치하려면 다음을 수행합니다.

워크로드 아이덴티티 사용

Fleet 워크로드 아이덴티티는 Google Cloud 서비스 계정 키에 대해 다운로드, 수동 순환 및 일반적인 관리를 수행할 필요 없이 클러스터의 워크로드가 Google에 인증할 수 있게 해줍니다. Fleet 워크로드 아이덴티티의 작동 방식과 장점에 대한 자세한 내용은 Fleet 워크로드 아이덴티티 사용을 참조하세요.

  1. Fleet 호스트 프로젝트의 Kubernetes 서비스 계정에 binaryauthorization.policyEvaluator 역할을 부여합니다.

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_ID}.svc.id.goog[binauthz-system/binauthz-admin]" \
        --role="roles/binaryauthorization.policyEvaluator"
    
  2. 작업 디렉터리를 만듭니다.

    1. binauthz라는 디렉터리를 만듭니다.

    2. 이 디렉터리로 변경합니다.

  3. manifest-wi-0.2.6.yaml.tmpl 파일을 다운로드합니다. 이 파일은 사용자 클러스터에 Binary Authorization 모듈을 설치하기 위해 사용됩니다.

    베어메탈

    gcloud storage cp gs://anthos-baremetal-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .
    

    VMware

    gcloud storage cp gs://gke-on-prem-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .
    
  4. 템플릿에서 환경 변수를 바꿉니다.

    envsubst < manifest-wi-0.2.6.yaml.tmpl > manifest-0.2.6.yaml
    
  5. 사용자 클러스터에 Binary Authorization 모듈을 설치합니다.

    kubectl apply -f manifest-0.2.6.yaml
    
  6. 배포가 생성되었는지 확인합니다.

    kubectl get pod --namespace binauthz-system
    

    이 출력과 비슷하게 StatusRunning이고 1/1 포드가 준비된 포드 binauthz-module-deployment-*가 나열된 것을 볼 수 있습니다.

    NAME                                          READY   STATUS    RESTARTS   AGE
    binauthz-module-deployment-5fddf9594f-qjprz   1/1     Running   0          11s
    

서비스 계정 키 사용

  1. Google Cloud CLI의 기본 프로젝트를 설정합니다.

    gcloud config set project ${PROJECT_ID}
    
  2. Binary Authorization API 액세스 서비스 계정을 만듭니다.

    gcloud iam service-accounts create ${SA_NAME}
    
  3. Fleet 호스트 프로젝트에서 Binary Authorization API 액세스 서비스 계정에 binaryauthorization.policyEvaluator 역할을 부여합니다.

    gcloud projects add-iam-policy-binding ${PROJECT_ID}\
        --member="serviceAccount:${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role="roles/binaryauthorization.policyEvaluator"
    
  4. 작업 디렉터리를 만듭니다.

    1. binauthz라는 디렉터리를 만듭니다.

    2. 이 디렉터리로 변경합니다.

  5. manifest-0.2.6.yaml 파일을 다운로드합니다. 이 파일은 사용자 클러스터에 Binary Authorization 모듈을 설치하기 위해 사용됩니다.

    베어메탈

    gcloud storage cp gs://anthos-baremetal-release/binauthz/manifest-0.2.6.yaml .
    

    VMware

    gcloud storage cp gs://gke-on-prem-release/binauthz/manifest-0.2.6.yaml .
    
  6. binauthz-system 네임스페이스에 대한 YAML 파일을 만듭니다.

    다음을 namespace.yaml이라는 파일에 복사합니다.

    apiVersion: v1
    kind: Namespace
    metadata:
      labels:
        control-plane: binauthz-controller
      name: binauthz-system
    
  7. 사용자 클러스터에 네임스페이스를 만듭니다.

    kubectl apply -f namespace.yaml
    

    다음과 비슷한 출력이 표시됩니다.

    namespace/binauthz-system created
    
  8. 이 서비스 계정을 위한 JSON 키 파일을 다운로드합니다.

    gcloud iam service-accounts keys create ${SA_JSON_PATH} --iam-account ${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    
  9. 사용자 클러스터에서 서비스 계정 키를 Kubernetes 보안 비밀로 저장합니다.

    kubectl --namespace binauthz-system create secret generic binauthz-sa --from-file=key.json=${SA_JSON_PATH}
    
  10. 사용자 클러스터에 Binary Authorization 모듈을 설치합니다.

    kubectl apply -f manifest-0.2.6.yaml
    
  11. 배포가 생성되었는지 확인합니다.

    kubectl get pod --namespace binauthz-system
    

    이 출력과 비슷하게 StatusRunning이고 1/1 포드가 준비된 포드 binauthz-module-deployment-*가 나열된 것을 볼 수 있습니다.

    NAME                                          READY   STATUS    RESTARTS   AGE
    binauthz-module-deployment-5fddf9594f-qjprz   1/1     Running   0          11s
    

Binary Authorization 정책 설정 및 사용

이 섹션에서는 온프레미스 클러스터에 Binary Authorization 정책을 설정 및 사용하는 방법을 보여줍니다.

각 예시에서 정책을 구성한 후 클러스터에 컨테이너 이미지를 배포하려고 시도하여 테스트합니다.

모두 허용

이 섹션에서는 성공 사례를 보여줍니다. 컨테이너 이미지가 정책을 충족시키고 배포되도록 Binary Authorization 정책을 구성합니다.

Google Cloud에서 다음을 수행합니다.

콘솔

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

    Binary Authorization으로 이동

  2. Fleet 호스트 프로젝트 ID를 선택해야 합니다.

  3. 정책 수정을 클릭합니다.

  4. 프로젝트 기본 규칙에서 모든 이미지 허용을 선택합니다.

  5. 정책 저장을 클릭합니다.

gcloud

  1. Fleet 호스트 프로젝트의 PROJECT_ID를 설정합니다. 이 프로젝트 ID는 사용자 클러스터 구성 파일의 gkeConnect 필드에서 찾을 수 있습니다.

    export PROJECT_ID=PROJECT_ID
    

    기본 Google Cloud 프로젝트를 설정합니다.

    gcloud config set project ${PROJECT_ID}
    
  2. 정책 YAML 파일을 로컬 시스템으로 내보냅니다.

    gcloud container binauthz policy export  > policy.yaml
    

    YAML 파일은 다음과 같습니다.

    defaultAdmissionRule:
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
      evaluationMode: ALWAYS_ALLOW
    globalPolicyEvaluationMode: ENABLE
    name: projects/<var>PROJECT_ID</var>/policy
    
  3. policy.yaml을 수정합니다.

  4. evaluationModeALWAYS_ALLOW로 설정합니다.

  5. 파일에 requireAttestationsBy 블록이 있으면 이 블록을 삭제합니다.

  6. 파일을 저장합니다.

  7. 다음과 같이 policy.yaml을 가져옵니다.

    gcloud container binauthz policy import policy.yaml
    

허용 목록에 예외 이미지를 추가하려면 정책 파일에 다음을 추가합니다.

admissionWhitelistPatterns:
  - namePattern: EXEMPT_IMAGE_PATH

EXEMPT_IMAGE_PATH를 제외할 am 이미지의 경로로 바꿉니다. 추가 이미지를 제외하려면 - namePattern 항목을 추가합니다. admissionWhitelistPatterns에 대해 자세히 알아보세요.

관리자 워크스테이션에서 다음을 수행합니다.

  1. 포드에 대해 매니페스트 파일을 만듭니다.

    다음 항목을 pod.yaml 파일에 저장합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    
  2. 포드를 만듭니다.

    kubectl apply -f pod.yaml
    

    포드가 성공적으로 배포된 것을 확인합니다.

  3. 포드를 삭제합니다.

    kubectl delete -f pod.yaml
    

모두 허용 안함

이 섹션에서는 실패 사례를 보여줍니다. 이 섹션에서는 컨테이너 이미지 배포를 금지하는 기본 정책을 구성합니다.

Google Cloud에서 다음을 수행합니다.

콘솔

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

    Binary Authorization으로 이동

  2. Fleet 호스트 프로젝트가 선택되어 있는지 확인합니다.

  3. 정책 수정을 클릭합니다.

  4. 프로젝트 기본 규칙에서 모든 이미지 금지를 선택합니다.

  5. 정책 저장을 클릭합니다.

gcloud

  1. PROJECT_ID를 Fleet 호스트 프로젝트 ID로 설정합니다.

    export PROJECT_ID=PROJECT_ID
    
  2. 기본 Google Cloud 프로젝트를 설정합니다.

    gcloud config set project ${PROJECT_ID}
    
  3. 정책 YAML 파일을 내보냅니다.

    gcloud container binauthz policy export  > policy.yaml
    
  4. policy.yaml을 수정합니다.

  5. evaluationModeALWAYS_DENY로 설정합니다.

  6. 파일에 requireAttestationsBy 블록이 있으면 이 블록을 삭제합니다.

  7. 파일을 저장합니다.

  8. 다음과 같이 policy.yaml을 가져옵니다.

    gcloud container binauthz policy import policy.yaml
    

관리자 워크스테이션에서 다음을 수행합니다.

  1. 포드에 대해 매니페스트 파일을 만듭니다.

    다음 항목을 pod.yaml 파일에 저장합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    
  2. 포드를 만듭니다.

    kubectl apply -f pod.yaml
    

    포드 배포가 차단된 것을 확인합니다. 출력은 다음과 같이 표시됩니다.

    Error from server (VIOLATES_POLICY): error when creating "pod.yaml": admission webhook "binaryauthorization.googleapis.com" denied the request: Denied by default admission rule. Overridden by evaluation mode
    

사용자 클러스터 리소스 ID 가져오기

이 섹션에서는 사용자 클러스터에 대해 클러스터 리소스 ID를 만드는 방법을 보여줍니다. Binary Authorization 정책에서 클러스터 특정 규칙을 만들 수 있습니다. 이러한 규칙을 클러스터 ID를 기반으로 하는 클러스터 특정 리소스 ID와 연결합니다.

다음과 같이 리소스 ID를 가져옵니다.

콘솔

  1. Google Cloud 콘솔에서 GKE 클러스터 페이지로 이동합니다.

    클러스터로 이동

  2. 클러스터의 Fleet 호스트 프로젝트 ID를 선택합니다. 이 프로젝트 ID는 사용자 클러스터 구성 파일의 gkeConnect 섹션에서 찾을 수 있습니다.

  3. 클러스터 목록의 이름 열에서 클러스터 ID를 찾습니다.

  4. 리소스 ID를 만들려면 리소스 ID 형식이 global.CLUSTER_ID와 같이 되도록 클러스터 ID에 global. 프리픽스를 추가합니다.

gcloud

  1. SSH를 사용하여 관리자 워크스테이션에 연결합니다.

  2. 관리자 워크스테이션에서 다음 명령어를 실행합니다.

    kubectl get membership -o yaml
    
  3. 출력의 spec.owner.id 필드에서 클러스터 ID를 가져옵니다. 출력 예시는 다음과 같습니다.

    apiVersion: v1
    items:
    - apiVersion: hub.gke.io/v1
      kind: Membership
      ...
      spec:
        owner:
          id: //gkehub.googleapis.com/projects/PROJECT_NUMBER/locations/global/memberships/my-cluster-id
    

    예시 출력에서 클러스터 ID는 my-cluster-id입니다.

  4. 리소스 ID를 만들기 위해 클러스터 ID에 global. 프리픽스를 추가합니다. 이 예시에서 리소스 ID는 global.my-cluster-id입니다.

클러스터 특정 규칙을 정의할 때 이 리소스 ID를 사용합니다. Google Cloud 콘솔 또는 gcloud CLI를 사용하여 클러스터별 규칙을 설정하는 방법을 알아봅니다.

실패 정책 업데이트

Binary Authorization 모듈 웹훅은 오류 시 허용 또는 오류 시 종료로 구성될 수 있습니다.

오류 시 종료

실패 정책을 오류 시 종료로 업데이트하려면 다음을 수행합니다.

  1. manifest-0.2.6.yaml 파일을 수정하고 failurePolicy를 Fail로 설정합니다.

  2. 웹훅을 다시 사용 설정합니다.

    kubectl apply -f manifest-0.2.6.yaml
    

    다음과 비슷한 출력이 표시됩니다.

    serviceaccount/binauthz-admin unchanged
    role.rbac.authorization.k8s.io/binauthz-role configured
    clusterrole.rbac.authorization.k8s.io/binauthz-role configured
    rolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    clusterrolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    secret/binauthz-tls unchanged
    service/binauthz unchanged
    deployment.apps/binauthz-module-deployment unchanged
    validatingwebhookconfiguration.admissionregistration.k8s.io/binauthz-validating-webhook-configuration configured
    

오류 시 허용

실패 정책을 오류 시 허용으로 업데이트하려면 다음 단계를 따르세요.

  1. manifest-0.2.6.yaml 파일을 수정하고 failurePolicy를 Ignore로 설정합니다.

  2. 웹훅을 다시 사용 설정합니다.

    kubectl apply -f manifest-0.2.6.yaml
    

    다음과 비슷한 출력이 표시됩니다.

    serviceaccount/binauthz-admin unchanged
    role.rbac.authorization.k8s.io/binauthz-role configured
    clusterrole.rbac.authorization.k8s.io/binauthz-role configured
    rolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    clusterrolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    secret/binauthz-tls unchanged
    service/binauthz unchanged
    deployment.apps/binauthz-module-deployment unchanged
    validatingwebhookconfiguration.admissionregistration.k8s.io/binauthz-validating-webhook-configuration configured
    

자세한 내용은 웹훅 실패 정책을 참조하세요.

삭제

  1. 다음 코드 샘플은 웹훅을 사용 중지하는 방법을 보여줍니다.

    kubectl delete ValidatingWebhookConfiguration/binauthz-validating-webhook-configuration
    
  2. 다음 코드 샘플은 웹훅을 다시 사용 설정하는 방법을 보여줍니다.

    kubectl apply -f manifest-0.2.6.yaml
    
  3. 다음 코드 샘플은 Binary Authorization과 관련된 모든 리소스를 삭제하는 방법을 보여줍니다.

    kubectl delete -f manifest-0.2.6.yaml
    kubectl delete namespace binauthz-system
    

다음 단계