Docker/Podman Selinux Udica - 루트 없는 컨테이너는 매핑된 진입점 스크립트에서 마운트/실행할 수 없습니다.

Docker/Podman Selinux Udica - 루트 없는 컨테이너는 매핑된 진입점 스크립트에서 마운트/실행할 수 없습니다.

나는 내 서버 사용자의 루트 없는 dockercontainer로 steamcmd를 사용하고 싶습니다. 그러나 steamcmd는 일반적으로 /opt/steam/steamcmd/steamcmd.sh 아래에 일반 사용자로 설치되어야 합니다.

나는 steamcmd arks를 사용하여 docker/podman 컨테이너를 실행하고 호출자 사용자 ID를 환경에 전달하는 사용자 정의 steamcmd.sh를 만들었습니다.

기본 진입점 스크립트를 /opt/steam/steamcmd/steamcmd.docker.sh(steamuser)라는 사용자 정의 진입점 스크립트로 대체했습니다.

컨테이너를 루트로 실행하면 모든 것이 잘 작동하지만 서버 사용자를 사용하여 시도하면 "오류: 오류 상태 파일 /opt/steam/steamcmd/steamcmd.docker.sh: 권한 거부됨: OCI 권한 거부됨" 이 표시됩니다.

내 selinux는 호스트 시스템에서 편안한 상태에 있습니다. 그래서 로그를 확인해 보니 다음과 같은 메시지가 떴습니다.

Mai 06 02:13:48 host setroubleshoot[81420]: SELinux is preventing steamcmd.replace from read access on the file steamcmd.docker.sh.
                                                      If you believe that steamcmd.replac should be allowed read access on the steamcmd.docker.sh file by default.
                                                      # ausearch -c 'steamcmd.replace' --raw | audit2allow -M my-steamcmdreplace
                                                      # semodule -X 300 -i my-steamcmdreplace.pp

파일을 생성했는데 다음과 같이 표시됩니다.

module my-steamcmdreplace 1.0;

require {
    type container_t;
    type etc_t;
    class file entrypoint;
}

#============= container_t ==============
allow container_t etc_t:file entrypoint;

두 번째 selinux 메시지는 다음과 같습니다.

Mai 05 01:30:29 host setroubleshoot[3763945]: SELinux is preventing /bin/dash from entrypoint access on the file /usr/bin/steamcmd.replace.
                                                        If you believe that dash should be allowed entrypoint access on the steamcmd.replace file by default.

모듈을 추가했지만 아무것도 변경되지 않았습니다. 그래서 udica를 사용하여 컨테이너 정책을 생성하려고 했습니다. 그러나 실행 중인 컨테이너에만 작동하므로 루트에서 실행되는 컨테이너를 사용했습니다.

다음 내용으로 udica 생성 모듈에 규칙을 수동으로 추가했습니다.

(block steamcmd
    (blockinherit container)
    (allow process process ( capability ( chown dac_override fowner fsetid kill net_bind_service setfcap setgid setpcap setuid sys_chroot ))) 

    (allow process usr_t ( dir ( getattr ioctl lock open read search ))) 
    (allow process usr_t ( file ( getattr ioctl lock open read ))) 
    (allow process usr_t ( sock_file ( getattr open read ))) 
    (allow process usr_t ( dir ( add_name create getattr ioctl lock open read remove_name rmdir search setattr write ))) 
    (allow process usr_t ( file ( append create getattr ioctl lock map open read rename setattr unlink write ))) 
    (allow process usr_t ( sock_file ( append getattr open read write ))) 
    (allow container_t etc_t (file (entrypoint)))
)

serveruser에서 컨테이너를 실행하는 명령은 다음과 같습니다.

podman run --network=host --dns 8.8.8.8 --security-opt label=type:steamcmd.process -t --rm --entrypoint 'steamcmd.replace' --name steamcmd -v /opt/steam/steamcmd/steamcmd.docker.sh:/usr/bin/steamcmd.replace:z -v .:/data docker.io/steamcmd/steamcmd:latest +force_install_dir /data validate

그 이유는 무엇입니까?

관련 정보