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ą.

Kod wyjścia jest tu sednem

--exit-code kończy kodem 5, gdy cokolwiek się różni. 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 - nic się nie różni
#   5 - coś się różni, 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ć.

Czego to jeszcze nie robi

Druga połowa historii o audycie nie jest zbudowana, a powiedzenie tego jest tańsze niż odkrycie tego przez kogoś samodzielnie.

  • Snapshoty są tylko w wierszu poleceń. Okno pokazuje, szuka i zmienia, a snapshotów nie robi ani nie porównuje.
  • Nie ma dziennika zmian. Kto zmienił typ uruchomienia i kiedy - dziennik zdarzeń nie jest jeszcze czytany. Snapshot przy wdrożeniu i różnica wobec maszyny odpowiadają na co się zmieniło, czyli na większość pytania.
  • Nie ma wzorca czystego Windowsa. Które z nich nie pochodzą z czystej instalacji nie jest liczone, więc punktem odniesienia musi być snapshot, który sam zrobiłeś.
  • Nie ma przywracania. Różnica mówi, co się rozjechało, a przywrócenie robi się ręcznie albo skryptem z komend, które ta różnica pokazuje.
Jak użyć tego do audytu