명령줄 인수를 포함하여 실행된 모든 명령을 기록하는 쉬운 방법이 있습니까?

명령줄 인수를 포함하여 실행된 모든 명령을 기록하는 쉬운 방법이 있습니까?

rrdtool수신 경로가 잘못된지 확인하기 위해 로그하는 방법에 대한 특정 인스턴스를 찾으려고 합니다 .

인수를 기록하는 쉘 스크립트로 실행 파일을 래핑할 수 있다는 것을 알고 있지만, 이를 모니터링하는 커널 전용 방법이 있는지 알고 싶습니다. 특정 /proc/pid/에서 실행될 수 있는 파일 시스템 콜백이 있을 수도 있습니다. 주어진 것과 일치하는 바이너리를 찾을 때 exe를 사용합니까?

답변1

예, 감사 하위 시스템이라는 커널 기능이 있습니다. 데몬은 auditd로깅을 수행하고 명령은 auditctl로깅 규칙을 설정합니다. 특정 시스템에 대한 모든 호출을 기록하고 일부 필터링을 수행할 수 있습니다. 실행된 모든 명령과 해당 매개변수를 기록하려면 execve시스템 호출을 기록하십시오.

auditctl -a exit,always -S execve

특정 프로그램에 대한 호출을 구체적으로 추적하려면 프로그램 실행 파일에 필터를 추가하세요.

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool

로그는 /var/log/audit.log배포판이 배치하는 위치나 위치에 나타납니다. 감사 하위 시스템을 제어하려면 루트여야 합니다.

조사를 완료한 후 대신 동일한 명령줄을 사용하여 -d로깅 -a규칙을 삭제하거나 실행하여 auditctl -D모든 감사 규칙을 삭제합니다.

디버깅 목적으로 프로그램을 래퍼 스크립트로 바꾸면 환경, 상위 프로세스에 대한 정보 등을 기록하는 데 더 많은 유연성이 제공됩니다.

답변2

당신이 사용할 수있는스누피.

스누피는 커널 협력이 필요하지 않기 때문에 더 가벼운 솔루션입니다. 필요한 것은 경로가 에 있는 스누피 라이브러리를 미리 로드하는 동적 로더(dl)입니다 /etc/ld.so.preload.

공개: 저는 현재 스누피 관리자입니다.

답변3

Linux 커널 "감사" 하위 시스템이 귀하의 요구 사항을 충족할 수 있습니다.

예를 들어 다음 명령을 실행하는 경우:

auditctl -a exit,always -F arch=b64 -S execve
auditctl -a exit,always -F arch=b32 -S execve

그런 다음 각 실행 이벤트를 기록하고많은이 문제와 관련하여 제공된 정보

예를 들어, 이것은 제가 실행한 결과입니다.tail /var/log/audit/audit.log

exit=0 a0=7f0e4a21e987 a1=7f0e4a21e6b0 a2=7f0e4a21e808 a3=8 items=2 ppid=906 pid=928 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="tail" exe="/usr/bin/tail" subj=kernel key=(null)
type=EXECVE msg=audit(1543671660.203:64): argc=2 a0="tail" a1="/var/log/audit/audit.log"
type=CWD msg=audit(1543671660.203:64):  cwd="/home/sweh"
type=PATH msg=audit(1543671660.203:64): item=0 name="/usr/bin/tail" inode=266003 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PATH msg=audit(1543671660.203:64): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=273793 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1543671660.203:64): proctitle=7461696C002F7661722F6C6F672F61756469742F61756469742E6C6F67

몇 가지 흥미로운 값을 볼 수 있습니다. 예를 들어 "uid"는 0이지만(실행 중이므로 su) "auid"는 내 로그인 ID인 ​​500입니다. 따라서 사용자가 계정을 전환한 경우에도 '감사 ID'를 추적할 수 있습니다 su.sudo

이제 auditctl재부팅 시 이러한 명령이 손실됩니다. 구성 파일(예 /etc/audit/rules.d/: CentOS 7의 디렉터리) 에 넣을 수 있습니다 . 정확한 위치는 운영 체제 버전에 따라 다릅니다. 매뉴얼 auditctl페이지가 여기서 도움이 될 것입니다.

하지만 조심하세요. 이로 인해 다음과 같은 상황이 발생할 수 있습니다.많은생성할 로그 메시지 수입니다. 디스크에 충분한 공간이 있는지 확인하세요!

필요한 경우 규칙을 특정 사용자나 특정 명령으로 제한할 수 있습니다.

또한 주의하십시오. 사용자가 명령 실행 중에 비밀번호를 입력하면 mysql --user=username --password=passwd이 내용이 기록됩니다.

관련 정보