Fayl ruxsatlari: rwx, chmod va kirish huquqi aslida qanday hal qilinadi
-rw-r----- fayl haqida nimadir aytadi, lekin "bu dastur hozir bu faylni o'qiy oladimi?" degan savolga o'zi javob bermaydi. Kernel avval yo'ldagi har bir katalogni bosib o'tadi, chaqirayotgan jarayonning identifikatorini obyekt egasi va guruhi bilan solishtiradi va so'ralgan amal uchun kerak bo'lgan aniq bitni tekshiradi. Shundan keyin ham ACL, mount parametri yoki xavfsizlik moduli natijani o'zgartirishi mumkin.
Bu maqola Foydalanuvchi va guruh hisoblari maqolasidagi hisoblar modeliga tayanadi: ruxsatlar jarayonning UID va GID iga nisbatan tekshiriladi, ular esa jarayonni ishga tushirgan hisobdan olinadi. Quyida rwx yozuvini o'qish va uni chmod bilan o'rnatishni; r, w va x katalogda oddiy fayldagidan boshqacha ma’no anglatishini; kernel yo'lni qanday bosib o'tishi va bitta ruxsat sinfini qanday tanlashini; id, stat, namei, findmnt va getfacl ni birgalikda o'qishni o'rganamiz. Oxirida xizmat hisobidagi Permission denied sababini topish uchun find -perm bilan faqat o'qiydigan audit o'tkazamiz va eng kam o'zgarish bilan muammoni hal qilamiz.
Ruxsatlar satrini o'qish va o'rnatish
ls -l har bir qator boshida o'nta belgini ko'rsatadi, masalan -rw-r-----. Birinchi belgi obyekt turi (- oddiy fayl, d katalog, l symbolic link va hokazo — fayl tizimi modulida ko'rib chiqilgan). Qolgan to'qqizta belgi uchta uchlikdan iborat: egasi (owner), guruh (group) va boshqalar (other). Ularning har biri r, w, x yoki - ni ko'rsatadi.
mkdir -p ~/lab/file-permissions
printf 'sample line\n' > ~/lab/file-permissions/report.txt
ls -l ~/lab/file-permissions/report.txt
stat -c 'symbolic=%A octal=%a owner=%U group=%G path=%n' ~/lab/file-permissions/report.txt
Namunaviy natija:
-rw-r--r-- 1 ali ali 12 Jul 29 10:00 /home/ali/lab/file-permissions/report.txt
symbolic=-rw-r--r-- octal=644 owner=ali group=ali path=/home/ali/lab/file-permissions/report.txt
Bir xil ruxsatlar to'plamining ikki keng tarqalgan yozuvi bor:
- Sakkizlik (octal): har bir sinf uchun bittadan, jami uchta (yoki to'rtta) raqam. Bunda
r=4,w=2,x=1, raqam esa ularning yig'indisi.644egasi uchunrw-(6), guruh uchunr--(4), boshqalar uchunr--(4) degani. - Simvolik:
rwxharflarining o'zi, ixtiyoriy ravishdachmodningu/g/o/asinf harflari va+/-/=operatorlari bilan birga.
chmod: bitlarni o'zgartirish
chmod 640 ~/lab/file-permissions/report.txt
chmod u=rw,g=r,o= ~/lab/file-permissions/report.txt
chmod go-w ~/lab/file-permissions/report.txt
stat -c '%A %a %n' ~/lab/file-permissions/report.txt
chmod 640 fileaniq sakkizlik rejimni o'rnatadi.u=rw,g=r,o=har bir sinfni aniq belgilaydi va ro'yxatda yo'q narsani tozalaydi.g+w,o-r,a+xsinfdagi boshqa bitlarga tegmasdan bitta bitni qo'shadi yoki olib tashlaydi.
Kichik, aniq o'zgarish uchun simvolik rejim ko'pincha xavfsizroq, chunki butun sakkizlik sonni hisoblash shart emas. Sakkizlik raqamdagi bitta xato o'sha sinfdagi barcha bitlarni birdaniga o'zgartirib yuboradi.
Warning
chmod -R katalog ostidagi har bir obyektga qo'llanadi va --dry-run opsiyasiga ega emas. Uni laboratoriya katalogidan boshqa biror narsaga qarshi ishlatishdan oldin maqsadni avval faqat o'qiydigan find bilan ko'rib chiqing va o'zgarishni ortga qaytara olish uchun joriy rejimni bilib qo'ying. chmod -R ni hech qachon /etc, /var, /srv yoki boshqa haqiqiy xizmat katalogiga o'ylamasdan ishlatmang.
Ruxsat qarori bitta qatordan iborat emas
Foydalanuvchi cat /srv/app/config.ini deb yozganda cat dasturi faylni shunchaki "ko'rmaydi". U kerneldan yo'lni ochishni so'raydi, kernel esa soddalashtirilgan qarorlar zanjiri bo'yicha ishlaydi:
- absolyut yo'l
/dan, nisbiy yo'l esa jarayonning joriy katalogidan boshlanadi; - kernel yo'lni oraliq kataloglar bo'ylab birma-bir bosib o'tadi va har birida
x(qidirish huquqi) bo'lishini talab qiladi; - oxirgi obyekt topilgach, jarayon aynan bitta uchlikka tasniflanadi: obyekt unga tegishli bo'lsa
u, obyekt guruhiga a’zo bo'lsag, aks holdao; - faqat so'ralgan amal uchun kerak bo'lgan bitta bit tekshiriladi — o'qish, yozish yoki bajarish/qidirish;
- qo'shimcha qoidalar — ACL, faqat o'qish yoki
noexecmount, Linux capabilities yoki xavfsizlik moduli — natijani baribir cheklashi mumkin; - barcha tekshiruvlar o'tsa, amal bajariladi; aks holda chaqiruv odatda
EACCES— "Permission denied" bilan tugaydi.
Muhim tafsilot: kernel u, g va o ruxsatlarini qo'shib hisoblamaydi va uchtasidan eng saxiysini qidirmaydi. Agar fayl jarayonga tegishli bo'lsa, faqat egasi uchligi qo'llanadi. Hatto other tasodifan owner dan kengroq bo'lsa ham, egasi bo'lgan jarayon kengroq huquq olish uchun other sinfiga "o'tib" ketolmaydi.
Muhimi — jarayonning identifikatori
Faylga inson to'g'ridan-to'g'ri emas, jarayon murojaat qiladi. Interaktiv shell odatda tizimga kirgan foydalanuvchining identifikatorini meros qilib oladi; xizmat esa o'z unit yoki daemon sozlamalarida belgilangan hisob ostida ishlashi mumkin.
Joriy shell uchun:
Muayyan xizmat jarayoni uchun:
<service_name> ni nginx.service kabi haqiqiy unit bilan, <process_name> ni esa bajariladigan faylning nomi bilan almashtiring. systemctl show dagi bo'sh User= ko'pincha xizmat sukut bo'yicha root sifatida ishlashini bildiradi — taxmin qilish o'rniga ishlab turgan jarayonni ps bilan tekshiring.
Amaliy qoida: ruxsat xatosi chiqqanda uni terminalda yozayotgan hisob nomidan emas, amalni haqiqatan bajarayotgan hisob nomidan qayta hosil qiling.
Katalog bitlari amalda boshqacha ishlaydi
Oddiy faylda r, w va x mazmunni o'qish, uni o'zgartirish va faylni dastur sifatida ishga tushirishni bildiradi. Katalog esa nomlar va inode’larga havolalarni saqlaydi, shuning uchun uning bitlari boshqa amallarni boshqaradi:
r: katalogda yozilgan nomlarni ro'yxatlash.x: muayyan nomni qidirib topish, uning metama’lumotlarini olish va yo'l bo'ylab undan o'tib davom etish.w:xbilan birga nom yaratish, o'chirish yoki qayta nomlash.
Xavfsiz laboratoriya buni to'g'ridan-to'g'ri ko'rsatadi:
mkdir -p ~/lab/file-permissions/vault
printf '%s\n' 'lab-2026' > ~/lab/file-permissions/vault/report.txt
printf '%s\n' '#!/usr/bin/env bash' 'echo "script ran"' > ~/lab/file-permissions/check.sh
chmod 0755 ~/lab/file-permissions
chmod 0700 ~/lab/file-permissions/vault
chmod 0644 ~/lab/file-permissions/vault/report.txt
chmod 0644 ~/lab/file-permissions/check.sh
Faqat r: nomlar ko'rinadi, obyekt esa yo'q
chmod 0400 ~/lab/file-permissions/vault
ls ~/lab/file-permissions/vault
stat ~/lab/file-permissions/vault/report.txt
cat ~/lab/file-permissions/vault/report.txt
chmod 0700 ~/lab/file-permissions/vault
Katalogda r bo'lgani uchun ls report.txt ni ko'rsatadi. stat va cat esa taxminan quyidagicha xato beradi:
report.txt
stat: cannot statx '/home/ali/lab/file-permissions/vault/report.txt': Permission denied
cat: /home/ali/lab/file-permissions/vault/report.txt: Permission denied
Sabab faylning o'zidagi 0644 emas: report.txt ni topish uchun kernelga vault katalogida x kerak.
Faqat x: ma’lum nom ochiladi, ro'yxat esa yo'q
chmod 0100 ~/lab/file-permissions/vault
ls ~/lab/file-permissions/vault
cat ~/lab/file-permissions/vault/report.txt
chmod 0700 ~/lab/file-permissions/vault
Bu safar ls katalogni o'qiy olmaydi:
Lekin nom oldindan ma’lum bo'lgani va katalogda x borligi uchun cat faylga yetib boradi. Shundan keyin faylning o'zidagi r uning mazmunini o'qishga ruxsat beradi.
w va x: nomlar o'zgaradi, ro'yxatlash shart emas
chmod 0300 ~/lab/file-permissions/vault
printf '%s\n' 'temporary' > ~/lab/file-permissions/vault/temp.txt
rm -- ~/lab/file-permissions/vault/temp.txt
ls ~/lab/file-permissions/vault
chmod 0700 ~/lab/file-permissions/vault
Yangi nom yaratish ham, ma’lum nomni o'chirish ham ishlaydi, lekin r bo'lmagani uchun ls natijani ro'yxatlay olmaydi. Bu g'alati xatti-harakat emas: bu katalog bitlari alohida, bir-biridan mustaqil amallarni boshqarishidan bevosita kelib chiqadi.
Warning
Agar laboratoriya o'rtasida terminal uzilib qolsa, boshlang'ich holatni chmod 0700 ~/lab/file-permissions/vault bilan tiklang. Bu buyruqlarni /etc, /var, /srv yoki biror haqiqiy xizmat katalogida sinab ko'rmang.
Bitta amal bir nechta obyektga bog'liq bo'lishi mumkin
"Fayl bilan ishlash" ortida bir nechta turli system call va ruxsat tekshiruvlari yashiringan:
| Amal | Asosiy talab |
|---|---|
| fayl mazmunini o'qish | yo'ldagi har bir katalogda x, oxirgi faylda r |
| mavjud faylga yozish | yo'l bo'ylab x, oxirgi faylda w; mount ham yozish mumkin bo'lishi kerak |
| yangi fayl yaratish | ota katalogda w va x |
| faylni qayta nomlash yoki o'chirish | tegishli ota katalogda w va x; sticky bit qo'shimcha cheklov qo'yishi mumkin |
| katalog mazmunini ro'yxatlash | katalogda r; to'liq metama’lumot uchun x ham |
| oddiy faylni bajarish | yo'l bo'ylab x, faylning o'zida x, shuningdek mos format/interpretator va bajarishga ruxsat berilgan mount |
O'qib bo'lmaydigan faylni ham o'chirish mumkin
O'chirish fayl mazmuniga tegmaydi — u ota katalogdan nomni olib tashlaydi. Buni laboratoriyada xavfsiz ko'rish mumkin:
printf '%s\n' 'unreadable' > ~/lab/file-permissions/delete-me.txt
chmod 0000 ~/lab/file-permissions/delete-me.txt
cat ~/lab/file-permissions/delete-me.txt
ls -ld ~/lab/file-permissions
rm -i -- ~/lab/file-permissions/delete-me.txt
test ! -e ~/lab/file-permissions/delete-me.txt
echo $?
cat rad etiladi, lekin ota katalog egasida w va x bo'lgani uchun interaktiv so'rovni tasdiqlaganingizdan keyin rm muvaffaqiyatli bajariladi. Oxirgi 0 chiqish holati fayl o'chirilganini tasdiqlaydi. Umumiy katalogdagi sticky bit bu qoidani toraytirishi mumkin — bu mexanizm maxsus ruxsatlar haqidagi keyingi mavzuga tegishli.
x biti fayl ishga tushishini kafolatlamaydi
Laboratoriya skriptiga bajarish bitini qo'shing:
chmod u+x ~/lab/file-permissions/check.sh
stat -c '%A %a %n' ~/lab/file-permissions/check.sh
~/lab/file-permissions/check.sh
Kutiladigan natija:
Bu yerda bajarish biti faqat ruxsatlar qatlamidan o'tishga imkon berdi. Skriptning shebang qatoridagi /usr/bin/env bash ham mavjud va ishga tushiriladigan bo'lishi kerak. Binar faylga mos arxitektura va format kerak, uning dinamik kutubxonalari topilishi kerak, fayl tizimi esa noexec bilan mount qilingan bo'lmasligi kerak. Demak, x bajarish uchun zarur bo'lgan bir nechta shartdan biri, to'liq kafolat emas.
Ochiq fayl va yo'l bir narsa emas
Dastur faylni muvaffaqiyatli ochgach, kernel fayl deskriptorini qaytaradi. Keyingi read yoki write chaqiruvlari nomni qaytadan qidirish orqali emas, shu deskriptor orqali ishlaydi. Keyinroq fayl qayta nomlansa yoki uning nomi o'chirilsa ham, deskriptor o'sha obyektga ishora qilishda davom etishi mumkin.
Shuning uchun ruxsatni olib tashlash allaqachon ochilgan ulanishni darhol uzib qo'yadi deb hisoblamang. Agar maxfiy ma’lumot sizib chiqayotgan bo'lishi mumkin bo'lsa, rejim bitlarini o'zgartirish bilan cheklanmang: faylni hali ham ochiq ushlab turgan jarayonlarni lsof <path> bilan toping va ularni tashkilotingizdagi hodisalarni boshqarish tartibiga ko'ra xavfsiz qayta ishga tushiring.
Vositalar: har biri boshqa savolga javob beradi
stat: oxirgi obyektning metama’lumotlari
Namunaviy natija:
mode=-rw-r--r-- (644) owner=ali(1000) group=ali(1000) path=/home/ali/lab/file-permissions/vault/report.txt
%A — simvolik rejim, %a — sakkizlik rejim; %U/%u — egasining nomi va UID i; %G/%g — guruh nomi va GID i. Agar nomni aniqlab bo'lmasa, ba’zi maydonlarda xom raqam ko'rinishi mumkin.
namei -l: yo'lning har bir qismi
namei -l ildizdan faylgacha bo'lgan har bir qismning turi, egasi, guruhi va rejimini chiqaradi. Agar yo'ldagi biror katalogda kerakli sinf uchun x bo'lmasa, tekshiruv aynan shu yerda to'xtaydi. Minimal image’da namei bo'lmasligi mumkin; Ubuntu va RHEL oilasida u odatda util-linux paketiga kiradi.
getfacl: ls -l dan tashqaridagi qoidalar
ls -l qatori oxiridagi + belgisi obyektda kengaytirilgan kirish nazorati ro'yxati (ACL) bo'lishi mumkinligini bildiradi. getfacl nomlangan foydalanuvchi va nomlangan guruh qoidalarini ham ko'rsatadi. ACL’lar klassik uchlik ustiga quriladi; ularning mask va default ACL mexanizmlari alohida ACL mavzusida ko'rib chiqiladi. Ubuntu’da buyruq topilmasa, u acl paketi bilan keladi.
findmnt: fayl tizimi qatlamini tekshirish
ro mount yozishni bloklaydi; noexec esa shu fayl tizimidan dastur ishga tushirishni bloklaydi. Ikkala holatda ham rwx bitlarini bo'shatish muammoni hal qilmaydi. Mount siyosatini o'zgartirish kattaroq tizim amali: avval nima uchun u shunday sozlanganini aniqlang va saqlash modulidagi tekshirilgan tartibga amal qiling.
Yakuniy dalil — haqiqiy amal
test -r, find -readable va shunga o'xshash vositalar foydali signal beradi, lekin tekshiruv va haqiqiy murojaat o'rtasida holat o'zgarishi yoki masofaviy fayl tizimi boshqacha qaror qabul qilishi mumkin. Eng ishonchli diagnostika — aynan kerakli hisob nomidan bajarilgan, xavfsiz va hech qanday yon ta’sirsiz haqiqiy amal:
Bu yerda sudo imtiyoz olish uchun emas, sinov maqsadida administrator sessiyasidan xizmat hisobiga o'tish uchun ishlatilmoqda. Agar fayl mazmuni terminalda ko'rinmasligi kerak bo'lsa:
0 faylni o'qish uchun ochish mumkinligini bildiradi; noldan farqli holat xato borligini ko'rsatadi. Bu test fayl mazmunini hech qachon chiqarmaydi.
find -perm bilan ruxsatlarni audit qilish
find -perm joriy foydalanuvchi faylni haqiqatan ocha oladimi-yo'qmi, tekshirmaydi — u inode’da saqlangan rejim bitlarini solishtiradi. ACL’lar, faqat o'qish rejimidagi mount va xavfsizlik moduli bunda umuman hisobga olinmaydi. Shu cheklovni bilgan holda, u katta katalog daraxtida shubhali rejimlarni topishning qulay usuli bo'lib qoladi.
Moslashtirishning uch usuli bor:
-perm 0644: oddiy ruxsat bitlari aynan0644bo'lgandagina mos keladi.-perm -0640: ko'rsatilgan barcha bitlar mavjud bo'lsa mos keladi; ortiqcha bitlar e’tiborga olinmaydi.-perm /0022: ko'rsatilgan bitlardan birortasi bo'lsa mos keladi;/shakli GNUfindkengaytmasi.
Laboratoriyani faqat o'qish orqali audit qilish:
find ~/lab/file-permissions -xdev -type f -perm 0644 \
-printf 'exact-0644 %m %u:%g %p\n'
find ~/lab/file-permissions -xdev -type f -perm /0022 \
-printf 'group-or-other-writable %m %u:%g %p\n'
find ~/lab/file-permissions -xdev -type f -perm /0111 \
-printf 'any-execute-bit %m %u:%g %p\n'
0022 guruhning yozish biti (0020) yoki boshqalarning yozish biti (0002) bor faylga mos keladi va ulardan bittasi yetarli — ikkalasi birga bo'lishi shart emas. 0111 uch sinfdan birortasida bajarish biti bor har qanday faylga mos keladi. -xdev qidiruvni bitta fayl tizimi ichida ushlab turadi.
Warning
find ... -exec chmod ... qo'shib, auditni ommaviy tuzatishga aylantirmang. Avval natijalarni fayl egasi, xizmatning haqiqiy talablari, ACL’lar va deploy siyosati bilan solishtiring. Rekursiv o'zgarish uchun oldindan snapshot yoki ACL/rejim zaxira nusxasi, test nusxasi va rollback rejasi kerak.
Production uchun foydali, faqat o'qiydigan misol:
Bu yerda sudo find aks holda audit qila olmaydigan kataloglarga kirishi uchun kerak. <app> ni tekshirilgan katalog nomi bilan almashtiring. Natijadagi guruh yoza oladigan har bir fayl xato emas — u umumiy yuklash katalogi yoki runtime ma’lumotlari uchun ataylab shunday qilingan bo'lishi mumkin. Auditning vazifasi kontekstsiz biror narsani o'zgartirish emas, kutilmagan istisnolarni yuzaga chiqarish.
Amaliy vaziyat: xizmat faylni ko'radi, lekin o'qiy olmaydi
Faraz qilaylik, veb-xizmat www-data sifatida ishlaydi va /srv/site/releases/current/index.html ni o'qishi kerak. Fayl 0640 rejimida, www-data guruhiga tegishli, lekin logda Permission denied chiqyapti.
1. Hisob va yo'lni faqat o'qish orqali tekshiring
systemctl show -p User -p Group <web_service>
id www-data
namei -l /srv/site/releases/current/index.html
stat -c '%A %a %U:%G %n' /srv/site/releases/current/index.html
findmnt -T /srv/site/releases/current/index.html -o TARGET,FSTYPE,OPTIONS
Namunaviy, tegishli parcha:
drwxr-xr-x root root /
drwxr-xr-x root root srv
drwxr-x--- root www-data site
drwxr----- root www-data releases
drwxr-x--- root www-data current
-rw-r----- root www-data index.html
index.html ni guruh o'qiy oladi. /srv/site va current ikkalasida ham guruh uchun x bor. Muammo releases qatoridagi r-- da: nomlarni ro'yxatlash mumkin, lekin keyingi current qismini topish uchun x yo'q.
2. Ko'zlangan siyosatni aniqlang
www-data faqat statik fayllarni o'qishi, hech qachon ularga yozmasligi kerak. Shuning uchun releases ga guruh uchun yozish huquqi ham, hamma uchun ochish ham kerak emas — faqat g+x yetishmayapti.
Biror narsani o'zgartirishdan oldin joriy holatni saqlang:
backup_file=$(sudo mktemp /root/site-releases.acl.before.XXXXXX)
sudo getfacl -p /srv/site/releases | sudo tee "$backup_file" >/dev/null
sudo chmod 0600 "$backup_file"
printf '%s\n' "$backup_file"
mktemp yagona nom yaratadi, shunda mavjud fayl tasodifan ustidan yozilmaydi. ACL zaxira nusxasi egasi, guruhi, rejimi va har qanday kengaytirilgan qoidalarni saqlaydi. backup_file faqat joriy shell sessiyasida yashaydi — chiqarilgan aniq yo'lni rollback qaydlaringizga yozib qo'ying.
3. Eng kichik o'zgarish va tekshirish
sudo chmod g+x /srv/site/releases
stat -c '%A %a %U:%G %n' /srv/site/releases
sudo -u www-data -- sh -c 'exec 3<"$1"' sh /srv/site/releases/current/index.html
echo $?
Kutilgan rejim 0750 (drwxr-x---), oxirgi holat esa 0. Katalog root ga tegishli bo'lgani uchun sudo chmod kerak. Bu o'zgarish xizmatga katalogdagi yozuvlarni o'zgartirish huquqini bermaydi.
4. Rollback
Agar o'zgarish kutilmagan ta’sir ko'rsatsa:
Xizmat sog'lom ishlayotgani tasdiqlangach, zaxira nusxani tashkilotingizning saqlash siyosatiga ko'ra o'chiring. Agar production’da konfiguratsiyani boshqarish tizimi yoki snapshot mavjud bo'lsa, o'sha tekshirilgan rollback yo'li ustun turadi.
rwx to'g'ri ko'rinsa-yu, xato yo'qolmasa
Tekshiruvni shu yerda to'xtatmang:
- ACL’lar va amaldagi mask’ni
getfacl -p <path>bilan tekshiring; royokinoexecborliginifindmnt -T <path>bilan tekshiring;- Ubuntu’da AppArmor rad etishlarini
journalctl -kdan qidiring; - RHEL oilasida SELinux kontekstini
ls -Z <path>va audit logi bilan tekshiring; - NFS yoki FUSE da server tomonidagi UID moslashtirish va export siyosatini hisobga oling.
Tashxis qo'ymasdan, xato yo'qolsin deb bu qatlamlardan birini o'chirib qo'yish xavfsiz yechim emas. Klassik DAC va bu qo'shimcha qatlamlar o'rtasidagi bog'liqlik Ruxsatlar xavfsizligi maqolasida chuqurroq yoritilgan.
Keng tarqalgan xatolar
Faqat oxirgi faylga qarash
stat file to'g'ri ko'rinishi mumkin, ota kataloglardan birida x yo'qligi esa butun yo'lni to'sib qo'yadi. namei -l ni birinchi bajariladigan tekshiruvlardan biriga aylantiring.
Katalogdagi r ni kirish huquqi deb hisoblash
r nomlarni sanab chiqadi; x esa nomni qidirib topadi. Haqiqiy kataloglarda ko'pincha ikkala bit birga bo'ladi, shuning uchun farqni sezmay qolish oson.
O'chirishni faylning o'zidagi w ga bog'lash
Nomni o'chirish — ota katalog amali. 0444 rejimidagi faylni ham, katalogda w+x bo'lsa, o'chirish mumkin — agar sticky bit boshqacha demasa.
find -perm -0022 va /0022 ni bir xil deb hisoblash
-0022 guruh va boshqalarning yozish bitlari ikkalasi birga bo'lishini talab qiladi. /0022 esa ulardan bittasi bo'lsa ham mos keladi. Auditning maqsadi odatda ikkinchi shaklga to'g'ri keladi.
test -r ni doimiy kafolat deb hisoblash
Tekshiruv va haqiqiy murojaat o'rtasida fayl yoki uning ruxsatlari o'zgarishi mumkin. Avtorizatsiyani "avval tekshir, keyin och" tarzida qurish poyga holatini (race condition) yaratadi. Dastur faylni to'g'ri hisob ostida to'g'ridan-to'g'ri ochishi va natijadagi xatoni qayta ishlashi kerak.
Skriptda x bo'lgani uchun u ishlaydi deb o'ylash
Noto'g'ri shebang, yo'q interpretator, noexec mount yoki format/arxitektura mos kelmasligi bajarishni to'sishi mumkin. "bad interpreter" va "Exec format error" kabi xatolar ruxsatlar satridan butunlay tashqaridagi sababni ko'rsatadi.
Xizmat xatosini o'z hisobingiz bilan tekshirish
Administrator yoki root sifatida muvaffaqiyatli bajarilishi www-data, postgres yoki ilovaning alohida hisobi ham xuddi shu narsaga kira olishini isbotlamaydi. Amalni yon ta’sirsiz sudo -u <account> -- ... bilan qayta hosil qiling.
Mashqlar
vaultni ketma-ket0400,0100,0500va0700qiling. Har biri uchunls,stat vault/report.txtvacat vault/report.txtnatijalarini qayd eting va qaysi bit qaysi xatti-harakatni boshqarganini tushuntiring.report.txtni0000qiling. Ota katalog0700bo'lganda uni baribir qayta nomlash mumkinligini tasdiqlang, so'ng asl nomi va0644rejimini tiklang.check.shni bajarish biti bilan va usiz solishtiring. So'ng uning shebang'ini ataylab mavjud bo'lmagan interpretator yo'liga yo'naltiring va ruxsat xatosini interpretator xatosi bilan solishtiring. Keyin faylni tiklang.- Rejimlari har xil kamida uchta test faylda
find -perm 0644,find -perm -0644vafind -perm /0022ni solishtiring. "Aynan", "hammasi" va "birortasi" ma’nolarini buyruq natijalari bilan isbotlang. - O'qiy oladigan bitta fayl uchun
id,namei -l,stat,getfacl -pvafindmnt -Tyordamida qisqa ruxsatlar hisobotini tuzing. Hech qanday tizim ruxsatini o'zgartirmang.
Mashqni bajardim deyish uchun: har bir xulosada faqat rejim raqamini emas, jarayon qaysi ruxsat sinfiga tushganini, yo'ldagi har bir katalogda x bor-yo'qligini va aynan qaysi amal so'ralayotganini ko'rsating.
Tugatganingizda avval laboratoriya daraxtini faqat o'qish orqali ko'rib chiqing:
Natijada faqat ~/lab/file-permissions test daraxti ko'rinsagina:
Warning
chmod -R butun daraxt bo'ylab rejimlarni o'zgartiradi, rm -rI esa fayllarni ortga qaytarib bo'lmaydigan tarzda o'chiradi. Ularni faqat yuqorida yaratilgan laboratoriya katalogiga qarshi va faqat maqsadni find bilan tasdiqlagandan keyin bajaring. Saqlamoqchi bo'lgan natijalarni avval boshqa joyga ko'chiring. Snapshot yoki metama’lumotlar zaxira nusxasisiz production daraxti uchun bunga teng qisqa yo'l yo'q.
Manbalar
- Linux man-pages:
path_resolution(7): https://man7.org/linux/man-pages/man7/path_resolution.7.html - Linux man-pages:
inode(7): https://man7.org/linux/man-pages/man7/inode.7.html - Linux man-pages:
access(2): https://man7.org/linux/man-pages/man2/access.2.html - Linux man-pages:
open(2): https://man7.org/linux/man-pages/man2/open.2.html - Linux man-pages:
acl(5): https://man7.org/linux/man-pages/man5/acl.5.html - GNU Coreutils qo'llanmasi:
chmodinvocation: https://www.gnu.org/software/coreutils/manual/html_node/chmod-invocation.html - util-linux qo'llanmasi:
namei(1): https://man7.org/linux/man-pages/man1/namei.1.html - GNU Findutils qo'llanmasi: file mode bits: https://www.gnu.org/software/findutils/manual/html_node/find_html/Mode-Bits.html
- POSIX.1-2024: general concepts, file access permissions: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap04.html