운영체제는 데비안입니다. 시스템 재부팅이 무엇인지 확인하기 위해 auditd를 설정했습니다.
다음과 같은 규칙이 있습니다.
-a exit,always -F arch=b64 -S execve -F path=/bin/systemctl -k debug_test
create 규칙은 /usr/sbin/reboot
Symlink이기 때문에 작동하지 않지만 /bin/systemctl
이 규칙은 잘 작동하며 재시작 명령이 실행될 때마다 캡처합니다. 그런 다음 다음 명령을 사용하여 이러한 재시작을 검색할 수 있습니다 ausearch -k debug_test | grep reboot
. (규칙 키에는 grep에 필요한 문자열 "reboot"가 포함되어 있지 않습니다.)
그런데 이는 담당 프로세스의 ppid만 출력할 뿐입니다. 해당 ppid의 프로세스 이름을 찾고 있는 것입니다. 이것을 기록하도록 auditd를 구성할 수 있습니까? 아니면 15초마다 모든 pid + 프로세스 이름을 기록하기 위해 일종의 데몬을 작성해야 합니까?
답변1
나는 되돌아보고 있었다문서 검토일부.
Auditd
와 같은 자리 표시자를 사용하지 마십시오 %{process.value}
. 값 목록을 기준으로 합니다.
uid, auid, gid, pid, subj_user, subj_role, subj_type, subj_sen, subj_clr, msgtype, and executable name.
규칙 키에 상위 프로세스 이름을 직접 기록하는 것은 불가능하다고 생각합니다. "실행 파일 이름"을 사용하는 것이 systemctl
& 내가 겪고 있는 문제라고 생각합니다 reboot
.
"감사 로그에 인쇄된 상위 프로세스 ID(ppid)로 상위 프로세스 이름을 찾을 수 있습니다."(이것은 기본적으로 내 첫 번째 답변입니다. terdon ;-))
ausearch
원시를 사용하여 ppid
이 프로세스를 생성한 이벤트를 찾을 수 있다는 것을 알았습니다 . execve
시스템 호출 에 기록됩니다 . 즉 PID
'곧 가버린다!
PPID와 동일한 로그 줄에서 type=EXECVE
"make" 명령(a0, a1...)에 사용되는 매개변수 목록을 찾습니다.
type=EXECVE msg=audit(1622816736.650:123456): argc=3 a0="sh" a1="-c" a2="reboot"
sh
이는 상위 프로세스가 인수와 함께 -c
명령()을 실행하는 쉘()임을 나타냅니다 reboot
. 이제 ausearch
제가 제안하는 첫 번째 제안은 결혼식을 할 수 있다는 것입니다.
#!/bin/bash
# Assuming ausearch command outputs lines with the format id=VAL
for ppid_line in $(your_actual_ausearch_command_here); do
ppid_to_match=$(echo "$ppid_line" | grep -Eo 'id=[0-9]{1,}')
# Extract the process information and commands
process_info=$(sudo cat /var/log/audit/audit.log | grep -i "$ppid_to_match" | grep -Ei 'a0=.*')
echo "$ppid_to_match is: $process_info"
done
exit 0
명령 은 ausearch
id=VAL, isolate 형식으로 PPID를 검색한 id=
다음 id=VAL, isolate 로 시작하는 해당 정보를 추출하여 a0=
실제 명령으로 연결됩니다.