답변:
이것은 감사를위한 완벽한 직업인 것 같습니다. 최신 RedHat 기반 시스템에서 기본 서비스 인 실행 감사를 마치면 실행하여 원하는대로 정확하게 수행 할 규칙을 작성할 수 있습니다.
auditctl -a task,always -F uid=0
이 명령 규칙을 세분화하여 매뉴얼 페이지를 과도하게 사용하면 다음을 알 수 있습니다.
-a list,action task Add a rule to the per task list. This rule list is used only at the time a task is created -- when fork() or clone() are called by the parent task. When using this list, you should only use fields that are known at task creation time, such as the uid, gid, etc. always Allocate an audit context, always fill it in at syscall entry time, and always write out a record at syscall exit time.
따라서 포크 또는 복제 시스템 호출이 종료 될 때마다 항상이 조치에 대한 레코드를 작성하십시오.
최종 옵션은 필터 문자열로 생각할 수 있습니다. 우리 -F uid=0
는 프로세스 소유자의 uid가 0 인 경우로 제한합니다.
이 규칙은 감사가 올바르게 구성되어 있는지 확인하고
-a task,always -F uid=0
배포를 위해 관련 파일에 규칙 을 추가하여 런타임에 실행될 수 있습니다./etc/audit/audit.rules
이것은 꽤 어리 석고 시끄러운 일이며, 로그 검토를하는 사람은 준비해야합니다.
CONFIG_PROC_EVENTS 및 / 또는 CONFIG_KPROBES로 커널을 다시 컴파일하지 않고이 작업을 수행 할 수있는 확실한 방법이 없다고 생각합니다.
나는 / proc 내부의 디렉토리 생성을 위해 iwatch / inotify를 사용할 생각을 가지고 있었지만 작동하지 않았고 auditctl도 마찬가지였습니다. 비록 더럽지 만 최선의 선택은 스크립트에서 변경 사항을 위해 ps를 지속적으로 구문 분석하는 것입니다. 다음 Perl 코드는 일부를 놓치기 쉽고 무시합니다 ps
(그렇지 않으면 자체 트리거됩니다).
perl -e 'my %pids; while(1) { my @pids = `ps -U root -u root`; foreach (@pids) { next if /ps$/; ($pid) = /^\s*(\d+)\D/; if (!$pids{$pid}) { $pids{$pid}++; print "Process $pid created (" . `cat /proc/$pid/cmdline` . ")\n"; } } }
내가 생각할 수있는 가장 좋은 방법은 스누피 라이브러리 를 구축하는 것 입니다. 스누피는 후크에 도착 아주 작은 공유 라이브러리 /etc/ld.so.preload
주위와 랩 execve()
시스템 호출. 모든 exec()
의 로그 또는 루트의 로그 만 기록하도록 구성 할 수 있습니다. 현재 화신에서 스누피는 일치하는 이벤트 (syscall to execve()
)가 발생할 때마다 syslog에 기록 합니다. 그것은 큰 프로그램이 아니며 (최대 수백 줄의 코드) 활동을 로깅하는 대신 (또는 추가로) 스크립트를 실행하는 데 큰 어려움없이 수정할 수 있습니다. 스누피는 C로 작성되었습니다.
몇 가지 참고할 사항 :