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


11

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

매개 변수를 기록하는 쉘 스크립트로 실행 파일을 래핑 할 수 있다는 것을 알고 있지만 특정 / proc / pid / exe를 볼 수있는 파일 시스템 콜백을 모니터링 할 수있는 더 커널 특정 방법이 있는지 궁금합니다. 주어진 바이너리와 일치합니까?


auditd프로그램 실행뿐만 아니라 명령 행 인수를 기록 할 수있는 방법 이 있습니까? serverfault.com/questions/765179/…
— Neil

답변:


16

예, 감사 기능인 커널 기능이 있습니다. 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모든 감사 규칙을 삭제합니다.

디버깅 목적으로 래퍼 스크립트로 프로그램을 교체하면 환경, 상위 프로세스에 대한 정보 등을 기록 할 수있는 유연성이 향상됩니다.


왜 -F path=/ust/bin/rrdtool? rrdtool관련 소프트웨어조차 어떻게 얻지 못합니다 .
— Graeme

@Graeme이 질문에 설명 된 문제는의 호출을 추적하는 것입니다 rrdtool. 모든 프로그램의 호출을 로그하려면 -F path=…부분을 삭제하십시오 (물론 많은 로그가 나타납니다).
— Gilles 'SO- 악마 그만두 다'

맞습니다 ... 질문의 첫 줄. 감사.
— Graeme

이것은 모두 훌륭하지만 구성을 초기 상태로 어떻게 재설정합니까? 그렇지 않으면 새로 시작된 명령과 새로 시작된 명령으로 로그를 계속 채 웁니다. 아니면이 auditctl명령 은 재부팅 할 때까지만 유효합니까?
— Ruslan

@Ruslan 재부팅의 효과는 auditctl재부팅 할 때까지만 유효 하지만 어쨌든 좋은 지적입니다. 대답에 재부팅하지 않고 제거하는 방법에 대한 지침을 추가했습니다.
— Gilles 'SO- 악의를 멈추십시오

6

snoopy를 사용할 수 있습니다 .

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

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


특정 쉘에서만 직접 또는 간접적으로 생성 된 명령에 대한 로깅을 수행 할 수 있습니까?
— rv

나는 당신의 질문을 이해하지 못합니다-쉘 (bash, dash, zsh 등)로 사용되는 특정 프로그램으로 "shell"을 의미합니까, 아니면 특정 PTY 만 기록하고 싶습니까? 스누피 프레임 워크를 필터링을 제공하지만, 현재 아주 기본적인 필터의 몇이 구현의 목록을 보려면 여기를 참조하십시오 링크를 . 다른 사용자에게 적용 할 수있는 구체적인 유스 케이스가있는 경우 기능 요청에 설명하고 패치를 환영합니다. btw : 패치
— Bostjan Skufca

나는 단지 특정 PTY를 의미했습니다.
— rv

사용 가능한 PTY ATM에 대한 특정 필터가 없습니다. 그러나 스누피를 사용하여 이벤트가 발생한 PTY를 포함하여 모든 것을 기록한 다음 syslog 데몬에서 필터링을 수행 할 수 있습니다. 어느 것을 사용하고 있는지 알지 못하지만 syslog-ng (예 :)는 정규식 일치, 양수 또는 음수를 수행 할 수 있습니다.
— Bostjan Skufca

감사합니다! 도구와 접근 방식은 일반적으로 매우 유용합니다. 필요한 것을 얻기 위해 필터링을 쉽게 할 수 있습니다.
— rv

2

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

볼 수있는 흥미로운 값이 있습니다. 예를 들어 "auid"는 500인데, "uid"가 0이더라도 ( 'cos 's under under su) 에도 로그인 ID 입니다. 따라서 사용자가 계정을 전환 su했거나 sudo"감사 ID"로 다시 추적 할 수있는 경우에도

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

그러나 이로 인해 많은 로그 메시지가 생성 될 수 있습니다. 디스크에 충분한 공간이 있는지 확인하십시오!

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

또한 조심하십시오. 사용자가 명령 실행에 비밀번호를 입력하면 (예 :) 비밀번호 mysql --user=username --password=passwd가 기록됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.