누구나 루트 프로세스 스폰을 모니터링하는 간단한 방법을 알고 있습니까? 될 때 스크립트를 실행하고 싶습니다.

새로운 루트 프로세스가 생성 될 때 스크립트를 실행하고 싶습니다. (Linux에서) 어떻게 간단하게 할 수 있습니까?

감사



답변

이것은 감사를위한 완벽한 직업인 것 같습니다. 최신 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로 작성되었습니다.

몇 가지 참고할 사항 :

  • 루트 프로세스가 생성 될 때마다 스크립트를 실행하면 스크립트가 루트 프로세스가되어 스크립트를 다시 생성해야합니다. 이는 다른 루트 프로세스가 될 것입니다. 루프에 빠지지 않도록주의하십시오. 그곳에.
  • 일반적인 Linux 박스에는 루트로 실행되고 정기적으로 생성되는 많은 프로세스가 있습니다. 예를 들어, cron은 시스템 cronjob을 1 분 또는 몇 분마다 루트로 생성 할 수 있습니다. 사용자가 루트로 로그인 할 때 이런 일이 발생하면 더 많은 작업이 필요합니다.