Tarkibga o'tish

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.

mkdir -p ~/lab/umask
cd ~/lab/umask
umask
umask -S

Tizim va distributivga qarab farq qiladigan namunaviy natija:

0022
u=rwx,g=rx,o=rx

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;
  • mkdir katalog uchun 0777 (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:

final_mode = base_mode AND NOT umask

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:

base (file): 110 110 110   = 0666
umask 0023 : 000 010 011
AND NOT    : 110 100 100   = 0644

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:

umask 0027
umask
touch fileA
mkdir dirA
stat -c '%A %a %n' fileA dirA

Kutiladigan natija:

0027
-rw-r----- 640 fileA
drwxr-x--- 750 dirA

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:

umask 0077
touch fileB
mkdir dirB
stat -c '%A %a %n' fileB dirB
-rw------- 600 fileB
drwx------ 700 dirB

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:

chmod 0644 fileB
stat -c '%A %a %n' fileB

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 umask dan emas, yaratayotgan jarayondan va har qanday setgid katalog siyosatidan keladi — bu Egalik maqolasida ko'rib chiqilgan.
  • Maxsus bitlar. umask yangi obyektga setuid, setgid yoki sticky bit ni avtomatik qo'ymaydi; ular Maxsus ruxsatlar maqolasidagidek chmod yoki setgid merosi orqali keladi.
  • Mavjud fayllar. Yuqorida ko'rsatilganidek, mask faqat yaratishga ta’sir qiladi.
  • cp va arxivlar. cp -p, cp -a, tar va shunga o'xshash vositalar manba ruxsatlarini saqlab qolishga urinishi va umask ni butunlay chetlab o'tishi mumkin. Nusxalash yoki tiklashdan keyin umask ga ishonmasdan, ruxsatlarni stat bilan 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:

umask 0002
touch team/report2.txt
stat -c '%A %a %U:%G %n' team/report2.txt

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:

  1. Shell’ning ichki buyrug'i. Interaktiv umask 0027 faqat 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.
  2. /etc/login.defs. UMASK direktivasi login paytida qo'llanadigan standart mask’ni belgilaydi.
  3. PAM (pam_umask). Ko'p distributivlar login sessiyasining mask’ini PAM moduli orqali o'rnatadi. U qiymatni login.defs ga yoki foydalanuvchi guruhiga qarab tanlashi mumkin.
  4. 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:

umask
grep -i '^UMASK' /etc/login.defs

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:

sudo systemctl edit report.service

Ochilgan muharrirga faqat quyidagini qo'shing:

[Service]
UMask=0027

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:

sudo find /var/lib/report/out -xdev -type f -newermt '-5 min' \
    -printf '%m %u:%g %p\n'

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

  1. Joriy umask ni umask va umask -S bilan qayd eting. So'ng ketma-ket 0022, 0002, 0027 va 0077 ni 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.
  2. umask 0111 ni o'rnating va bitta fayl hamda bitta katalog yarating. Bitlar darajasida nega faylning rejimi o'zgarmagani, katalogniki esa o'zgarganini tushuntiring.
  3. setgid katalog yarating (chmod 2775). Uning ichidagi yangi faylning rejimini umask 0022 va umask 0002 ostida solishtiring. Qaysi mask guruhga haqiqatan yozishga ruxsat berishini ko'rsating.
  4. grep -i '^UMASK' /etc/login.defs natijasini umask buyrug'ining o'z natijasi bilan solishtiring. Agar ular farq qilsa, amaldagi qiymatni qaysi manba — shell profili yoki PAM — o'rnatganini aniqlang.
  5. Taxminiy xizmat uchun "fayllarni faqat egasi va guruh o'qiy olishi kerak" degan talabni oling. Mos umask ni tanlang, uni UMask= 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:

find ~/lab/umask -xdev -maxdepth 2 -printf '%y %m %p\n'

Natijada faqat ~/lab/umask test daraxti ko'rinsagina:

rm -rI -- ~/lab/umask

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 umask utility: 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