개요

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          
BASH

컨테이너 로그를 보기 위해서 docker logs 명령을 실행하면 다음과 같이 권한 없음 에러가 발생합니다.

sudo docker logs mysql8.0
BASH
find: '/var/lib/mysql/': Permission denied
chown: changing ownership of '/var/lib/mysql/': Permission denied
CODE


해결

이 문제는 SELinux 가 docker 컨테이너는 svirt_sandbox_file_t 컨텍스트가 없으면 접근을 차단하기 때문이며 자세한 내용은 audit2why 를 사용해서 확인할 수 있습니다.

audit2why  < /var/log/audit/audit.log  
BASH


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.
CODE


다음 명령어로 /var/mysql-volume 에 생성되는 파일과 디렉터리는 svirt_sandbox_file_t 컨텍스트가 부여되도록 SELinux 의 file context 정책을 설정할 수 있습니다.

semanage fcontext -a -t  svirt_sandbox_file_t '/var/mysql-volume(/.*)?'
BASH

설정이 끝나면 restorecon 으로 컨텍스트를 복구해 주면 됩니다.

restorecon -R /var/mysql-volume
CODE


또는 chcon 으로 직접 컨텍스트를 지정해서 변경해줘도 됩니다.

chcon -R -t  svirt_sandbox_file_t  /var/mysql-volume
CODE



같이 보기

Ref