Docker 에서 루트 사용자가 아닌 사용자에게 세밀한 권한 부여 방법

DockerBeginner
지금 연습하기

소개

Docker 는 애플리케이션 개발, 배포 및 관리 방식을 혁신한 강력한 컨테이너화 플랫폼입니다. 그러나 루트 사용자로 Docker 컨테이너를 실행하면 보안 위험이 발생할 수 있습니다. 이 튜토리얼에서는 Docker 에서 일반 사용자에게 세밀한 권한을 부여하는 과정을 안내하여 시스템 보안을 손상시키지 않고 특정 작업을 수행할 수 있도록 합니다.

Docker 사용자 권한 이해

Docker 컨테이너는 기본적으로 일반 사용자로 실행되도록 설계되어 시스템의 전반적인 보안을 향상시킵니다. 그러나 특정 작업을 수행하기 위해 Docker 컨테이너 내에서 일반 사용자에게 세밀한 권한을 부여해야 하는 경우가 있을 수 있습니다.

Docker 의 기본 사용자 권한

기본적으로 Docker 컨테이너는 컨테이너 내에서 최고 권한을 가진 root 사용자로 실행됩니다. 이는 컨테이너 내의 취약점이나 악성 활동이 호스트 시스템에 영향을 줄 수 있는 보안 위험이 될 수 있습니다.

이러한 위험을 완화하기 위해 Docker 는 컨테이너를 루트 사용자가 아닌 일반 사용자로 실행하는 것을 권장합니다. 이는 Dockerfile에서 사용자를 지정하거나 컨테이너를 실행할 때 --user 플래그를 사용하여 수행할 수 있습니다.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
USER myuser
## 일반 사용자로 컨테이너 실행
docker run -it --user myuser ubuntu:22.04 bash

사용자 네임스페이스 이해

Docker 는 컨테이너 내의 일반 사용자를 위한 추가적인 분리 및 보안 레이어를 제공하기 위해 사용자 네임스페이스를 사용합니다. 사용자 네임스페이스를 통해 컨테이너의 사용자 및 그룹 ID 를 호스트 시스템의 다른 ID 로 매핑하여 컨테이너를 위한 별도의 사용자 공간을 효과적으로 생성할 수 있습니다.

graph TD A[호스트 시스템] --> B[컨테이너] B[컨테이너] --> C[매핑된 사용자 ID] B[컨테이너] --> D[매핑된 그룹 ID]

이러한 매핑을 통해 컨테이너 내의 일반 사용자가 높은 권한을 가지고 있더라도 호스트 시스템이나 동일한 호스트에서 실행되는 다른 컨테이너에 영향을 줄 수 없습니다.

사용자 권한 확인

컨테이너 내에서 id 명령어를 사용하여 현재 사용자가 매핑된 사용자 및 그룹 ID 를 확인할 수 있습니다.

$ id
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lxd),128(systemd-journal),129(systemd-journal-gateway)

이 출력은 myuser 사용자가 컨테이너 내에서 사용자 ID 1000 및 그룹 ID 1000로 매핑되었음을 보여줍니다.

루트 사용자가 아닌 사용자에게 세밀한 권한 부여

컨테이너를 루트 사용자가 아닌 사용자로 실행하는 것은 좋은 보안 관행이지만, 특정 작업을 수행하기 위해 이러한 사용자에게 특정 권한을 부여해야 할 수 있습니다. Docker 는 컨테이너 내의 루트 사용자가 아닌 사용자에게 세밀한 권한을 부여하는 여러 가지 방법을 제공합니다.

--cap-add--cap-drop 플래그 사용

Docker 는 특정 권한을 사용자 또는 프로세스에 부여하거나 취소할 수 있는 Linux 기능을 지원합니다. 루트 사용자가 아닌 사용자의 기능을 추가 또는 제거하려면 컨테이너를 실행할 때 --cap-add--cap-drop 플래그를 사용할 수 있습니다.

## 루트 사용자가 아닌 사용자에게 "CAP_SYS_ADMIN" 기능 부여
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash

## 루트 사용자가 아닌 사용자에게서 "CAP_CHOWN" 기능 제거
docker run -it --user myuser --cap-drop=CHOWN ubuntu:22.04 bash

특정 권한으로 볼륨 마운트

특정 소유권 및 권한으로 볼륨을 마운트하여 루트 사용자가 아닌 사용자에게 세밀한 권한을 부여할 수도 있습니다. 이를 통해 컨테이너 내의 루트 사용자가 아닌 사용자의 액세스 권한을 제어할 수 있습니다.

## 특정 권한으로 볼륨 마운트
docker run -it --user myuser -v /path/on/host:/path/in/container:rw,uid=1000,gid=1000 ubuntu:22.04 bash

이 예제에서 마운트된 볼륨은 사용자 ID 가 1000이고 그룹 ID 가 1000인 루트 사용자가 아닌 사용자가 액세스할 수 있습니다.

--group-add 플래그 사용

루트 사용자가 아닌 사용자가 특정 그룹의 구성원 자격이 필요한 작업을 수행해야 하는 경우 --group-add 플래그를 사용하여 컨테이너 내의 추가 그룹에 사용자를 추가할 수 있습니다.

## 루트 사용자가 아닌 사용자를 "docker" 그룹에 추가
docker run -it --user myuser --group-add docker ubuntu:22.04 bash

이렇게 하면 루트 사용자가 아닌 사용자가 Docker 데몬과 상호 작용하는 것과 같은 "docker" 그룹 구성원 자격이 필요한 작업을 수행할 수 있습니다.

Dockerfile 사용자 지정

Dockerfile을 사용자 지정하여 특정 권한 및 그룹 구성원 자격을 가진 루트 사용자가 아닌 사용자를 만들 수도 있습니다. 이렇게 하면 루트 사용자가 아닌 사용자가 컨테이너 내에서 작업을 수행하는 데 필요한 권한을 갖도록 합니다.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser

Dockerfile은 루트 사용자가 아닌 myuser라는 사용자를 만들고 "docker" 그룹에 추가하여 Docker 데몬과 상호 작용할 수 있도록 합니다.

실제 사용 사례 및 예시

Docker 에서 루트 사용자가 아닌 사용자에게 세밀한 권한을 부여하는 것은 다양한 시나리오에서 유용할 수 있습니다. 다음은 실제 사용 사례와 예시입니다.

시나리오 1: 웹 서버 실행

Docker 컨테이너에서 웹 애플리케이션을 실행하고 루트 사용자가 아닌 사용자가 웹 서버 프로세스를 시작하고 관리하는 데 필요한 권한을 갖도록 하려는 경우를 가정해 보겠습니다.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN apt-get update && apt-get install -y nginx
RUN chown -R myuser:myuser /var/www/html
USER myuser
CMD ["nginx", "-g", "daemon off;"]

이 예제에서 myuser라는 루트 사용자가 아닌 사용자는 Nginx 웹 서버의 기본 위치인 /var/www/html 디렉터리의 소유권을 부여받습니다. 이를 통해 루트 사용자가 아닌 사용자는 컨테이너 내에서 Nginx 프로세스를 시작하고 관리할 수 있습니다.

시나리오 2: 민감한 파일 액세스

컨테이너가 민감한 파일이나 디렉터리를 액세스해야 하는 경우 루트 사용자가 아닌 사용자에게 해당 위치에 읽기 또는 쓰기 권한을 부여할 수 있습니다.

## 특정 볼륨 권한으로 컨테이너 실행
docker run -it --user myuser -v /path/to/sensitive/files:/sensitive:rw,uid=1000,gid=1000 ubuntu:22.04 bash

이 예제에서 사용자 ID 가 1000이고 그룹 ID 가 1000인 루트 사용자가 아닌 사용자는 컨테이너 내의 /path/to/sensitive/files 디렉터리에 읽기 및 쓰기 액세스 권한을 부여받습니다.

시나리오 3: Docker 데몬과의 상호 작용

루트 사용자가 아닌 사용자가 Docker 데몬과 상호 작용해야 하는 경우 컨테이너 내의 "docker" 그룹에 사용자를 추가할 수 있습니다.

## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser

Dockerfile은 루트 사용자가 아닌 myuser라는 사용자를 만들고 "docker" 그룹에 추가하여 컨테이너 생성 및 관리와 같은 Docker 관련 작업을 수행할 수 있도록 합니다.

시나리오 4: 특권 명령 실행

일부 경우 루트 사용자가 아닌 사용자가 특정 기능이 필요한 특권 명령을 실행해야 할 수 있습니다. --cap-add 플래그를 사용하여 루트 사용자가 아닌 사용자에게 필요한 기능을 부여할 수 있습니다.

## 특정 기능으로 컨테이너 실행
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash

이 예제에서 루트 사용자가 아닌 사용자에게 "CAP_SYS_ADMIN" 기능이 부여되어 높은 권한이 필요한 시스템 관리 작업을 수행할 수 있습니다.

이러한 실제 사용 사례와 예시를 이해함으로써 Docker 에서 루트 사용자가 아닌 사용자에게 세밀한 권한을 효과적으로 부여하여 보안하고 분리된 환경을 유지하면서 작업을 수행하는 데 필요한 액세스 권한을 부여할 수 있습니다.

요약

이 포괄적인 Docker 튜토리얼에서는 루트 사용자가 아닌 사용자에게 세밀한 권한을 부여하여 Docker 컨테이너 및 리소스와 상호 작용할 수 있도록 하되, 그들의 권한을 상승시키지 않도록 하는 방법을 배웁니다. Docker 에서 사용자 권한의 원리를 이해하고 실제 사용 사례를 탐색함으로써 조직의 요구 사항에 맞는 보다 안전하고 효율적인 Docker 환경을 구현할 수 있습니다.