4. Gatekeeper
1. Gatekeeper 개요
쿠버네티스 환경에서 정책제어를 할 수 있도록 특화된 솔루션으로 OPA(Open Policy Agent) 엔진을 사용하여 클러스터에 대한 승인, 제어를 할 수 있습니다.
OPA란?
플랫폼 관리자가 시스템 권한 관리를 체계적으로 할 수 있도록 도와주는 오픈소스 솔루션으로 쿠버네티스 뿐만 아니라 OPA 엔진은 이해하는 모든 플랫폼에서 동작합니다. 요청이 들어오면 서비스는 JSON을 이용하여 OPA에 허용 여부 질의를 하고, 질의를 받은 OPA는 저장된 Policy를 불러와서 요청에 대한 평가를 하고 다시 JSON 형식으로 서비스에 반환합니다.
OPA는 Policy를 기반으로하여 사용자 접근을 관리하기 때문에 Policy를 어떻게 작성하는 지가 중요하며, Policy는 Rego라는 자체 질의언어를 이용하여 작성하기 때문에 해당 문법에 대한 이해가 필요합니다.
Gatekeeper란?
Gatekeeper는 내부적으로 OPA 엔진을 사용하는 쿠버네티스 승인/제어를 위해 제작된 솔루션입니다.
쿠버네티스에서는 정책적인 결정을 API 서버와 분리하여 독립적으로 할 수 있게 Admission Controller Webhook(이하 웹훅)을 제공합니다. 웹훅은 쿠버네티스 클러스터가 변경될 때 무조건 실행되며, Gatekeeper는 웹훅을 확인하여 OPA 정책 엔진에서 정의한 대로 실행합니다.
Gatekeeper 구성요소
Validating Admission Control: 웹훅을 트리거로 OPA와 api-server의 다리 역할을 하여 정책을 적용
Policies and Constraints: Rego 언어로 작성되며 정의한 요구사항을 위반하는 리소스들을 확인
Audit: 배포된 자원을 정기적으로 감사하며 Constraints에 반하는 것이 있는지 확인
Data Replication: 리소스를 복제 한 후 감사가 진행되며 복제할 수 있도록 권한 부여가 필요
2. Gatekeeper 사용
상태 확인
(1) Gatekeeper 파드가 정상적으로 Running 중인지 확인합니다.
kubectl -n playcekube get all | grep Gatekeeper
pod/Gatekeeper-audit-696f978cd9-fj6nz 1/1 Running 1 (6h55m ago) 6h56m
pod/Gatekeeper-controller-manager-6f98779979-h9sxv 1/1 Running 0 6h56m
pod/Gatekeeper-controller-manager-6f98779979-r7nzh 1/1 Running 0 6h56m
pod/Gatekeeper-controller-manager-6f98779979-sc6fx 1/1 Running 0 6h56m
service/Gatekeeper-webhook-service ClusterIP 10.233.21.178 <none> 443/TCP 6h56m
deployment.apps/Gatekeeper-audit 1/1 1 1 6h56m
deployment.apps/Gatekeeper-controller-manager 3/3 3 3 6h56m
replicaset.apps/Gatekeeper-audit-696f978cd9 1 1 1 6h56m
replicaset.apps/Gatekeeper-controller-manager-6f98779979 3 3 3 6h56m
Gatekeeper-library 다운로드
(1) Gatekeeper 정책 샘플 라이브러리를 다운로드합니다.
# git clone https://github.com/open-policy-agent/Gatekeeper-library.git
# ls -l
total 76
-rw-r--r-- 1 root root 11357 Jan 16 16:53 LICENSE
-rw-r--r-- 1 root root 3377 Jan 16 16:53 Makefile
-rw-r--r-- 1 root root 62 Jan 16 16:53 NOTICE
-rw-r--r-- 1 root root 4333 Jan 16 16:53 README.md
drwxr-xr-x 3 root root 4096 Jan 16 16:53 artifacthub
drwxr-xr-x 4 root root 4096 Jan 16 16:53 build
drwxr-xr-x 3 root root 4096 Jan 16 16:53 docs
-rw-r--r-- 1 root root 83 Jan 16 16:53 go.work
-rw-r--r-- 1 root root 336 Jan 16 16:53 go.work.sum
drwxr-xr-x 4 root root 4096 Jan 16 16:53 library
drwxr-xr-x 3 root root 4096 Jan 16 16:53 mutation
drwxr-xr-x 5 root root 4096 Jan 16 16:53 scripts
drwxr-xr-x 5 root root 4096 Jan 16 16:53 src
drwxr-xr-x 3 root root 4096 Jan 16 16:53 test
-rwxr-xr-x 1 root root 338 Jan 16 16:53 test.sh
drwxr-xr-x 5 root root 4096 Jan 16 16:53 website
샘플 정책 적용
(1) Gatekeeper 정책 샘플 중에 아내 requiredlabels를 적용해보겠습니다.
(2) template 적용
requiredlabels 폴더에 template.yaml 하단부에 rego 언어로 작성된 내용을 확인 할 수 있습니다.
해당 yaml 을 적용합니다.
(3) constraint 적용
네임스페이스에 ‘owner’ label이 적용되어 있어야 한다는 제약을 확인합니다.
제약 조건을 적용을 위해 constraint.yaml 을 적용합니다.
(4) 네임스페이스를 생성하여 제약이 정상적으로 동작하는지 확인합니다.
명령어로 네임스페이스 생성 시 Gatekeeper에서 denied 되었다는 메시지를 확인 할 수 있습니다.
lable 설정 없는 yaml 파일로 네임스페이스 생성 시 denied 된 메시지를 확인 할 수 있습니다.
lable 설정 추가하여 네임스페이스 생성을 확인합니다.
3. Gatekeeper 기술자료
https://open-policy-agent.github.io/gatekeeper/website/docs/
https://github.com/open-policy-agent/gatekeeper-library
4. Gatekeeper 릴리즈 노트
https://github.com/open-policy-agent/gatekeeper/releases