selinux 정책을 시행하는 rsync 데몬 rsync_export_all_ro는 여전히 /var/spool/postfix/private/ 아래의 파일에 대한 액세스를 차단합니다.

selinux 정책을 시행하는 rsync 데몬 rsync_export_all_ro는 여전히 /var/spool/postfix/private/ 아래의 파일에 대한 액세스를 차단합니다.

저는 정기적으로 사용하는 여러 Debian 기반 시스템을 가지고 있습니다 rsync. 여러 가지 이유로 소규모 CentOS 7 서버를 배포해야 했고 이를 백업 계획에 추가하고 싶었습니다. SSH를 통한 rsync를 사용하여 백업하는 것은 불가능합니다. 대신 rsync 데몬을 사용해야 합니다.

CentOS는 시행 모드에서 SELinux를 활성화했기 때문에 학습 곡선이 가파릅니다.

구성 rsyncd섹션(단순화)

[root]
    comment = Filesystem
    path = /
    exclude = /proc/*** /run/*** /sys/*** [...]
    read only = yes
    list = yes
    uid = root
    secrets file = [...]
    ignore errors = no
    ignore nonreadable = no
    refuse options = delete

프로세스에 올바르게 라벨이 지정되어 있다고 생각합니다.

ps -eZ | grep rsync
system_u:system_r:rsync_t:s0    26020 ?        00:00:00 rsync

처음에는 데몬을 통한 백업 시도가 rsync다양한 권한 오류로 인해 실패했습니다. 이는 SELinux 태그 때문이었습니다. 나를 더 파헤쳐봐참조가 발견되었습니다rsync데몬이 모든 파일을 읽기 전용으로 내보낼 수 있도록 허용하는 SELinux 정책:

setsebool -P rsync_export_all_ro 1

그 결과 이 ​​컬렉션이 탄생했습니다.

getsebool -a | grep '^rsync'
rsync_anon_write --> off
rsync_client --> off
rsync_export_all_ro --> on
rsync_full_access --> off

불행하게도 이 방법으로는 여전히 시스템의 모든 파일에 액세스할 수 없습니다. 특히 아래에는 읽을 수 없는 일부 파일이 있습니다 /var/spool/postfix/private.

rsync: readlink_stat("/var/spool/postfix/private/defer" (in root)) failed: Permission denied (13)
rsync: readlink_stat("/var/spool/postfix/private/trace" (in root)) failed: Permission denied (13)
rsync: readlink_stat("/var/spool/postfix/private/verify" (in root)) failed: Permission denied (13)
rsync: readlink_stat("/var/spool/postfix/private/proxymap" (in root)) failed: Permission denied (13)
...

/var/spool/postfix/privatefrom과 관련된 항목의 예는 audit2why -a다음과 같습니다. 다음을 참조하는 항목이 없습니다 rsync_export_all_ro.

type=AVC msg=audit(1565118203.332:21775): avc:  denied  { getattr } for  pid=26597 comm="rsync" path="/var/spool/postfix/private/scache" dev="dm-0" ino=9148374 scontext=system_u:system_r:rsync_t:s0 tcontext=system_u:object_r:postfix_private_t:s0 tclass=sock_file permissive=0
        Was caused by:
        The boolean rsync_full_access was set incorrectly.
        Description:
        Allow rsync to full access

        Allow access by executing:
        # setsebool -P rsync_full_access 1

rsync_full_access(설정하고 싶지 않고 트리거해서는 안 되는)에 대한 참조는 있지만 에 대한 참조는 없는 이유를 이해하지 못합니다 rsync_export_all_ro.

완전한 백업을 얻으려면 데몬이 내보낼 수 있는 파일 세트에 이 디렉터리 트리를 어떻게 추가할 수 있습니까 rsync? (그리고 이 변경 사항은 재부팅 후에도 지속됩니다.)

답변1

rsync_t귀하의 도메인에 대해 SELinux를 비활성화 하지 않는 것이 옳습니다 . 불행하게도구성 가능성rsync의 SELinux 구현은 상당히 광범위하지만 일부 극단적인 경우 rsync_export_all_ro부울 설정은 여전히아니요rsync 데몬이 특정 파일에 액세스하도록 허용합니다. 가지다Bugzilla 항목이것은 당신의 문제와 매우 유사합니다. 제공된 조언은 문제를 극복하기 위해 rsync_full_access보안이 손상됨에도 불구하고(여전히 그럼에도 불구하고 더 나은) 사용하라는 것입니다.semanage permissive -a rsync_t

사용자 정의 정책 모듈 만들기

따라서 귀하의 질문에 대답하려면 더 안전한 옵션을 사용하고 싶다면rsync_export_all_ro 그리고rsync 데몬이 "최종 사례" 파일/디렉토리에 액세스할 수 있도록 하려면 자체 정책 모듈을 만들어야 합니다.

이는 다음과 같이 rsync 데몬이 허용 모드에서 작동하도록 하고 AVC 거부를 포착한 다음 AVC 거부를 정책으로 변환함으로써 수행됩니다.

# put SELinux in permissive mode
setenforce 0

# --- do your rsync stuff ---

# get related AVC denials
# I'm using 'recent' here, depending on the rsync run time please adjust accordingly
ausearch -m avc -ts recent --subject rsync_t

# go through the output. If you're satisfied, create the module
ausearch -m avc -ts recent --subject rsync_t | audit2allow -m roaima-rsync-custom-1 > roaima-rsync-custom-1.te
checkmodule -M -m -o roaima-rsync-custom-1.mod roaima-rsync-custom-1.te
semodule_package -o roaima-rsync-custom-1.pp -m roaima-rsync-custom-1.mod

# load the policy module
semodule -i roaima-rsync-custom-1.pp

# disable permissive mode
setenforce 1

# --- do your rsync stuff again --

감사되지 않은 AVC 거부("dontaudit") 캡처

어떤 이유로 "극단적인 사례" 파일에 액세스할 수 없고 ausearch명령이 결과를 생성하지 않는 경우 "dontaudit" 규칙이 발생할 수 있습니다.

SELinux 정책을 다시 작성하고 모든 "dontaudit" 규칙을 무시하려면 를 실행하십시오 semodule -DB. -D이 옵션은 "dontaudit" 규칙을 비활성화 -B합니다.

그런 다음 감사 로그 이벤트를 트리거할 수 있는지 시도해 보세요. 그렇다면 위와 같이 캡처하고 SELinux 모듈을 생성한 후 다음 명령을 실행하여 "dontaudit" 규칙을 다시 활성화합니다 semodule -B.

"dontaudit" 규칙의 전체 목록을 얻으려면 sesearch --dontaudit명령을 실행하십시오. -s검색 범위를 좁히려면 도메인 옵션과 명령을 사용하세요 grep. 예를 들어: sesearch --dontaudit -s rsync_t.

관련 정보