연재 시리즈

pkos 스터디 5주차 3편 - securityContext.privileged

악분 2023. 4. 4. 15:38
반응형

5주차 세번째 주제는 pod securityContext.privileged입니다.

 

사전지식

컨테이너는 프로세스로서 노드 커널 위에 실행됩니다. 그러므로 컨테이너가 커널에 접근할 수 있습니다. 쿠버네티스와 같은 컨테이너 오케스트레이션 도구는 pod가 노드 커널에 접근하지 못하도록 보안설정을 합니다.

 

privileged란?

부득이하게 pod가 커널 접근이 꼭 필요한 상황이 있습니다. 네트워크 설정을 해야 하는 Calico CNI가 대표적인 예입니다. 이런 상황을 대비하여 쿠버네티스는 pod가 커널에 접근할 수 있는 설정을 제공합니다. 그 설정이 바로 securityContext.privileged입니다. 

 

spec.containers.securityContext.privileged를 true로 설정하면 pod가 노드 커널에 접근할 수 있습니다. 디폴트로 false로 설정되어 있습니다.

apiVersion: v1
kind: Pod
metadata:
 name: example
spec:
 containers:
 - name: main
   image: busybox:1.28
   command: [ "sh", "-c", "sleep 1h" ]
   # privileged 설정
   securityContext:
     privileged: true

 

정확한 의미는 쿠버네티스 explain에서 찾을 수 있습니다. 문서 설명을 보면 host의 root권한과 동등한 권한을 갖는다고 설명되어 있습니다. 

kubectl explain pod.spec.containers.securityContext | more

 

예제

실습에서는 privileged 설정 여부에 따라 노드 디바이스 목록을 조회하는 예제를 살펴보겠습니다. 만약 privileged 설정이 true로 되어 있다면, 해당 pod는 노드 디바이스에 접근할 수 있게 됩니다.

 

privileged를 true/false설정하여 pod를 2개 생성합니다.

# privileged:true -> 노드 디바이스 목록 조회 가능
apiVersion: v1
kind: Pod
metadata:
 name: security-privileged-true
spec: 
 containers:
 - name: sec-ctx-demo-default
   image: nicolaka/netshoot
   command: ["tail"]
   args: ["-f", "/dev/null"]
   securityContext:
     privileged: true
---
# privileged:false -> 노드 디바이스 목록 조회 불가능
apiVersion: v1
kind: Pod
metadata:
 name: security-privileged-false
spec: 
 containers:
 - name: sec-ctx-demo-default
   image: nicolaka/netshoot
   command: ["tail"]
   args: ["-f", "/dev/null"]

 

privileged가 false로 설정되어 있으면 컨테이너에 있는 디바이스 목록만 조회합니다.

# privileged:false
kubectl exec -it security-privileged-false -- ls /dev

 

반면, privileged가 true로 되어 있으면 노드 디바이스 목록을 조회됩니다.

# privileged:true
kubectl exec -it security-privileged-true -- ls /dev

 

오픈소스 활용사례

calico

calico는 쿠버네티스 CNI로서 쿠버네티스 네트워킹을 담당합니다. 그러므로 노드 커널접근이 필요하고 privileged가 true로 설정되어 있습니다.

kubectl -n kube-system get ds calico-node -oyaml | grep "securityContext:" -A 2

 

Elasticsearch

elasticsearch도 노드 커널 파라미터를 수정하기 위해 privileged가 true로 설정되어 있습니다. 

출처: https://github.com/elastic/helm-charts/blob/main/elasticsearch/templates/statefulset.yaml#L177

 

helm차트를 렌더링 하면 privileged를 사용하는 것을 알 수 있습니다.

helm repo add elastic https://helm.elastic.co
helm template elasticsearch elastic/elasticsearch | grep "securityContext:" -A 2

 

참고자료

[1] earthly기업 기술 블로그: https://earthly.dev/blog/k8s-cluster-security/

 

이하여백

반응형