연재 시리즈

pkos 스터디 5주차 5편 - securityContext.readOnlyRootFilesystem

악분 2023. 4. 8. 12:33
반응형

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

 

readOnlyRootFilesystem이란?

쿠버네티스 컨테이너 내부 파일을 수정하지 못하게 하려면 어떻게 해야할까요? 파일 읽기권한만 설정하면 됩니다. 쿠버네티스에서 파일읽기권한만 설정하는 것을 readOnlyRootFilesystem이라고 합니다. securitycontext.readOnlyRootFilesystem필드에 bool값으로 설정할 수 있습니다.

apiVersion: v1
kind: Pod
metadata:
  name: rootfile-readonly
spec:
  containers:
  - name: busybox
    image: busybox
    command: ["tail"]
    args: ["-f", "/dev/null"]
    securityContext:
      readOnlyRootFilesystem: true
  terminationGracePeriodSeconds: 0

 

rootFilesystem의미는 컨테이너마다 독립적으로 갖는 파일시스템을 말합니다. 컨테이너 root 파일시스템은 카카오엔터프라이즈 테크 블로그에 잘 설명되어 있습니다.

 

첫 번째 예제

첫 번째 예제는 readOnlyRootFilesystem: false로 설정하고 파일을 생성해봅니다. 예제 pod spec은 아래와 같습니다.

# kubectl apply -f rootfilesystem-false.yaml
apiVersion: v1
kind: Pod
metadata:
  name: rootfilesystem-false
spec:
  containers:
  - name: busybox
    image: busybox
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0

 

root 파일시스템이 rw모드로 마운트되어 있습니다.

kubectl exec -it rootfilesystem-false -- mount

 

쓰기권한이 있기 때문에 파일 시스템에 파일 생성이 가능합니다.

kubectl exec -it rootfilesystem-false -- touch /helloworld.txt && echo "success"

 

두 번째 예제

첫 번째 예제는 readOnlyRootFilesystem: true로 설정하고 파일이 생성되는지 확인합니다. 예제 pod spec은 아래와 같습니다.

# kubectl apply -f rootfilesystem-true.yaml
apiVersion: v1
kind: Pod
metadata:
  name: rootfilesystem-true
spec:
  containers:
  - name: busybox
    image: busybox
    command: ["tail"]
    args: ["-f", "/dev/null"]
    securityContext:
      readOnlyRootFilesystem: true
  terminationGracePeriodSeconds: 0

 

root 파일시스템이 ro모드로 마운트되어 있습니다. 쓰기 권한이 제거되어 있습니다.

kubectl exec -it rootfilesystem-true -- mount

 

쓰기 권한이 없기 때문에 당연히 파일 생성은 실패합니다.

kubectl exec -it rootfilesystem-true -- touch /helloworld.txt && echo "success"

 

 

적용이 안되는 예외 파일

readOnlyRootFilesystem를 true로 설정하더라도 쓰기 가능한 파일이 존재합니다. /etc/hosts파일이 한 예입니다. 추측으로는 /etc/hosts파일은 kubelet이 직접 관리하는 파일이므로 readOnlyRootFilesystem설정 적용이 안되는 것 같습니다.

 

두 번째 예제에서 만들었던 pod에서 /etc/hosts파일을 권한을 확인하면 “rw”로 되어 있습니다. readOnlyRootFilesystem을 true로 설정해도 쓰기 권한이 부여되었습니다.

kubectl exec -it rootfilesystem-true -- mount | grep hosts

 

두 번째 예제에서 만들었던 pod에서 /etc/hosts파일을 수정하면 수정이 가능합니다.

kubectl exec -it rootfilesystem-true -- echo "12.12.12.12 helllworld" >> /etc/hosts && echo "success"

반응형