볼륨 마운트를 사용하여 Podman 컨테이너를 실행하는 경우 일반적으로 마운트 경로에 :z
(또는 ) 매개변수를 추가해야 합니다. :Z
이는 SELinux와 해당 유형 강제로 인한 것입니다. 이 매개변수의 목적은 설치된 파일의 유형을 변경하는 것입니다. 나는 이것이 실제로 매우 위험한 작업이라고 생각하며, 다른 SELinux 유형을 적용해야 하는 일부 파일을 마운트하면 일부 문제가 발생할 수 있습니다. Apache httpd 서버의 예를 고려해 보겠습니다. 내가 아는 한, httpd는 적절하게 태그가 지정된 디렉토리에서만 파일을 제공할 수 있습니다(예를 들어 httpd_file_t
무엇이든 상관없습니다). Podman 컨테이너를 시작하고 www
httpd의 디렉토리를 여기에 마운트하면( 를 사용하여 ) :z
어떻게 됩니까 ? 컨텍스트가 container_file_t
유형으로 변경되고 서버가 작동을 멈출 것이라고 생각합니다(서버의 파일에 대한 액세스를 잃게 됩니다 www
).
내 이해가 맞나요?
답변1
당신의 이해가 정확합니다. Docker 매뉴얼에서 (기본적으로 podman과 동일):
Configure the selinux label
If you use selinux you can add the z or Z options to modify the selinux label of the host file or directory being mounted into the container. This affects the file or directory on the host machine itself and can have consequences outside of the scope of Docker.
The z option indicates that the bind mount content is shared among multiple containers.
The Z option indicates that the bind mount content is private and unshared.
Use extreme caution with these options. Bind-mounting a system directory such as /home or /usr with the Z option renders your host machine inoperable and you may need to relabel the host machine files by hand.
:Z
즉, 호스트 디렉터리를 Docker에 바인드 마운트하면 특정 디렉터리가 해당 특정 컨테이너( ) 또는 모든 컨테이너( :z
) 에서만 액세스할 수 있도록 SELinux 컨텍스트 레이블이 변경됩니다 .
이러한 작업은 호스트 파일 시스템 자체에서 수행되므로 결과가 발생합니다.컨테이너 가상화를 넘어서. 귀하의 예는 좋은 예입니다. 호스트 웹 루트를 바인드 마운트하면 표준이 httpd_sys_(rw_)content_t
대체됩니다. 그러면 호스트의 Apache는 웹 루트에 대한 서비스를 거부합니다.
다행히도 이 문제는 맞춤형 전략 모듈을 사용하여 쉽게 극복할 수 있습니다.
Docker/podman을 사용 :z
하거나 :Z
시작합니다. 작동하는지 확인하세요. 이제 Set SELinux를 permissive 로 사용하세요 setenforce 0
. 그런 다음 아파치를 시작하십시오. SELinux는 허용하기 때문에 작동하지만 AVC 거부는 감사 로그에 기록됩니다.
# use the output of ausearch to create a policy that allows this. This is the dry-run version
ausearch -m avc -ts recent | audit2allow -a
# If you're satisfied that this is indeed a module you want to add to the SELinux system,
# pick a policyname (use a custom prefix like mnj-) and run
ausearch -m avc -ts recent | audit2allow -a -M mnj-[policyname]
이렇게 하면 정책 모듈 파일이 생성됩니다 /etc/selinux/targeted/modules/active/modules
.
이 모듈을 설치하고 활성화하려면 다음을 실행하세요.
semodule -i mnj-[policyname].pp
이제 SELinux를 다시 활성화합니다 setenforce 1
. 이제 Apache가 Webroot를 다시 제공할 수 있습니다.