non-root 계정으로 pvc mount 시 퍼미션 에러 해결방법

rodusik·2022년 9월 27일
0

kubernetes

목록 보기
2/3
post-thumbnail

helm chart를 통해 파드를 생성할 때 사용하려는 pvc의 마운트 경로에 대한 디렉터리 생성과 디렉터리 이하에 파일 생성 등의 명령을 실행한다.

이 때, 파드 생성 및 실행 계정은 non-root 계정이고 마운트 시 root로 동작하기 때문에 퍼미션 에러가 발생한다. (사내보안으로 인해 권장 계정을 사용해야 함)
이를 해결한 방법을 찾았고 root 또는 sudo 권한이 있는 계정은 보안으로 인해 사용하지 못 할 경우 참고하면 좋을 것 같아 정리했다.

아래는 시도했던 방법들이니 급하다면 아래 해결방법으로 넘어가도 좋다.


시도

시도1

처음 해결했던 방법은 일시적으로 helm install 시 securityContext를 지정해 root로 파드를 띄운 뒤 해당하는 마운트 디렉터리의 소유권을 변경해줬다.
이 방법은 매우 불편한게 pvc 신규 생성 또는 초기화 시 이 작업을 다시 해줘야 한다는 것이다.

시도2

그래서 다음으로 생각한 방법은 helm에서 받아오는 Dockerfile에 미리 마운트 디렉터리를 생성하고 소유권을 바꿔놓는 방법이었는데, 실패했다.
미리 생성한 뒤 non-root 계정으로 권한을 바꾼다 하더라도 helm install할 때 root로 다시 덮어쓰기 때문에 퍼미션 에러가 똑같이 발생했다.

시도3
생각한 방법들이 모두 안된다고 생각이 들었고, 우회방법으로 Dockerfile에서 직접 non-root 계정에 sudo 권한을 부여하는 방법을 시도했다.
사용할 계정에 sudo 권한이 추가되면 이후 실행할 helm chart에 non-root계정에서 sudo로 디렉터리 생성 및 소유권을 변경하는 작업을 할 수 있다.

  1. sudo 패키지 설치 및 sudoers 파일에 해당 계정을 추가
RUN apt-get update && apt-get install -y sudo
RUN chmod +w /etc/sudoers
RUN echo 'user ALL=(ALL) NOPASSWD:ALL' | tee -a /etc/sudoers
RUN chmod -w /etc/sudoers

참고로 컨테이너는 ubuntu OS이다.

  1. 도커 이미지 빌드
$ docker build -f Dockerfile -t image:tag --progress=plain --no-cache .
  1. 도커 푸시
$ docker push image:tag
  1. helm chart 수정
sudo mkdir -p $ZK_DATA_DIR
sudo mkdir -p $ZK_DATA_LOG_DIR
sudo chown -R user:user $ZK_DATA_DIR
echo $MY_ID >> $ID_FILE

위와 같이 설정했더니 퍼미션 에러없이 잘 동작했다.
sudo를 통해 여러가지 작업을 할 수 있고 문제 분석 시 훨씬 편리해졌지만, 보안적인 측면에서 위험성이 높은 방법이라 다른 방법을 다시 찾아봤다.

해결방법

기존에 생각했던 방법들은 Dockerfile에 미리 생성하기, helm에서 command로 넣어주기 등등 애매한 방법들이었다.

근본적으로 volume mount 시 root 권한을 사용할 수 있는 방법을 찾아봤고 지금까지 문제 해결을 위해 고민했던 시간들에 비해 수월하게 방법을 찾을 수 있었다.

해결방법은 initContainer를 만들어 securityContext를 지정하는 것이다.

initContainer : 애플리케이션 컨테이너보다 먼저 실행되고 앱 이미지에 없는 유틸리티 또는 설정 스크립트를 포함할 수 있는 특수 컨테이너

  • 보안상의 이유로 앱 컨테이너 이미지에 포함하지 않는 유틸리티를 포함 및 실행합니다.
  • 앱 이미지에 없는 설정에 대한 유틸리티 또는 사용자 정의 코드를 포함합니다. 예를 들어, 설치 중에 sed, awk, python 또는 dig와 같은 툴을 사용하기 위해 다른 이미지에서 이미지를 만들 필요가 없습니다.
  • 애플리케이션 컨테이너에서 액세스할 수 없는 보안에 대한 액세스 권한과 같이 파일 시스템 보기가 앱 컨테이너와 다르게 표시되도록 Linux 네임스페이스를 사용합니다.
    (출처 : https://access.redhat.com/documentation/ko-kr/openshift_container_platform/4.6/html/nodes/nodes-containers-init)

statefulset.yaml을 다음과 같이 수정했다.

initContainers:
        - name: pvc-init
          image: busybox:latest
          command:
            - /bin/sh
            - -c
            - |
              mkdir -p /data
              chown -R user:user /data
          securityContext:
            runAsUser: 0
          volumeMounts:
            - name: data
              mountPath: "/data"

runAsUser: 0로 root계정으로 실행될 수 있도록 지정하고 pvc 마운트 디렉터리를 생성 및 non-root계정으로 소유권을 변경하니 퍼미션 에러없이 파드를 생성할 수 있었다.

해결하고나니 고생에 비해 쉽게 방법을 찾은 것 같아 허무했지만 실무와 공부를 함께 진행하면서 생기는 경험이라고 생각하기로 했다.
이후 다른 문제가 생겼을 때는 더 쉽게 해결할 수 있겠지 하고..

0개의 댓글