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"
'연재 시리즈' 카테고리의 다른 글
EKS 스터디 - 1주차 1편 EKS란? (0) | 2023.04.15 |
---|---|
pkos 스터디 5주차 6편 - securityContext.allowPrivilegeEscalation (0) | 2023.04.08 |
pkos 스터디 5주차 4편 - securityContext.capability (0) | 2023.04.07 |
pkos 스터디 5주차 3편 - securityContext.privileged (0) | 2023.04.04 |
pkos 스터디 5주차 2편 - pod에서 인스턴스 메타데이터 접근 가능하면 생기는 위험 (0) | 2023.04.03 |