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


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.