NFsec Logo

Fałszywy rozmiar pliku /var/log/lastlog

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

Kategorie K a t e g o r i e : Administracja, Debug

Tagi T a g i : , , , , ,

Brak nowszych postów

Komentowanie tego wpisu jest zablokowane.