Kubernetes 데이터 평면 강화 보호

이 페이지에서는 Kubernetes 데이터 평면 강화 전용 클라우드용 Microsoft Defender의 보안 권장 사항 집합을 사용하는 방법을 설명합니다.

Kubernetes 클러스터 및 노드에 대해 표시될 수 있는 보안 권장 사항의 목록은 권장 사항 참조 테이블의 컨테이너 권장 사항 섹션을 참조하세요.

워크로드 보호 설정

클라우드용 Microsoft Defender에는 Kubernetes용 Azure Policy를 설치한 후 사용할 수 있는 권장 사항 번들이 포함되어 있습니다.

필수 조건

Kubernetes 데이터 평면 강화 사용

다음 두 가지 방법 중 하나로 Kubernetes용 Azure Policy를 사용하도록 설정할 수 있습니다.

계획/커넥터 설정을 사용하여 현재 및 향후의 모든 클러스터에 대해 Kubernetes용 Azure Policy를 사용하도록 설정합니다.

참고 항목

이 설정을 사용하면 Kubernetes Pod용 Azure Policy가 클러스터에 설치됩니다. 이렇게 하면 Pod에서 사용할 소량의 CPU와 메모리가 할당됩니다. 이 할당은 최대 용량에 도달할 수 있지만 리소스의 나머지 CPU 및 메모리에는 영향을 주지 않습니다.

참고 항목

클러스터 관리자가 클러스터 자체의 새 IAM 역할에 대한 권한을 추가해야 하는 EKS의 제한 사항으로 인해 커넥터를 통한 AWS 사용이 지원되지 않습니다.

Azure 구독 또는 온-프레미스에 대해 사용

컨테이너용 Microsoft Defender를 사용하도록 설정하면 Azure Kubernetes Service 및 관련 구독에 있는 Azure Arc 지원 Kubernetes 클러스터의 “Kubernetes용 Azure Policy” 설정이 기본적으로 사용하도록 설정됩니다. 초기 구성 시 설정을 사용하지 않도록 설정한 경우 나중에 수동으로 사용하도록 설정할 수 있습니다.

컨테이너 계획에서 "Kubernetes에 대한 Azure Policy" 설정을 사용하지 않도록 설정한 경우 아래 단계에 따라 구독의 모든 클러스터에서 이를 사용하도록 설정할 수 있습니다.

  1. Azure Portal에 로그인합니다.

  2. 클라우드용 Microsoft Defender>환경 설정으로 이동합니다.

  3. 관련 구독을 선택합니다.

  4. Defender 플랜 페이지에서 컨테이너를 켜기로 전환해야 합니다.

  5. 설정을 선택합니다.

    Screenshot showing the settings button in the Defender plan.

  6. 설정 및 모니터링 페이지에서 "Kubernetes에 대한 Azure Policy"를 켜기로 전환합니다.

    Screenshot showing the toggles used to enable or disable the extensions.

GCP 프로젝트에 사용

GCP 커넥터에서 컨테이너용 Microsoft Defender를 사용하도록 설정하면 관련 프로젝트의 Google Kubernetes Engine에 대해 "Azure Arc용 Azure Policy 확장" 설정이 기본적으로 사용하도록 설정됩니다. 초기 구성 시 설정을 사용하지 않도록 설정한 경우 나중에 수동으로 사용하도록 설정할 수 있습니다.

GCP 커넥터에서 "Azure Arc용 Azure Policy 확장" 설정을 사용하지 않도록 설정한 경우 아래 단계에 따라 GCP 커넥터에서 사용하도록 설정할 수 있습니다.

기존 클러스터에 Kubernetes용 Azure Policy 배포

권장 사항 페이지를 통해 기존 Kubernetes 클러스터에서 Kubernetes용 Azure Policy를 수동으로 구성할 수 있습니다. 사용하도록 설정되면 강화 권장 사항을 사용할 수 있게 됩니다(일부 권장 사항은 작동하려면 다른 구성이 필요함).

참고 항목

AWS의 경우 커넥터를 사용하여 대규모 온보딩을 수행할 수는 없지만 권장 사항을 사용하여 모든 기존 클러스터 또는 특정 클러스터에 설치할 수 있습니다. Azure Arc 지원 Kubernetes 클러스터에는 Kubernetes 확장용 Azure 정책 확장이 설치되어 있어야 합니다.

Kubernetes용 Azure Policy를 지정된 클러스터에 배포하려면:

  1. 권장 사항 페이지에서 관련 권장 사항을 검색합니다.

    • Azure -"Azure Kubernetes Service clusters should have the Azure Policy add-on for Kubernetes installed"

    • GCP - "GKE clusters should have the Azure Policy extension".

    • AWS 및 온-프레미스 - "Azure Arc-enabled Kubernetes clusters should have the Azure policy extension for Kubernetes extension installed". Screenshot showing the Azure Kubernetes service clusters recommendation.

      이 권장 사항은 다양한 보안 제어에 포함되며, 다음 단계에서 어떤 것을 선택해도 상관없습니다.

  2. 보안 제어에서 권장 사항을 선택하여 추가 기능을 설치할 수 있는 리소스를 확인합니다.

  3. 관련 클러스터를 선택하고 수정을 선택합니다.

    Screenshot that shows how to select the cluster to remediate.

권장 사항 번들 보기 및 구성

Kubernetes용 Azure Policy 설치가 완료되고 약 30분 후에 클라우드용 Defender는 다음 권장 사항에 대한 클러스터의 상태를 표시합니다. 각 권장 사항은 다음과 같이 관련 보안 제어에 표시됩니다.

참고 항목

Kubernetes용 Azure Policy를 처음 설치하는 경우 이러한 권장 사항은 권장 사항 목록에 새로운 추가 항목으로 표시됩니다.

일부 권장 사항에는 효과적으로 사용하기 위해 Azure Policy를 통해 사용자 지정해야 하는 매개 변수가 있습니다. 예를 들어 신뢰할 수 있는 레지스트리에 컨테이너 이미지만 배포해야 합니다.라는 권장 사항의 이점을 활용하려면 신뢰할 수 있는 레지스트리를 정의해야 합니다. 구성이 필요한 권장 사항에 필요한 매개 변수를 입력하지 않으면 워크로드가 비정상으로 표시됩니다.

권장 사항 이름 보안 제어 구성이 필요함
컨테이너 CPU 및 메모리 한도를 적용해야 함 DDoS 공격으로부터 애플리케이션 보호
컨테이너 이미지는 신뢰할 수 있는 레지스트리에서만 배포해야 합니다. 약점 수정
최소 권한 Linux 기능을 컨테이너에 적용해야 합니다. 액세스 및 권한 관리
컨테이너는 허용되는 AppArmor 프로필만 사용해야 합니다. 보안 구성 수정
서비스는 허용되는 포트에서만 수신 대기해야 합니다. 무단 네트워크 액세스 제한
호스트 네트워킹 및 포트 사용을 제한해야 합니다. 무단 네트워크 액세스 제한
Pod HostPath 볼륨 탑재 사용은 알려진 목록으로 제한되어야 함 액세스 및 권한 관리
권한 상승을 포함하는 컨테이너를 사용하지 않아야 함 액세스 및 권한 관리 아니요
중요한 호스트 네임스페이스를 공유하는 컨테이너를 사용하지 않아야 합니다. 액세스 및 권한 관리 아니요
변경 불가능한(읽기 전용) 루트 파일 시스템을 컨테이너에 적용해야 합니다. 액세스 및 권한 관리 아니요
Kubernetes 클러스터는 HTTPS를 통해서만 액세스할 수 있어야 함 전송 중인 데이터 암호화 아니요
Kubernetes 클러스터는 자동 탑재 API 자격 증명을 사용하지 않도록 설정해야 합니다. 액세스 및 권한 관리 아니요
Kubernetes 클러스터는 기본 네임스페이스를 사용하지 않아야 합니다. 보안 모범 사례 구현 아니요
Kubernetes 클러스터는 CAPSYSADMIN 보안 기능을 부여하지 않아야 함 액세스 및 권한 관리 아니요
권한 있는 컨테이너를 피해야 합니다. 액세스 및 권한 관리 아니요
컨테이너를 루트 사용자로 실행하지 않아야 합니다. 액세스 및 권한 관리 아니요

사용자 지정해야 하는 매개 변수가 있는 권장 사항의 경우 다음과 같이 매개 변수를 설정합니다.

매개 변수를 설정하려면 다음을 수행합니다.

  1. Azure Portal에 로그인합니다.

  2. 클라우드용 Microsoft Defender>환경 설정으로 이동합니다.

  3. 관련 구독을 선택합니다.

  4. 클라우드용 Defender의 메뉴에서 보안 정책을 선택합니다.

  5. 관련 할당을 선택합니다. 기본 할당은 ASC default입니다.

  6. 매개 변수 탭을 열고 필요에 따라 값을 수정합니다.

    Screenshot showing where to modify the parameters for one of the recommendations in the Kubernetes data plane hardening protection bundle.

  7. 검토 + 저장을 선택합니다.

  8. 저장을 선택합니다.

권장 사항을 적용하려면 다음을 수행합니다.

  1. 권장 사항 세부 정보 페이지를 열고 거부를 선택합니다.

    Screenshot showing the Deny option for Azure Policy parameter.

    범위를 설정하는 창이 열립니다.

  2. 범위를 설정하고 거부로 변경을 선택합니다.

클러스터에 적용되는 권장 사항을 확인하려면 다음을 수행합니다.

  1. 클라우드용 Defender의 자산 인벤토리 페이지를 열고 Kubernetes 서비스에 대한 리소스 유형 필터를 사용합니다.

  2. 조사할 클러스터를 선택하고 클러스터에 사용 가능한 권장 사항을 검토합니다.

워크로드 보호 집합에서 권장 사항을 보면 영향을 받는 Pod("Kubernetes 구성 요소") 수가 클러스터와 함께 나열됩니다. 특정 Pod 목록을 보려면 클러스터를 선택하고 작업 수행을 선택합니다.

Screenshot showing where to view the affected pods for a Kubernetes recommendation.

적용을 테스트하려면 아래의 두 Kubernetes 배포를 사용합니다.

  • 하나는 워크로드 보호 권장 사항의 번들을 준수하는 정상적인 배포에 대한 것입니다.

  • 다른 하나는 권장 사항을 준수하지 않는 비정상적인 배포에 대한 것입니다.

예제 .yaml 파일을 있는 그대로 배포하거나 고유한 워크로드를 수정하기 위한 참조로 사용합니다.

정상적인 배포 예제. yaml 파일

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-healthy-deployment
  labels:
    app: redis
spec:
  replicas: 3
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
      annotations:
        container.apparmor.security.beta.kubernetes.io/redis: runtime/default
    spec:
      containers:
      - name: redis
        image: <customer-registry>.azurecr.io/redis:latest
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 100m
            memory: 250Mi
        securityContext:
          privileged: false
          readOnlyRootFilesystem: true
          allowPrivilegeEscalation: false
          runAsNonRoot: true
          runAsUser: 1000
---
apiVersion: v1
kind: Service
metadata:
  name: redis-healthy-service
spec:
  type: LoadBalancer
  selector:
    app: redis
  ports:
  - port: 80
    targetPort: 80

비정상적인 배포 예제. yaml 파일

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-unhealthy-deployment
  labels:
    app: redis
spec:
  replicas: 3
  selector:
    matchLabels:
      app: redis
  template:
    metadata:      
      labels:
        app: redis
    spec:
      hostNetwork: true
      hostPID: true 
      hostIPC: true
      containers:
      - name: redis
        image: redis:latest
        ports:
        - containerPort: 9001
          hostPort: 9001
        securityContext:
          privileged: true
          readOnlyRootFilesystem: false
          allowPrivilegeEscalation: true
          runAsUser: 0
          capabilities:
            add:
              - NET_ADMIN
        volumeMounts:
        - mountPath: /test-pd
          name: test-volume
          readOnly: true
      volumes:
      - name: test-volume
        hostPath:
          # directory location on host
          path: /tmp
---
apiVersion: v1
kind: Service
metadata:
  name: redis-unhealthy-service
spec:
  type: LoadBalancer
  selector:
    app: redis
  ports:
  - port: 6001
    targetPort: 9001

다음 단계

이 문서에서는 Kubernetes 데이터 평면 강화를 구성하는 방법을 알아보았습니다.

관련 자료는 다음 페이지를 참조하세요.