Egalik va maxsus bitlar — chown, umask, setuid, sticky
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— rekursivsudobilan nusxalangan fayllar — root ga tegishli bo'ladi- Veb-sayt: egasi — siz, guruhi —
www-data,750/640, yozish kerak joyda770 umask 022→ fayllar 644, papkalar 755;077— maxfiy- setuid (
segada) — 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.