이 문서에서는 GKE 클러스터의 Binary Authorization을 설정하는 방법을 보여줍니다. 그런 후 샘플 Binary Authorization 정책을 구성하는 방법을 보여줍니다.
시작하기 전에
Connect에 GKE 클러스터가 등록되어 있어야 합니다. Binary Authorization은 다음 환경을 지원합니다.
베어메탈용 GKE
베어메탈용 GKE 1.14 이상
VMware용 GKE
VMware용 GKE 1.4 이상
Binary Authorization 서비스는 일반 인터넷 연결을 통해 액세스할 수 있는 공개 IP 주소를 사용합니다. 사용자 클러스터가 엔드포인트
binaryauthorization.googleapis.com
에 액세스할 수 있도록 HTTPS용 방화벽 규칙을 구성하세요.베어메탈용 GKE
베어메탈용 GKE 방화벽 규칙을 구성합니다.
VMware용 GKE
VMware용 GKE 방화벽 규칙을 구성합니다.
GKE 클러스터의 Binary Authorization의 항목을 포함하여 감사 로그 항목을 보기 위해 중앙화된 Cloud 감사 로그를 사용하려는 경우 클러스터 구성에서 Cloud 감사 로그를 구성해야 합니다.
베어메탈용 GKE
베어메탈용 GKE에서 Cloud 감사 로그를 구성합니다.
VMware용 GKE
VMware용 GKE에서 Cloud 감사 로그를 구성합니다.
다음과 같이 Binary Authorization API를 사용 설정해야 합니다.
Google Cloud 콘솔로 이동합니다.
프로젝트 드롭다운 목록에서 Connect 프로젝트를 선택합니다. 사용자 클러스터 구성 파일의
gkeConnect
섹션에서 이 Google Cloud 프로젝트를 찾을 수 있습니다. 이것은 사용자 클러스터를 Google Cloud에 연결하는 Google Cloud 프로젝트입니다.
Binary Authorization 설정
이 섹션에서는 사용자 클러스터에서 GKE 클러스터에 대해 Binary Authorization을 설정합니다.
설치 환경 변수 지정
환경 변수를 지정하려면 다음을 수행합니다.
워크로드 아이덴티티 사용
Connect 프로젝트를 지정합니다.
export PROJECT_ID=PROJECT_ID
클러스터의 Fleet 멤버십 ID를 지정하세요.
export MEMBERSHIP_ID=MEMBERSHIP_ID
서비스 계정 키 사용
Connect 프로젝트를 지정합니다.
export PROJECT_ID=PROJECT_ID
사용자 클러스터 구성 파일의
gkeConnect
섹션에서 PROJECT_ID를 Google Cloud 프로젝트로 바꿉니다.사용자 클러스터의 kubeconfig 파일의 경로를 지정합니다.
export KUBECONFIG=PATH
PATH를 사용자 클러스터 kubeconfig 파일 경로로 바꿉니다.
Binary Authorization API 액세스 서비스 계정의 이름을 선택합니다.
export SA_NAME=SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAME을 선택한 서비스 계정 이름으로 바꿉니다. Binary Authorization 모듈은 이 서비스 계정을 사용하여 Binary Authorization API에 액세스합니다.
이 가이드의 뒷 부분에서 다운로드하는 서비스 계정 키 파일의 경로를 지정합니다.
export SA_JSON_PATH=SA_KEY_FILE_PATH
SA_KEY_FILE_PATH를 서비스 계정의 JSON 키 파일 경로로 바꿉니다.
사용자 클러스터에 Binary Authorization 모듈 설치
Binary Authorization 모듈을 설치하려면 다음을 수행합니다.
워크로드 아이덴티티 사용
Fleet 워크로드 아이덴티티는 Google Cloud 서비스 계정 키에 대해 다운로드, 수동 순환 및 일반적인 관리를 수행할 필요 없이 클러스터의 워크로드가 Google에 인증할 수 있게 해줍니다. Fleet 워크로드 아이덴티티의 작동 방식과 장점에 대한 자세한 내용은 Fleet 워크로드 아이덴티티 사용을 참조하세요.
Connect 프로젝트의 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"
작업 디렉터리를 만듭니다.
binauthz
라는 디렉터리를 만듭니다.이 디렉터리로 변경합니다.
manifest-wi-0.2.6.yaml.tmpl
파일을 다운로드합니다. 이 파일은 사용자 클러스터의 GKE 클러스터에 Binary Authorization 모듈을 설치하기 위해 사용됩니다.베어메탈용 GKE
gsutil cp gs://anthos-baremetal-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .
VMware용 GKE
gsutil cp gs://gke-on-prem-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .
템플릿에서 환경 변수를 바꿉니다.
envsubst < manifest-wi-0.2.6.yaml.tmpl > manifest-0.2.6.yaml
사용자 클러스터에 Binary Authorization 모듈을 설치합니다.
kubectl apply -f manifest-0.2.6.yaml
배포가 생성되었는지 확인합니다.
kubectl get pod --namespace binauthz-system
이 출력과 비슷하게
Status
가Running
이고 1/1 포드가 준비된 포드binauthz-module-deployment-*
가 나열된 것을 볼 수 있습니다.NAME READY STATUS RESTARTS AGE binauthz-module-deployment-5fddf9594f-qjprz 1/1 Running 0 11s
서비스 계정 키 사용
Google Cloud CLI의 기본 프로젝트를 설정합니다.
gcloud config set project ${PROJECT_ID}
Binary Authorization API 액세스 서비스 계정을 만듭니다.
gcloud iam service-accounts create ${SA_NAME}
Connect 프로젝트에서 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"
작업 디렉터리를 만듭니다.
binauthz
라는 디렉터리를 만듭니다.이 디렉터리로 변경합니다.
manifest-0.2.6.yaml
파일을 다운로드합니다. 이 파일은 사용자 클러스터의 GKE 클러스터에 Binary Authorization 모듈을 설치하기 위해 사용됩니다.anthos_clusters_on_bare_metal
gsutil cp gs://anthos-baremetal-release/binauthz/manifest-0.2.6.yaml .
anthos_clusters_on_vmware
gsutil cp gs://gke-on-prem-release/binauthz/manifest-0.2.6.yaml .
binauthz-system
네임스페이스에 대한 YAML 파일을 만듭니다.다음을
namespace.yaml
이라는 파일에 복사합니다.apiVersion: v1 kind: Namespace metadata: labels: control-plane: binauthz-controller name: binauthz-system
사용자 클러스터에 네임스페이스를 만듭니다.
kubectl apply -f namespace.yaml
다음과 비슷한 출력이 표시됩니다.
namespace/binauthz-system created
이 서비스 계정을 위한 JSON 키 파일을 다운로드합니다.
gcloud iam service-accounts keys create ${SA_JSON_PATH} --iam-account ${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
사용자 클러스터에서 서비스 계정 키를 Kubernetes 보안 비밀로 저장합니다.
kubectl --namespace binauthz-system create secret generic binauthz-sa --from-file=key.json=${SA_JSON_PATH}
사용자 클러스터에 Binary Authorization 모듈을 설치합니다.
kubectl apply -f manifest-0.2.6.yaml
배포가 생성되었는지 확인합니다.
kubectl get pod --namespace binauthz-system
이 출력과 비슷하게
Status
가Running
이고 1/1 포드가 준비된 포드binauthz-module-deployment-*
가 나열된 것을 볼 수 있습니다.NAME READY STATUS RESTARTS AGE binauthz-module-deployment-5fddf9594f-qjprz 1/1 Running 0 11s
Binary Authorization 정책 설정 및 사용
이 섹션에서는 GKE 클러스터에 대해 Binary Authorization 정책을 설정 및 사용하는 방법을 보여줍니다.
각 예시에서 정책을 구성한 후 GKE 클러스터에 컨테이너 이미지를 배포하려고 시도하여 테스트합니다.
모두 허용
이 섹션에서는 성공 사례를 보여줍니다. 컨테이너 이미지가 정책을 충족시키고 배포되도록 Binary Authorization 정책을 구성합니다.
Google Cloud에서 다음을 수행합니다.
콘솔
Google Cloud 콘솔에서 Binary Authorization 페이지로 이동합니다.
Connect 프로젝트 ID를 선택해야 합니다.
정책 수정을 클릭합니다.
프로젝트 기본 규칙에서 모든 이미지 허용을 선택합니다.
정책 저장을 클릭합니다.
gcloud
Connect 프로젝트에 대해
PROJECT_ID
를 설정합니다. 이 프로젝트 ID는 사용자 클러스터 구성 파일의gkeConnect
필드에서 찾을 수 있습니다.export PROJECT_ID=PROJECT_ID
기본 Google Cloud 프로젝트를 설정합니다.
gcloud config set project ${PROJECT_ID}
정책 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
policy.yaml
을 수정합니다.evaluationMode
를ALWAYS_ALLOW
로 설정합니다.파일에
requireAttestationsBy
블록이 있으면 이 블록을 삭제합니다.파일을 저장합니다.
다음과 같이
policy.yaml
을 가져옵니다.gcloud container binauthz policy import policy.yaml
예외 이미지를 허용 목록에 추가하려면 정책 파일에 다음을 추가합니다.
admissionWhitelistPatterns: - namePattern: EXEMPT_IMAGE_PATH
EXEMPT_IMAGE_PATH
를 제외할 am 이미지의 경로로 바꿉니다. 추가 이미지를 제외하려면 - namePattern
항목을 추가합니다. admissionWhitelistPatterns
에 대해 자세히 알아보세요.
GKE 클러스터 관리자 워크스테이션에서 다음을 수행합니다.
포드에 대해 매니페스트 파일을 만듭니다.
다음 항목을
pod.yaml
파일에 저장합니다.apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
포드를 만듭니다.
kubectl apply -f pod.yaml
포드가 성공적으로 배포된 것을 확인합니다.
포드를 삭제합니다.
kubectl delete -f pod.yaml
모두 허용 안함
이 섹션에서는 실패 사례를 보여줍니다. 이 섹션에서는 컨테이너 이미지 배포를 금지하는 기본 정책을 구성합니다.
Google Cloud에서 다음을 수행합니다.
콘솔
Google Cloud 콘솔에서 Binary Authorization 페이지로 이동합니다.
Connect 프로젝트가 선택되었는지 확인합니다.
정책 수정을 클릭합니다.
프로젝트 기본 규칙에서 모든 이미지 금지를 선택합니다.
정책 저장을 클릭합니다.
gcloud
PROJECT_ID
를 Connect 프로젝트 ID로 설정합니다.export PROJECT_ID=PROJECT_ID
기본 Google Cloud 프로젝트를 설정합니다.
gcloud config set project ${PROJECT_ID}
정책 YAML 파일을 내보냅니다.
gcloud container binauthz policy export > policy.yaml
policy.yaml
을 수정합니다.evaluationMode
를ALWAYS_DENY
로 설정합니다.파일에
requireAttestationsBy
블록이 있으면 이 블록을 삭제합니다.파일을 저장합니다.
다음과 같이
policy.yaml
을 가져옵니다.gcloud container binauthz policy import policy.yaml
GKE 클러스터 관리자 워크스테이션에서 다음을 수행합니다.
포드에 대해 매니페스트 파일을 만듭니다.
다음 항목을
pod.yaml
파일에 저장합니다.apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container image: gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
포드를 만듭니다.
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를 가져옵니다.
콘솔
Google Cloud 콘솔에서 GKE Enterprise 클러스터 페이지로 이동합니다.
GKE 클러스터의 Connect 프로젝트 ID를 선택합니다. 이 프로젝트 ID는 사용자 클러스터 구성 파일의
gkeConnect
섹션에서 찾을 수 있습니다.Anthos 관리 클러스터의 이름 열에서 클러스터 ID를 찾습니다.
리소스 ID를 만들려면 리소스 ID 형식이
global.CLUSTER_ID
와 같이 되도록 클러스터 ID에global.
프리픽스를 추가합니다.
gcloud
SSH를 사용해서 GKE 클러스터 관리자 워크스테이션에 연결합니다.
관리 워크스테이션에서 다음 명령어를 실행합니다.
kubectl get membership -o yaml
출력의
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
입니다.리소스 ID를 만들기 위해 클러스터 ID에
global.
프리픽스를 추가합니다. 이 예시에서 리소스 ID는global.my-cluster-id
입니다.
클러스터 특정 규칙을 정의할 때 이 리소스 ID를 사용합니다. Google Cloud 콘솔 또는 gcloud CLI를 사용하여 클러스터별 규칙을 설정하는 방법을 알아봅니다.
실패 정책 업데이트
Binary Authorization 모듈 웹훅은 오류 시 허용 또는 오류 시 종료로 구성될 수 있습니다.
오류 시 종료
실패 정책을 오류 시 종료로 업데이트하려면 다음을 수행합니다.
manifest-0.2.6.yaml 파일을 수정하고 failurePolicy를
Fail
로 설정합니다.웹훅을 다시 사용 설정합니다.
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
오류 시 허용
실패 정책을 오류 시 허용으로 업데이트하려면 다음 단계를 따르세요.
manifest-0.2.6.yaml 파일을 수정하고 failurePolicy를
Ignore
로 설정합니다.웹훅을 다시 사용 설정합니다.
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
자세한 내용은 웹훅 실패 정책을 참조하세요.
삭제
다음 코드 샘플은 웹훅을 사용 중지하는 방법을 보여줍니다.
kubectl delete ValidatingWebhookConfiguration/binauthz-validating-webhook-configuration
다음 코드 샘플은 웹훅을 다시 사용 설정하는 방법을 보여줍니다.
kubectl apply -f manifest-0.2.6.yaml
다음 코드 샘플은 Binary Authorization과 관련된 모든 리소스를 삭제하는 방법을 보여줍니다.
kubectl delete -f manifest-0.2.6.yaml kubectl delete namespace binauthz-system
다음 단계
- 포드가 실제로 생성되는 것을 차단하지 않고 포드 생성 시에 정책 준수를 확인하려면 테스트 실행 사용 설정 참조하기
- Binary Authorization 시행자가 차단하는 포드를 강제로 만들려면 breakglass 사용 참조하기
built-by-cloud-build
증명자를 사용하여 Cloud Build에서 빌드한 이미지만 배포(미리보기)하기- 증명자 기반 Binary Authorization 정책을 구현하려면 다음을 참조하세요.
- Google Cloud 콘솔 또는 명령줄 도구를 사용하여 정책 구성하기 증명을 요구하도록 기본 또는 클러스터 특정 규칙 설정하기
- Google Cloud 콘솔 또는 명령줄 도구를 사용하여 증명자 만들기
- 증명 만들기
- GKE 클러스터의 Binary Authorization 관련 로그 이벤트를 보려면 Cloud 감사 로그 이벤트 보기를 참조하세요.
- 측정항목 모니터링