PodSecurityPolicy 사용

이 페이지에서는 Google Kubernetes Engine에서 PodSecurityPolicy를 사용하는 방법을 설명합니다.

개요

PodSecurityPolicy클러스터에서 포드 생성 및 업데이트 요청의 유효성을 검사하는 허용 컨트롤러 리소스로서 사용자가 만듭니다. PodSecurityPolicy는 클러스터에 의해 허용되려면 포드가 충족해야 하는 조건의 집합을 정의합니다. 포드 생성 또는 업데이트 요청이 PodSecurityPolicy의 조건을 충족하지 못하면 해당 요청은 거부되고 오류가 반환됩니다.

PodSecurityPolicy를 사용하려면 먼저 새로운 포드와 업데이트된 포드가 충족해야 하는 정책을 만들고 정의해야 합니다. 그런 다음 정의된 정책과 비교하여 포드 생성 및 업데이트 요청의 유효성을 검사하는 PodSecurityPolicy 허용 컨트롤러를 사용 설정해야 합니다.

여러 PodSecurityPolicy를 사용할 수 있는 경우, 허용 컨트롤러는 유효성 검사에 성공하는 첫 번째 정책을 사용합니다. 정책은 알파벳 순으로 정렬되며, 컨트롤러는 변형 정책보다 비변형 정책(포드를 변경하지 않는 정책)을 선호합니다.

PodSecurityPolicy는 Kubernetes 버전 1.8.6 이상을 실행하는 GKE 클러스터에서 사용할 수 있습니다.

시작하기 전에

이 작업을 준비하려면 다음 단계를 수행하세요.

  • Google Kubernetes Engine API가 사용 설정되었는지 확인합니다.
  • Google Kubernetes Engine API 사용 설정
  • Cloud SDK가 설치되었는지 확인합니다.
  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project [PROJECT_ID]
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 지역 클러스터를 사용하는 경우 기본 컴퓨팅 지역을 설정합니다.
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

PodSecurityPolicy 정의

PodSecurityPolicy 컨트롤러가 포드의 유효성을 검사하고 클러스터에 허용하려면 먼저 클러스터에서 PodSecurityPolicy 리소스를 정의해야 합니다.

PodSecurityPolicy는 정책에 따라 만들어진 포드의 제한 사항, 요구 사항, 기본값 목록을 지정합니다. 예를 들어 권한 있는 컨테이너, hostPath 볼륨, 호스트 네트워킹의 사용을 제한하거나 모든 컨테이너가 seccomp 프로필로 실행되는 것을 기본값으로 설정합니다. PodSecurityPolicy 허용 컨트롤러는 사용 가능한 PodSecurityPolicy와 비교하여 요청의 유효성을 검사합니다.

다음 예시 PodSecurityPolicy my-psp.yaml은 단순히 권한 있는 포드의 생성을 방지합니다. 이 정책은 사용 가능한 모든 볼륨에 대한 액세스 허용과 같은 다른 몇 가지 제어 측면에도 영향을 미칩니다.

apiVersion: extensions/v1beta1
kind: PodSecurityPolicy
metadata:
  name: my-psp
spec:
  privileged: false  # Prevents creation of privileged Pods
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  runAsUser:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  volumes:
  - '*'

PodSecurityPolicy 사양은 수많은 제어 측면을 보호할 수 있습니다. 이 예에서 지정된 제어 측면(seLinux, supplementalGroups, runAsUser, fsGroup)은 모두 RunAsAny로 설정되어 있는데, 이러한 필드의 모든 유효한 값을 이 정책과 함께 사용할 수 있다는 뜻입니다.

PodSecurityPolicy와 제어 측면에 대한 자세한 내용은 포드 보안 정책이란?과 Kubernetes 문서의 정책 참조를 참조하세요.

kubectl 명령줄 도구를 사용하여 다음 리소스를 만듭니다.

kubectl apply -f my-psp.yaml

PodSecurityPolicy 구성의 더 많은 예는 Kubernetes 문서 PodSecurityPolicy 페이지의 예시를 참조하세요.

정책 승인

클러스터 관리자 역할이 있는 계정은 역할 기반 액세스 제어를 사용하여 원하는 서비스 계정에게 PodSecurityPolicy에 대한 액세스 권한을 부여하는 Role 또는 ClusterRole을 만들 수 있습니다. ClusterRole은 클러스터 전체 권한을 부여하고, Role은 정의하는 네임스페이스 내의 권한을 부여합니다.

예를 들어 다음 ClusterRole my-clusterrole.yamlverb: use가 나타내는 것처럼 my-psp PodSecurityPolicy에 대한 액세스 권한을 부여합니다.

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: my-clusterrole
rules:
- apiGroups:
  - extensions
  resources:
  - podsecuritypolicies
  resourceNames:
  - my-psp
  verbs:
  - use

다음 명령어를 사용하여 ClusterRole을 만듭니다.

kubectl apply -f my-clusterrole.yaml

Role(또는 ClusterRole)을 만든 후 RoleBinding(또는 ClusterRoleBinding) 리소스를 만들어 원하는 서비스 계정에 연결합니다.

다음 RoleBinding my-rolebinding.yaml은 ClusterRole my-clusterrole을 특정 네임스페이스 my-namespace의 서비스 계정에 결합합니다.

# Bind the ClusterRole to the desired set of service accounts.
# Policies should typically be bound to service accounts in a namespace.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my-rolebinding
  namespace: my-namespace
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: my-clusterrole
subjects:
# Example: All service accounts in my-namespace
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:serviceaccounts
# Example: A specific service account in my-namespace
- kind: ServiceAccount # Omit apiGroup
  name: default
  namespace: my-namespace

이 RoleBinding에서,

  • subjects 필드는 ClusterRole이 결합되는 계정을 지정합니다.
  • 첫 번째 제목은 Group system:serviceaccounts로서 클러스터의 모드 서비스 계정을 포함합니다.
  • 두 번째 제목은 개별 ServiceAccount default로서 네임스페이스의 기본 서비스 계정을 지정합니다.

다음 명령어를 실행하여 RoleBinding을 만듭니다.

kubectl apply -f my-rolebinding.yaml

RBAC에 대한 자세한 내용은 RBAC 승인 사용을 참조하세요.

PodSecurityPolicy 컨트롤러 사용 설정

PodSecurityPolicy 허용 컨트롤러를 사용하려면 --enable-pod-security-policy 플래그로 새 클러스터를 만들거나 기존 클러스터를 업데이트해야 합니다.

PodSecurityPolicy를 사용하여 새 클러스터를 만들려면 다음 명령어를 실행합니다.

gcloud beta container clusters create [CLUSTER_NAME] --enable-pod-security-policy

기존 클러스터를 업데이트하려면 다음을 실행합니다.

gcloud beta container clusters update [CLUSTER_NAME] --enable-pod-security-policy

PodSecurityPolicy 컨트롤러 사용 중지

PodSecurityPolicy 컨트롤러 사용을 중지하려면 다음 명령어를 실행합니다.

gcloud beta container clusters update [CLUSTER_NAME] --no-enable-pod-security-policy

컨트롤러 사용을 중지하면 클러스터의 기존 정책 유효성 검사와 기본값 설정이 중단되지만 기존 정책은 삭제되지 않습니다. 결합도 삭제되지 않습니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine