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일 경우, 컨테이너 내 비루트 사용자는 해당 마운트된 디렉토리에서 쓰기 권한을 잃을 수 있다.

  

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

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

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

728x90