DevOps/Container

[Container] 컨테이너 사용자 설정 및 권한

kyoulho 2024. 9. 14. 13:20

도커 컨테이너는 기본적으로 루트 사용자(UID 0)로 실행된다. 그러나 루트 사용자로 실행되는 것은 보안상 위험할 수 있다. 컨테이너가 보안 침해를 당할 경우, 루트 권한을 가진 컨테이너는 호스트 시스템에 영향을 미칠 수 있기 때문이다. 따라서 비루트 사용자를 사용하여 컨테이너를 실행하는 것이 일반적으로 권장된다. 도커 이미지는 설계 목적에 따라 다르게 구성되어 있으며, 이미지마다 기본적으로 설정된 사용자가 다를 수 있다.
 

컨테이너 사용자 설정과 호스트 사용자 간의 관계

도커 컨테이너는 호스트 시스템과 격리되어 동작하지만, UID(사용자 ID)와 GID(그룹 ID) 개념은 유지된다. 이는 파일과 디렉토리의 소유권과 권한 관리에 영향을 미친다. 컨테이너가 호스트의 디렉토리를 마운트 할 때, 컨테이너 내부에서 생성된 파일이나 디렉토리의 소유권은 해당 작업을 수행한 사용자(UID/GID)에 따라 할당된다.

특히, 호스트에서 마운트 된 디렉토리가 root 소유일 경우, 컨테이너의 비루트 사용자는 해당 디렉토리에 접근하거나 쓰기 작업을 할 수 없게 된다. 반대로, 컨테이너 내부에서 생성된 파일이 호스트에 기록될 때 호스트의 파일 소유권이 컨테이너 내부 사용자로 변경될 수 있다.

 

비루트 사용자 설정

Dockerfile에서 USER 명령을 사용해 비루트 사용자를 명시적으로 설정할 수 있다. 이를 위해 useradd 명령을 통해 비루트 사용자를 생성한 후, USER 명령으로 해당 사용자로 전환하는 과정이 필요하다. 또한, 루트 권한이 필요한 작업(예: 패키지 설치)을 수행한 후 다시 비루트 사용자로 전환하는 방식이 일반적이다.

Dockerfile 예시:

FROM ubuntu:latest

# 루트 권한으로 패키지 설치
USER root
RUN apt-get update && apt-get install -y <패키지 목록>

# 비루트 사용자 생성 및 소유권 설정
RUN useradd -ms /bin/bash kyoulho
RUN chown -R kyoulho:kyoulho /app

# 비루트 사용자로 전환
USER kyoulho

 

호스트 사용자와의 권한 문제

호스트 시스템의 UID와 GID가 도커 컨테이너 내부에서 사용되는 UID/GID와 일치하지 않으면 권한 문제가 발생할 수 있다. 예를 들어, 호스트에서 마운트 된 디렉토리가 root 소유일 경우, 컨테이너의 비루트 사용자는 해당 디렉토리에 접근하거나 쓰기 작업을 할 수 없을 수 있다. 또한, 컨테이너에서 생성된 파일이 호스트에 기록되면, 호스트 파일 소유권이 컨테이너 내부 사용자로 변경될 수 있다.

Dockerfile에서 mkdirchown 명령으로 디렉토리를 생성하고 컨테이너 내부의 소유권을 설정하더라도, 호스트 디렉토리와 마운트 할 경우 이 설정은 무시될 수 있다. 이는 호스트 디렉토리의 소유권과 권한이 우선 적용되기 때문이다. 특히, 호스트 디렉토리의 소유자가 root일 경우, 컨테이너 내 비루트 사용자는 해당 마운트된 디렉토리에서 쓰기 권한을 잃을 수 있다.

 

—chown 옵션 사용

--chown 옵션은 도커 컨테이너에서 호스트 디렉토리를 마운트 할 때, 해당 디렉토리의 소유권을 컨테이너 내 특정 사용자 및 그룹으로 설정하는 기능을 제공한다. 이 옵션을 사용하면, 마운트 된 호스트 디렉토리나 파일의 UID(사용자 ID)와 GID(그룹 ID)를 컨테이너 내부의 비루트 사용자에게 맞출 수 있으며, 이를 통해 권한 문제를 방지할 수 있습니다.

--chown 옵션의 역할

  1. 소유권 변경: 호스트의 디렉토리를 컨테이너에 마운트 할 때, 마운트 된 디렉토리나 파일의 소유권을 특정 UID와 GID로 설정한다. 이는 마운트 된 디렉토리나 파일의 권한을 컨테이너 내부의 특정 사용자에게 맞춰서 작업할 수 있도록 한다.
  2. 비루트 사용자로 접근 가능: 컨테이너 내부의 비루트 사용자가 마운트 된 디렉토리에 접근할 수 없을 경우, --chown 옵션을 사용해 비루트 사용자가 소유권을 가져 작업을 할 수 있도록 권한을 조정할 수 있다.
  3. 호스트의 권한은 유지: --chown 옵션을 사용하더라도 호스트 시스템의 디렉토리 소유권과 권한은 변경되지 않는다. 호스트 시스템에서는 여전히 원래 소유자가 유지되지만, 컨테이너 내부에서만 소유권이 변경되어 비루트 사용자가 해당 디렉토리에서 읽기/쓰기가 가능해진다.

docker 명령어

docker run -d \
  --name my-nginx \
  -v ./logs:/var/logs/nginx:rw --chown=kyoulho:kyoulho \
  nginx:latest

 
호스트 시스템에서: ./logs 디렉토리는 여전히 root 소유로 유지되며, 권한 또한 변경되지 않는다.
컨테이너 내부에서: /var/logs/nginx 디렉토리는 UID kyoulho, GID kyoulho 사용자가 소유하게 되며, 해당 사용자는 자유롭게 해당 디렉토리에서 읽기/쓰기 작업을 수행할 수 있다.
 
 

동일한 유저 이름, 다른 UID/GID 문제

유저 이름은 같더라도 UID와 GID가 다르면, 컨테이너와 호스트 시스템 간에는 권한 문제가 발생할 수 있다. 리눅스 및 유닉스 기반 시스템에서 실제 파일 권한은 UID/GID에 의해 결정되기 때문이다.

호스트에서 kyoulho 사용자가 UID 1001, GID 1001로 설정되어 있고, 컨테이너 내부의 kyoulho 사용자가 UID 2001, GID 2001이라면, 같은 이름을 가지고 있더라도 두 사용자는 서로 다른 사용자로 간주된다. 이 경우 호스트에서 생성된 파일은 컨테이너 내부의 kyoulho가 접근할 수 없거나, 소유권 충돌이 발생할 수 있다.