Pregled prava pristupa — kako se čita rwxr-xr--

Deset znakova na početku svakog reda u ls -l govore ko šta sme sa tim fajlom. Kad ih naučiš da čitaš, prestaju da budu šifra — a većina poruka Permission denied dobija očigledan uzrok.

Ova stranica je o čitanju dozvola. Menjanje je na stranicama chmod i Podešavanje prava pristupa.

Deset znakova

$ ls -l izvestaj.txt
-rw-r--r-- 1 alen urednici 284 Aug 22 10:15 izvestaj.txt

Prvi deo se čita kao 1 + 3 + 3 + 3:

-  rw-  r--  r--
│   │    │    │
│   │    │    └── ostali
│   │    └─────── grupa
│   └──────────── vlasnik
└──────────────── tip fajla

Prvi znak: tip

- običan fajl
d direktorijum
l simbolički link
b / c blokovski / znakovni uređaj (u /dev)
s / p soket / imenovana cev

Tri trojke: ko

Redom: vlasnik fajla, grupa kojoj fajl pripada, i ostali — svi koji nisu ni jedno ni drugo.

U primeru iznad vlasnik je alen, grupa urednici.

Tri slova: šta

r Fajl: čitanje sadržaja. Direktorijum: listanje imena unutra.
w Fajl: izmena sadržaja. Direktorijum: pravljenje, brisanje i preimenovanje fajlova u njemu.
x Fajl: pokretanje. Direktorijum: ulazak i pristup fajlovima unutra.
- nema tog prava

Desna kolona je najvažnija stvar na stranici: ista slova znače različite stvari za fajl i za direktorijum. Na tome se lome skoro sve zabune.

Kako sistem odlučuje

Provera ide redom i staje na prvom poklapanju:

  1. Jesi li vlasnik? Primenjuje se prva trojka. Kraj.
  2. Jesi li u grupi fajla? Primenjuje se druga trojka. Kraj.
  3. Inače važi treća trojka.

Reč kraj je bitna, jer daje neočekivan rezultat:

$ ls -l tajna.txt
----rw-rw- 1 alen urednici 128 Aug 22 11:02 tajna.txt

$ whoami
alen
$ cat tajna.txt
cat: tajna.txt: Permission denied

Alen je vlasnik, njegova trojka je ---, i tu se provera završava. To što grupa i ostali imaju rw ne pomaže — ostale trojke se ne gledaju.

Ovo je jedini slučaj u kome vlasnik ima manje prava od stranca. Retko se dešava namerno, ali objašnjava naizgled nemoguću poruku.

Root ne prolazi kroz ovu proveru

$ sudo cat tajna.txt
prvi red

Za UID 0 kernel dozvole ne proverava. Detaljnije u lekciji Kontrola privilegija.

Brojčani zapis

Ista informacija, kraće. Svakom slovu pripada broj:

r = 4     w = 2     x = 1

Trojka je njihov zbir:

7 rwx — sve
6 rw- — čitanje i pisanje
5 r-x — čitanje i izvršavanje
4 r-- — samo čitanje
0 --- — ništa

Pa je rw-r--r-- zapravo 644, a rwxr-xr-x je 755.

Ne moraš računati napamet:

$ stat -c "%a %A %U %G %n" izvestaj.txt
644 -rw-r--r-- alen urednici izvestaj.txt

$ stat -c "%a %A" /var/www
775 drwxrwxr-x

Ovo je najbrži način da vidiš oba oblika odjednom.

Vrednosti koje ćeš sretati

644 Običan fajl. Vlasnik menja, ostali čitaju.
755 Skripta ili direktorijum. Svi mogu koristiti, samo vlasnik menja.
600 Privatno. SSH ključevi, fajlovi sa lozinkama.
664 / 775 Timski rad — grupa sme da menja.
777 Svi sve. Skoro nikad nije pravo rešenje.

Direktorijumi: gde se najviše greši

Ponovimo, jer je ovo suština:

  • r — smeš da vidiš imena fajlova
  • x — smeš da uđeš i pristupiš fajlu unutra
  • w — smeš da pravíš i brišeš fajlove

r bez x — vidiš imena, ali ništa više

$ ls -ld podaci
dr--r--r-- 2 alen alen 4096 Aug 22 12:00 podaci

$ ls podaci
ls: cannot access 'podaci/izvestaj.txt': Permission denied
izvestaj.txt

$ cd podaci
bash: cd: podaci: Permission denied

Ime se vidi, sve ostalo ne. Direktorijum bez x je praktično beskoristan — zato dozvole nad direktorijumima gotovo uvek imaju x tamo gde imaju r.

x bez r — prolaziš, ali ne listaš

$ ls -ld /home/marko
drwx--x--x 5 marko marko 4096 Aug 22 12:10 /home/marko

$ ls /home/marko
ls: cannot open directory '/home/marko': Permission denied

$ cat /home/marko/javno/podaci.txt
sadrzaj fajla

Ne možeš videti šta postoji, ali ako znaš tačno ime, dolaziš do fajla. Ovo je legitimna postavka — tako web server pristupa jednom direktorijumu, a ne vidi ostatak.

Za brisanje je bitan direktorijum, ne fajl

$ ls -l vazno.txt
-r--r--r-- 1 root root 1024 Aug 22 12:20 vazno.txt

$ ls -ld .
drwxrwxrwx 2 alen alen 4096 Aug 22 12:20 .

$ rm vazno.txt
rm: remove write-protected regular file 'vazno.txt'? y
$ ls vazno.txt
ls: cannot access 'vazno.txt': No such file or directory

Fajl je bio rootov i samo za čitanje — a obrisan je. Razlog: brisanje menja tabelu imena u direktorijumu, ne sam fajl. Objašnjenje je u lekciji Inode-ovi i linkovi, a zaštita od ovoga je sticky bit — otud t na /tmp.

Cela putanja mora biti prohodna

$ ls -l /podaci/tim/izvestaj.txt
-rw-rw-r-- 1 alen urednici 512 Aug 22 12:30 /podaci/tim/izvestaj.txt

$ cat /podaci/tim/izvestaj.txt
cat: /podaci/tim/izvestaj.txt: Permission denied

Dozvole na fajlu su u redu. Problem je iznad:

$ namei -l /podaci/tim/izvestaj.txt
f: /podaci/tim/izvestaj.txt
 drwxr-xr-x root root /
 drwxr-x--- root arhiva  podaci
 drwxrwxr-x alen urednici tim
 -rw-rw-r-- alen urednici izvestaj.txt

Direktorijum podaci nema x za ostale, a ti nisi u grupi arhiva. Put je zatvoren na drugom nivou.

namei -l je najkorisnija komanda na ovoj stranici. Kad god dobiješ Permission denied a dozvole na fajlu izgledaju ispravno, pokreni je — pokazuje ceo lanac odjednom.

Provera bez pogađanja

$ test -r fajl.txt && echo "mogu da citam"
$ test -w fajl.txt && echo "mogu da pisem"
$ test -x skripta.sh && echo "mogu da pokrenem"

Za tuđa prava postoji sudo -u:

$ sudo -u www-data test -r /var/www/sajt/index.html && echo "moze"
$ sudo -u www-data ls /var/www/sajt

Ovo je pravi način da proveriš zašto web server ne vidi fajl — umesto zaključivanja iz ispisa ls -l.

A da vidiš u kojim si grupama:

$ id
uid=1000(alen) gid=1000(alen) groups=1000(alen),27(sudo),1002(urednici)

Detaljnije na stranici id.

Sveže dodata grupa ne važi odmah

$ sudo usermod -aG urednici alen
$ id
uid=1000(alen) gid=1000(alen) groups=1000(alen),27(sudo)

Nove grupe nema. Članstvo se učitava pri prijavi, pa se moraš odjaviti i prijaviti. Privremeno rešenje:

$ newgrp urednici

Ovo je čest izvor zbunjenosti — dodaš korisnika u grupu, on kaže da i dalje ne može, a ti proveriš i vidiš da je sve podešeno kako treba.

Znakovi koje ne objašnjava običan rwx

s umesto x

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Mar 23  2026 /usr/bin/passwd

SUID: program se izvršava sa pravima vlasnika. Objašnjeno u lekciji Kontrola privilegija.

t na kraju

$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 Aug 22 14:02 /tmp

Sticky bit: brisati sme samo vlasnik fajla, uprkos w za sve.

+ na kraju

$ ls -l projekat.txt
-rw-rw-r--+ 1 alen urednici 1024 Aug 22 13:15 projekat.txt

Plus znači da fajl ima dodatna ACL pravila, koja ls -l ne prikazuje:

$ getfacl projekat.txt
# file: projekat.txt
user::rw-
user:marko:rw-
group::rw-
mask::rw-
other::r--

Marko ima pravo pisanja iako nije ni vlasnik ni u grupi. Ako se dozvole ponašaju drugačije nego što ls -l sugeriše, prvo proveri ima li plusa. Detaljno na stranicama Lista kontrole pristupa i getfacl.

. na kraju

$ ls -l /var/www/html/index.html
-rw-r--r--. 1 root root 612 Aug 22 09:00 index.html

Tačka znači SELinux kontekst. Ako je pristup odbijen a sve ostalo izgleda ispravno, uzrok je često tu — vidi SELinux.

Pronalaženje po dozvolama

$ find /var/www -type f -perm 777
$ find ~ -name "id_*" -not -perm 600
$ find / -perm -4000 -type f 2>/dev/null
$ find /home -type d -perm -o+w 2>/dev/null

Redom: fajlovi sa punim pravima, SSH ključevi sa preširokim dozvolama, SUID programi, i direktorijumi u koje svako sme da piše. Prve dve komande vredi povremeno pustiti na svom serveru.

Razlika u zapisu: -perm 777 traži tačno tu vrednost, -perm -4000 traži da je taj bit postavljen bez obzira na ostale. Više na stranici find.

Kratka referenca

  • Deset znakova: tip + vlasnik + grupa + ostali
  • r=4, w=2, x=1 · 644 običan fajl · 755 skripta i direktorijum · 600 privatno
  • Direktorijum: r listanje imena, x ulazak, w pravljenje i brisanje
  • Provera staje na prvom poklapanju — vlasnik, pa grupa, pa ostali
  • stat -c "%a %A %U %G" fajl — dozvole u oba oblika
  • namei -l putanja — dozvole celog lanca direktorijuma
  • sudo -u korisnik test -r fajl — provera tuđih prava
  • + na kraju znači ACL · . znači SELinux
  • find -perm — pronalaženje po dozvolama

Vežba

$ mkdir -p ~/vezba-prava/podaci
$ echo "sadrzaj" > ~/vezba-prava/podaci/fajl.txt
$ cd ~/vezba-prava
  1. Pretvori -rwxr-x--- u brojčani oblik napamet, pa proveri sa stat.
  2. Postavi direktorijumu podaci dozvole 444 i objasni sebi zašto ne možeš pročitati fajl unutra, iako mu ime vidiš.
  3. Postavi 111 i proveri da li možeš pročitati fajl ako mu znaš tačno ime. Objasni razliku u odnosu na prethodni zadatak.
  4. Napravi fajl sa dozvolama 044 i pokušaj da ga pročitaš kao vlasnik. Objasni poruku.
  5. Napravi lanac od tri ugnežđena direktorijuma, oduzmi x srednjem, pa pomoću namei -l pokaži gde tačno pristup pada.

Četvrti zadatak je pravilo o zaustavljanju na prvom poklapanju, u jednoj komandi.


Menjanje dozvola je na stranicama chmod, chown i chgrp, podrazumevane dozvole novih fajlova na stranici umask, a pregled cele oblasti na stranici Podešavanje prava pristupa.

Cela lekcija je deo vodiča Linux osnove.

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

groupadd

Konverzija tipova podataka u Pythonu