소개
Docker 는 애플리케이션 개발, 배포 및 관리 방식을 혁신한 강력한 컨테이너화 플랫폼입니다. 그러나 루트 사용자로 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 로 매핑하여 컨테이너를 위한 별도의 사용자 공간을 효과적으로 생성할 수 있습니다.
이러한 매핑을 통해 컨테이너 내의 일반 사용자가 높은 권한을 가지고 있더라도 호스트 시스템이나 동일한 호스트에서 실행되는 다른 컨테이너에 영향을 줄 수 없습니다.
컨테이너 내에서 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 에서 루트 사용자가 아닌 사용자에게 세밀한 권한을 부여하는 것은 다양한 시나리오에서 유용할 수 있습니다. 다음은 실제 사용 사례와 예시입니다.
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 프로세스를 시작하고 관리할 수 있습니다.
컨테이너가 민감한 파일이나 디렉터리를 액세스해야 하는 경우 루트 사용자가 아닌 사용자에게 해당 위치에 읽기 또는 쓰기 권한을 부여할 수 있습니다.
## 특정 볼륨 권한으로 컨테이너 실행
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 디렉터리에 읽기 및 쓰기 액세스 권한을 부여받습니다.
루트 사용자가 아닌 사용자가 Docker 데몬과 상호 작용해야 하는 경우 컨테이너 내의 "docker" 그룹에 사용자를 추가할 수 있습니다.
## Dockerfile
FROM ubuntu:22.04
RUN useradd -ms /bin/bash myuser
RUN usermod -aG docker myuser
USER myuser
이 Dockerfile은 루트 사용자가 아닌 myuser라는 사용자를 만들고 "docker" 그룹에 추가하여 컨테이너 생성 및 관리와 같은 Docker 관련 작업을 수행할 수 있도록 합니다.
일부 경우 루트 사용자가 아닌 사용자가 특정 기능이 필요한 특권 명령을 실행해야 할 수 있습니다. --cap-add 플래그를 사용하여 루트 사용자가 아닌 사용자에게 필요한 기능을 부여할 수 있습니다.
## 특정 기능으로 컨테이너 실행
docker run -it --user myuser --cap-add=SYS_ADMIN ubuntu:22.04 bash
이 예제에서 루트 사용자가 아닌 사용자에게 "CAP_SYS_ADMIN" 기능이 부여되어 높은 권한이 필요한 시스템 관리 작업을 수행할 수 있습니다.
이러한 실제 사용 사례와 예시를 이해함으로써 Docker 에서 루트 사용자가 아닌 사용자에게 세밀한 권한을 효과적으로 부여하여 보안하고 분리된 환경을 유지하면서 작업을 수행하는 데 필요한 액세스 권한을 부여할 수 있습니다.
이 포괄적인 Docker 튜토리얼에서는 루트 사용자가 아닌 사용자에게 세밀한 권한을 부여하여 Docker 컨테이너 및 리소스와 상호 작용할 수 있도록 하되, 그들의 권한을 상승시키지 않도록 하는 방법을 배웁니다. Docker 에서 사용자 권한의 원리를 이해하고 실제 사용 사례를 탐색함으로써 조직의 요구 사항에 맞는 보다 안전하고 효율적인 Docker 환경을 구현할 수 있습니다.