Red Hat Training

A Red Hat training course is available for RHEL 8

9.2. 사용자 지정 컨테이너에 대한 SELinux 정책 생성 및 사용

사용자 지정 컨테이너에 대한 SELinux 보안 정책을 생성하려면 다음 절차의 단계를 따르십시오.

사전 요구 사항

  • 컨테이너를 관리하는 podman 툴이 설치되어 있습니다. 그렇지 않은 경우 yum install podman 명령을 사용합니다.
  • 이 예제의 사용자 지정 Linux 컨테이너 - ubi8.

절차

  1. udica 패키지를 설치합니다.

    # yum install -y udica

    또는 udica 를 포함한 일련의 컨테이너 소프트웨어 패키지를 제공하는 container-tools 모듈을 설치합니다.

    # yum module install -y container-tools
  2. 읽기 및 쓰기 권한이 있는 /home 디렉터리와 읽기 전용 권한으로 /var/spool 디렉터리를 마운트하는 ubi8 컨테이너를 시작합니다. 컨테이너는 포트 21 을 노출합니다.

    # podman run --env container=podman -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash

    이제 컨테이너가 container_t SELinux 유형으로 실행됩니다. 이 유형은 SELinux 정책의 모든 컨테이너에 대한 일반 도메인이며 시나리오에 너무 엄격하거나 너무 느릴 수 있습니다.

  3. 새 터미널을 열고 podman ps 명령을 입력하여 컨테이너의 ID를 가져옵니다.

    # podman ps
    CONTAINER ID   IMAGE                                   COMMAND   CREATED          STATUS              PORTS   NAMES
    37a3635afb8f   registry.access.redhat.com/ubi8:latest  bash      15 minutes ago   Up 15 minutes ago           heuristic_lewin
  4. 컨테이너 JSON 파일을 생성하고 JSON 파일의 정보를 기반으로 정책 모듈을 생성하는 데 udica 를 사용합니다.

    # podman inspect 37a3635afb8f > container.json
    # udica -j container.json my_container
    Policy my_container with container id 37a3635afb8f created!
    [...]

    또는 다음을 수행합니다.

    # podman inspect 37a3635afb8f | udica my_container
    Policy my_container with container id 37a3635afb8f created!
    
    Please load these modules using:
    # semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil}
    
    Restart the container with: "--security-opt label=type:my_container.process" parameter
  5. 이전 단계에서 udica 의 출력에서 제안한 대로 정책 모듈을 로드합니다.

    # semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil}
  6. 컨테이너를 중지하고 --security-opt label=type:my_container.process 옵션을 사용하여 다시 시작합니다.

    # podman stop 37a3635afb8f
    # podman run --security-opt label=type:my_container.process -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash

검증

  1. 컨테이너가 my_container.process 유형으로 실행되는지 확인합니다.

    # ps -efZ | grep my_container.process
    unconfined_u:system_r:container_runtime_t:s0-s0:c0.c1023 root 2275 434  1 13:49 pts/1 00:00:00 podman run --security-opt label=type:my_container.process -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash
    system_u:system_r:my_container.process:s0:c270,c963 root 2317 2305  0 13:49 pts/0 00:00:00 bash
  2. SELinux에서 /home 및 / var/spool 마운트 지점에 액세스할 수 있는지 확인합니다.

    [root@37a3635afb8f /]# cd /home
    [root@37a3635afb8f home]# ls
    username
    [root@37a3635afb8f ~]# cd /var/spool/
    [root@37a3635afb8f spool]# touch test
    [root@37a3635afb8f spool]#
  3. SELinux에서 포트 21에만 바인딩할 수 있는지 확인합니다.

    [root@37a3635afb8f /]# yum install nmap-ncat
    [root@37a3635afb8f /]# nc -lvp 21
    ...
    Ncat: Listening on :::21
    Ncat: Listening on 0.0.0.0:21
    ^C
    [root@37a3635afb8f /]# nc -lvp 80
    ...
    Ncat: bind to :::80: Permission denied. QUITTING.

추가 리소스