Kubernetes 데이터 평면 강화는 권한 있는 컨테이너 제한, 리소스 제한 적용 및 네트워크 액세스 제한과 같이 클러스터에서 실행되는 워크로드에 대한 보안 구성을 적용하는 데 도움이 됩니다.
클라우드용 Microsoft Defender 데이터 평면 강화는 Kubernetes에 Azure Policy 사용하여 이러한 구성을 평가하고 적용하여 구현됩니다. Azure Policy 자동 프로비저닝을 사용하는 경우 컨테이너에 대한 Defender 일부로 배포됩니다.
Defender 컨테이너 계획 설정에서 Kubernetes에 대한 Azure Policy 해제된 경우 관련 권장 사항을 수정하여 배포할 수 있습니다. 사용하도록 설정하는 동안 자동 프로비저닝을 사용하지 않도록 설정하거나 특정 클러스터를 자동 프로비저닝에서 제외한 경우 Azure CLI 또는 Helm을 사용하여 Azure Policy 수동으로 배포할 수도 있습니다.
Kubernetes에 대한 Azure Policy 배포된 후 클라우드용 Defender 클러스터 구성에 따라 데이터 평면 강화 권장 사항을 생성합니다. 이 페이지에서는 이러한 권장 사항을 검토하고, 정책 매개 변수를 구성하고, 클러스터에 적용하는 방법을 보여 줍니다.
필수 조건
시작하려면 다음을 확인합니다.
Azure 정책에 대한 필수 FQDN/애플리케이션 규칙 추가했습니다.
(AKS 클러스터가 아닌 경우) Kubernetes 클러스터는 Azure Arc 연결됩니다.
권장 사항을 수정하여 Kubernetes에 대한 Azure Policy 사용하도록 설정
Kubernetes에 대한 Azure Policy 배포되지 않았거나 컨테이너용 Defender 계획 설정에서 해제된 경우 클라우드용 Defender 관련 권장 사항을 수정하여 설치할 수 있습니다.
Azure 포털 로그인합니다.
클라우드용 Microsoft Defender>권장 사항으로 이동합니다.
관련 권장 사항을 검색합니다.
- Azure: Azure Kubernetes Service 클러스터에는 Kubernetes용 Azure Policy 추가 기능이 설치되어 있어야 합니다.
- GCP: GKE 클러스터에는 Azure Policy 확장이 설치되어 있어야 합니다.
- AWS/Arc 지원 Kubernetes: Azure Arc 사용 가능한 Kubernetes 클러스터에는 Azure Policy 확장이 설치되어 있어야 합니다.
Azure Kubernetes 서비스 클러스터 추천을 보여주는 스크린샷입니다. 권장 사항을 선택합니다.
작업 수행 탭에서 수정을 선택합니다.
수정을 선택하여 선택한 리소스를 수정합니다.
각 권장 사항에 대해 반복합니다.
데이터 평면 강화 권장 사항
Kubernetes용 Azure Policy 배포한 후 클라우드용 Defender 클러스터 구성을 평가하고 데이터 평면 강화 권장 사항을 생성합니다. 이 프로세스는 최대 30분이 걸릴 수 있습니다.
참고
Defender 센서와 같은 Microsoft 구성 요소는 기본적으로 kube-system 네임스페이스에 배포되며 비준수로 표시되지 않습니다. 다른 네임스페이스에 설치된 타사 구성 요소에 플래그가 지정될 수 있습니다. 특정 네임스페이스를 제외하려면 Azure 정책 제외를 구성합니다.
다음 표에서는 일반적인 데이터 평면 강화 권장 사항을 나열합니다.
| 권장 사항 이름 | 보안 제어 | 구성이 필요함 |
|---|---|---|
| 컨테이너 CPU 및 메모리 한도를 적용해야 함 | DDoS 공격으로부터 애플리케이션 보호 | 예 |
| 신뢰할 수 있는 레지스트리의 컨테이너 이미지만 배포해야 함 | 약점 수정 | 예 |
| 최소 권한 Linux 기능을 컨테이너에 적용해야 합니다. | 액세스 및 권한 관리 | 예 |
| 컨테이너는 허용되는 AppArmor 프로필만 사용해야 합니다. | 보안 구성 수정 | 예 |
| 서비스는 허용되는 포트에서만 수신 대기해야 합니다. | 무단 네트워크 액세스 제한 | 예 |
| 호스트 네트워킹 및 포트 사용을 제한해야 합니다. | 무단 네트워크 액세스 제한 | 예 |
| Pod HostPath 볼륨 탑재 사용은 알려진 목록으로 제한되어야 함 | 액세스 및 권한 관리 | 예 |
| 권한 상승을 포함하는 컨테이너를 사용하지 않아야 함 | 액세스 및 권한 관리 | 아니요 |
| 중요한 호스트 네임스페이스를 공유하는 컨테이너를 사용하지 않아야 합니다. | 액세스 및 권한 관리 | 아니요 |
| 변경 불가능한(읽기 전용) 루트 파일 시스템을 컨테이너에 적용해야 합니다. | 액세스 및 권한 관리 | 아니요 |
| Kubernetes 클러스터는 HTTPS를 통해서만 액세스할 수 있어야 함 | 전송 중인 데이터 암호화 | 아니요 |
| Kubernetes 클러스터는 자동 탑재 API 자격 증명을 사용하지 않도록 설정해야 합니다. | 액세스 및 권한 관리 | 아니요 |
| Kubernetes 클러스터는 기본 네임스페이스를 사용하면 안 됩니다. | 보안 모범 사례 구현 | 아니요 |
| Kubernetes 클러스터는 CAP_SYS_ADMIN 기능을 부여해서는 안 됩니다. | 액세스 및 권한 관리 | 아니요 |
| 권한 있는 컨테이너를 피해야 합니다. | 액세스 및 권한 관리 | 아니요 |
| 컨테이너를 루트 사용자로 실행하지 않아야 합니다. | 액세스 및 권한 관리 | 아니요 |
클러스터에 대한 권장 사항 보기
특정 클러스터에 대한 데이터 평면 강화 권장 사항을 보려면 다음을 수행합니다.
Azure 포털 로그인합니다.
클라우드용 Defender>벤토리로 이동합니다.
리소스 종류 필터를 Kubernetes 서비스 로 설정하고 적용을 선택합니다.
관련 클러스터를 선택합니다.
사용 가능한 권장 사항을 검토합니다. 데이터 평면 강화 권장 사항은 영향을 받는 Kubernetes 구성 요소의 수를 보여 줍니다.
영향을 받는 리소스를 보려면 권장 사항을 선택합니다.
작업 수행 탭을 선택하여 수정 옵션을 검토합니다.
정책 매개 변수 구성
일부 권장 사항에는 매개 변수 구성이 유효해야 합니다. 예를 들어 신뢰할 수 있는 레지스트리에서 컨테이너 이미지를 배포해야 하는 권장 사항은 신뢰할 수 있는 레지스트리 목록을 정의하기만 하면 됩니다.
필수 매개 변수가 구성되지 않으면 리소스가 비정상으로 표시됩니다.
정책 매개 변수를 구성하려면 다음을 수행합니다.
Azure 포털 로그인합니다.
클라우드용 Microsoft Defender> 환경 설정 이동합니다.
관련 구독을 선택합니다.
보안 정책을 선택합니다.
표준 탭에서 관련 보안 표준을 선택합니다.
관련 정책 할당의 3점 메뉴를 선택하고 효과 및 매개 변수 관리를 선택합니다.
필요한 매개 변수 값을 업데이트합니다.
저장을 선택합니다.
데이터 평면 강화 정책 적용
기본적으로 정책은 감사 모드에서 리소스를 평가합니다. 정책을 적용하려면 해당 효과를 거부로 설정합니다.
권장 사항을 적용하려면 다음을 수행합니다.
Azure 포털 로그인합니다.
클라우드용 Microsoft Defender>권장 사항으로 이동합니다.
관련 데이터 평면 강화 권장 사항을 검색하고 선택합니다.
작업 수행 탭에서 거부를 선택합니다.
범위를 설정합니다.
거부하려면 [변경]을 선택합니다.
테스트 정책 적용
테스트 워크로드를 배포하여 데이터 평면 강화 정책의 유효성을 검사할 수 있습니다.
- 데이터 평면 강화 요구 사항을 충족하는 규정 준수 배포.
- 여러 정책을 위반하는 비규격 배포
다음 예제 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
규정을 따르지 않는 배포의 예
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