umask: yangi fayl va kataloglarning ruxsatlari qanday belgilanadi
Terminalda touch report.txt bilan yaratilgan oddiy fayl deyarli har doim -rw-r--r-- (644), yangi katalog esa drwxr-xr-x (755) bo'lib chiqadi. Bu sonlarni na touch, na mkdir tanlagan va ular tasodifiy ham emas: ular har bir jarayonga biriktirilgan umask degan qiymatdan keladi. umask ni tushunmaslik ikki qarama-qarshi xatoga olib keladi: maxfiy fayl kutilmaganda hamma o'qiy oladigan bo'lib qoladi yoki xizmat yozadigan fayllar kerak bo'lganda ham guruh yoza oladigan bo'lmaydi.
Maxsus ruxsatlar maqolasida setuid, setgid va sticky bit mavjud faylning metama’lumotlarini qanday o'zgartirishi ko'rib chiqilgan. umask esa boshqa savolga javob beradi: obyekt hali mavjud bo'lmasdan oldin u qanday boshlang'ich ruxsat oladi? chmod mavjud faylni tuzatadi; umask esa yangi faylning boshidanoq noto'g'ri ruxsat bilan "tug'ilishining" oldini oladi.
Quyida oddiy fayl 666 asosidan, katalog esa 777 asosidan boshlanishini; umask ayirish orqali emas, bitlar ustidagi AND NOT amali orqali ishlashini; umask va umask -S ni qanday o'qish va joriy qiymatni xavfsiz o'zgartirishni ko'ramiz. Shuningdek, mask aslida qayerda o'rnatilishini — shell, login.defs, PAM yoki systemd unit’i — va xizmat fayllarining ruxsatlarini UMask= yoki interaktiv umask bilan qanday boshqarishni o'rganamiz. Butun maqola davomida umask ni chmod, egalik va setgid katalogdan aniq ajratib turing.
Laboratoriyani tayyorlash
Quyidagi barcha misollar joriy foydalanuvchining uy katalogi ichida ishlaydi va sudo talab qilmaydi. umask faqat joriy shell jarayoni va uning bola jarayonlariga ta’sir qiladi — u hech qachon tizim kataloglariga tegmaydi. Har bir qatorni aynan buyruqdan boshlang; $ yoki # prompt belgisi buyruqning bir qismi emas.
Tizim va distributivga qarab farq qiladigan namunaviy natija:
Birinchi qator joriy umask ni sakkizlik ko'rinishda chiqaradi; ikkinchisi esa yaratish paytida saqlanib qoladigan ruxsatlarni simvolik ko'rinishda ko'rsatadi. Ubuntu Server’dagi oddiy foydalanuvchida bu qiymat odatda 0022 yoki 0002 bo'ladi — ikkinchisi Foydalanuvchi va guruh hisoblari maqolasida ko'rilgan "user private group" siyosati bilan bog'liq.
Note
umask alohida dastur emas — u shell’ning ichki buyrug'i (built-in). U jarayonga xos atribut bo'lgani uchun uning qiymati faqat joriy shell va undan keyin ishga tushadigan jarayonlarga qo'llanadi. Yangi terminal oynasi yoki yangi login sessiyasi o'z konfiguratsiya fayllari bergan qiymatni o'qib, noldan boshlanadi.
Asosiy ruxsat va mask’ning ma’nosi
Yangi obyekt yaratilganda kerneldan qanday ruxsat so'rashni chaqirayotgan dastur hal qiladi, lekin amalda ikkita keng tarqalgan asos ishlatiladi:
- ko'pchilik dasturlar oddiy fayl uchun
0666(rw-rw-rw-) ni so'raydi; mkdirkatalog uchun0777(rwxrwxrwx) ni so'raydi.
E’tibor bering: fayl asosida umuman x biti yo'q. Oddiy fayl tasodifan bajariladigan bo'lib qolmasligi kerak — bajarish bitini haqiqatan kerak bo'lganda chmod bilan ataylab qo'shasiz. Katalog asosida esa x bor, chunki u "ichiga kirish" degani.
umask shu asosdan qaysi bitlarni olib tashlashni hal qiladi. U faqat cheklay oladi, hech qachon qo'sha olmaydi. Yakuniy ruxsat arifmetik ayirish emas, bitlar ustidagi "AND NOT" amali:
Boshqacha aytganda, umask da o'rnatilgan har bir bit natijada tozalanadi; qolgan barcha bitlar asosdagidek qoladi.
Nega ayirish emas?
Ko'p qo'llanmalar umask ni "asosdan ayiriladi" deb soddalashtiradi. Bu ko'pincha to'g'ri javob beradi, lekin mexanizmni noto'g'ri tasvirlaydi va ba’zi qiymatlar uchun noto'g'ri natija beradi. Buni bitlarning o'zida ko'rish eng oson. 0023 mask’ini olaylik:
Har bir uchlikda umask da o'rnatilgan bit natijada 0 bo'ladi; boshqa bitlar o'zgarmaydi. Guruhning w biti (010) va boshqalarning w hamda x bitlari (011) tozalanadi. Natija 0644. Agar bu haqiqatan ayirish bo'lganda, 0666 − 0023 0643 ga teng bo'lardi va boshqalarga ma’nosiz -wx huquqini bergan bo'lardi. Demak, umask ayirmaydi — u mos bitlarni niqoblab (mask qilib) olib tashlaydi.
Fayl asosida x yo'qligining yana bir oqibati bor: umask dagi x bitlari oddiy faylga hech qachon ta’sir qilmaydi. umask 0111 faylning 0666 ini o'zgarishsiz qoldiradi, chunki u tozalashi kerak bo'lgan x bitlari asosda allaqachon yo'q. Xuddi shu mask katalogga esa ta’sir qiladi, chunki katalog asosida x bor.
Uchta keng tarqalgan qiymat
| umask | Fayl natijasi | Katalog natijasi | Qachon |
|---|---|---|---|
022 |
644 (rw-r--r--) |
755 (rwxr-xr-x) |
boshqalar o'qiy oladi; ko'p tizimlarda sukut bo'yicha |
002 |
664 (rw-rw-r--) |
775 (rwxrwxr-x) |
guruh a’zolari yoza oladi; jamoaviy ish uchun foydali |
077 |
600 (rw-------) |
700 (rwx------) |
faqat egasi kira oladi; maxfiy ma’lumotlar uchun mos |
077 guruh va boshqalarning barcha bitlarini tozalaydi, shuning uchun yangi fayllar faqat egasiga ochiq bo'ladi. Maxfiy yoki shaxsiy ma’lumotlarni tez-tez yaratadigan sessiya uchun bu xavfsiz standart qiymat.
To'g'ridan-to'g'ri sinab ko'rish
Endi qiymatni o'zgartirib, natijani bevosita kuzating. umask 0027 guruhga o'qishni qoldiradi va boshqalar uchun hamma narsani tozalaydi:
Kutiladigan natija:
Fayl asosi 0666 edi; 0027 guruhning w ini va boshqalarning rwx ini tozalab, 0640 ni qoldirdi. Katalog asosi 0777 edi; xuddi shu mask 0750 ni qoldirdi. Endi qat’iyroq mask’ni sinab ko'ring:
Warning
Bu misollar umask ni faqat joriy interaktiv shell uchun vaqtincha o'zgartirdi. Shell yopilganda qiymat yo'qoladi. /etc/profile, /etc/login.defs yoki systemd unit’idagi global umask ni o'zgartirish butun tizimga yoki butun xizmatga ta’sir qiladi — avval uni laboratoriya muhitida sinab ko'ring.
Mavjud faylni chmod bilan tuzatish
umask faqat yaratish paytida qo'llanadi. U mavjud faylni qayta hisoblamaydi — buning uchun chmod kerak:
umask — oldini olish, chmod — tuzatish. To'g'ri umask fayllarning noto'g'ri ruxsat bilan boshlanishining oldini oladi; chmod esa allaqachon noto'g'ri yaratilgan yoki maxsus rejim talab qiladigan obyektni tuzatadi. Biri ikkinchisining o'rnini bosmaydi.
umask nimaga ta’sir qilmaydi
umask ruxsatlar modelining faqat bir qismini boshqaradi. Uni quyidagi qo'shni tushunchalar bilan adashtirmang:
- Egalik. Yangi obyektning egasi va guruhi
umaskdan emas, yaratayotgan jarayondan va har qandaysetgidkatalog siyosatidan keladi — bu Egalik maqolasida ko'rib chiqilgan. - Maxsus bitlar.
umaskyangi obyektgasetuid,setgidyoki sticky bit ni avtomatik qo'ymaydi; ular Maxsus ruxsatlar maqolasidagidekchmodyokisetgidmerosi orqali keladi. - Mavjud fayllar. Yuqorida ko'rsatilganidek, mask faqat yaratishga ta’sir qiladi.
cpva arxivlar.cp -p,cp -a,tarva shunga o'xshash vositalar manba ruxsatlarini saqlab qolishga urinishi vaumaskni butunlay chetlab o'tishi mumkin. Nusxalash yoki tiklashdan keyinumaskga ishonmasdan, ruxsatlarnistatbilan tekshiring.
setgid katalog va umask birgalikda
Umumiy katalogda setgid yangi fayllar katalog guruhini meros qilib olishini ta’minlaydi, lekin o'zi guruhga yozish huquqini bermaydi. Bu huquq baribir umask ga bog'liq. Faraz qilaylik, setgid katalog bor, lekin sessiya umask 0022 bilan ishlayapti:
umask 0022
mkdir team
chmod 2775 team
touch team/report.txt
stat -c '%A %a %U:%G %n' team team/report.txt
Katalog setgid bo'lsa ham, fayl 0644 bo'lib chiqadi — guruh a’zosi uni o'qiy oladi, lekin unga yoza olmaydi. Agar guruhga yozish huquqi kerak bo'lsa, sessiya o'rniga umask 0002 bilan ishlashi kerak:
Endi fayl 0664 bo'lib chiqadi. Xulosa: "jamoa katalogidagi fayllarga guruh yoza olmayapti" degan muammoning sababi ko'pincha setgid yo'qligi emas, noto'g'ri umask.
umask qayerdan keladi va qanday saqlanadi
umask jarayondan jarayonga meros bo'lib o'tadi, shuning uchun "u qayerda o'rnatiladi" degan savol muhim. Asosiy manbalar:
- Shell’ning ichki buyrug'i. Interaktiv
umask 0027faqat joriy shell va uning bola jarayonlariga ta’sir qiladi. Uni foydalanuvchi profiliga (~/.bashrc,~/.profile) yozish doimiy qiladi, lekin faqat o'sha foydalanuvchining interaktiv shell’i uchun. /etc/login.defs.UMASKdirektivasi login paytida qo'llanadigan standart mask’ni belgilaydi.- PAM (
pam_umask). Ko'p distributivlar login sessiyasining mask’ini PAM moduli orqali o'rnatadi. U qiymatnilogin.defsga yoki foydalanuvchi guruhiga qarab tanlashi mumkin. - systemd. Xizmat yoki user manager uchun mask unit faylidagi
UMask=direktivasi bilan aniq belgilanadi — daemon yaratadigan fayllar uchun eng ishonchli usul.
Konfiguratsiya faylida shunday yozilgani uchun amaldagi qiymat ham shunday deb o'ylamang — joriy sessiyadagi haqiqiy qiymatni doim to'g'ridan-to'g'ri tekshiring:
grep faqat login.defs dagi matnni ko'rsatadi; u PAM yoki shell profili keyinchalik qiymatni almashtirishini hisobga olmaydi. Yakuniy dalil har doim umask buyrug'ining o'z natijasi.
Note
Ubuntu va Debian’da oddiy foydalanuvchi ko'pincha o'zining shaxsiy guruhiga tegishli bo'ladi (masalan, ali:ali). Shuning uchun umask 0002 xavfsiz standart qiymat hisoblanadi: amalda guruhning yozish huquqi faqat foydalanuvchining o'ziga tegishli bo'ladi. RHEL oilasi ham shunga o'xshash "user private group" yondashuviga amal qiladi. Ko'p a’zoli umumiy guruhda esa 0002 ni guruhning haqiqiy siyosatini tekshirgandan keyin ongli ravishda qo'llang.
Amaliy vaziyat: xizmat fayllari juda ochiq yaratilyapti
Faraz qilaylik, report.service hisobot fayllarini /var/lib/report/out/ ga yozadi. Audit bu fayllar 0644 ekanini aniqladi — ya’ni tizimdagi istalgan lokal foydalanuvchi ularni o'qiy oladi. Siyosatga ko'ra hisobotlarni faqat xizmat egasi va report guruhi ko'rishi kerak. Sabab — xizmatning umask i 0022.
Bu systemd unit’iga kiritiladigan production o'zgarishi. VM snapshot yoki konfiguratsiyani boshqarish tizimi va rollback rejasisiz davom etmang.
1. Hech narsani o'zgartirmasdan joriy holatni tekshiring
systemctl show -p User -p Group -p UMask report.service
sudo find /var/lib/report/out -xdev -type f -printf '%m %u:%g %p\n' | head
systemctl cat report.service
systemctl show xizmatning amaldagi UMask ini ko'rsatadi; find esa mavjud fayllarning haqiqiy rejimini ko'rsatadi. Agar UMask bo'sh yoki 0022 bo'lsa, yangi fayllar nega 0644 bo'lib chiqayotgani shu bilan tushuntiriladi.
2. Ko'zlangan siyosatni aniqlang
Fayllarni egasi va guruh o'qiy olishi, boshqalar uchun esa yopiq bo'lishi kerak. umask 0027 mos keladi: guruhning o'qish huquqi qoladi, boshqalar uchun barcha bitlar tozalanadi. Agar guruhga yozish ham kerak bo'lsa, 0007 tanlanadi.
3. Zaxira nusxa va nazorat ostidagi o'zgarish
Avval mavjud drop-in faylni saqlang yoki qayd eting, so'ng UMask ni drop-in fayl orqali o'rnating:
Ochilgan muharrirga faqat quyidagini qo'shing:
systemctl edit /etc/systemd/system/report.service.d/override.conf drop-in faylini yaratadi va asosiy unit’ga tegmaydi. Bu rollback’ni soddalashtiradi: drop-in faylni olib tashlash yetarli.
4. Qayta yuklash va tekshirish
sudo systemctl daemon-reload
sudo systemctl restart report.service
systemctl show -p UMask report.service
UMask=0027 tasdiqlangach, xizmat yaratadigan navbatdagi hisobotni tekshiring:
Yangi fayllar 0640 bo'lib chiqishi kerak. Mavjud fayllar eski rejimini saqlab qoladi — ularni zaxira nusxa rejasi tasdiqlangandan keyingina, siyosatga mos ravishda chmod bilan alohida tuzating.
5. Rollback
Agar o'zgarish kutilmagan ta’sir ko'rsatsa, drop-in faylni olib tashlang:
sudo systemctl revert report.service
sudo systemctl daemon-reload
sudo systemctl restart report.service
systemctl show -p UMask report.service
systemctl revert systemctl edit yaratgan drop-in fayllarni bekor qiladi va xizmatni distributiv bergan holatga qaytaradi. Shundan keyin xizmat loglarini va yangi fayllar rejimini yana tekshiring.
Keng tarqalgan xatolar
umask ruxsat qo'shadi deb o'ylash
umask faqat bitlarni olib tashlaydi. umask 0000 fayl asosiga x qo'shmaydi — oddiy fayl baribir 0666 bilan yaratiladi. Bajarish yoki maxsus bit haqiqatan kerak bo'lganda chmod dan foydalaning.
umask ni arifmetik ayirish deb hisoblash
0666 − umask ko'p qiymatlar uchun to'g'ri javob beradi, lekin mexanizm bitlar ustidagi AND NOT. umask 0023 fayl uchun 0643 emas, 0644 beradi. Ikkilansangiz, natijani stat bilan tasdiqlang.
Fayl va katalog uchun bir xil natija kutish
Bitta mask fayl asosiga (0666) va katalog asosiga (0777) turlicha ta’sir qiladi. umask dagi x bitlari faylga hech qachon tegmaydi, lekin katalogga ta’sir qiladi. Shuning uchun umask 0022 faylga 0644, katalogga esa 0755 beradi.
Global umask’ni interaktiv umask bilan tekshirish
Login shell’ingizdagi umask xizmat yoki cron vazifasining mask’ini ko'rsatmaydi. Har bir kontekstni alohida tekshiring: xizmat uchun systemctl show -p UMask, cron vazifasi uchun esa uning ichida aniq umask natijasini chiqaring.
Umumiy katalogdagi ruxsat muammosini faqat setgid ga bog'lash
Agar fayllarga guruh yoza olmasa, sabab ko'pincha setgid yo'qligi emas, umask 0022. setgid guruhni meros qilib beradi; umask esa yozish bitini boshqaradi. Ikkalasini birga tuzating.
Konfiguratsiya faylini amaldagi qiymat deb hisoblash
/etc/login.defs dagi UMASK qiymati yagona haqiqat manbai emas, balki manbalardan biri. PAM, shell profili yoki systemd uni almashtirishi mumkin. Yakuniy qiymatni faqat aynan kerakli kontekstda umask ni ishga tushirib tasdiqlang.
Mashqlar
- Joriy
umaskniumaskvaumask -Sbilan qayd eting. So'ng ketma-ket0022,0002,0027va0077ni o'rnating va har safar bitta fayl hamda bitta katalog yarating.stat -c '%A %a %n'natijasidan har bir mask qaysi bitlarni olib tashlaganini tushuntiring. umask 0111ni o'rnating va bitta fayl hamda bitta katalog yarating. Bitlar darajasida nega faylning rejimi o'zgarmagani, katalogniki esa o'zgarganini tushuntiring.setgidkatalog yarating (chmod 2775). Uning ichidagi yangi faylning rejiminiumask 0022vaumask 0002ostida solishtiring. Qaysi mask guruhga haqiqatan yozishga ruxsat berishini ko'rsating.grep -i '^UMASK' /etc/login.defsnatijasiniumaskbuyrug'ining o'z natijasi bilan solishtiring. Agar ular farq qilsa, amaldagi qiymatni qaysi manba — shell profili yoki PAM — o'rnatganini aniqlang.- Taxminiy xizmat uchun "fayllarni faqat egasi va guruh o'qiy olishi kerak" degan talabni oling. Mos
umaskni tanlang, uniUMask=sifatida qanday o'rnatishingizni va natijani qaysi buyruq tekshirishini tasvirlab bering. Haqiqiy xizmatni o'zgartirmang.
Mashqni bajardim deyish uchun: har bir javobda faqat yakuniy rejim raqamini emas, asosni (0666/0777), mask’ni va uch bosqichli AND NOT amalini ko'rsating.
Laboratoriyani tugatganingizda maqsadni faqat o'qish orqali ko'rib chiqing:
Natijada faqat ~/lab/umask test daraxti ko'rinsagina:
Warning
rm -rI test daraxtini ortga qaytarish imkoniyatisiz o'chiradi. Uni faqat absolyut chegarani yuqoridagi find buyrug'i bilan tasdiqlagandan keyin ishga tushiring. Saqlamoqchi bo'lgan natijalarni avval boshqa joyga saqlang; bu buyruqni production katalogida ishlatmang.
Manbalar
- Linux man-pages:
umask(2): https://man7.org/linux/man-pages/man2/umask.2.html - POSIX.1-2024: the
umaskutility: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/umask.html - Linux man-pages:
open(2): https://man7.org/linux/man-pages/man2/open.2.html - Linux man-pages:
login.defs(5): https://man7.org/linux/man-pages/man5/login.defs.5.html - Linux man-pages:
pam_umask(8): https://man7.org/linux/man-pages/man8/pam_umask.8.html - systemd:
systemd.exec(5)(UMask=): https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html - GNU Bash Reference Manual: Bourne shell builtins (
umask): https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html