Menu Close
Settings Close

Language and Page Formatting Options

Red Hat Training

A Red Hat training course is available for RHEL 8

8.3. 로컬 SELinux 정책 모듈 생성

활성 SELinux 정책에 특정 SELinux 정책 모듈을 추가하면 SELinux 정책의 특정 문제를 해결할 수 있습니다. 이 절차를 사용하여 Red Hat 릴리스 노트에 설명된 특정 알려진 문제를 해결하거나 특정 Red Hat 솔루션을 구현할 수 있습니다.

주의

Red Hat에서 제공하는 규칙만 사용하십시오. Red Hat은 제품 지원 적용 범위를 벗어나기 때문에 사용자 지정 규칙을 사용하여 SELinux 정책 모듈 생성을 지원하지 않습니다. 전문가가 아닌 경우 Red Hat 영업 담당자에게 문의하고 컨설팅 서비스를 요청하십시오.

사전 요구 사항

  • 확인을 위한 setools-console감사 패키지입니다.

절차

  1. 텍스트 편집기를 사용하여 새 .cil 파일을 엽니다. 예를 들면 다음과 같습니다.

    # vim <local_module>.cil

    로컬 모듈을 더 잘 정리하려면 로컬 SELinux 정책 모듈의 이름에 local_ 접두사를 사용합니다.

  2. 알려진 문제 또는 Red Hat 솔루션에서 사용자 지정 규칙을 삽입합니다.

    중요

    자체 규칙을 작성하지 마십시오. 특정 알려진 문제 또는 Red Hat 솔루션에 제공된 규칙만 사용하십시오.

    예를 들어 SELinux에서 cups.sock에 대한 cups-lpd 읽기 액세스를 RHEL 솔루션에서 거부하려면 다음 규칙을 삽입합니다.

    참고

    RHBA-2021:4420 의 RHEL에서 예제 솔루션이 영구적으로 수정되었습니다. 따라서 이 솔루션과 관련된 절차의 일부는 업데이트된 RHEL 8 및 9 시스템에 영향을 미치지 않으며 구문의 예로만 포함됩니다.

    (allow cupsd_lpd_t cupsd_var_run_t (sock_file (read)))

    두 개의 SELinux 규칙 구문, 즉 CIL(Common Intermediate Language) 및 m4 중 하나를 사용할 수 있습니다. 예를 들어 CIL의 cupsd_lpd_t cupsd_var_run_t (sock_file (read)) 는 m4의 다음과 같습니다.

    module local_cupslpd-read-cupssock 1.0;
    
    require {
        type cupsd_var_run_t;
        type cupsd_lpd_t;
        class sock_file read;
    }
    
    #============= cupsd_lpd_t ==============
    allow cupsd_lpd_t cupsd_var_run_t:sock_file read;
  3. 파일을 저장하고 종료합니다.
  4. policy 모듈을 설치합니다.

    # semodule -i <local_module>.cil
    참고

    semodule -i 를 사용하여 생성한 로컬 정책 모듈을 제거하려면 .cil 접미사가 없는 모듈 이름을 참조하십시오. 로컬 정책 모듈을 제거하려면 semodule -r < local_module>을 사용합니다.

  5. 규칙과 관련된 서비스를 다시 시작하십시오.

    # systemctl restart <service-name>

검증

  1. SELinux 정책에 설치된 로컬 모듈을 나열합니다.

    # semodule -lfull | grep "local_"
    400 local_module  cil
    참고

    로컬 모듈에는 우선 순위가 400 이므로 예를 들어 semodule -lfull | grep -v ^100 명령을 사용하여 목록에서도 필터링할 수 있습니다.

  2. 관련 허용 규칙을 검색하려면 SELinux 정책을 검색합니다.

    # sesearch -A --source=<SOURCENAME> --target=<TARGETNAME> --class=<CLASSNAME> --perm=<P1>,<P2>

    여기서 <SOURCENAME> 은 소스 SELinux 유형이며 <TARGETNAME> 은 대상 SELinux 유형이며, <CLASSNAME> 은 보안 클래스 또는 개체 클래스 이름이고 <P1><P2> 는 규칙의 특정 권한입니다.

    예를 들어 SELinux의 경우, RHEL 솔루션의 cups.sock에 대한 cups-lpd 읽기 액세스 권한을 거부합니다.

    # sesearch -A --source=cupsd_lpd_t --target=cupsd_var_run_t --class=sock_file --perm=read
    allow cupsd_lpd_t cupsd_var_run_t:sock_file { append getattr open read write };

    마지막 행에는 읽기 작업이 포함되어야 합니다.

  3. 관련 서비스가 SELinux에 의해 제한되어 실행되는지 확인합니다.

    1. 관련 서비스와 관련된 프로세스를 식별합니다.

      $ systemctl status <service-name>
    2. 이전 명령의 출력에 나열된 프로세스의 SELinux 컨텍스트를 확인합니다.

      $ ps -efZ | grep <process-name>
  4. 서비스가 SELinux 거부를 유발하지 않는지 확인합니다.

    # ausearch -m AVC -ts recent
    <no matches>