Azure Policy로 AKS(Azure Kubernetes Service) 클러스터 보호

Azure Policy를 사용하여 AKS(Azure Kubernetes Service) 클러스터에 기본 제공 보안 정책을 적용하고 집행할 수 있습니다. Azure Policy는 대규모로 조직의 표준을 적용하고 규정 준수를 평가하는 데 도움이 됩니다. AKS용 Azure Policy 추가 항목을 설치한 후 개별 정책 정의 또는 이니셔티브(정책 세트라고도 함)라는 정책 정의 그룹을 클러스터에 적용할 수 있습니다. AKS 정책 및 이니셔티브 정의의 전체 목록은 AKS에 대한 Azure Policy 기본 제공 정의를 참조하세요.

이 문서에서는 클러스터에 정책 정의를 적용하고 해당 할당이 적용되는지 확인하는 방법을 보여 줍니다.

필수 조건

기본 제공 정책 정의 또는 이니셔티브 할당

다음 단계를 사용하여 Azure Portal에서 정책 정의 또는 이니셔티브를 적용할 수 있습니다.

  1. Azure Portal에서 정책이라는 Azure Policy 서비스로 이동합니다.
  2. Azure Policy 페이지의 왼쪽 창에서 정의를 선택합니다.
  3. 범주에서 Kubernetes를 선택합니다.
  4. 적용하려는 정책 정의 또는 이니셔티브를 선택합니다. 이 예제에서는 Linux 기반 워크로드에 대한 Kubernetes 클러스터 Pod 보안 기준 표준 이니셔티브를 선택합니다.
  5. 할당을 선택합니다.
  6. 범위를 Azure Policy 추가 항목이 지원되는 AKS 클러스터의 리소스 그룹으로 설정합니다.
  7. 매개 변수 페이지를 선택하고 효과audit에서 deny로 업데이트하여 기준 이니셔티브를 위반하는 새 배포를 차단합니다. 또한 평가에서 제외할 네임스페이스를 더 추가할 수 있습니다. 이 예제의 경우 기본값을 유지합니다.
  8. 검토 + 만들기>만들기를 차례로 선택하여 정책 할당을 제출합니다.

사용자 지정 정책 정의 만들기 및 할당

사용자 지정 정책을 사용하면 Azure 사용에 대한 규칙을 정의할 수 있습니다. 예를 들어 다음 유형의 규칙을 적용할 수 있습니다.

  • 보안 관행
  • 비용 관리
  • 조직별 규칙(예: 이름 지정 또는 위치)

사용자 지정 정책을 만들기 전에 일반적인 패턴 및 샘플 목록을 확인하여 사례가 이미 적용되었는지 확인합니다.

사용자 지정 정책 정의는 JSON으로 작성됩니다. 사용자 지정 정책을 만드는 방법에 대한 자세한 내용은 Azure Policy 정의 구조사용자 지정 정책 정의 만들기를 참조하세요.

참고 항목

이제 Azure Policy는 templateInfo라는 새 속성을 활용하여 사용자가 제약 조건 템플릿의 원본 형식을 정의할 수 있습니다. 사용자가 정책 정의에서 templateInfo를 정의한 경우 constraintTemplate 또는 제약 조건 속성을 정의할 필요가 없습니다. 그러나 apiGroups종류는 계속 정의해야 합니다. 이에 대한 자세한 내용은 Azure Policy 효과 이해를 참조하세요.

사용자 지정 정책 정의를 만든 후에는 Kubernetes 클러스터에 정책을 할당하는 단계별 연습에 대한 정책 정의 할당을 참조하세요.

Azure Policy가 실행 중인지 확인

  • kubectl get 명령을 실행하여 정책 할당이 클러스터에 적용되었는지 확인합니다.

    kubectl get constrainttemplates
    

    참고 항목

    정책 할당은 각 클러스터에 동기화하는 데 최대 20분이 걸릴 수 있습니다.

    출력은 다음 출력 예제와 유사해야 합니다.

    NAME                                     AGE
    k8sazureallowedcapabilities              23m
    k8sazureallowedusersgroups               23m
    k8sazureblockhostnamespace               23m
    k8sazurecontainerallowedimages           23m
    k8sazurecontainerallowedports            23m
    k8sazurecontainerlimits                  23m
    k8sazurecontainernoprivilege             23m
    k8sazurecontainernoprivilegeescalation   23m
    k8sazureenforceapparmor                  23m
    k8sazurehostfilesystem                   23m
    k8sazurehostnetworkingports              23m
    k8sazurereadonlyrootfilesystem           23m
    k8sazureserviceallowedports              23m
    

권한 있는 Pod 거부 유효성 검사

먼저 privileged: true의 보안 컨텍스트를 사용하여 Pod를 예약할 때 발생하는 결과를 테스트하겠습니다. 이 보안 컨텍스트는 Pod의 권한을 에스컬레이션합니다. 이니셔티브는 권한 있는 Pod를 허용하지 않으므로 요청이 거부되고 결과적으로 배포가 거부됩니다.

  1. nginx-privileged.yaml이라는 파일을 만들고 다음 YAML 매니페스트를 붙여넣습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-privileged
    spec:
      containers:
        - name: nginx-privileged
          image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
          securityContext:
            privileged: true
    
  2. kubectl apply 명령을 사용하여 Pod를 만들고 YAML 매니페스트의 이름을 지정합니다.

    kubectl apply -f nginx-privileged.yaml
    

    예상한 대로 다음 예제 출력과 같이 Pod를 예약하지 못합니다.

    Error from server ([denied by azurepolicy-container-no-privilege-00edd87bf80f443fa51d10910255adbc4013d590bec3d290b4f48725d4dfbdf9] Privileged container is not allowed: nginx-privileged, securityContext: {"privileged": true}): error when creating "privileged.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [denied by azurepolicy-container-no-privilege-00edd87bf80f443fa51d10910255adbc4013d590bec3d290b4f48725d4dfbdf9] Privileged container is not allowed: nginx-privileged, securityContext: {"privileged": true}
    

    Pod가 예약 단계에 도달하지 않으므로 계속 진행하기 전에 삭제할 리소스가 없습니다.

권한 없는 Pod 만들기 테스트

이전 예제에서 컨테이너 이미지는 자동으로 루트를 사용하여 NGINX를 포트 80에 바인딩하려고 했습니다. 정책 이니셔티브에서 이 요청을 거부해 Pod를 시작하지 못합니다. 그럼 이제 권한 있는 액세스 없이 동일한 NGINX Pod를 실행해 보겠습니다.

  1. nginx-unprivileged.yaml이라는 파일을 만들고 다음 YAML 매니페스트를 붙여넣습니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-unprivileged
    spec:
      containers:
        - name: nginx-unprivileged
          image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
    
  2. kubectl apply 명령을 사용하여 Pod를 만들고 YAML 매니페스트의 이름을 지정합니다.

    kubectl apply -f nginx-unprivileged.yaml
    
  3. kubectl get pods 명령을 사용하여 Pod의 상태를 확인합니다.

    kubectl get pods
    

    출력은 Pod가 예약되고 상태가 실행 중임을 보여 주는 다음 예제 출력과 유사해야 합니다.

    NAME                 READY   STATUS    RESTARTS   AGE
    nginx-unprivileged   1/1     Running   0          18s
    

    이 예제는 컬렉션에서 정책을 위반하는 배포에만 영향을 주는 기준 이니셔티브를 보여 줍니다. 허용되는 배포는 계속 작동합니다.

  4. kubectl delete 명령을 사용하여 NGINX 권한이 없는 Pod를 삭제하고 YAML 매니페스트의 이름을 지정합니다.

    kubectl delete -f nginx-unprivileged.yaml
    

정책 또는 이니셔티브 사용 안 함

다음 단계를 사용하여 Azure Portal에서 기준 이니셔티브를 제거할 수 있습니다.

  1. Azure Portal의 정책 창으로 이동합니다.
  2. 할당을 선택합니다.
  3. Linux 기반 워크로드에 대한 Kubernetes 클러스터 Pod 보안 기준 표준 이니셔티브 옆에 있는 ... 단추를 선택합니다.
  4. 할당 삭제를 선택합니다.

다음 단계

Azure Policy 작동 방식에 대한 자세한 내용은 다음 문서를 참조하세요.