Linux oferuje trzy typy specjalnych uprawnień bitowych, które mogą być ustawione na plikach i katalogach:
# setuid |
4 | set user identifier bit | bit identyfikatora użytkownika |
# setgid |
2 | set group identifier bit | bit identyfikatora grupy |
# sticky |
1 | sticky bit | klejący bit |
Bit setuid na plikach wykonywalnych
Flaga setuid jest ustawiana na plikach wykonywalnych na poziomie właściciela pliku. Plik wykonywalny z ustawionym bitem setuid jest wykonywany przez zwykłych użytkowników z takimi przywilejami jakie posiada właściciel pliku. Najczęściej spotykanym przykładem jest komenda su, której właścicielem jest root. Komenda ta ma domyślnie ustawiony bit setuid.
1 2 |
# ll /usr/bin/su -rwsr-xr-x. 1 root root 32072 2016-08-02 /usr/bin/su |
Gdy zwykły użytkownika wykonuje tą komendę zostania ona uruchomiona tak jak gdyby root (właściciel) ją uruchomił.
Komenda su (switch user) pozwala użytkownikowi na przełączenie się na konto innego użytkownika pod warunkiem, że zna on hasło tego innego użytkownika.
Usuńmy bit setuid z polecenia su:
1 2 3 |
# chmod u-s /usr/bin/su # ll /usr/bin/su -rwxr-xr-x. 1 root root 32072 2016-08-02 /usr/bin/su |
Plik jest wciąż wykonywalny ale nie ma bitu setuid (s), będzie to zapobiegać przed przełączaniem się zwykłych użytkowników na konta innych użytkowników tak jakby utracili specjalne uprawnienia:
1 |
$ su –</code> <code>Password:</code> <code>su: Authentication failure |
Użytkownik otrzymuje komunikat o braku możliwości autentykacji pomimo, że wpisał prawidłowe hasło.
Zresetujmy teraz bit setuid na komendzie su:
1 2 3 |
# chmod 4755 /usr/bin/su # ll /usr/bin/su -rwsr-xr-x. 1 root root 32072 2016-08-02 /usr/bin/su |
Możemy to zrobić korzystając także z notacji symbolicznej:
1 |
# chmod u+s /usr/bin/su |
Możemy przeszukać wszystkie pliki naszego systemu w poszukiwaniu plików posiadających ustawiony bit setuid:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# find / –perm –4000 /usr/bin/fusermount /usr/bin/umount /usr/bin/mount /usr/bin/chage /usr/bin/gpasswd /usr/bin/newgrp /usr/bin/chfn /usr/bin/chsh /usr/bin/su /usr/bin/pkexec /usr/bin/crontab . . . |
Bit setgid na plikach wykonywalnych
Bit setgid ustawiany jest na plikach wykonywalnych na poziomie grupy. Z ustawionym bitem setgid plik jest wykonywany przez użytkowników, którzy nie są jego właścicielami, z przywilejami użytkowników należących do grupy.
Przykładem programu z ustawionym bitem setgid jest wall, którego właścicielem jest root a grupa, do której należy to tty.
1 2 |
# ll /usr/bin/wall -r-xr-sr-x. 1 root tty 15344 Jan 27 2014 /usr/bin/wall |
Wall to program, który rozgłasza komunikaty wszystkim zalogowanym użytkownikom i drukuje je na terminalach użytkowników.
1 |
$ wall Hello, this is to test the setgid flag on the wall command Broadcast message from user1@host1.example.com (pts/0) (Mon Dec 1 11:26:24 2014): Hello, this is to test the setgid flag on the wall command |
Usuńmy bit setgid z /usr/bin/wall
:
1 2 |
# chmod g-s /usr/bin/wall -r-xr-xr-x. 1 root tty 15344 Jan 27 2014 /usr/bin/wall |
Użytkownicy, którzy nie są właścicielem programu wall (wszyscy poza rootem) utracili teraz przywilej rozgłaszania komunikatów.
Przypiszmy z powrotem bit setgid:
1 2 |
# chmod 2555 /usr/bin/wall # ll /usr/bin/wall -r-xr-sr-x. 1 root tty 15344 Jan 27 2014 /usr/bin/wall |
lub notacja symboliczna:
1 |
# chmod g+s /usr/bin/wall |
Przeszukajmy nasz system w poszukiwaniu plików z ustawionym bitem setgid:
1 2 3 4 5 6 7 8 9 |
# find / –perm –2000 /run/log/journal /run/log/journal/03858cff4a7b482e8b70a7cea28585b5 /usr/bin/wall /usr/bin/write /usr/bin/ssh-agent /usr/bin/locate /usr/sbin/netreport ... |
Bit setgid na współdzielonych katalogach
Bit setgid może być ustawiany na katalogach współdzielonych przez grupę aby pliki i podkatalogi automatycznie dziedziczyły grupę przypisaną do katalogu. Członkowie grupy, która współdzieli dany katalog nie muszą dzięki temu ręcznie zmieniać grupy na każdym nowo utworzonym pliku lub katalogu.
Ćwiczenie.
1. Dodaj grupę sdatagrp z GID 9999 :
1 |
# groupadd –g 9999 sdatagrp |
2. Uczyń użytkowników user100 i user200 członkami grupy sdatagrp:
1 2 |
# usermod –G sdatagrp user100 # usermod –G sdatagrp user200 |
3. Utwórz katalog /sdata
:
1 |
# mkdir /sdata |
4. Dla katalogu /sdata
właścicielem ma być root a grupą sdatagrp:
1 2 |
# chown root:sdatagrp /sdata –v changed ownership of ‘/sdata’ from root:root to root:sdatagrp |
5. Ustaw bit setgid na katalogu /sdata
:
1 2 |
# chmod g+s /sdata –v mode of ‘/sdata’ changed from 0755 (rwxr-xr-x) to 2755 (rwxr-sr-x |
6. Zweryfikuj atrybuty ustawione w powyższych krokach:
1 2 |
# ll –d /sdata drwxrws---. 2 root sdatagrp 18 Dec 1 14:06 /sdata |
7. Przełącz się lub zaloguj jako user100 i wejdź do katalogu /sdata
:
1 |
# su – user100 ; cd /sdata |
8. Utwórz plik i wylistuj go:
1 2 3 |
# touch file1 # ls –l file1 -rw-rw-r--. 1 user100 sdatagrp 0 Dec 1 14:06 file1 |
Obaj członkowie grupy mogą teraz tworzyć i modyfikować pliki w katalogu /sdata
. Będą oni właścicielami plików ale będą one przynależeć do grupy sdatagrp.
Klejący bit w katalogach dostępnych publicznie
Klejący bit ustawiany jest w katalogach, w których wszyscy użytkownicy mogą zapisywać dane aby zabezpieczyć pliki i podkatalogi należące do zwykłych użytkowników przed skasowaniem lub przeniesieniem przez innych użytkowników.
Ten atrybut ustawiony jest na katalogu /tmp
i /var/tmp
:
1 2 3 |
# ll -d /tmp /var/tmp drwxrwxrwt. 12 root root 4096 03-13 21:29 /tmp drwxrwxrwt. 6 root root 4096 03-13 21:29 /var/tmp |
Do ustawiania tego atrybutu można używać polecenia chmod:
1 2 |
# ll -d /var drwxr-xr-x. 24 root root 4096 03-12 03:52 /var # chmod 1755 /var -v uprawnienia do „/var” zmienione z 0755 (rwxr-xr-x) na 1755 (rwxr-xr-t) # ll -d /var drwxr-xr-t. 24 root root 4096 03-12 03:52 /var |
Notacja symboliczna:
1 |
# chmod o+t /var |
Usuwanie klejącego bitu:
1 |
#</code>chmod 755 /var mode of ‘/var’ changed from 1755 (rwxr-xr-t) to 0755 (rwxr-xr-x) # chmod o-t /var |
Wyszukiwanie w systemie plików z ustawionym klejącym bitem:
1 2 3 4 5 6 7 8 9 10 11 12 |
# find / –type d –perm –1000 /dev/mqueue /dev/shm /tmp /tmp/.X11-unix /tmp/.ICE-unix /tmp/.XIM-unix /tmp/.font-unix /tmp/.Test-unix /tmp/systemd-private-vPX96e /tmp ... |