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, iż jego zgłaszany rozmiar (np. przez polecenie ls) może być znacznie większy niż rzeczywista przestrzeń, jaką zajmuje na dysku.
Przykład:
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/lastlogW 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ć, iż zgłaszany rozmiar pliku będzie wydawał się bardzo duży, choćby jeżeli 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/lastlogO 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/lastlogAle 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/lastlogJeś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żeli 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).logprzed 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