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로 설정되어 있습니다.
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/
이하여백
'연재 시리즈' 카테고리의 다른 글
pkos 스터디 5주차 5편 - securityContext.readOnlyRootFilesystem (0) | 2023.04.08 |
---|---|
pkos 스터디 5주차 4편 - securityContext.capability (0) | 2023.04.07 |
pkos 스터디 5주차 2편 - pod에서 인스턴스 메타데이터 접근 가능하면 생기는 위험 (0) | 2023.04.03 |
pkos 스터디 5주차 1편 - AWS EC2 인스턴스 메타데이터 (0) | 2023.04.03 |
pkos 스터디 4주차 - 메트릭 오픈소스 프로메테우스 (3) | 2023.03.29 |