Egalik va maxsus bitlar — chown, umask, setuid, sticky

~12 daq · Linux · Foydalanuvchilar va ruxsatlar

Muammodan boshlaylik

Saytni /var/www/dokon ga ko'chirdingiz:

sudo cp -r ~/dokon /var/www/

Endi uni tahrirlamoqchisiz — Permission denied. Nega? sudo bilan ko'chirildi — demak barcha fayllar endi root ga tegishli. Ruxsatlar to'g'ri bo'lishi mumkin, lekin egasi noto'g'ri.

Ruxsatlar (20-dars) — "egasi nima qila oladi". Bu dars — "egasi kim".


chown — egasini o'zgartirish

sudo chown YANGI_EGASI fayl
sudo chown EGASI:GURUH fayl
sudo chown otabek index.html                  # egasi
sudo chown otabek:www-data index.html         # egasi va guruhi
sudo chown :www-data index.html               # faqat guruh
sudo chown -R otabek:otabek /var/www/dokon    # rekursiv — butun papka

Egasini faqat root o'zgartira oladi (sudo kerak) — aks holda har kim o'z fayllarini boshqalarga "tashlab" yuborishi mumkin edi.

Faqat guruhni o'zgartirish uchun — chgrp:

chgrp www-data index.html

Veb-sayt uchun tipik sxema

Vazifa: siz (otabek) fayllarni tahrirlaysiz, Nginx (www-data) ularni o'qiydi, uploads/ ga esa ilova yozadi.

# Egasi — siz, guruhi — www-data
sudo chown -R otabek:www-data /var/www/dokon

# Papkalar 750, fayllar 640: siz — hamma narsa, Nginx — o'qish, boshqalar — hech narsa
find /var/www/dokon -type d -exec chmod 750 {} +
find /var/www/dokon -type f -exec chmod 640 {} +

# Yuklamalar papkasiga guruh ham yoza olsin
chmod 770 /var/www/dokon/uploads

Natija:

drwxr-x--- otabek www-data  /var/www/dokon
-rw-r----- otabek www-data  /var/www/dokon/index.html
drwxrwx--- otabek www-data  /var/www/dokon/uploads

Hech qanday 777 siz — har bir tomon aynan kerakli huquqqa ega.


umask — yangi fayllar ruxsati

Yangi fayl yaratdingiz — u qanday ruxsat bilan yaratiladi?

touch yangi.txt && mkdir yangi-papka
ls -ld yangi.txt yangi-papka
-rw-r--r-- ... yangi.txt         (644)
drwxr-xr-x ... yangi-papka       (755)

Buni umask belgilaydi — "olib tashlanadigan" ruxsatlar:

umask
0022
  • Fayllar uchun boshlang'ich: 666 − 022 = 644
  • Papkalar uchun: 777 − 022 = 755

Maxfiyroq standart:

umask 077        # yangi fayllar 600, papkalar 700

Doimiy qilish — ~/.bashrc da. systemd xizmatlarida — UMask=0027 (25-dars).


Maxsus bitlar

Oddiy rwx dan tashqari uchta maxsus bit bor. Ularni kamdan-kam o'zingiz qo'yasiz, lekin ls -l da ko'rganingizda tanib olish kerak.

setuid (s) — egasi nomidan ishga tushish

ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 ... /usr/bin/passwd
   ↑

Egasining x o'rnida s. Bu dastur kim ishga tushirishidan qat'i nazar, egasi (root) huquqi bilan ishlaydi. Shuning uchun oddiy foydalanuvchi passwd bilan o'z parolini o'zgartira oladi — garchi /etc/shadow ga faqat root yoza olsa ham.

[!WARNING] setuid — xavfli: setuid root dasturdagi har qanday zaiflik — to'g'ridan-to'g'ri root huquqi. O'z skriptlaringizga hech qachon setuid qo'ymang. Tizimdagilarni tekshirish: find / -perm -4000 2>/dev/null.

setgid (s guruhda) — umumiy papkalar uchun

Papkada setgid bo'lsa — ichida yaratilgan barcha fayllar papkaning guruhini meros qilib oladi:

sudo mkdir /srv/jamoa
sudo chown :dasturchilar /srv/jamoa
sudo chmod 2775 /srv/jamoa          # 2 — setgid
ls -ld /srv/jamoa
drwxrwsr-x root dasturchilar /srv/jamoa
       ↑

Endi malika u yerda fayl yaratsa — guruhi malika emas, dasturchilar bo'ladi, va jamoaning boshqa a'zolari uni tahrirlay oladi. Jamoaviy papkalar uchun juda foydali.

sticky bit (t) — faqat o'z fayllaringni o'chirish

ls -ld /tmp
drwxrwxrwt root root /tmp
         ↑

/tmp ga hamma yoza oladi (777). Lekin sticky bit tufayli har kim faqat o'z fayllarini o'chira oladi — boshqalarnikini emas.

chmod +t /srv/umumiy        # yoki chmod 1777

Raqamli yozuvda

To'rtinchi (birinchi) raqam:

Raqam Bit
4 setuid
2 setgid
1 sticky

chmod 2775 — setgid + 775. chmod 1777 — sticky + 777 (/tmp kabi).


Tez-tez uchraydigan muammolar

Belgi Sabab Yechim
sudo cp dan keyin fayllarni tahrirlay olmayman Egasi root sudo chown -R $USER:$USER papka
Nginx: 403 Forbidden www-data o'qiy olmaydi yoki papkaga kira olmaydi namei -l, guruh yoki x ruxsati
Ilova yuklamalarni saqlay olmaydi Ilova foydalanuvchisi papkaga yoza olmaydi Papka egasi yoki guruhi — ilova foydalanuvchisi
Git: "dubious ownership" Repo boshqa foydalanuvchiga tegishli chown yoki git config --global --add safe.directory
Docker volume dagi fayllar root ga tegishli Konteyner root sifatida yozgan Konteynerda USER, yoki chown

$USER — joriy foydalanuvchi nomi (30-dars).


Nima uchun shunday?

Nima uchun egani faqat root o'zgartira oladi — o'z faylimni boshqaga bera olmasligim g'alati emasmi?

Bu kvotalar va javobgarlik uchun muhim. Agar har kim o'z fayllarini boshqalarga "bera" olsa: disk kvotasi tugagan foydalanuvchi o'z fayllarini boshqasiga yozib, chegarani chetlab o'tardi; yoki zararli faylni boshqa foydalanuvchi nomiga o'tkazib, izni yo'qotardi. Egalikni o'zgartirish — tizim darajasidagi qaror, shuning uchun u administrator (root) qo'lida. Siz esa o'z fayllaringiz ruxsatlarini (chmod) erkin boshqarasiz — kimga ochish yoki yopish.


Xulosa

Eslab qoling:

  • sudo chown egasi:guruh fayl, -R — rekursiv
  • sudo bilan nusxalangan fayllar — root ga tegishli bo'ladi
  • Veb-sayt: egasi — siz, guruhi — www-data, 750/640, yozish kerak joyda 770
  • umask 022 → fayllar 644, papkalar 755; 077 — maxfiy
  • setuid (s egada) — egasi huquqi bilan ishga tushish; xavfli
  • setgid papkada — guruh meros qolinadi; jamoaviy papkalar
  • sticky (t) — faqat o'z fayllaringni o'chirish (/tmp)

Keyingi bo'lim

5-bo'lim: Jarayonlar va tizim — ps, kill, systemd, loglar va disk.