연재 시리즈

pkos 스터디 5주차 6편 - securityContext.allowPrivilegeEscalation

악분 2023. 4. 8. 21:02
반응형

5주차 여섯번째 주제는 pod securityContext.allowPrivilegeEscalation입니다.

 

allowPrivilegeEscalation이란?

allowPrivilegeEscalation은 컨테이너가 실행 된 후, 컨테이너 유저 권한보다 높은 권한을 제어합니다.

 

공식문서 allowPrivilegeEscalation설명을 보면 부모 프로세스보다 높은 권한을 얻는 것을 제어한다고 되어 있습니다. 컨테이너에서 부모(최초) 프로세스는 entrypoint로 실행된 프로세스입니다. entrypoint는 Dockerfile에서 USER로 설정된 사용자로 실행됩니다. 결국, 컨테이너 유저보다 높은 권한을 제어한다는 의미와 같습니다.

 

예제

예제는 allowPrivilegeEscalation를 false로 설정하여 sudo를 제한하는 과정을 실습합니다.

 

먼저 커스텀 도커 이미지를 빌드합니다. testuser를 생성하고 sudo권한을 허용하도록 설정했습니다.

# docker build -t ubuntu:sudo .
FROM ubuntu:20.04

RUN apt-get update && \
    apt-get -y install sudo && \
    echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

RUN adduser --disabled-password --gecos '' testuser && \
    adduser testuser sudo

USER testuser

 

방금 만난 커스텀 이미지를 pod로 생성합니다.

# kubectl apply -f ubunut-allow-sudo.yaml
apiVersion: v1
kind: Pod
metadata:
 name: ubunut-allow-sudo
spec:
 containers:
 - name: main
   image: ubuntu:sudo
   command: [ "sh", "-c", "sleep 1h" ]

 

pod에서 sudo명령어 사용이 가능한지 확인합니다.

kubectl exec -it ubunut-allow-sudo -- sudo id && echo "sudo success"

 

sudo 권한을 사용하지 못하도록 allowPrivilegeEscalation:false를 설정합니다.

# kubectl apply -f ubunut-disallow-sudo.yaml
apiVersion: v1
kind: Pod
metadata:
 name: ubunut-disallow-sudo
spec:
 containers:
 - name: main
   image: ubuntu:sudo
   command: [ "sh", "-c", "sleep 1h" ]
   securityContext:
     allowPrivilegeEscalation: false

 

pod에서 sudo명령어 사용이 불가능한지 확인합니다. 부모 프로세스(pid: 1)보다 높은 권한을 실행하지 못하도록 쿠버네티스가 제한합니다.

kubectl exec -it ubunut-disallow-sudo -- sudo id && echo "sudo success"

반응형