컨테이너 런타임(Container runtime) 을 위한 SELinux label - container_file_t
TL;DR
SELinux 를 쓰고 있는데 docker 나 podman 에 연결한 볼륨에 write 에러가 난다면 volume 의 file context 를 container_file_t 로 변경해 주면 됩니다.
예로 /var/local/mysql 를 MySQL 컨테이너에 볼륨으로 연결했다면 다음 명령을 실행합니다.
$ sudo semanage fcontext -a -t container_file_t '/var/local/mysql(/.*)?' $ sudo restorecon -R /var/local/mysql
Label
출처: https://opensource.com/article/18/2/understanding-selinux-labels-container-runtimes
docker 나 podman 같은 컨테이너 런타임을 더 안전하게 구동하기 위해 SELinux 에는 새로운 label 이 많이 추가되었습니다.
container_runtime_exec_t
docker 나 podman 에는 container_runtime_exec_t 레이블이 할당되어 있습니다.
$ ls -lZ `which docker` -rwxr-xr-x. 1 root root system_u:object_r:container_runtime_exec_t:s0 163 Sep 23 16:25 /usr/bin/docker
$ ls -lZ `which podman` -rwxr-xr-x. 1 root root system_u:object_r:container_runtime_exec_t:s0 52909504 Sep 23 16:21 /usr/bin/podman
container_runtime_exec_t 는 실행시에 container_t 도메인으로 전환되며 아래와 같은 레이블에 접근 가능합니다.
container_var_lib_t
/var/lib/containers/ 는 container_var_lib_t 레이블이 부여되어 있으며 container_t 도메인은 읽고 실행할 수 있습니다.
쓰기는 금지되는데 컨테이너 overlay 이미지등이 저장되어 있으므로 컨테이너에서 직접 수정하면 문제가 되기때문입니다.
container_var_lib_t 는 Web Server 가 읽고 실행할 수 있는 httpd_sys_content_t와 비슷하다고 보면 됩니다.
$ ls -lZd /var/lib/containers/ drwxr-xr-x. 5 root root system_u:object_r:container_var_lib_t:s0 50 Nov 17 03:13 /var/lib/containers/
container_file_t
컨테이너에서 쓰기 가능한 레이블로 httpd_sys_content_t 와 httpd_sys_rw_content_t 의 관계와 비슷하다고 보시면 됩니다.
container 와 공유해야 하는 볼륨(volume) 같은 persistent storage 가 있을 경우 SELinux 에서 문제가 없으려면 container_file_t 를 할당해 줘야 합니다.
예로 /var/local/mysql 라는 폴더를 만들고 MySQL container 에 volume 으로 연결할 경우 아래와 같이 semanage로 file context 를 설정해 줍니다.
$ sudo semanage fcontext -a -t container_file_t '/var/local/mysql(/.*)?'
이미 폴더를 만들었다면 다음 명령어로 context 를 변경해 주면 됩니다.
$ sudo restorecon -R /var/local/mysql