Czego services.msc nie robił nigdy

Snapshoty i dryf

Każde inne narzędzie mówi, jak maszyna wygląda teraz. Pytanie, które administrator ma naprawdę, brzmi czym różni się od chwili, gdy działała - i nic w standardowym Windowsie na to nie odpowiada.

Co niesie snapshot

Całą maszynę w jednej chwili: każdą usługę i sterownik, z typem uruchomienia, kontem, ścieżką uruchomienia i argumentami, skrótem i podpisem uruchamianego pliku, zależnościami w obie strony, wyzwalaczami, wymaganymi przywilejami, typem SID i deskryptorem bezpieczeństwa - plus nazwę maszyny, konto, które go zrobiło, i to, czy tamto konto było administratorem.

bws snapshot create before.json --note "before the patch"

To JSON z jednym polem na linię. Celowo: dzięki temu snapshot wchodzi do repozytorium i czyta go git diff, więc porównanie tym narzędziem nie jest jedynym sposobem, żeby na niego spojrzeć.

Traktuj ten plik tak, jak na to zasługuje. Snapshot opisuje całą maszynę, aż do każdej ścieżki uruchomienia i deskryptora bezpieczeństwa. Jest zapisywany z uprawnieniami, które ma już jego katalog, a narzędzie niczego nie zawęża - więc katalog czytelny dla innych to katalog, w którym przeczytają to wszystko.

A potem zapytaj, co jest inaczej

$ bws snapshot diff before.json --live --exit-code
Changed (2):
  Spooler  Print Spooler
    startType: Manual -> Automatic
    status: Stopped -> Running  (running state, not configuration)
  wlidsvc  Microsoft Account Sign-in Assistant
    status: Stopped -> Running  (running state, not configuration)

Added 0, removed 0, changed 2. Fields differing: 1 in configuration, 2 in running state.
  • Konfiguracja i stan są zgłaszane osobno. Dwa snapshoty z odstępem doby różnią się tym, co akurat działa, i prawie nic z tego nie jest dryfem. Zmieszane razem, jedna linia, która ma znaczenie - zmieniony przez kogoś typ uruchomienia - ginie pod czterdziestoma, które go nie mają.
  • To, czego nie dało się porównać, jest wypisane, a nie ukryte. Pole, którego jeden z dwóch snapshotów nigdy nie odczytał, bo tamta sesja nie miała do niego praw, wychodzi jako nieporównane pod swoim wpisem, a podsumowanie liczy takie wpisy.
  • Snapshot elewowany wobec nieelewowanego kłamałby, zgłaszając jako usunięte wpisy, których nikt nie usunął. Każdy plik zapisuje, czy konto, które go zrobiło, było administratorem, i porównanie to mówi.
  • Dwa pliki, nie tylko plik i ta maszyna. Zrób jeden na testowej i jeden na produkcyjnej, a potem porównaj gdziekolwiek - odpowiedź na czym różni się środowisko testowe nie potrzebuje żadnej z tych maszyn pod ręką.

Okno robi to samo pod Audit.... Take snapshot... zapisuje ten sam plik, z notatką, jeśli ją wpiszesz, a Compare with this machine... albo Compare two snapshots... pokazuje w miejscu listy, co się zmieniło - jeden wiersz na pole, a nad tabelą wszystko, przez co porównanie nie jest dokładne. Show zawęża je do różnic albo do jednego pola, a Export... zapisuje je do pliku CSV.

Kod wyjścia jest tu sednem

--exit-code kończy kodem 5, gdy różni się konfiguracja - wpis doszedł albo zniknął, albo jest ustawiony inaczej. Usługa, która tylko sama się zatrzymała albo uruchomiła, jest w raporcie i się nie liczy, podobnie jak kopie per-użytkownik, które Windows robi dla każdej zalogowanej sesji - te są pomijane i policzone. To nie jest porażka - dryf jest tym, czego to narzędzie szuka, a znalezienie go nie jest porażką - i dlatego ma własny numer, zamiast pożyczać ten, który znaczy, że coś poszło źle.

# w dniu, w którym maszyna wchodzi do pracy
bws snapshot create C:\baselines\web01.json --note "after the build"

# co noc, z zadania harmonogramu
bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
#   0 - konfiguracja się nie rozjechała
#   5 - konfiguracja się rozjechała, a drift.json mówi co
#   3 - wykonało się i nie wszystko dało się odczytać, więc odpowiedź jest częściowa

To cały mechanizm: punkt odniesienia wzięty, gdy maszyna była dobra, i pytanie zadawane co noc. Pierwszej nocy, w której odpowiedź brzmi 5, ktoś się o tym dowiaduje - zamiast rano tego dnia, w którym coś przestanie działać.

Jak użyć tego do audytu