PO CO 'fixowner'? Program 'fixowner' służy rozwiązaniu jednego z dwóch problemów, powszechnie występujących w konfiguracjach współdzielonych serwerów WWW, gdzie wielu uzytkowników chce uruchamiać swoje własne skrypty serwerowe (np. PHP lub CGI), które zapisują pliki na dyskach serwera. Skrypty z reguły działają z uprawnieniami użytkownika, pod którym działa serwer WWW (zazwyczaj "nobody"). Tak więc aby zapisać dane, użytkownik "nobody" musi mieć prawo zapisu w odpowiednim katalogu bądź pliku. To jest pierwszy problem, ponieważ model uprawnień systemów *nixowych (właściciel/ grupa/inni) nie pozwala na jawne wyspecyfikowanie uprawnień dla konkretnego użytkownika. Czasami można znaleźć w Sieci porady, aby ustawić prawa dostępu do pliku/katalogu na 777 (wszystkie prawa dla wszystkich). To jest jednak bardzo mało bezpieczne, ponieważ pozwala nie tylko użytkownikowi serwera WWW, ale KAŻDEMU użytkownikowi systemu zmodyfikować COKOLWIEK w tym katalogu. Zdecydowanie nie tego chcemy. Można w miarę prosto rozwiązać ten problem, jako ze uzytkownik "nobody" zazwyczaj jest członkiem specjalnej grupy "nobody", tak więc interesujący nas plik/katalog można przypisać do tej grupy, po czym ustawić prawo zapisu dla grupy, jak w tym przykładzie: drwxrwx--- 2 raj nobody 512 May 3 21:12 upload Niestety jednak zwykły użytkownik nie może zmienić grupy pliku czy katalogu na grupę, do której sam nie należy - to może zrobić tylko administrator (zaś użytkownicy nie powinni należeć do grupy "nobody", gdyż w przeciwnym razie znów będziemy mieć pełny dostęp dla wszystkich, podobnie jak w konfiguracji z prawami 777). Sprawę załatwia nam komenda "sudo", która pozwala użytkownikom wykonywać wybrane polecenia z uprawnieniami root-a (albo innego użytkownika). Wiele systemów *nixowych ma już "sudo" domyślnie zainstalowane; jeżeli nie, pakiet sudo można pobrać ze strony http://www.sudo.ws/. Aby zezwolić użytkownikom na zmianę grupy dowolnego pliku bądź katalogu na "nobody", umieść poniższy wiersz w pliku /etc/sudoers (czy gdzie tam znajduje się u Ciebie plik konfiguracyjny sudo): ALL ALL = NOPASSWD: /usr/bin/chgrp nobody * (zmień odpowiednio ścieżkę jeżeli komenda "chgrp" nie znajduje się w /usr/bin) Użytkownicy będą mogli wówczas zmienić grupe dowolnego pliku/katalogu na "nobody", będą tylko musieli użyć komendy "sudo chgrp nobody plik" zamiast po prostu "chgrp nobody plik". Jednak jeśli uporamy się z tym problemem, pojawia się następny. Pliki, które już zostały zapisane do katalogu przez skrypty WWW, są własnością użytkownika "nobody", tak jak tu: -rwxr-xr-x 1 nobody nobody 3741 Jan 6 18:24 smile.jpg A to oznacza, że jeżeli zechcesz zmodyfikować ten plik ze swojego konta (np. za pomocą komend shella lub poprzez FTP), to się nie da! Tylko użytkownik "nobody" ma prawo zapisu do pliku, i co więcej, tylko użytkownik "nobody" jako właściciel pliku może zmieniać do niego prawa dostępu. W tej sytuacji sudo nie pomoże, i tu właśnie przydaje się mój program 'fixowner'. Pozwala on "odebrać" plik, który jest własnością użytkownika "nobody". Właściciel pliku zostanie zmieniony na właściciela katalogu, w którym znajduje się plik, jeżeli spełnione będzie kilka warunków. Po pierwsze, plik *musi* być własnością użytkownika "nobody". Program w żadnej sytuacji nie zmieni własności żadnego pliku należącego do innego użytkownika niż "nobody". Po drugie, program musi być uruchamiany przez użytkownika root, tego samego użytkownika, który jest właścicielem katalogu zawierającego plik bądź przez użytkownika "nobody" (ta ostatnia możliwość pozwala na wywoływanie programu ze skryptów serwerowych, aby np. skorygować własność pliku bezpośrednio po jego zapisaniu na serwer). Po trzecie, program nie działa na linkach symbolicznych ani żadnych innych obiektach, które nie są zwykłymi plikami bądź katalogami (urządzenia znakowe, potoki itp.) SPOSÓB UŻYCIA Program wywołuje się poleceniem fixowner [-d] plik ... 'Plik' może odwoływać się do faktycznego pliku albo katalogu. Jeżeli podany zostanie plik, program zmieni właściciela pliku na właściciela katalogu zawierającego plik. Np. polecenie "fixowner /home/user/uploads/image.jpg" zmieni właściciela pliku "image.jpg" na tego samego użytkownika, który jest właścicielem katalogu "/home/user/uploads" (oczywiście zakładając, że aktualnym właścicielem pliku jest "nobody"). Jeżeli podamy nazwę katalogu, program zmieni własność wszystkich plików w tym katalogu, które należą do użytkownika "nobody", na właściciela katalogu, o ile nie została użyta opcja "-d". Z opcją "-d", katalogi są traktowane dokładnie tak samo jak pliki, tzn. właściciel samego katalogu (jeżeli jest nim "nobody") zostanie zmieniony na właściciela katalogu nadrzędnego. Pliki wewnątrz katalogu nie będą modyfikowane. W jednej komendzie można podac wiele nazw plików/katalogów. Program zmienia tylko właściciela pliku/katalogu, nie zmienia grupy. INSTALACJA Źródło składa się z trzech plików: fixowner.c, myname.c i (opcjonalnie) strlcpy.c. Niketóre systemy *nixowe mają w standardowej bibliotece funkcje strlcpy() i strlcat(), a inne nie. (Są to bardzo użyteczne funkcje - w pliku strlcpy.doc załączono ich dokumentację zaczerpniętą z manuala systemowego Solarisa) Nie ma pliku makefile, bo nie jestem dobry w pisaniu takich plików ;). Jeżeli w systemie masz funckej strlcpy() i strlcat(), aby skompilować program napisz gcc -o fixowner fixowner.c myname.c Jeżeli nie masz tych dwu funkcji, użyj polecenia gcc -DHAVE_NO_STRLCPY -o fixowner fixowner.c myname.c strlcpy.c Jeżeli nazwa użytkownika serwera WWW w Twoim systemie jest inna niż "nobody" (jak np. "apache" albo "wwwdata" w niektórych instalacjach Linuxa), zmień odpowiednio wartość w #define NOBODY w pliku fixowner.c przed kompilacją. Umieść plik wynikowy "fixowner" w jakimś katalogu znajdującym sie na ścieżce wyszukiwania (sugerowany /usr/local/bin) i - to najważniejsze - ustaw mu bit setuid (wykonaj jako root komendę "chmod u+s /usr/local/bin/fixowner"). Program nie będzie działał prawidłowo, jeżeli nie będzie miał ustawionego bitu setuid (tylko użytkownik root będzie mógł wtedy go używać). LICENCJA Ten program jest rozpowszechniany na licencji GNU GPL, zobacz stronę http://www.gnu.org/licenses/ dla uzyskania dokładniejszych informacji. Copyright (C) Jarosław Rafa, 2008. email: raj@ap.krakow.pl