Czy istnieje prosty sposób na zarejestrowanie wszystkich wykonanych poleceń, w tym argumentów wiersza poleceń?

11

Próbuję znaleźć sposób zarejestrowania określonej instancji, rrdtoolaby sprawdzić, czy ścieżka, którą otrzymuje, jest niepoprawna.

Wiem, że mógłbym owinąć plik wykonywalny w skrypcie powłoki, który rejestrowałby parametry, ale zastanawiałem się, czy istnieje bardziej specyficzny sposób monitorowania tego przez jądro, być może wywołanie zwrotne systemu plików, które widzi, kiedy określony / proc / pid / exe pasuje do danego pliku binarnego?

Peter Grace
źródło
Czy istnieje sposób na auditdnagranie argumentów wiersza poleceń oraz uruchomienia programu? serverfault.com/questions/765179/…
Neil

Odpowiedzi:

16

Tak, istnieje narzędzie jądra: podsystem kontroli. auditdDemon robi rejestrowanie, a komenda auditctlustawia zasady rejestrowania. Możesz rejestrować wszystkie połączenia do określonego systemu alls, z pewnym filtrowaniem. Jeśli chcesz zarejestrować wszystkie wykonane polecenia i ich argumenty, zarejestruj execvewywołanie systemowe:

auditctl -a exit,always -S execve

Aby w szczególności śledzić wywołanie określonego programu, dodaj filtr do pliku wykonywalnego programu:

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

Dzienniki pojawiają się w /var/log/audit.logdowolnym miejscu w Twojej dystrybucji. Musisz być rootem, aby kontrolować podsystem kontroli.

Po zakończeniu badania użyj tego samego wiersza polecenia -dzamiast zamiast, -aaby usunąć regułę rejestrowania lub uruchom, auditctl -Daby usunąć wszystkie reguły kontroli.

W celu debugowania zastąpienie programu skryptem opakowania zapewnia większą elastyczność w rejestrowaniu takich rzeczy, jak środowisko, informacje o procesie nadrzędnym itp.

Gilles „SO- przestań być zły”
źródło
Dlaczego -F path=/ust/bin/rrdtool? Nie rozumiem, w jaki sposób rrdtooljest nawet powiązane oprogramowanie.
Graeme
@Graeme Problem opisany w pytaniu polegał na śledzeniu wywołania rrdtool. Jeśli chcesz rejestrować wywołania wszystkich programów, upuść -F path=…część (oczywiście otrzymasz wiele dzienników).
Gilles „SO- przestań być zły”
Racja ... pierwsza linia pytania. Dzięki.
Graeme
To wszystko świetnie, ale jak zresetować konfigurację do stanu początkowego? W przeciwnym razie będzie kontynuować wypełnianie dziennika nowymi i nowymi uruchomionymi poleceniami ... czy to auditctlpolecenie działa tylko do momentu ponownego uruchomienia?
Ruslan,
@ Ruslan Efekt auditctltylko przetrwa do momentu ponownego uruchomienia, ale to i tak dobra uwaga, dodałem instrukcje dotyczące ich usuwania bez ponownego uruchamiania do mojej odpowiedzi.
Gilles „SO- przestań być zły”
6

Możesz użyć snoopy .

Snoopy jest bardziej lekkim rozwiązaniem, ponieważ nie wymaga współpracy jądra. Wszystko czego potrzeba to dynamiczny moduł ładujący (dl), który wstępnie ładuje bibliotekę snoopy, do której ścieżka jest określona w /etc/ld.so.preload.

Ujawnienie: Jestem obecnym opiekunem snoopy.

Bostjan Skufca
źródło
Czy można rejestrować polecenia bezpośrednio lub pośrednio odradzane tylko z konkretnej powłoki?
rv
Nie jestem pewien, czy rozumiem twoje pytanie - czy masz na myśli „powłokę” jako konkretny program, który jest używany jako powłoka (bash, myślnik, zsh itp.), Czy masz na myśli, że chcesz zalogować tylko konkretny PTY? Snoopy zapewnia platformę filtrowania, ale obecnie zaimplementowanych jest tylko kilka bardzo podstawowych filtrów, patrz tutaj: link . Jeśli masz konkretny przypadek użycia, który może mieć zastosowanie do innych, wyjaśnij to w żądaniu funkcji, a och, btw, łatki są mile widziane :)
Bostjan Skufca
Miałem na myśli tylko konkretny PTY.
rv
Nie ma konkretnego filtra dla bankomatu PTY dostępnego. Można jednak użyć funkcji snoopy do zarejestrowania wszystkiego, w tym PTY, w którym zdarzenie miało miejsce, a następnie przefiltrowania w demonie syslog. Nie wiem, którego używasz, ale syslog-ng (na przykład) może dopasowywać wyrażenia regularne, dodatnie lub ujemne.
Bostjan Skufca
Pewnie. Dzięki! Narzędzie i podejście są ogólnie bardzo przydatne. Mogę łatwo przeprowadzić filtrowanie, aby uzyskać to, czego potrzebuję.
rv
2

Podsystem „audytu” jądra systemu Linux może wykonać to, czego potrzebujesz.

np. jeśli uruchomisz następujące polecenia:

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

Następnie każde zdarzenie wykonania jest rejestrowane i wokół niego znajduje się wiele informacji

np. to jest wynik mojego działania 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

Istnieje kilka interesujących wartości, które można zobaczyć; np. „auid” to 500, co jest moim identyfikatorem logowania, mimo że „uid” wynosi zero (bo pod którym pracuję su). Więc nawet jeśli użytkownik mógł zmienić konto sulub sudonadal możemy wyśledzić jego „identyfikator kontroli”

Teraz te auditctlpolecenia zostaną utracone przy ponownym uruchomieniu. Możesz umieścić je w pliku konfiguracyjnym (np. W /etc/audit/rules.d/katalogu na CentOS 7). Dokładna lokalizacja zależy od wersji systemu operacyjnego. Strona auditctlpodręcznika powinna tutaj pomóc.

Uważaj jednak ... spowoduje to wygenerowanie wielu komunikatów dziennika. Upewnij się, że masz wystarczająco dużo miejsca na dysku!

W razie potrzeby reguły można ograniczyć do określonego użytkownika lub określonego polecenia.

A także strzeżcie się; jeśli użytkownik wprowadzi hasło do wykonania polecenia (np. mysql --user=username --password=passwd), zostanie ono zarejestrowane.

Stephen Harris
źródło