많은 경로에 대해 fcontext를 구성하는 루틴이 필요합니다. 현재 저는 이 작업을 수행하기 위해 semanage를 호출하는 bash 스크립트를 유지 관리하고 있습니다. 하지만 이 작업은 꽤 길어 보입니다. 여기서 주요 문제는 다음과 같습니다.
규칙에 따라 개체를 업데이트하는 간단한 명령을 찾을 수 없습니다. 개체가 존재하는지 확인하는 데 사용해야 하며
semanage fcontext -l | grep <object>
그 개체에서 선택하거나-a
결과-m
에 의존해야 합니다. 이 명령은 호출당 약 0.5~1초가 소요될 정도로 매우 느립니다. 규칙 업데이트를 강제하는 기존 도구가 있습니까?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 -i
35초가 소요됩니다. 루프에는 25초가 소요됩니다.
답변1
당신 말이 맞아요, semanage fcontext
단지 느릴 뿐입니다. 그러나 배치 모드에서 지속적으로 실행되도록 설계되지 않았습니다.
따라서 사용자 정의 SELinux 정책을 직접 생성하는 것이 좋습니다. RHEL 파생 제품의 경우 policycoreutils-devel
패키지 설치가 포함됩니다(차례로 레이블이 지정됨 selinux-policy-devel
).
여기에서 두 가지 가능성이 있습니다. 첫 번째 옵션은 빠르고 더럽습니다. 두 번째 옵션은 더 힘들지만 더 많은 힘을 줄 것입니다.
옵션 1 - make를 사용한 간단한 전략 패키지
두 파일 모두 기본 SELinux 파일 컨텍스트를 갖는 /unixsetest
파일이 포함된 디렉토리가 있다고 가정합니다 .testfile
default_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/.