이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Kubernetes

102. Kubernetes 보안 설정 node-restriction.kubernetes.io

이쿠우우 2022. 5. 5. 16:43
반응형
 
 
 

kubernetes 보안 설정 node-restriction.kubernetes.io

 

취약점 분석

 
kube-apiserver의 --enable-admission-plugin 항목을 확인해보면
default로 NodeRestriction 항목이 활성화 되어있는 것을 확인할 수 있음.

 
해당 NodeRestriction 설정은 어떤 역할을 하는지 찾아봄.
 
일반적으로 worker node는 kubelet을 통해서 master(control) node의 kube-apiserver와 통신할 수 있음.
즉 worker node의 kubectl 사용 시 별도의 인증 계정을 만들지 않고도
worker node에 이미 배포되어있는 kubelet의 인증권한을 사용하면 kube-apiserver와 통신하여
kubectl tool을 정상적으로 사용할 수 있음.
실제로 사용해보겠음.
 
worker node에서 
cat /etc/kubernetes/kubelet.conf 파일을 확인할 수 있음

 
해당 파일을 kubeconfig로 설정해서 kubeclt 사용.
 
[명령어]
export KUBECONFIG=/etc/kubernetes/kubelet.conf
 
이후 kubectl get node로
cluster node 정보를 확인해보면
worker node에서 정상적으로 조회 가능.

 
하지만 해당 kubelet 권한은 worker node role 권한을 가지고 있어서
모든 정보를 확인할 수는 없음
실제로 namespace 정보 확인 시 
"system:node:node01" user는 권한이 없어서
다음과 같이 정상 조회가 안됨.

 
하지만 해당 권한으로 node의 label은 추가가 가능함.
물론 해당 node의 labeld만 추가할 수 있고
다른 node의 label 수정권한은 없어서 불가능함.

 
근데 본인 node에서도 수정하지 못하는 label이 있음.
해당 label은 "node-restriction.kubernetes.io" 임
worker node에서 kubelet 권한을 가진 kubectl 명령으로도
node-restriction.kubernetes.io 의 label은 추가하지 못함.

 
node-restriction.kubernetes.io label은 오로지 master(control) node에서만 추가 가능

 
이와 같이 다른 node에 label을 추가하지 못하게하고
node-restriction.kubernetes.io label은 수정하지 못하게 하는 설정이
admission plugins 중 NodeRestriction 임.
 
해당 설정은 다음과 같이 추가할 수 있음.
--enable-admission-plugins=NodeRestriction
 
만약 
--enable-admission-plugins=NodeRestriction 
설정이 없다면
node에서 다른 node의 label을 수정할 수 있고
이는 보안적으로 굉장히 위험함.
 

결론

kubernetes에서 이와같은 NodeRestriction 를 default로 제공하고 있는 이유는 바로 보안임.
node에 label을 추가하면 
특정 pod를 해당 label을 가진 node에만 배포할 수 있음.
kubernetes cluster를 구성하다 보면 
특정 node에만 보안적인 기능을 많이 추가해서 중요한 pod만 배포되도록 구성할 수 있음.
이런 경우 해당 중요한 node에는 다른 node에서 수정이 불가능한
label을 추가해서 해당 label을 가진 node에만 중요 pod가 배포되도록 해야함.
이런 경우 node-restriction.kubernetes.io label를 사용함.
해당 옵션을 사용해야하는 또 다른 이유는
공격자가 손상된 node를 배포하고
해당 node에 중요 label을 추가해서 
손상된 node에 중요 pod를 배포해서 운영에 악영향을 주는 경우가 있음.
이런걸 대비하기 위해서도 NodeRestriction admission controller를 사용해야함.
 

해결책

--enable-admission-plugins=NodeRestriction 
설정은 반드시 존재해야함.
 
 

 


 
참고

 

반응형