Ruxsatlar — rwx, chmod, raqamli yozuv (755, 644)

~15 daq · Linux · Foydalanuvchilar va ruxsatlar

Muammodan boshlaylik

Skript yozdingiz va ishga tushirmoqchisiz:

./deploy.sh
bash: ./deploy.sh: Permission denied

Yoki Nginx saytni ko'rsatmayapti — logda 13: Permission denied. Yoki SSH kalitingiz bilan ulanmayapti:

WARNING: UNPROTECTED PRIVATE KEY FILE!
Permissions 0644 for '/home/otabek/.ssh/id_ed25519' are too open.

Uchala muammoning ildizi bitta — fayl ruxsatlari. Linux da har bir fayl kim uni o'qiy, o'zgartira va ishga tushira olishini aniq belgilaydi.


Ruxsatlarni o'qish

ls -l
-rwxr-xr-- 1 otabek dasturchilar 1240 Nov  6 12:00 deploy.sh

Birinchi 10 belgi:

 -    rwx    r-x    r--
tur  egasi  guruh  boshqalar
  • tur: - fayl, d papka, l havola
  • egasi (user, u) — otabek
  • guruh (group, g) — dasturchilar guruhi a'zolari
  • boshqalar (others, o) — qolgan hamma

Har bir uchlikda:

Belgi Fayl uchun Papka uchun
r (read) Mazmunini o'qish Ichidagi nomlarni ko'rish (ls)
w (write) O'zgartirish Ichida fayl yaratish, o'chirish, nomini o'zgartirish
x (execute) Dastur sifatida ishga tushirish Ichiga kirish (cd) va fayllarga murojaat
- Ruxsat yo'q

Yuqoridagi misol:

  • otabek — o'qiy, yoza, ishga tushira oladi
  • dasturchilar guruhi — o'qiy va ishga tushira oladi, o'zgartira olmaydi
  • Boshqalar — faqat o'qiy oladi

[!INFO] Papka uchun x muhim: x siz papkaga cd qilib bo'lmaydi va ichidagi fayllarni ochib bo'lmaydi — hatto ularning o'zida ruxsat bo'lsa ham. Nginx saytni ko'rsata olmasligining tez-tez uchraydigan sababi — yo'ldagi papkalardan birida x yo'qligi.


Raqamli yozuv

Har bir ruxsatning qiymati bor:

Ruxsat Qiymat
r 4
w 2
x 1

Har bir uchlik — yig'indi:

rwx = 4+2+1 = 7
rw- = 4+2   = 6
r-x = 4  +1 = 5
r-- = 4     = 4
--- =         0

Uch raqam — egasi, guruh, boshqalar:

rwxr-xr-x = 755
rw-r--r-- = 644
rw------- = 600

Tipik qiymatlar — yod oling

Raqam Ko'rinish Qayerda
644 rw-r--r-- Oddiy fayllar: kod, HTML, sozlamalar
755 rwxr-xr-x Papkalar, skriptlar, dasturlar
600 rw------- Maxfiy: .env, SSH kalit, parollar
700 rwx------ Shaxsiy papka: ~/.ssh
640 rw-r----- Guruh o'qishi kerak bo'lgan sozlama
777 rwxrwxrwx ❌ Deyarli hech qachon

chmod — ruxsatlarni o'zgartirish

Raqamlar bilan

chmod 755 deploy.sh
chmod 644 index.html
chmod 600 .env
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519

Belgilar bilan

chmod +x deploy.sh          # hammaga ishga tushirish huquqi
chmod u+x deploy.sh         # faqat egasiga
chmod g+w fayl.txt          # guruhga yozish
chmod o-r maxfiy.txt        # boshqalardan o'qishni olib tashlash
chmod go-rwx .env           # guruh va boshqalardan hamma narsani
chmod u=rw,go=r fayl.txt    # aniq o'rnatish (= 644)

u egasi, g guruh, o boshqalar, a hammasi; + qo'shish, - olib tashlash, = aniq.

Endi skript ishlaydi:

chmod +x deploy.sh
./deploy.sh

Rekursiv

chmod -R 755 /var/www/dokon

[!WARNING] chmod -R 755 fayllarga ham x beradi — bu kerak emas. To'g'ri usul — papkalar va fayllarga alohida:

find /var/www/dokon -type d -exec chmod 755 {} +
find /var/www/dokon -type f -exec chmod 644 {} +

chmod 777 — nega yomon

Internetda "Permission denied" ga ko'p javob: chmod -R 777. Bu "eshikni olib tashlash" bilan teng:

  • Har kim — har qanday foydalanuvchi va har qanday buzilgan xizmat — faylni o'zgartira oladi
  • Veb-papkada: hujumchi zararli PHP fayl yozadi va ishga tushiradi
  • SSH kalit 777 bo'lsa — SSH uni umuman ishlatmaydi

To'g'ri yondashuv: kim kirishi kerakligini aniqlang va aynan unga ruxsat bering — egasini o'zgartirish (21-dars) yoki guruhga qo'shish orqali.


Amaliy holatlar

"Permission denied" — tashxis

ls -l fayl                     # fayl ruxsatlari va egasi
id                             # men kimman, qaysi guruhlarda
namei -l /var/www/dokon/index.html    # butun yo'l bo'ylab ruxsatlar
f: /var/www/dokon/index.html
drwxr-xr-x root     root     /
drwxr-xr-x root     root     var
drwxr-xr-x root     root     www
drwx------ otabek   otabek   dokon        ← muammo shu yerda!
-rw-r--r-- otabek   otabek   index.html

namei -l — yo'ldagi har bir papkani ko'rsatadi. dokon papkasi 700 — Nginx (www-data) unga kira olmaydi.

sudo -u www-data cat /var/www/dokon/index.html      # tekshirish

SSH kalitlar

SSH ruxsatlar bo'yicha juda qat'iy (34-dars):

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/id_ed25519.pub

.env fayl

chmod 600 .env

Faqat egasi (ilova foydalanuvchisi) o'qiy oladi.


Nima uchun shunday?

Nima uchun ruxsatlar uchta guruhga (egasi, guruh, boshqalar) bo'lingan — har bir foydalanuvchi uchun alohida emas?

Bu 1970-yillardagi oddiylik va samaradorlik tanlovi: har bir faylga atigi 9 bit (va egasi + guruh raqamlari) — juda kam joy, juda tez tekshiruv. Va bu model ajablanarli darajada ko'p holatni qamraydi: "men", "jamoam", "qolganlar". Murakkabroq holatlar uchun guruhlar ishlatiladi — "dasturchilar" guruhiga 10 kishi qo'shiladi, faylga esa bitta guruh ruxsati beriladi. Juda nozik holatlar uchun Linux da ACL (setfacl) ham bor, lekin amalda 95% holatlarda rwx yetarli.


Xulosa

Eslab qoling:

  • -rwxr-xr--: tur + egasi + guruh + boshqalar
  • r=4, w=2, x=1; uch raqam — egasi/guruh/boshqalar
  • Papka uchun x — ichiga kirish huquqi
  • 644 fayllar, 755 papka va skriptlar, 600 maxfiy, 700 shaxsiy papka
  • chmod 755 fayl, chmod +x skript.sh, chmod go-rwx .env
  • -R dan ehtiyot — fayl va papkalarga alohida find bilan
  • 777 — yo'q
  • Tashxis: ls -l, id, namei -l yo'l, sudo -u www-data

Keyingi dars

21-dars: Egalik va maxsus bitlar — chown, umask, setuid, sticky