macOS – Apple Unified Log
Napisał: Patryk Krawaczyński
05/03/2021 w Techblog Brak komentarzy. (artykuł nr 774, ilość słów: 815)
F
irma Apple ogłosiła wprowadzenie formatu AUL (ang. Apple Unified Log) na swojej konferencji dla developerów w 2016 roku – WWDC. Przed AUL system macOS opierał się na tradycyjnych formatach rejestrowania systemu Unix, takich jak syslog lub własnym – Apple System Log (ASL). Jednak Apple doszło do wniosku, że potrzebuje jednego, znormalizowanego formatu rejestrowania na platformach macOS, iOS, tvOS i watchOS. Zmiana została wprowadzona od wersji macOS 10.12 Sierra. Format cały czas poddawany jest ewolucji np. liczba zdefiniowanych logowanych pól od czasu wydania Sierry do Cataliny (10.15) wzrosła z 16 do 27. W formacie AUL firma Apple poprawiła kompresję logowanych danych, przechodząc do formatu binarnego, co pozwala na zmaksymalizowanie gromadzenia dużej ilości informacji przy jednoczesnym zminimalizowaniu efektu obserwatora.
Zbierane dane są zapisywane w formacie logarchive
. Ze względu na swoją unikalną strukturę binarną AUL składa się z wielu plików. Można je podzielić na dwie grupy: pliki .tracev3
, które można znaleźć w katalogu /var/db/diagnostics
oraz pliki pomocnicze, znajdujące się w katalogu /var/db/uuidtext
. I tutaj dochodzimy do tematu retencji danych. Zajętość tych katalogów powinna wahać się od 400 – 800 MB. Oprócz zajętości innymi kryteriami są: liczba rekordów (30 – 50 milionów) lub czas (28 – 30 dni). Jeśli chcesz zobaczyć ile Twój system produkuje logów wpisz w terminalu:
log stream
lub uruchom program Console.app jeśli wolisz GUI. Do odpytywania o konkretne logi możemy użyć polecenia:
log show
Najczęściej będziemy odpytywać o datę (timestamp), proces (process) oraz wiadomość (eventMessage). Kilka przykładowych zapytań, które pomogą nam ustalić co się działo w systemie:
Do jakich sieci WiFi łączył się nasz system w ciągu jednego dnia:
log show --style syslog --predicate 'eventMessage CONTAINS "WiFi join started"' --last 1d
2021-02-06 11:50:35.001761+0100 localhost rapportd[798]: (CoreUtils) [com.apple.CoreUtils:CUWiFiManager] SysMon: WiFi join started: SSID "fsck.off"
Kiedy włączył się nam wygaszacz ekranu:
log show --style syslog --predicate 'processImagePath contains "loginwindow" and eventMessage CONTAINS "began service screensaver"' --info --debug
2021-02-21 14:37:08.453991+0100 localhost loginwindow[312]: [com.apple.loginwindow.logging:Standard] -[LWPAMManager _beginServiceNamed:] | began service screensaver
Jakie aplikacje były odpalane z poziomu Dock’a:
log show --style syslog --predicate 'processImagePath contains "Dock" and eventMessage CONTAINS "LAUNCHING"' --info --debug
2021-02-21 14:08:40.126647+0100 localhost Dock[841]: (LaunchServices) [com.apple.processmanager:front-35286506] LAUNCHING:0x0-0x3c03c iTerm 2021-02-21 14:53:17.964021+0100 localhost Dock[841]: (LaunchServices) [com.apple.processmanager:front-35286506] LAUNCHING:0x0-0x4a04a Brave Browser
Jakie aplikacje były odpalane ze Spotlight:
log show --style syslog --predicate 'process = "loginwindow" AND eventMessage CONTAINS "entered. checking app"' --info --debug
2021-02-21 16:15:20.013792+0100 localhost loginwindow[312]: [com.apple.loginwindow.logging:TAL] -[PersistentAppsSupport appShouldBeRelaunched:] | entered. checking app: Preferencje systemowe
Kiedy podłączyliśmy lub odłączyliśmy słuchawki do wejścia Jack:
log show --style syslog --predicate 'process = "kernel" AND eventMessage CONTAINS "handleJack"' --info --debug
2021-02-21 15:15:19.536985+0100 localhost kernel[0]: (AppleHDA) - AppleHDAMikeyInternalCS8409::handleJackDetectUR () 2021-02-21 15:18:23.998080+0100 localhost kernel[0]: (AppleHDA) + AppleHDAMikeyInternalCS8409::handleJackDisconnectUR ()
Co i kiedy podłączaliśmy do USB-C:
log show --style syslog --predicate 'process = "icdd" AND eventMessage CONTAINS "USB"' --info --debug
2021-02-21 13:57:58.735776+0100 localhost icdd[900]: [com.apple.imagecapture:icdd] Added | [USB][ Apple T1 Controller ] ( 0, 0, 0) @ 0x14100000 2021-02-21 16:26:13.992399+0100 localhost icdd[900]: [com.apple.imagecapture:icdd] Added | [USB][ My Passport 25E1 ] ( 0, 0, 0) @ 0x110000
Jakie aplikacje działały w tyle o danej porze, gdy używaliśmy CMD+Tab:
log show --style syslog --predicate 'process = "loginwindow" AND eventMessage CONTAINS "BackgroundState"' --info --debug
2021-02-21 15:34:00.996079+0100 localhost loginwindow[312]: [com.apple.loginwindow.logging:TAL] - [PersistentAppsSupport saveLogoutPersistentState:finalSnapshot:] | Contents:( { BackgroundState = 2; BundleID = “org.mozilla.firefox"; Hide = 0; Path = "/Applications/Firefox.app"; }
Jeśli interesuje nas dane zdarzenie to przepis jest prosty. Uruchamiamy log stream – generujemy daną akcję i wyszukujemy zdarzenie w logach. Przeszkujujemy archiwalne wpisy za pomocą log show. AUL wprowadził jeszcze jedną istotną zmianę – wpływa ona przede wszystkim na sposób rejestrowania poufnych informacji. Jeśli system operacyjny (lub twórca aplikacji) zdecyduje, że dane osobowe są rejestrowane, zastąpi je frazą: <private>
. Oznacza to, że dane te nie mogą być przez inne aplikacje w systemie, ale także użytkownik nie ma do nich dostępu. Jeśli chcemy odsłonic tego typu wpisy musimy zaimportować profil (dot. Catalina 10.15.3+). Dla poprzednich wersji (Sierra / Mojave) obowiązuje polecenie:
sudo log config --mode "private_data:on"
lub program PrivateLogs. Tak wyglądają zapytania DNS przed uruchomieniem prywatnych wpisów w logach:
[com.apple.mDNSResponder:Default] [Q10205] DNS Query (35) (flags 0100) RCODE: NoErr (0) RD: <private> 0/0/0 <private> [com.apple.mDNSResponder:Default] [Q36773] DNS Query (35) (flags 0100) RCODE: NoErr (0) RD: <private> 0/0/0 <private>
Po wyłączeniu wpisów dla trybu prywatnego:
[com.apple.mDNSResponder:Default] [Q29345] DNS Query (51) (flags 0100) RCODE: NoErr (0) RD: www.google.pl. A? 0/0/0 [com.apple.mDNSResponder:Default] [Q55475] DNS Query (51) (flags 0100) RCODE: NoErr (0) RD: www.google.pl. AAAA? 0/0/0
Jeśli interesują nas zapytania DNS w czasie rzeczywistym możemy wkorzystać log stream:
log stream --predicate 'process = "mDNSResponder" AND eventMessage CONTAINS "DNS Query"'
[com.apple.mDNSResponder:Default] [Q26536] DNS Query (25) (flags 0100) RCODE: NoErr (0) RD: onet.pl. A? 0/0/0 [com.apple.mDNSResponder:Default] [Q78] DNS Query (29) (flags 0100) RCODE: NoErr (0) RD: www.onet.pl. A? 0/0/0
Więcej informacji: man log, Finding Waldo: Leveraging the Apple Unified Log for Incident Response, Show private log messages in Catalina’s Console.app