제한되지 않은 SELinux 사용자(루트)가 시스템에 정책을 설치하는 것을 방지

제한되지 않은 SELinux 사용자(루트)가 시스템에 정책을 설치하는 것을 방지

설치 후 제한되지 않은(또는 다른 선택 사항) 사용자에 대한 후속 SELinux 정책 설치를 비활성화하는 SELinux 정책을 작성하려고 합니다. 이를 수행하는 방법에는 여러 가지가 있는 것 같습니다.

  1. 사용자가 정책을 설치할 수 없도록 semodule 사용을 비활성화합니다. semodule에는 "semanage_exec_t" SELinux 유형이 있습니다. 개체를 사용하고 있습니다.도메인 변환여기.
  2. SELinux 사용보안 레벨.

첫 번째 결론은 "domain_auto_trans" 매크로를 사용하려고 하는데 이건25보다 낮은 정책 버전에는 매크로가 적용되지 않습니다.. 나는 24개를 갖고 있다. 정책 버전 28에서 확인할 수 있었지만 예상대로 작동합니다. 그런데 이렇게 생겼어요

    policy_module(semanage_access_deny_label_B, 1.0.0)
    require {
       type unconfined_t, semanage_exec_t, semanage_t;
       role object_r;
    }
    domain_auto_trans (unconfined_t, {semanage_exec_t semanage_t}, user_t);

두 번째 결론에 대한 TE 파일은 다음과 같습니다.

policy_module(semanage_access_deny, 1.0.0)
require {
   type unconfined_t;
   role object_r;
   class security { compute_av compute_user compute_relabel 
   compute_create setenforce check_context load_policy setbool };
}
allow unconfined_t self: security compute_user;
neverallow unconfined_t self: security { compute_av setenforce check_context load_policy setbool };

첫 번째 방법은 현재 SELinux 버전에서만 작동하는 반면, 두 번째 방법은 성공적으로 컴파일하고 적용했지만 내가 계획한 대로 수행되지 않았습니다(사실 전혀 아무것도 수행하지 않았습니다). 그렇다면 문제는 설치 후에 선택한 사용자에 대해 후속 SELinux 정책 설치를 비활성화하고 현재 및 이전 SELinux 버전 모두에 적용되는 정책을 작성하는 방법입니다.

답변1

첫 번째 모듈에 문제가 있습니다: 루트 사용자무제한_tselinux 정책 수정을 허용하는 권한과 규칙이 여전히 있습니다. 맞춤 정책은 새로운 자동 전환에만 적용됩니다.semanage_exec_t도착하다 user_t. 에서 처리됨user_t도메인은 정책을 수정할 수 없으므로 semodule대기 semanage가 실패합니다. 그러나 신뢰할 수 없는 도메인의 모든 프로그램은 여전히 ​​정책을 수정할 수 있습니다. 또한 루트는 해당 항목의 레이블을 다시 지정할 수 있습니다.semanage_exec_t실행하려면 바이너리를 무제한 유형으로 표시하세요.

두 번째 정책 모듈은 아무 작업도 수행하지 않습니다.절대 허용되지 않음규칙은 컴파일러에 의해 확인되며 컴파일 정책에는 규칙이 생성되지 않습니다. 당신은 사용할 수 없습니다절대 허용되지 않음삭제/블랙리스트 규칙은 로드된 정책에 포함됩니다.부정적인이러한 방식으로 사용할 수 있는 SELinux 정책 언어의 선언).

충돌이 있는 경우 정책 컴파일에서 오류가 발생하고 실패해야 합니다.허용하다그리고절대 허용되지 않음규칙. ~에 따르면문서,절대 허용되지 않음규칙은 정책 모듈에서 사용될 수 있지만 검사가 유효하려면 규칙을 expand-check1로 설정해야 합니다 semanage.conf(아마도 모듈이 성공적으로 컴파일되는 이유일 것입니다).

로드된 SELinux 정책의 수정을 방지하기 위해 문제를 해결하는 몇 가지 방법은 다음과 같습니다.

  • 사용secure_mode_policyload부울 값:

    시스템이 정책 로드, 적용 모드 설정 및 부울 값 변경을 허용하는지 여부를 결정하는 데 사용되는 부울 값입니다.

    비슷하게secure_mode_insmod부울 값은 추가 커널 모듈이 로드되는 것을 방지합니다. 일단 켜진 후에는 실행 중인 시스템에서 이러한 부울을 끌 수 없습니다(끄려면 재부팅해야 함).

  • 사용자 구성더 제한된 지역(예:user_t), 이는 로드된 정책의 수정을 허용하지 않습니다. su루트로 /switching을 사용하면 sudo더 높은 권한을 가진 SELinux 사용자로 승격되지 않으며 동일한 SELinux 시행 제한이 유지됩니다.

  • 자신만의 SELinux 사용자를 생성하세요. 배포에서 제공하는 SELinux 사용자를 기반으로 이를 기반으로 할 수 있습니다(배포의 정책 소스 다운로드). 제한되지 않은 사용자 대신 일부 제한된 사용자를 템플릿으로 사용하는 것을 고려하고 너무 광범위한 권한을 부여하지 않도록 허용해야 하는 권한만 추가해야 합니다.

    또한 일부 제한된 액세스(변환/규칙)만 부여해야 하는 경우 제한된 사용자에게 필요한 액세스 권한을 부여하는 정책 모듈을 작성할 수 있습니다.

답변2

새로운 정책을 "설치"하는 경우, 결국 /etc/selinux/TYPE/policy/policy.* 파일을 "쓰기" 및 "레이블 재지정"할 수 있는 사람에 대한 액세스를 제한하는 것으로 요약됩니다.

목표 유형을 결정합니다. SELinux 정책 분석 제품군을 사용하여 이 유형의 파일에 "쓰기" 및 "설명"할 수 있는 내용을 결정합니다. 그런 다음 정책을 설치하지 않으려는 프로세스가 해당 유형의 파일에 직접 또는 간접적으로 액세스할 수 없는지 확인하십시오.

또한 정책을 설치하지 않으려는 모든 프로세스에 "security setenforce"에 대한 액세스 권한이 없고 물리적 액세스 권한이 없는지 확인하고 싶을 수도 있습니다. 그렇지 않으면 이러한 프로세스가 SELinux를 우회할 수 있기 때문입니다.

관련 정보