본문 바로가기
Kubernaetes

KubeCon Kyverno 세션 적용해보기

by 앵남(Andy) 2022. 12. 9.

Pod(Container Grop)

Pod에 대한 이해가 먼저 필요하다. Pod는 하나 이상의 컨테이너로 구성된 그룹이며, Pod는 언제라도 죽을 수 있는 존재로 설계되었다.

Pod는 항상 두 개 이상의 Container를 포함하는 것을 의미하지 않는다. 하나의 container만 포함하더라도 괜찮다. 그렇다면 쿠버네티스는 Container를 직접 사용하지 않고 왜 Pod를 감싸고 운영을 하는 것일까?

Pod 내부에 존재하는 Container가 실행 할 수 있는 환경을 제공하면서 독립성을 보존할 수 있는 Cotainer보다 더 상위 레벨로 만들어졌다.

즉, Container 그룹 Pod를 사용해서 밀접하게 연관된 프로세스를 함께 실행하고 한개의 컨테이너 안에서 모두 실행되는 것처럼 동일한 환경을 제공할 수 있게 만들며 격리된 상태로 유지할 수 있게 만드는 것이다.

그렇다면 쿠버네티스는 Pod(container grop)를 보안을 해줄까? 정답은 쿠버네티스는 보안을 해주지 않는다. 또한, 쿠버네티스는 취약점으로 부터 애플리케이션을 보호하는 기능을 제공하지 않는다.

그래서 쿠버네티스에 적절한 보안 시스템이 있는 추가 프로그램을 사용하거나 특정 업체의 기술을 활용해야 한다.

 

 

PSP(Pod Security Policy)란 무엇인가?

pod에는 SecurityContext보안의 기능을 정의 하는게 존재한다. 그렇다면 PSP(Pod Security Policy)는무엇일까?

Pod Security Policy는 보안 기능에 대한 정책을 정의 하는 것이다. PSP를 정의를 하게되면 클러스터 전체에 적용이 된다.

Pod Security Policy를 통해서 Pod내부에 있는 container의 권한에 대한 정책, Volume, 파일 설정 등등 Pod 내 container가 불필요하게 과도한 권한을 가지지 않도록 만들어야 하는데 PodSecurityPolicy를 사용해서 권한을 조절할 수 있다.

그러면 SecurityContext 와 Pod Security Policy과 관계는 무엇일까 PSP는 SC보다 상위 보안 설정을 가지고 있다.

즉, SC는 Pod와 Container에 적용되는 설정이면 PSP는 클러스터 전체에 적용이된다. 그래서 PSP가 부여하지 않은 권한을 SC가 부여할 수 없게 된다.

 

예를들자면 PSP에서 Privileged를 false를 주고 SC가 Pod에 대한 보안 Privileged 권한을 true를 주면 이 해당 Container는 생성되지 않는다.

 

 

 

KubeCon에서 설명한 Kyverno는 무엇일까?

Kyverno는 그리스용어로 쿠버네티스용으로 설계된 정책 엔진이다. 쿠버네티스에서는 podSecurityPolicy yaml 파일을 통해 PSP를 적용할 수 있다. 하지만 여기서 중요한점은 쿠버네티스 v1.21버전부터 사용되지 않고 v1.25부터는 아예 제거가 된다고 발표했다.

 

근데 PSP가 제거되었다고 해서 쿠버네티스에서 Pod 보안이 종료되는게 아니라고 한다. PSA(Pod Security Admission) 컨트롤러로 대체 되었다고함 그러나 PSA에도 단점이 존재한다. 몇가지 단점을 보안할 수 있는 kyverno를 사용해서 새로운 배포 방법이 나왔다.

 

from kyberno document

 

kyverno 장점

  • kubernetes 리소스로서의 정책(새로운 언어를 배울 필요가 없음)
  • 리소스 유효성 검사, 변경 또는 생성
  • 이미지 메타데이터 검사
  • 레이블 선택기와 와일드카드를 사용하여 리소스 일치
  • 오버레이를 사용하여 유효성 검사 및 변형(예: Kustomize)
  • 네임스페이스 전체에서 구성 동기화
  • 허용 제어를 사용하여 비 준수 리소스를 차단하거나 정책 위반 확인
  • 클러스터에 적용하기 전에 CI/CD 파이프라인에서 Kyverno CLI를 사용하여 정책을 테스트하고 리소스를 검증
  • git와 같은 친숙한 도구를 사용하여 정책을 코드로 관리kustomize

 

kyverno를 사용해서 클러스터 내에 정책만들고 실습해보기

 

mac os에서 heml 설치하기

brew install kubernetes-helm

 

helm --help 명령어를 통해 설치 확인하기

 

 

kubectl create 명령어로 설치하기

kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/main/config/install.yaml
  • kubens 명령어를 통해 kyverno가 생성된걸 확인할 수 있다.

 

kubens namespace-name를 통해 kyverno pod가 생성되어있는지 확인

1
kubens kyverno 
2
kubectl get pods

 

 

 

kyverno yaml file 작성하기

  • 해당정책은 특정 파드를 배포할 때 label를 설정하지 않고 클러스터 내에 배포를 한다면 파드 정책를 위반했기 때문에 만들지 못하게 하는 정책을 만드는 예제이다.

 

kyverno를 통해 클러스터 정책 적용하기

 

cluster네에 정책 생성 확인하기

kubectl get cpol

 

 

nginx deployment를 label를 지정하지 않고 배포하기

kubectl create deployment nginx --image=nginx

  • nginx를 배포할 수 없다. 왜냐면 클러스터 내에 정의된 label를 정의하지 않고 배포시 파드를 생성할 수 없는 정책을 생성했기 때문이다.

 

 

label를 지정하고 배포하기

kubectl run nginx --image nginx --labels app.kubernetes.io/name=nginx

label를 지정하고 배포하게 되면 nginx pod가 생성된 것을 확인할 수 있다

 

결론

 
 
 

Sinha Speaker가 해당 세션에서 말하고자 하는 건 keyverno가 쿠버네티스 스타일을 그대로 적용할 수 있고 읽기가 편하다는 점을 말하고 싶어하는거 같았다. 조금 단점을 찾아보자면 정책이 다른 PSP management와 비교했을 때 제한적인 정책을 가지고 있다는 점이다. 또한, 성숙도가 낮다. 성숙도가 낮다는건 인지도가 낮을 수 있다는 것이다. 아마도 Abhinav Sinha kubecon에서 발표한 이유도 kyverno를 알리기 위해 나오지 않았을까 추측을 해보다.

 

댓글