chown nowe (10)





6. 10.1 Zmiana wlasciciela - funkcja chown()





Do spisu tresci tematu 6

6.10.1 Zmiana wlasciciela - funkcja chown()



Spis tresci


Wstep.

Objasnienia.

Struktura iattr.

Funkcja chown.

Funkcja notify_change.

Zrodla informacji

Pytania i odpowiedzi





Wstep

Duzo tego wyszlo o tej funkcji, ale nie trzeba w to sie wgryzac. Wystarczy,
moim zdaniem, wiedziec, ze zeby zmienic wlasciciela pliku, trzeba byc superuserem
dla systemu plikow (fsuid=0), wlasciciel nie moze komus pliku swojego oddac.
Moze on sie nim za to bawic zmieniajac wlasciciela na siebie - funkcja
nie zwroci bledu. Do grupy tyczy sie to samo, jednak z kodu zrodlowego
to tak latwo nie wynika. Jest to troche namieszane, dlatego ze zmieniajac
grupe, funkcja chown zmienia tez czas modyfikacji, i o ile do
samej zmiany grupy nie musimy byc wlascicielem, to zeby zmieniac czas,
musimy. Wiec zasady sa tylko dwie: dotychczasowy wlascicel lub superuser
moze zmieniac grupe pliku, z tym, ze jesli to wlasciciel, to musi jeszcze
nalezec do grupy, na ktora zmienia.




Objasnienia.

W Linuxie pewne pliki moga miec szczegolne wlasciwosci, o ktorych mowi
pole inode->flags. Naleza do nich:


immutable - nikt nie dostaje do niego
prawa do pisania, moga byc tylko czytane (np. czule pliki konfiguracyjne)


append-only - moga byc otwierane w
trybie pisania, ale dane sa zawsze dodawane na koncu pliku. Pliki te nie
moga byc usuwane, ani ich nazwy zmieniane (np. pliki zalogowania - log
files - one moga tylko rosnac).





Struktura iattr

struct iattr {


unsigned int ia_valid; /* bity mowia, co chcemy zmienic */


umode_t ia_mode; /* nowy tryb dostepu dla i-wezla */

uid_t ia_uid; /* nowy uid */

gid_t ia_gid; /* nowy gid */

... (i inne, np. czas dostepu i modyfikacji i-wezla)


};

Ta struktura sluzy do wymiany atrybutow i-wezla miedzy funkcjami wirtualnego
(np. chown), a konkretnego file-systemu (np. notify_change).





Funkcja chown.

DEFINICJA: int chown (const char *filename, uid_t user,
gid_t group);

DZIALANIE: zmiana wlasciciela i grupy dla pliku (inode->uid,
inode-> gid). Dzialanie jej jest kilkupoziomowe. Najpierw przypisujemy
wszystkie nowe atrybuty do struktury iattr
, zaznaczamy w niej co chcemy zmieniac i wywolujemy notify_change, ktora
wywoluje funkcje sprawdzajace prawa i dokonujace wlasciwych zmian.

ARGUMENTY: nazwa pliku, nowy uid i gid dla pliku

WYNIK: blad

ALGORYTM:

{


Przeksztalc nazwe sciezkowa pliku w i-wezel;

Jesli


file-system jest zamontowany tylko do czytania lub

i-wezel jest immutable lub append-only,

to: zwolnij i wezel (pobrany w namei) - funkcja iput - i wyjdz;


Jesli user=-1, to wez starego wlasciciela;

Jesli group=-1, to wez stara grupe;

Podstaw tryb dostepu (pobrany z i-wezla), user oraz group do struktury
iattr;

Zaznacz w niej, ze chcemy zmienic te rzeczy i czas (dostepu i modyfikacji
pliku);

Jesli podales nowego wlasciciela (a nie dotychczasowego), to usuwamy
bit setuid;

Jesli podales nowa grupe i jest prawo wykonywania dla grupy, i jest
ustawiony bit setgid, to usun ten ostatni bit (na razie w polu iattr->ia_mode
- potem, o ile mamy odpowiednie uprawnienia, zmiana dokona sie w i-wezle).
Z tym bitem setgid chodzi o to, zeby nie zniszczyc kandydata na obowiazkowe
blokowanie (mandatory locking) - a jest on wtedy, gdy nie ma prawa wykonywania
dla grupy, ale jest ustawiony bit setgid.;

Zaznacz i-wezel na brudny;

Jesli system z quota'mi, to:


przepisz ilosc blokow pliku do quoty nowego usera;

wykonaj notify_change;

jesli funkcja zwrocila blad, to przepisz quote z powrotem;


Jesli system bez quot, to zrob tylko notify_change;

Zwolnij i-wezel (iput).


}




Zeby bylo wiadomo, jak to Linux robi, trzeba jeszcze wyjasnic:

funkcja notify_change

DEFINICJA: int notify_change (inode *inode, struct iattr *iattr);


DZIALANIE: sprawdzenie uprawnien procesu wolajacego, zmiana atrybutow
i-wezla.

ARGUMENTY: i-wezel i nowe dla niego atrybuty.

WYNIK: blad

ALGORYTM:

{


Ustaw czas ostatniej modyfikacji i-wezla (iattr->ia_ctime) na
obecny;

Jesli konkretny file-system ma swoje notify_change, to je wykonaj
i wyjdz. Inaczej (by default) wykonaj nastepne kroki:

Sprawdz, czy mozna zmienic prawa, wykonujac funkcje:

inode_change_ok(inode, iattr):

{


Zerowa zasada: superuser dla file-systemu moze wszystko! Jest tak,
gdy fsuid procesu (efektywny identyfikator uzytkownika dla systemu plikow)
jest równy 0.

Pozostale zasady: (o tym, co chcemy zmieniac mówi pole iattr->ia_valid)



Jesli chcesz zmienic:


uid pliku - musisz zmieniac wlasciciela swojego pliku (current->
fsuid = inode->uid) na siebie (nie mozna plikow komus oddawac, jesli
sie nie jest superuserem)

grupe (gid) dla pliku, musisz nalezec do grupy docelowej
(nie musisz byc wlascicielem) lub zmieniac na grupe dotychczasowa.

slowo dostepu, musisz byc wlascicielem. Uwaga:


jesli nie nalezysz do grupy, na ktora chcesz zmienic, to bit setgid
zostanie wyzerowany. Stanie sie tak rowniez, gdy nie chcesz zmieniac grupy
(ale chcesz prawa dostepu) i nie nalezysz do dotychczasowej grupy pliku.



czas modyfikacji pliku (mtime) lub dostepu do pliku (atime),
musisz posiadac ten plik.




}

Zmien i-wezel wykonujac procedure:

void inode_setattr(inode, iattr)

{


przypisuje wszystkie atrybuty na inode;

zaznacza i-wezel na brudny;

nie zwraca bledu!


}


}





Zrodla informacji

Tylko pliki zrodlowe Linuxa:



include/linux/fs.h


include/linux/kernel.h


fs/open.c (chown - glowna
czesc funkcji)

fs/inode.c (inode_change_ok)





Pytania i odpowiedzi

No problems detected.

(ogolne pytania p. Raczunasa sa na stronie write).




Autor: Mateusz Hauzer
E-mail: mhauzer@students.mimuw.edu.pl


tego samego autora: funkcja write.








Wyszukiwarka

Podobne podstrony:
chown nowe (2)
Rozporzadzenie nowe 10(1)
w3 nowe pol 10(1)
Gazeta Prawna Nowe prawo Przepisy z 10 czerwca 09 (nr 112)
Islamski Irak (organizacja) – nowe wyzwanie (31 10 2009)
NEXUS Nowe Czasy nr 10 2000 2
NEXUS Nowe Czasy nr 10 2000 2 nfo
10 dzieci nowe intern
WSM 10 52 pl(1)
VA US Top 40 Singles Chart 2015 10 10 Debuts Top 100

więcej podobnych podstron