많은 경로에 대해 fcontext 규칙을 추가/업데이트하는 가장 좋은 방법은 무엇입니까?

많은 경로에 대해 fcontext 규칙을 추가/업데이트하는 가장 좋은 방법은 무엇입니까?

많은 경로에 대해 fcontext를 구성하는 루틴이 필요합니다. 현재 저는 이 작업을 수행하기 위해 semanage를 호출하는 bash 스크립트를 유지 관리하고 있습니다. 하지만 이 작업은 꽤 길어 보입니다. 여기서 주요 문제는 다음과 같습니다.

  1. 규칙에 따라 개체를 업데이트하는 간단한 명령을 찾을 수 없습니다. 개체가 존재하는지 확인하는 데 사용해야 하며 semanage fcontext -l | grep <object>그 개체에서 선택하거나 -a결과 -m에 의존해야 합니다. 이 명령은 호출당 약 0.5~1초가 소요될 정도로 매우 느립니다. 규칙 업데이트를 강제하는 기존 도구가 있습니까?

  2. Semanage fcontext 호출이 매우 느립니다. conf 파일을 사용하여 규칙을 정의하는 방법이 있습니까? 파일이 있지만 /etc/selinux/targeted/contexts/files/file_contexts.local수동으로 편집하면 안 됩니다.

고쳐 쓰다

사용자 정의 정책 모듈은 다양한 경로의 규칙을 처리하는 표준적인 방법일 수 있습니다. 그러나 semodule -i실제로는 루프 의미 관리자 명령보다 훨씬 느립니다.

다음은 mytest.fc의 예입니다.

/var/run/mytest/afolder(/.*)?  gen_context(system_u:object_r:httpd_sys_content_t, s0)
/var/run/mytest/bfolder(/.*)?  gen_context(system_u:object_r:httpd_sys_rw_content_t, s0)
/var/run/mytest/cfolder(/.*)?  gen_context(system_u:object_r:httpd_sys_content_t, s0)
/var/spool/mytest/alink  gen_context(system_u:object_r:httpd_sys_content_t, s0)
/var/spool/mytest/blink  gen_context(system_u:object_r:httpd_sys_rw_content_t, s0)
/var/spool/mytest/clink  gen_context(system_u:object_r:httpd_sys_content_t, s0)

내 샘플 스크립트 버전:


#!/bin/bash
set -x
httpd_sys_content_paths=(
"/var/spool/mytest/alink"
"/var/spool/mytest/clink"
"/var/run/mytest/afolder(/.*)?"
"/var/run/mytest/cfolder(/.*)?"
)

for _path in "${httpd_sys_content_paths[@]}"
do
    set +e
    semanage fcontext -d "${_path}"
    set -e
    semanage fcontext -a -s system_u -t httpd_sys_content_t "${_path}"
done

httpd_sys_rw_content_paths=(
    "/var/spool/mytest/blink"
    "/var/run/mytest/bfolder(/.*)?"
)

for _path in "${httpd_sys_rw_content_paths[@]}"
do
    set +e
    semanage fcontext -d "${_path}"
    set -e
    semanage fcontext -a -s system_u -t httpd_sys_rw_content_t "${_path}"
done

semodule -i35초가 소요됩니다. 루프에는 25초가 소요됩니다.

답변1

당신 말이 맞아요, semanage fcontext단지 느릴 뿐입니다. 그러나 배치 모드에서 지속적으로 실행되도록 설계되지 않았습니다.

따라서 사용자 정의 SELinux 정책을 직접 생성하는 것이 좋습니다. RHEL 파생 제품의 경우 policycoreutils-devel패키지 설치가 포함됩니다(차례로 레이블이 지정됨 selinux-policy-devel).

여기에서 두 가지 가능성이 있습니다. 첫 번째 옵션은 빠르고 더럽습니다. 두 번째 옵션은 더 힘들지만 더 많은 힘을 줄 것입니다.

옵션 1 - make를 사용한 간단한 전략 패키지

두 파일 모두 기본 SELinux 파일 컨텍스트를 갖는 /unixsetest파일이 포함된 디렉토리가 있다고 가정합니다 .testfiledefault_t

$ ls -laZ /unixsetest
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 .
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 testfile

이제 파일 컨텍스트를 얻고 싶지만 testfile질문에 언급한 이유로 사용하고 싶지 않다고 가정해 보겠습니다 admin_home_t.semanage fcontext

unixsetest.te다음 내용으로 (typeforce)라는 파일을 만듭니다 .

policy_module(unixsetest, 1.0)

unixsetest.fc다음 내용으로 (파일 컨텍스트 정의)라는 파일을 만듭니다 .

/unixsetest(/.*)?   --  gen_context(system_u:object_r:admin_home_t,s0)

이제 다음 명령을 실행하여 이를 사용자 정의된 SELinux 정책으로 컴파일하십시오.

$ make -f /usr/share/selinux/devel/Makefile
Compiling targeted unixsetest module
/usr/bin/checkmodule:  loading policy configuration from tmp/unixsetest.tmp
/usr/bin/checkmodule:  policy configuration loaded
/usr/bin/checkmodule:  writing binary representation (version 19) to tmp/unixsetest.mod
Creating targeted unixsetest.pp policy package
rm tmp/unixsetest.mod.fc tmp/unixsetest.mod

그리고 설치하세요:

$ semodule -i unixsetest.pp

로드 확인:

$ semodule -l | grep unixsetest
unixsetest      1.0

파일 컨텍스트가 파일 컨텍스트 정의 데이터베이스에 로드되었는지 확인합니다.

$ semanage fcontext -l | grep admin_home_t
/root(/.*)?                                        all files          system_u:object_r:admin_home_t:s0
/unixsetest(/.*)?                                  regular file       system_u:object_r:admin_home_t:s0

(첫 번째 줄은 운영 체제의 기본 SElinux 정책의 일부이고 두 번째 줄은 사용자 정의 정책 파일을 통해 추가한 부분입니다.)

이제 다음 명령을 사용하여 파일 컨텍스트를 적용합니다 restorecon.

$ restorecon -Rv /unixsetest/
restorecon reset /unixsetest/testfile context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:admin_home_t:s0

효율적인:

 ls -laZ /unixsetest
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 .
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 testfile

옵션 2 - sepolicy 생성 도구 세트의 복잡한 정책(RPM) 패키지 사용

이제 sepolicy-generate도구에 액세스할 수 있습니다. 실행 man sepolicy-generate하여 무엇을 할 수 있는지 확인하세요. RPM 기반 설치용으로 설계되었으며 정책 설치와 패키지 설치를 긴밀하게 통합합니다.

sepolicy generate수행하려는 작업을 지정하는 적절한 매개변수를 사용하여 템플릿을 실행하여 템플릿에서 정책을 생성할 수 있습니다.

       Confined Applications

       sepolicy generate --application [-n NAME] [-u USER ]command [-w WRITE_PATH ]
       sepolicy generate --cgi [-n NAME] command [-w WRITE_PATH ]
       sepolicy generate --dbus [-n NAME] command [-w WRITE_PATH ]
       sepolicy generate --inetd [-n NAME] command [-w WRITE_PATH ]
       sepolicy generate --init [-n NAME] command [-w WRITE_PATH ]

       Confined Users

       sepolicy generate --admin_user [-r TRANSITION_ROLE] -n NAME
       sepolicy generate --confined_admin -n NAME [-a ADMIN_DOMAIN] [-u USER] [-n NAME] [-w WRITE_PATH]
       sepolicy generate --desktop_user -n NAME [-w WRITE_PATH]
       sepolicy generate --term_user -n NAME [-w WRITE_PATH]
       sepolicy generate --x_user -n NAME [-w WRITE_PATH]

       Miscellaneous Policy

       sepolicy generate --customize -d DOMAIN -n NAME [-a ADMIN_DOMAIN]
       sepolicy generate --newtype -t type -n NAME
       sepolicy generate --sandbox -n NAME

정책 패키지에는 다음 5개 파일이 포함됩니다.

       Type Enforcing File NAME.te
       This file can be used to define all the types rules for a particular domain.

       Note: Policy generated by sepolicy generate will automatically add a permissive DOMAIN  to
       your  te  file.   When  you  are  satisfied that your policy works, you need to remove the
       permissive line from the te file to run your domain in enforcing mode.

       Interface File NAME.if
       This file defines the interfaces for the types generated in the te file, which can be used
       by other policy domains.

       File Context NAME.fc
       This file defines the default file context for the system, it takes the file types created
       in the te file and associates file paths to the types.  Tools like restorecon and RPM will
       use these paths to put down labels.

       RPM Spec File NAME_selinux.spec
       This  file  is  an  RPM  SPEC  file  that  can be used to install the SELinux policy on to
       machines and setup the labeling. The spec file also installs the interface file and a  man
       page  describing  the  policy.   You  can use sepolicy manpage -d NAME to generate the man
       page.

       Shell File NAME.sh
       This is a helper shell script to compile, install  and  fix  the  labeling  on  your  test
       system.   It  will also generate a man page based on the installed policy, and compile and
       build an RPM suitable to be installed on other machines

물론 .fc 파일에 특히 관심이 많을 것입니다.

당신을 도울 좋은 튜토리얼이 있습니다. 특히 RH 문서를 추천합니다:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/using_selinux/writing-a-custom-selinux-policy_using-selinux그리고https://linuxconcept.com/tutorial/extending-generated-selinux-policies/.

관련 정보