SELinux에서 개별 프로그램의 특정 위험한 동작을 안전하게 허용

SELinux에서 개별 프로그램의 특정 위험한 동작을 안전하게 허용

후크와 메모리 조작을 통해 프로그램의 동작을 변경하는 .so 파일을 로드하는 Docker 컨테이너 내에서 실행되는 프로그램이 있습니다. SELinux는 이 동작을 차단하고 감사 로그에 다음 메시지를 표시합니다.

type=AVC msg=audit(1548166862.066:2419): avc: pid=11171 comm="myProgram" scontext=system_u:system_r:container_t:s0:c426,c629 tcontext=system_u:system_r:container_t:s0에 대해 { execheap } 거부됨: c426, c629 tclass=프로세스 권한=0

audit2allow나는 이 특정 동작을 다른 곳에서 허용하고 싶지 않기 때문에(매우 위험할 수 있으므로) 이 작업을 수행하는 것을 매우 주저합니다 .

  • 가능한 가장 안전한 방법으로 이러한 특정 동작을 허용하도록 SELinux에 어떻게 지시합니까?
  • 나중에 동일한 프로그램을 실행하는 더 많은 Docker 컨테이너를 생성할 수 있는 방식으로 이를 수행할 수 있습니까?

답변1

audit2allowexecheap유형 처리를 허용하는 규칙이 생성될 수 있습니다 container_t. 언제든지 모듈을 먼저 생성하고 로드하기 전에 검사할 수 있습니다.

한 가지 가능한 문제는 이제 container_t유형이 있는 모든 프로세스가 동일한 작업을 수행할 수 있다는 것입니다. 이를 방지하려면 고유한 사용자 정의 유형( container_t템플릿 으로 사용)을 만들고 execheap이 특수 유형만 허용할 수 있습니다.

이 블로그 게시물작성자: Dan Walsh가 이러한 사용자 지정 정책을 작성하는 방법을 설명합니다. 이를 결합하여 audit2allow실제 규칙을 생성할 수도 있습니다. 기본 단계는 다음과 같습니다.

  1. 다음과 같은 기본 컨테이너 정책을 만듭니다 container_execheap.

    policy_module(container_execheap, 1.0)
    
    virt_sandbox_domain_template(container_execheap_t)
    

    virt_sandbox_domain_template매크로는 새 유형을 생성 container_execheap_t하고 새 유형을 컨테이너 도메인으로 사용할 수 있도록 Docker 작업에 필요한 규칙을 생성합니다.

  2. 정책 모듈을 컴파일하고 로드합니다(makefile을 포함하여 필요한 개발 파일은 selinux-policy-devel패키지에서 제공되어야 함).

    make -f /usr/selinux/devel/Makefile container_execheap.pp
    semodule -i container_execheap.pp
    

    새로운 유형을 권한 도메인으로 구성할 수 있습니다.

    semanage permissive -a container_execheap_t
    

    허용 도메인의 경우 AVC 거부가 기록되지만 규칙도 기록됩니다.아니요시행. 이렇게 하면 나중에 생성된 누락 규칙을 쉽게 사용할 수 있습니다 audit2allow.

  3. 다음과 같은 새로운 컨텍스트에서 컨테이너를 실행하세요.docker run ... --security-opt label:type:container_execheap_t ...

  4. 예상되는 오류를 생성합니다. 그런 다음 실행 audit2allow하여 이러한 작업을 허용하는 규칙을 생성합니다 container_execheap_t. 동일한 모듈 .te파일을 새 규칙으로 업데이트할 수 있습니다(버전 번호를 증가시키는 것을 기억하세요). 업데이트된 모듈을 컴파일하고 설치합니다.

  5. 더 이상 오류가 생성되지 않으면 사용자 정의 컨테이너 유형을 다시 시행 모드로 전환합니다 semanage -d container_execheap.

관련 정보