Overview
쿠버네티스 정책 기반의 솔루션인 Kyverno 을 소개하고 원리와 사용 방법을 이해하겠습니다.
Kyverno
Kyverno는 Kubernetes용으로 설계된 정책 엔진을 포함하는 PaC(Policy-as-Code) 솔루션입니다. Kyverno를 통해 PSA/PSS 설정을 보완하고, 포드 보안을 강화할 수 있습니다. PSA (Pod Security Admission) 와 PSS (Pod Security Standards) 둘 다 쿠버네티스에서 제공하는 파드 보안 기능으로 PSA는 보안 기준을 강제하는 기능이며, PSS는 파드가 준수해야 할 구체적인 보안 기준을 제공합니다.
Kyverno 정책 엔진은 Kubernetes 클러스터에 설치되고 Kubernetes API 서버에 동적 승인 컨트롤러로 통합됩니다 . 이를 통해 요청이 내부 Kubernetes etcd 데이터 저장소 에 변경 사항을 유지하기 전에 Kyverno 정책을 사용하여 인바운드 Kubernetes API 서버 요청을 변경하고 검증할 수 있습니다 .
동작 원리를 이해를 위해 기능 예제를 앞서 확인하겠습니다. Kyverno 에서는 validate(유효성 검사), Mutate(변경) 기능을 제공합니다. 사용자가 정의한 정책에 맞게 파드를 검사하여 유효성을 검사하여 파드 주입이 안되거나, 파드가 자동으로 주입됩니다.
Kyverno 의 정책은 Rule로 구성됩니다. 각 구성 요소는 다음과 같습니다.
- Match, Exclude 는 정책을 적용할 대상을 뜻합니다. 대상은 쿠버네티스 자원들 대상으로 설정합니다.
- Kyverno 기능 구분 요소입니다. Validate는 유효성 검사, Mutate는 변경, Generate는 동기화, Verify Imaged 는 이미지 검증에 사용됩니다.
이를 통해 제공하는 기능들은 다음과 같습니다.
파드 보안성이나 파드 스케쥴러에 필요한 기능들을 자동으로 주입할 수 있고, Karpenters와 같이 라벨셀렉터를 통해 노드를 구별하여 구성하는 addons들과 결합하여 장애 방지를 할 수 있습니다.
배포
AEWS 스터디에서 공유해주신 설치 내용을 참고하여 진행하였습니다.
EKS 클러스터가 구성된 상태에서 helm 차트를 통해 Kyverno 배포하겠습니다.
먼저, kyverno 메트릭 수집 및 대시보드 확인을 위해 kube-prometheus-stack 을 배포하였습니다.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# 파라미터 설정
cat < monitor-values.yaml
prometheus:
prometheusSpec:
podMonitorSelectorNilUsesHelmValues: false
serviceMonitorSelectorNilUsesHelmValues: false
retention: 5d
retentionSize: "10GiB"
grafana:
defaultDashboardsTimezone: Asia/Seoul
adminPassword: prom-operator
defaultDashboardsEnabled: false
alertmanager:
enabled: false
EOT
# 배포
kubectl create ns monitoring
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 57.2.0 \
--set prometheus.prometheusSpec.scrapeInterval='15s' --set prometheus.prometheusSpec.evaluationInterval='15s' \
-f monitor-values.yaml --namespace monitoring
# Metrics-server 배포
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Kyverno 배포는 다음의 명령어를 통해 진행해주세요.
# 파라미터 설정
cat << EOF > kyverno-value.yaml
config:
resourceFiltersExcludeNamespaces: [ kube-system ]
admissionController:
serviceMonitor:
enabled: true
backgroundController:
serviceMonitor:
enabled: true
cleanupController:
serviceMonitor:
enabled: true
reportsController:
serviceMonitor:
enabled: true
EOF
kubectl create ns kyverno
helm repo add kyverno https://kyverno.github.io/kyverno/
helm install kyverno kyverno/kyverno --version 3.2.0-rc.3 -f kyverno-value.yaml -n kyverno
- kube-system 네임스페이스는 웹후크에서 필터 대상에서 제외하였습니다. EKS VPC-CNI로 배포 스페이스로 운영을 위해 선택하였습니다.
- ArgoCD와 같이 배포하여 운영하는 경우 대상 감시에 충돌이 일어납니다. 공식문서를 참고해주세요.
리소스 확인은 다음과 같습니다.
# 리소스 확인
kubectl get all -n kyverno
kubectl get crd | grep kyverno
Kyverno는 웹훅 등록에 사용할 자체 서명 인증 기관(CA)과 인증서를 자동으로 생성되어 쿠버네티스와 통신합니다. 자체 인증서가 필요한 경우 공식문서를 참고해주세요.
# 시크릿 확인
kubectl -n kyverno get secret
# 인증서 확인을 위한 툴 설치
wget https://dl.smallstep.com/cli/docs-cli-install/latest/step-cli_amd64.rpm
sudo rpm -i step-cli_amd64.rpm
# 인증서 확인
kubectl -n kyverno get secret kyverno-svc.kyverno.svc.kyverno-tls-ca -o jsonpath='{.data.tls\.crt}' | base64 -d | step certificate inspect --short
kubectl get validatingwebhookconfiguration kyverno-policy-validating-webhook-cfg -o jsonpath='{.webhooks[0].clientConfig.caBundle}' | base64 -d | step certificate inspect --short
Kyverno 대시보드는 다음과 같이 그라파나를 접근해서 구성해주세요.
# 로드밸런서 설정
# ClusterIP -> LoadBalancer 변경
kubectl edit svc kube-prometheus-stack-grafana -n monitoring
# EXTERNAL-IP 확인 (접근에 약 5분 소요)
kubectl get svc -n monitoring | grep grafana
- 초기 아이디와 비밀번호는 admin, prom-operator 입니다.
Import a Dashboard 에서 15987를 입력하여 구성하면 kyverno 대시보드를 확인할 수 있습니다.
원리 이해
kyverno 동작 원리는 쿠버네티스 웹훅 이해가 필요합니다. 커피고래님 블로그에 웹훅에 대해 설명이 잘 나와있으니 링크를 대신 공유드립니다. kyverno 의 구성 웹훅을 확인하면 컨트롤러별 웹훅이 구성되어 있습니다.
kubectl get validatingwebhookconfigurations
kubectl get mutatingwebhookconfigurations
각 웹훅을 확인하면 웹훅 대상과 파드 조건을 확인할 수 있습니다. 예를 들어 mutate 웹훅을 확인하면 다음과 같습니다.
파드가 생성, 업데이트될 때 kyverno-svc 의 /policymutate 에서 웹훅이 되는 것을 확인할 수 있습니다.
kyverno 정책 구성
Kyverno 공식문서에는 다양한 정책 예제들이 제공됩니다. 제공 예제들은 EKS나 Istio, Karpenter같은 addon들도 세분화되어 정리되어 있습니다. 시나리오가 다양하게 제공됨으로 필요 기능에 따라 정책을 구성하는 것을 추천드립니다. 필자의 경우는 파드 보안과 운영 측면에서 활용될 수 있는 시나리오를 선택하여 구성하겠습니다.
파드 보안
Require Read-Only Root Filesystem (링크)
Restricted Pod Security Standards (링크) : 파드 보안 표준을 Restrcted 로 설정합니다. 허용되는 리소스가 제한되어 있으며 보안 설정이 필요합니다. (참고)
파드 스케쥴러
Require Limits and Requests (링크)
Require Pod Probes (링크)
Require PodDisruptionBudget(링크)
정책 조건으로 패턴, 정규식, 변수 값 등으로 다양하게 정책을 설정할 수 있습니다. 링크된 예제 정책을 확인하시는 것을 추천드립니다.
링크를 참고하여 정책을 배포합니다.
kubectl get ClusterPolicy
정책이 확인되면 예제 파드를 배포하겠습니다.
kubectl run redis --image redis
예상과 달리 파드가 정상적으로 배포되었습니다. 정책 옵션의 validationFailureAction: audit 때문인데요. 옵션이 audit 인 경우, 리포트에서 실패를 남기지만 배포가 수행됩니다. 배포까지 중지를 원한다면 옵션 값을 enforce 로 수정해주세요. 정책 옵션은 위 ClusterPolicy 에서 VALIDATE ACTION에서 확인할 수 있습니다.
정책 리포트를 확인하면 상세 내역을 확인할 수 있습니다. 배포한 정책들을 조회하면 다음과 같이 확인할 수 있습니다.
kubectl get policyreport -o wide
---
NAME KIND NAME PASS FAIL WARN ERROR SKIP AGE
f783892c-8a04-4b03-878e-25e3bf5c6597 Pod redis 2 5 0 0 0 11s
kubectl get policyreport f783892c-8a04-4b03-878e-25e3bf5c6597 -o yaml
결과를 확인하면 배포한 정책 중 fsgroup, supplementalgroups 의 정책(Require Read-Only Root Filesystem 일부)만 통과하고 나머지 정책들은 fail이 된 것을 확인할 수 있습니다.
대시보드에서 설정한 정책들에 대해 결과를 확인할 수 있습니다.
kyverno CLI
kyverno 정책 검증으로 CLI를 통해 로컬에서 사전 테스트가 가능합니다. CD 파이프라인에서 사전 테스트 목적으로 구성되었다고 합니다.
# CLI 설치
kubectl krew install kyverno
kubectl kyverno version
# 정책 테스트
kubectl kyverno apply require-probes.yaml --resource nginx.yaml --policy-report
- --policy-report 옵션은 로컬에서도 리포트 출력을 할 수 있는 기능입니다.
끝으로
kyverno는 운영성이나 보안성을 강화하는 도구로 사용될 수 있습니다. 다만, 구성 정책 시나리오에 따라 쿠버네티스 어드민에 과부하가 갈 수 있다고 생각합니다. 운영과 보안 측면에서 고려하여 정책 설정이 필요할 것 같습니다. 구성 시나리오대로 레벨을 구분하여 크리티컬한 보안은 배포가 안되도록, 파드 스케쥴의 경우는 배포가 되지만 대시보드를 통해 안내를 하는 것이 좋아보이네요.
'Cloud Tech' 카테고리의 다른 글
Terraform 내부 로직 이해 (0) | 2024.06.15 |
---|---|
SonarQube를 활용한 EKS CleanCode CI /CD 파이프라인 구축하기 (0) | 2024.04.20 |
Karpenter 고려사항 (0) | 2024.04.07 |
Kubeflow로 보는 Karpenter (0) | 2024.04.07 |
Terraform AWS Observability Accelerator와 멀티클러스터 Observability 구성하기 (1) | 2024.03.31 |