docker volume을 사용하기 위한 SELinux 의 container context 설정
개요
Docker 의 volume 기능을 사용해서 host 의 디렉터리를 마운트할 경우 SELinux 가 활성화되어 있으면 기본적으로 차단하게 됩니다.
예로 MySQL 의 DB 를 마운트하기 위해 /var/mysql-volume 이란 폴더를 생성하고 docker 의 -v 옵션으로 볼륨으로 지정해서 실행해 보겠습니다.
mkdir /var/mysql-volume sudo docker run --name mysql8.0 -v /var/mysql-volume:/var/lib/mysql -d mysql:8.0
컨테이너 로그를 보기 위해서 docker logs 명령을 실행하면 다음과 같이 권한 없음 에러가 발생합니다.
sudo docker logs mysql8.0
find: '/var/lib/mysql/': Permission denied chown: changing ownership of '/var/lib/mysql/': Permission denied
해결
이 문제는 SELinux 가 docker 컨테이너는 svirt_sandbox_file_t 컨텍스트가 없으면 접근을 차단하기 때문이며 자세한 내용은 audit2why 를 사용해서 확인할 수 있습니다.
audit2why < /var/log/audit/audit.log
audit 메시지에서 볼수 있듯이 mysql-volume 디렉터리는 var_t 라는 context가 부여되어 있는데 docker 의 context 인 container_t 는 접근할 수 없기때문입니다.
type=AVC msg=audit(1627122113.313:50621): avc: denied { setattr } for pid=435693 comm="chown" name="mysql-volume" dev="dm-0" ino=213466624 scontext=system_u:system_r:container_t:s0:c239,c405 tcontext=unconfined_u:object_r:var_t:s0 tclass=dir permissive=0 Was caused by: Missing type enforcement (TE) allow rule. You can use audit2allow to generate a loadable module to allow this access.
다음 명령어로 /var/mysql-volume 에 생성되는 파일과 디렉터리는 svirt_sandbox_file_t 컨텍스트가 부여되도록 SELinux 의 file context 정책을 설정할 수 있습니다.
semanage fcontext -a -t svirt_sandbox_file_t '/var/mysql-volume(/.*)?'
설정이 끝나면 restorecon 으로 컨텍스트를 복구해 주면 됩니다.
restorecon -R /var/mysql-volume
또는 chcon 으로 직접 컨텍스트를 지정해서 변경해줘도 됩니다.
chcon -R -t svirt_sandbox_file_t /var/mysql-volume