Fałszywy rozmiar pliku /var/log/lastlog
Napisał: Patryk Krawaczyński
Wczoraj w Administracja, Debug Brak komentarzy. (artykuł nr 926, ilość słów: 559)
P
lik lastlog
, znajdujący się w ścieżce /var/log/lastlog, jest plikiem typu „niegęstego” (ang. sparse file), który próbuje wykorzystać przestrzeń systemu plików bardziej efektywnie, gdy sam plik jest częściowo pusty. Osiąga się to poprzez zapisywanie krótkich informacji (metadanych) reprezentujących puste bloki na nośniku danych zamiast rzeczywistej „pustej” przestrzeni, która tworzy blok, zużywając w ten sposób mniej miejsca. Pełny blok jest zapisywany na nośniku jako rzeczywisty rozmiar tylko wtedy, gdy blok zawiera „rzeczywiste” (niepuste) dane. Dla codziennego użytkowania systemu Linux oznacza to, że jego zgłaszany rozmiar (np. przez polecenie ls) może być znacznie większy niż rzeczywista przestrzeń, jaką zajmuje na dysku.
Przykład:
root@darkstar:~# ls -alh /var/log/lastlog -rw-rw-r-- 1 root utmp 286K May 18 17:46 /var/log/lastlog root@darkstar:~# du -h /var/log/lastlog 4.0K /var/log/lastlog
Dzieje się tak, ponieważ polecenie ls -alh zgłasza rozmiar pliku na podstawie przydzielonego miejsca na dysku, które może być znacznie większe niż rzeczywiste dane. W celu zobaczenia rzeczywistego wykorzystania przestrzeni możemy użyć polecenia:
root@darkstar:~# ls -alhs /var/log/lastlog 4.0K -rw-rw-r-- 1 root utmp 286K May 18 17:46 /var/log/lastlog
W dodatku plik lastlog został zaprojektowany do przechowywania informacji o logowaniach użytkowników, indeksowanych według identyfikatora użytkownika (ang. User ID – UID). Dlatego dodając do systemu użytkowników z wysokim numerem UID możemy sztucznie spowodować, że zgłaszany rozmiar pliku będzie wydawał się bardzo duży, nawet jeśli rzeczywiste dane są małe:
root@darkstar:~# useradd -u 666999666 sizebomb useradd warning: sizebomb's uid 666999666 outside of the UID_MIN 1000 and UID_MAX 60000 range. root@darkstar:~# ssh localhost -l sizebomb $ logout root@darkstar:~# last -1 sizebomb pts/2 127.0.0.1 Sun May 18 18:33 - 18:34 (00:00) root@darkstar:~# ls -alh /var/log/lastlog -rw-rw-r-- 1 root utmp 182G May 18 18:33 /var/log/lastlog root@darkstar:~# ls -alhs /var/log/lastlog 8.0K -rw-rw-r-- 1 root utmp 182G May 18 18:33 /var/log/lastlog
O ile „fałszywe” raportowanie zajętości przestrzeni nie przeszkadza w normalnym funkcjonowaniu systemu – to już wykonywanie „zewnętrznych” czynności na takich plikach tak. Na przykład polecenie kopiowania (cp) takiego pliku nie sprawi nam żadnego problemu:
root@darkstar:~# time cp /var/log/lastlog /tmp/lastlog real 0m0.005s user 0m0.002s sys 0m0.003s root@darkstar:~# ls -alhs /tmp/lastlog 8.0K -rw-r--r-- 1 root root 182G May 18 20:53 /tmp/lastlog
Ale już jego synchronizacja przez standardowo użyte polecenie rsync (często wykorzystywane do kopii zapasowych) tak:
root@darkstar:~# rsync -v --info=progress --info=name /var/log/lastlog /tmp/lastlog lastlog 17,329,913,856 8% 189.67MB/s 0:15:13 rsync: [receiver] write failed on "/tmp/lastlog": No space left on device (28) rsync error: error in file IO (code 11) at receiver.c(381) [receiver=3.2.7]
Dopiero użycie parametru --sparse
daje efekt podobny do polecenia cp (chociaż czasy wykonania są nieporównywalne):
root@darkstar:~# rsync -v --sparse --info=progress --info=name /var/log/lastlog /tmp/lastlog lastlog 194,763,902,764 100% 289.08MB/s 0:10:42 (xfr#1, to-chk=0/1) sent 194,811,452,625 bytes received 35 bytes 302,737,300.17 bytes/sec total size is 194,763,902,764 speedup is 1.00 root@darkstar:~# ls -alhs /tmp/lastlog 8.0K -rw-r--r-- 1 root root 182G May 18 21:23 /tmp/lastlog
Jeśli używamy narzędzi, które nie posiadają wsparcia dla „niegęstych” plików to możemy wykluczyć plik /var/log/lastlog
z ich aktywności. Jeśli potrzebujemy jego zawartości dla celów audytowych to możemy rozważyć tworzenie jego kopii poprzez polecenie:
lastlog > /var/log/lastlog_$(date +%d%m%Y).log
przed każdym użyciem narzędzia lub cyklicznym zadaniem w crontab. Oczywiście jest to skrajny przypadek użycia wysokich wartości UID, ale spotykany np. przy integracji systemów Linux z Active Directory lub z ogromną ilością lokalnych użytkowników.
Więcej informacji: man lastlog, man pam_lastlog, Is there a reason why /var/log/lastlog is a huge sparse file, You may not want your lastlog in your Linux Forensics journey
Poprzedni wpis Brak nowszych postów