뭐, 다양한 기사와 영상을 찾아보게 됐는데요. 그들은 모두 동일한 기본 사항을 말합니다. 즉, 기본 정책으로 시작하고 허용 모드에서 실행하여 수정해야 할 사항을 확인합니다. 그런 다음 전략을 수정하여 잠재적인 문제를 해결하세요. 그런 다음 다시 엄격한 시행을 시작합니다.
ausearch
이 참조에서 그들은 더 단순화된 버전의 audit.log를 얻기 위해 실행을 제안했습니다 . 그래서 나는 다음과 같은 보고서를 시도했습니다.
type=PROCTITLE msg=audit(03/27/2015 02:58:34.764:439) : proctitle=/bin/sh
type=SYSCALL msg=audit(03/27/2015 02:58:34.764:439) : arch=x86_64 syscall=getxattr success=no exit=-61(No data available) a0=0x1fef030 a1=0x7fc0dbf2ef9f a2=0x7fff6aaa1da0 a3=0x84 items=0 ppid=1 pid=3861 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=systemd-logind exe=/lib/systemd/systemd-logind subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 key=(null)
type=AVC msg=audit(03/27/2015 02:58:34.764:439) : avc: denied { getattr } for pid=3861 comm=systemd-logind name=kvm dev="devtmpfs" ino=11755 scontext=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:kvm_device_t:s0 tclass=chr_file permissive=1
특히 수백 개의 메시지를 접할 때 이 메시지가 무엇을 말하는지 파악하기가 어렵습니다.
결과 ausearch
를 audit2allow
. 이는 확인 상자가 나타날 때마다 수락 버튼을 누르는 것과 같습니다. 또한 메시지가 침입을 시도하는 해커가 아닌 버그로 인해 발생했다고 가정합니다.
그렇다면 SELinux 허용 모드의 "출력"을 분석하는 합리적인 방법을 제안할 수 있는 사람이 있을까요?
답변1
여러 번 당신은 어떤 정보를 받고 당신의 목적과 관련된 정보를 골라야 할 것입니다. 예를 들어, strace
프로그램을 작성할 때 많은 양의 출력이 있고 출력을 보는 이유와 관련된 부분에만 집중합니다 strace
.
감사 로그는 비슷한 원칙을 따릅니다. 당신의 것을 살펴 보겠습니다:
유형=PROCTITLE msg=audit(2015/03/27 02:58:34.764:439): proctitle=/bin/sh
그다지 흥미롭지 않습니다. 이는 타임스탬프와 실행 파일의 값 proctitle
(일반적으로 프로세스 이름)을 제공합니다. 하지만 logind
이것이 왜 프로그램 제목인지 는 확실하지 않습니다.
type=AVC msg=audit(03/27/2015 02:58:34.764:439) : avc: pid=3861 comm=systemd-logind name=kvm dev="devtmpfs" ino=11755 scontext=system_u에 대한 { getattr } 거부 :system_r:system_dbusd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:kvm_device_t:s0 tclass=chr_file 권한=1
이것은 실제 SELinux 오류 메시지이며 가장 걱정해야 할 사항입니다. 그게 type=AVC
바로 그거예요. AVC
대표하다access vector cache
이것은 SELinux 구성 요소입니다..
주목해야 할 중요한 부분은 denied
해당 섹션(이 경우 getattr
)에 있는 내용으로, 프로그램이 거부되기 위해 구체적으로 수행한 작업을 알려줍니다. 그런 다음 scontext
아이디어를 제공하는 소스 컨텍스트(일명)를 살펴봅니다.일반 카테고리이 경우 전체 맥락은 system_u:system_r:system_dbusd_t
실질적인 부분(99%)으로 단축 됩니다 system_dbusd_t
. 우리가 얻은 대상 컨텍스트에 대해 동일한 작업을 수행합니다 kvm_device_t
. comm
필드는 pid
매우 중요하고 분명합니다. systemd-logind
PID 3861을 사용하여 실행 중인 프로그램 에서 예외가 발생합니다 .
그러니 함께 모아봐systemd-logind
context 가 있는 파일에 대해 system_dbusd_t
일부 작업을 실행하고 수행 하려고 합니다 .getattr
kvm_device_t
관리자는 이것이 무엇을 의미하는지, 무엇을 해야 하는지 알고 있습니다. SELinux는 해당 정책이 그러한 것을 허용하지 않는다는 것을 알고 있으므로 사용자가 직접 호출할 수 있도록 세부 정보를 제공합니다.
type=SYSCALL msg=audit(03/27/2015 02:58:34.764:439) : arch=x86_64 syscall=getxattr 성공=no exit=-61(사용 가능한 데이터 없음) a0=0x1fef030 a1=0x7fc0dbf2ef9f a2=0x7fff6aaa1da0 a3= 0x84 항목=0 ppid=1 pid=3861 auid=설정 해제 uid=루트 gid=루트 euid=루트 suid=루트 fsuid=루트 egid=루트 sgid=루트 fsgid=루트 tty=(없음) ses=설정 해제 comm=systemd-logind exe=/lib/systemd/systemd-logind subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 key=(null)
표현 방식이 좀 어긋나긴 했지만, 어떻게 읽어야 할지 이해하기 쉽기 때문에 나중에 넣습니다. 이것이 type=AVC
중요한 부분이지만 일반적으로 실패한 실제 시스템 호출을 기록하므로 자세한 내용을 얻을 수 있습니다.
예를 들어, 프로그램 이름이 주어지면 systemd-logind
그것이 무엇인지 알 수 있지만, 이름이 더 모호한 경우 exe=/lib/systemd/systemd-logind
어떤 프로그램이 오류를 일으키는지 확인할 수 있습니다. auid
( loginuid
프로세스의) 또는 (프로세스의) 와 같은 정보는 문제의 실행 파일이 시작된 이유를 잘 모르는 경우에도 유용한 정보가 될 수 있습니다.uid
도움이 되길 바랍니다. 질문이 있으시면 답변을 업데이트하겠습니다.
편집하다:마지막 요점에 대해 한 가지 더. 일반적으로 audit2allow
정책이 생성하는 내용을 살펴보고 정책에 따른 변경 사항을 이해할 수 있습니다. 정책 모듈을 삽입할 때까지 실제로 변경 사항이 적용되지 않습니다. 따라서 이를 생성한 다음 텍스트 편집기에서 보고 해당 일이 발생하도록 허용하려는지 확인할 수 있습니다. 직접 읽는 것보다 세부사항을 추적하는 것이 더 빠를 수 있습니다 audit.log
.