도커 혹은 쿠버네티스 Pod에서 컨테이너를 privileged mode로 사용해보자
환경
- Linux 기반 시스템
- Bash shell(/bin/bash)
- Docker
- Kubernetes
Privileged Mode 사용하기
Privileged Mode란?
--cap-add: Add Linux capabilities
--cap-drop: Drop Linux capabilities
--privileged=false: Give extended privileges to this container
--device=[]: Allows you to run devices inside the container without the --privileged flag.
- 도커 컨테이너는 일반적으로 “unprivileged”이며 도커 데몬과 같은 프로세스를 도커 컨테이너 안에서 실행 할 수 없습니다. “privileged”된 컨테이너들만 모든 호스트의 장치에 접근 할 수 있으며 일반적인 컨테이너는 보안상 해당 기능이 없는 “unprivileged”로 실행됩니다.
docker run --privileged
를 이용해 컨테이너를 사용하면 모든 장치에 접근할 수 있을뿐만 아니라 호스트 컴퓨터 커널의 대부분의 기능을 사용할 수 있습니다.systemctl
과 같은 프로그램이나 도커 컨테이너 내부에서 도커를 사용할 수 있습니다.--cap-add
와--cap-drop
옵션을 이용해--privileged
옵션을 사용하지 않고 필요한 기능만 추가해서 사용할 수 있습니다. 해당 옵션은 공식 홈페이지에 다양한 옵션들과 기능이 나와있습니다.
도커 컨테이너 Privileged Mode 사용법
- 도커 컨테이너를 생성할 때
--privileged
옵션을 함께 주고 실행하면 됩니다.
sudo docker run --privileged [IMAGE NAME] [OTHER OPTIONS...]
도커 컨테이너 Privileged Mode 예제
CentOS
를 받아서systemctl
을 사용해보겠습니다.systemctl
을 사용하기 위해서는/sbin/init
을 해줘서 기본 설정들을 시작해야합니다.
# Run docker container in privileged mode
# Run "/sbin/init" command in background
$ sudo docker run -d --privileged --name centos-example centos /sbin/init
# Access to docker container
$ sudo docker exec -it centos-example /bin/bash
# Run systemctl command
$ systemctl -a
...
Kubernetes Pod에서 컨테이너 Privileged Mode 사용법
- Pod을 설정한 YAML 파일에서
securityContext
에privileged: true
를 추가해주시면 됩니다. - openstack-helm과 공식 홈페이지에서 예제를 가져왔습니다.
...
containers:
- name: pod-name
image: image-name
securityContext:
privileged: true
...
Kubernetes Pod에서 Privileged Mode 예제
apiVersion: v1
kind: Pod
metadata:
name: privileged-pod
spec:
containers:
- name: pause
image: k8s.gcr.io/pause
securityContext:
privileged: true