Tarkibga o'tish

Maxsus ruxsatlar: setuid, setgid va sticky bit

Oddiy rwx bitlari jarayon faylni o'qiy, unga yoza yoki uni bajara oladimi-yo'qligini hal qiladi. Amalda yana ikki savol tug'iladi: bajariladigan fayl ishga tushgach, qaysi identifikator bilan ishlaydi va umumiy katalogdagi faylni kim o'chira oladi? Linux ikkalasiga ham uchta maxsus rejim biti bilan javob beradi: set-user-ID (setuid), set-group-ID (setgid) va sticky bit.

Fayl ruxsatlari maqolasida jarayon identifikatori rwx bilan qanday solishtirilishi, Egalik maqolasida esa shu identifikatorning UID/GID i aslida qayerdan kelishi ko'rib chiqilgan. Maxsus bitlar xuddi shu rejim maydonida saqlanadi, lekin kernel bajarish va katalog amallarini qanday talqin qilishini o'zgartiradi va bir vaqtning o'zida o'zining hujum yuzasini ham olib keladi.

Warning

Quyidagi <path> va <group> kabi to'ldiriladigan joylar aynan yoziladigan qiymat emas — biror narsani ishga tushirishdan oldin ularni tekshirilgan haqiqiy qiymat bilan almashtiring. < yoki > belgisi bor buyruqni shell’ga to'g'ridan-to'g'ri ko'chirib qo'ymang.

Quyida bu uch bit rwx yonida qanday joylashishini va ularning sakkizlik qiymatlarini qanday o'qishni; ls -l dagi s, S, t va T belgilarini; setuid va setgid bajariladigan faylda jarayonning effective UID/GID ini qanday o'zgartirishini; katalogdagi setgid yangi fayllarga katalog guruhini qanday meros qilib berishini; sticky bit nimani himoya qilishini va nimani qilmasligini ko'rib chiqamiz. Shuningdek, maxsus bitlarni stat, find, findmnt va paket vositalari bilan zaxira nusxa, tekshiruv qadami va rollback’ga tayangan holda audit qilishni o'rganamiz.

Maxsus bitlar rejim ichida qayerda turadi

Oddiy rejim uchta sakkizlik raqam bilan yoziladi: egasi, guruh va boshqalar. Maxsus bitlar shu uchtasining oldidagi to'rtinchi raqamni egallaydi:

Maxsus bit Sakkizlik qiymati Simvolik o'zgartirish Asosiy vazifasi
setuid 4 u+s, u-s bajariladigan faylni uning egasining effective UID i bilan ishga tushirish
setgid 2 g+s, g-s bajariladigan faylni uning guruhi bilan ishga tushirish yoki katalogga o'z guruhini meros qilib berish
sticky 1 +t, -t umumiy katalogda o'chirish va qayta nomlashni cheklash

Masalan:

4755 = setuid + 0755
2770 = setgid + 0770
1777 = sticky + 0777
6755 = setuid + setgid + 0755

Bu sonlar qo'shiladi: 4 + 2 = 6, 2 + 1 = 3, uchalasi birga esa 7 bo'ladi. Son sakkizlik ekanini ko'rinib turishi uchun ba’zan 04755 kabi bosh nol bilan yoziladi.

Rejimni bir necha shaklda tekshiring:

stat -c 'symbolic=%A octal=%a owner=%U group=%G path=%n' -- <path>
ls -ld -- <path>

stat %a xom bitlarni beradi, %A va ls -l esa simvolik ko'rinishni beradi. ls -l qatori oxiridagi + ACL borligini bildirishi mumkin; maxsus bitlar ACL’lar o'rnini bosmaydi.

s, S, t va T nimani anglatadi

Maxsus bit alohida ustunga ega emas — u tegishli bajarish belgisi o'rnida ko'rsatiladi:

  • egasining bajarish o'rnida s: setuid o'rnatilgan va egasi uchun bajarish huquqi ham bor.
  • egasining bajarish o'rnida S: setuid o'rnatilgan, lekin egasi uchun bajarish huquqi yo'q.
  • guruhning bajarish o'rnida s: setgid o'rnatilgan va guruh uchun bajarish huquqi ham bor.
  • guruhning bajarish o'rnida S: setgid o'rnatilgan, lekin guruh uchun bajarish huquqi yo'q.
  • boshqalarning bajarish o'rnida t: sticky o'rnatilgan va boshqalar uchun bajarish huquqi ham bor.
  • boshqalarning bajarish o'rnida T: sticky o'rnatilgan, lekin boshqalar uchun bajarish huquqi yo'q.

Masalan:

-rwsr-xr-x 4755 root:root /usr/bin/passwd
drwxrws--- 2770 root:catalog-editors /srv/catalog/shared
drwxrwxrwt 1777 root:root /tmp
-rwS------ 4600 ali:ali mode-sample

Oxirgi qatordagi katta S "kuchliroq setuid" degani emas. Aksincha: egasining bajarish huquqisiz bu oddiy fayl umuman bajariladigan dastur sifatida ishga tushmaydi va bunday rejim birikmasi odatda xato yoki chala qolgan sozlama bo'ladi.

Note

Oddiy faylda setgid tozalangan guruh bajarish biti bilan birga — yuqorida ko'rsatilgan guruhdagi S — tarixan majburiy fayl qulflashni (mandatory locking) so'rash uchun ham ishlatilgan. Bu mexanizm ishonchsiz deb hisoblanadi va Linux 5.15 dan beri qo'llab-quvvatlanmaydi. Hozirgi tizimda yangi qulflash mexanizmini shu rejim birikmasi atrofida loyihalamang.

Bajariladigan faylda setuid qanday ishlaydi

Jarayonning real UID i uni kim ishga tushirganini ko'rsatadi; effective UID esa kirish tekshiruvlarining ko'pchiligida ishlatiladigan identifikator. Oddiy bajariladigan faylda ikkalasi ham chaqiruvchiga tegishli. setuid biti bor native bajariladigan fayl execve(2) orqali ishga tushganda kernel effective UID ni fayl egasiga almashtiradi; real UID esa o'zgarmaydi.

Soddalashtirilgan oqim:

ali runs the executable
        │
        ▼
the kernel checks mode and mount/process restrictions
        │
        ▼
if setuid is honored: real UID=ali, effective UID=the file's owner
        │
        ▼
the program performs only whatever privileged action its own code allows

Ubuntu’dagi keng tarqalgan misol:

command -v passwd
stat -c '%A %a %U:%G %n' -- /usr/bin/passwd

Namunaviy natija:

/usr/bin/passwd
-rwsr-xr-x 4755 root:root /usr/bin/passwd

Oddiy foydalanuvchi o'z parolini o'zgartirganda passwd himoyalangan hisob ma’lumotlarini yangilashi kerak. setuid root foydalanuvchiga ixtiyoriy root shell bermaydi: argumentlarni, chaqirayotgan foydalanuvchining identifikatorini va aslida qaysi amallarga ruxsat berilishini qat’iy tekshirish dasturning o'z vazifasi.

Note

Aniq rejim distributivga, paket versiyasiga va qotirish (hardening) siyosatiga bog'liq. Ba’zi tarixiy dasturlar setuid o'rniga Linux capabilities, imtiyozli xizmat yoki boshqa mexanizmdan foydalanadi. Internetda topilgan ro'yxatni tizimingiz uchun haqiqat deb qabul qilmang — lokal faylni tekshiring.

setuid har doim ham qo'llanavermaydi

Quyidagi holatlarda Linux setuid/setgid orqali yangi huquq bermaydi:

  • fayl turgan fayl tizimi nosuid bilan mount qilingan;
  • chaqirayotgan jarayonda no_new_privs o'rnatilgan;
  • jarayon tegishli ptrace kuzatuvi ostida;
  • bajariladigan fayl interpretator orqali ishlaydigan skript — Linux skriptlardagi setuid/setgid bitlarini e’tiborsiz qoldiradi.

Mount kontekstini faqat o'qish orqali tekshirish:

findmnt -no TARGET,VFS-OPTIONS,FS-OPTIONS --target /usr/bin/passwd

Agar nosuid ko'rinsa, bit diskda saqlangan bo'lsa ham, imtiyozga o'tish sodir bo'lmaydi. Kernel versiyasiga qarab bajariladigan fayl oddiy huquqlar bilan ishga tushishi yoki umuman xato bilan tugashi mumkin.

Danger

Shell skriptga chmod u+s qilib imtiyoz mexanizmi qurishga urinmang. Linux skriptlar uchun bu bitni e’tiborsiz qoldiradi; boshqa platformalarda xatti-harakat boshqacha bo'lishi mumkin. Haqiqatan imtiyoz talab qiladigan vazifa uchun tor sudoers qoidasi, ko'rib chiqilgan native yordamchi dastur, tizim xizmati yoki o'rinli bo'lsa, minimal capability modeli xavfsizlik tekshiruvidan o'tsin.

Nega setuid bajariladigan fayl xavfli

setuid root dasturidagi argumentlarni tahlil qilish, muhit o'zgaruvchilari bilan ishlash, vaqtinchalik fayl yaratish, poyga holati, kutubxona yoki undan chaqiriladigan tashqi buyruqdagi xato oddiy foydalanuvchini root huquqiga olib chiqishi mumkin. Ayniqsa, imtiyozsiz hisob faylga yoki uning ota kataloglaridan biriga yoza olsa, hujumchi bajariladigan faylni butunlay almashtira oladi.

setuid bitini qo'shishdan oldin kamida:

  1. vazifani sudo, xizmat yoki capability bilan torroq ifodalash mumkinmi-yo'qligini tekshiring;
  2. bajariladigan fayl va uning har bir ota katalogining egaligi va rejimini audit qiling;
  3. binar fayl qayerdan kelganini va qaysi paketga tegishli ekanini aniqlang;
  4. mount, MAC siyosati va no_new_privs kontekstini tekshiring;
  5. o'zgarishni monitoring va rollback rejasi bilan o'zgarishlar qaydiga yozing.

Bajariladigan fayldagi va katalogdagi setgid

Bajariladigan fayldagi setgid kernelga jarayonning effective GID ini fayl guruhiga almashtirishni buyuradi. Real GID va qo'shimcha guruhlar o'z-o'zidan almashtirilmaydi. Simvolik ko'rinishda s guruhning bajarish o'rnida chiqadi:

-rwxr-sr-x 2755 root:tty <executable>

Lekin katalogdagi setgid jarayon identifikatorini umuman oshirmaydi. U yangi fayl va ichki kataloglar yaratuvchi jarayonning o'z guruhi o'rniga ota katalogning guruhini meros qilib olishini ta’minlaydi. Yangi ichki kataloglar odatda setgid bitini ham meros qilib oladi.

Egalik maqolasidagi umumiy katalog muammosi aynan shunday hal qilinadi:

stat -c '%A %a %U:%G %n' -- <team_directory>
chmod g+s -- <team_directory>
stat -c '%A %a %U:%G %n' -- <team_directory>

Masalan, root:catalog-editors ga tegishli 2770 katalogda guruh a’zosi yangi fayl yaratsa, bu faylning guruhi odatda foydalanuvchining o'z asosiy guruhi emas, catalog-editors bo'ladi.

Muhim chegaralar:

  • setgid faqat keyin yaratiladigan obyektlarga ta’sir qiladi — mavjud fayllarning guruhini o'zgartirmaydi;
  • u yangi faylning rw bitlarini bermaydi — ular so'ralgan rejim, umask va har qanday default ACL dan keladi;
  • yangi ichki katalog setgid ni meros qilib oladi, lekin uning ichidagi kirish bitlari baribir umask yoki default ACL ga bog'liq;
  • agar foydalanuvchi katalog guruhining a’zosi bo'lmasa yoki ACL ruxsat bermasa, setgid o'zi unga kirish huquqini yaratmaydi.

Qisqasi, setgid "guruhni izchil saqlash" vazifasini bajaradi. O'sha guruhga yozish huquqini berish esa umask maqolasida ko'rib chiqilgan rejim, ACL va umask siyosatining alohida masalasi.

Note

GNU chmod katalogdagi mavjud setuid/setgid bitlarini ba’zi uch yoki to'rt raqamli sonli rejim o'zgarishlarida saqlab qolishi mumkin. Maqsad bitni olib tashlash bo'lsa, chmod g-s -- <directory> kabi aniq simvolik shakldan foydalaning va natijani stat bilan tasdiqlang. Katalogdagi setuid ma’nosi platformalarda bir xil emas; Linux umumiy katalog holati uchun setgid dan foydalanadi.

Sticky bit katalog yozuvlarini himoya qiladi

Katalogda w va x huquqiga ega foydalanuvchi odatda undagi istalgan yozuvni, hatto boshqa birovga tegishlisini ham o'chira yoki qayta nomlay oladi. Sticky bit bu qoidani toraytiradi: faylni o'chirish yoki qayta nomlash uchun fayl egasi, katalog egasi yoki tegishli imtiyozga ega jarayon bo'lish kerak.

Klassik misol:

stat -c '%A %a %U:%G %n' -- /tmp /var/tmp

Ubuntu Server’dagi odatiy natija:

drwxrwxrwt 1777 root:root /tmp
drwxrwxrwt 1777 root:root /var/tmp

1777 har bir foydalanuvchiga katalogdan foydalanishga ruxsat beradi; oxiridagi t esa bir foydalanuvchi u yerdagi boshqa foydalanuvchining katalog yozuvini o'chirishi yoki qayta nomlashini cheklaydi.

Sticky bit quyidagilarni qilmaydi:

  • fayl mazmunini o'qishni cheklamaydi;
  • faylning o'zida w huquqi bor foydalanuvchiga uning mazmunini o'zgartirishni taqiqlamaydi;
  • fayl nomlarini taxmin qiladigan, symlink’lar ortidan ehtiyotsiz boradigan, poyga holatlariga ega yoki vaqtinchalik fayllarni xavfsiz yaratmaydigan dasturni avtomatik tuzatmaydi;
  • boshqa katalogga nusxalashga yoki faylning o'z kirish rejimiga ta’sir qilmaydi.

Demak, 1777 xavfsiz saqlash joyi emas. Dastur vaqtinchalik faylni xavfsiz API orqali, oldindan taxmin qilib bo'lmaydigan nom va 0600 kabi mos rejim bilan yaratishi kerak.

Xavfsiz laboratoriya

Bu laboratoriya faqat ~/lab/special-permissions ichida ishlaydi, sudo talab qilmaydi va imtiyozli bajariladigan fayl yaratmaydi. setuid namunasi hech qanday yangi identifikator bermaydi, u joriy foydalanuvchiga tegishli — u faqat rejim belgisi qanday ko'rinishini o'rganish uchun mavjud.

Avval maqsad hali mavjud emasligini tasdiqlang:

test ! -e ~/lab/special-permissions
echo $?

0 qaytsa, davom eting:

mkdir -m 0700 -p ~/lab/special-permissions
mkdir ~/lab/special-permissions/shared
mkdir ~/lab/special-permissions/dropbox

chmod 2770 ~/lab/special-permissions/shared
chmod 1777 ~/lab/special-permissions/dropbox

touch ~/lab/special-permissions/shared/report.txt
mkdir ~/lab/special-permissions/shared/reports

touch ~/lab/special-permissions/mode-sample
chmod 4600 ~/lab/special-permissions/mode-sample

Natijani bitta izchil formatda ko'ring:

find ~/lab/special-permissions -xdev -maxdepth 2 \
    -printf '%y %M %m %u:%g %p\n'

Namunaviy, tegishli parcha:

d drwxrws--- 2770 ali:ali /home/ali/lab/special-permissions/shared
f -rw-r--r-- 644 ali:ali /home/ali/lab/special-permissions/shared/report.txt
d drwxr-sr-x 2755 ali:ali /home/ali/lab/special-permissions/shared/reports
d drwxrwxrwt 1777 ali:ali /home/ali/lab/special-permissions/dropbox
f -rwS------ 4600 ali:ali /home/ali/lab/special-permissions/mode-sample

Host nomi, foydalanuvchi va aniq oddiy bitlar umask ingizga qarab farq qiladi. Muhim kuzatuvlar:

  • shared guruhning bajarish o'rnida s ni ko'rsatadi, bu uni setgid katalog sifatida belgilaydi;
  • yangi ichki katalog reports setgid bitini meros qilib olgan;
  • report.txt guruhni meros qilib olgan, lekin uning o'z rejimi faqat setgid tufayli 0660 ga aylanmagan;
  • dropbox oxiridagi t sticky va boshqalarning bajarish biti ikkalasi ham borligini ko'rsatadi;
  • mode-sample dagi S egasining bajarish huquqi yo'qligini ko'rsatadi.

mode-sample ga egasining bajarish bitini qo'shing va belgi qanday o'zgarishini kuzating:

chmod u+x ~/lab/special-permissions/mode-sample
stat -c '%A %a %U:%G %n' \
    ~/lab/special-permissions/mode-sample

Kutilgan rejim:

-rws------ 4700 ali:ali /home/ali/lab/special-permissions/mode-sample

Fayl bo'sh va boshqa UID ga tegishli emas — uni ishga tushirishga urinmang. Bu mashq haqiqiy imtiyozga o'tishni emas, rejim yozuvini ko'rsatdi.

Maxsus bitlarni find bilan audit qilish

Laboratoriyada uchta maxsus bitdan istalganini topish:

find ~/lab/special-permissions -xdev -perm /7000 \
    -printf '%m %u:%g %p\n'

GNU find da /7000 setuid, setgid yoki sticky dan kamida bittasi borligini bildiradi. Aniqroq qidiruvlar:

find ~/lab/special-permissions -xdev -type f -perm -4000 \
    -printf 'setuid %m %u:%g %p\n'

find ~/lab/special-permissions -xdev -perm -2000 \
    -printf 'setgid %m %u:%g %p\n'

find ~/lab/special-permissions -xdev -type d -perm -1000 \
    -printf 'sticky %m %u:%g %p\n'

-perm -4000 ko'rsatilgan barcha bitlar bo'lishini talab qiladi; bu yerda faqat bitta bit so'ralgani uchun u setuid obyektlarni topadi. /6000 esa setuid yoki setgid dan birortasiga mos keladi:

sudo find /usr /opt -xdev -type f -perm /6000 \
    -printf '%m %u:%g %p\n'

Bu production uchun mos, faqat o'qiydigan audit, lekin katta daraxtda u sezilarli disk (I/O) yuki va kirish logi trafigini qo'shishi mumkin. Cheklangan kataloglar ichini ko'rish uchun sudo kerak. Qidiruvni muayyan mount yoki ilova ildizi bilan chegaralang; / va uning virtual fayl tizimlarini o'ylamasdan aylanib chiqmang.

Warning

Audit natijasiga -exec chmod, -delete yoki boshqa tuzatishni ulamang. Qonuniy setuid/setgid bajariladigan fayldan bitni olib tashlash login, parolni o'zgartirish, rejalashtirish yoki boshqa tizim funksiyasini buzishi mumkin. Natija — faqat tekshirilishi kerak bo'lgan nomzodlar ro'yxati.

Har bir topilmani qanday tekshirish kerak

Masalan, <found_file> uchun:

target='<found_file>'

stat -c '%A %a %u:%g %U:%G %n' -- "$target"
namei -l -- "$target"
findmnt -no TARGET,VFS-OPTIONS,FS-OPTIONS --target "$target"
file -- "$target"

So'ng distributivga mos vosita bilan paket manbasini aniqlang.

Debian/Ubuntu:

dpkg-query -S -- "$target"

RHEL oilasi:

rpm -qf -- "$target"
rpm -Vf -- "$target"

Agar rpm -Vf hech narsa chiqarmasa, tekshirilgan atributlar paketlar bazasida qayd etilgan holatga mos keladi. Agar u belgilar chiqarsa, ularni rpm(8) ga ko'ra talqin qiling. dpkg-query -S faqat yo'lni qaysi paket olib kelganini ko'rsatadi — joriy rejim kutilganidek ekanini isbotlamaydi. Ikkala oilada ham natijani konfiguratsiyani boshqarish tizimidagi asosiy holat (baseline), ishlab chiqaruvchining xavfsizlik bildirishnomalari va o'zgarishlar tarixi bilan solishtiring.

Quyidagilar jiddiy ogohlantirish belgilari:

  • setuid/setgid bajariladigan faylga egasidan boshqa hisob yoki guruh yoza oladi;
  • ota kataloglardan biriga ishonchsiz foydalanuvchi yoza oladi;
  • binar faylni paketga yoki tasdiqlangan deploy manbasiga bog'lab bo'lmaydi;
  • bit yaqinda paydo bo'lgan va unga mos o'zgarish qaydi yo'q;
  • bajariladigan fayl shell, interpretator yoki ixtiyoriy plugin/hook yuklaydi;
  • imtiyozli dastur foydalanuvchi boshqaradigan konfiguratsiya, muhit o'zgaruvchilari yoki nisbiy PATH ga tayanadi.

Amaliy vaziyat: umumiy katalogda guruhlar tarqalib ketishi

Muammo: /srv/catalog/shared dan catalog-editors guruhi foydalanadi. Turli foydalanuvchilar yaratgan yangi fayllar har bir foydalanuvchining o'z asosiy guruhiga tushib qolyapti va bu hamkorlikni buzyapti. Maqsad — mavjud daraxt bo'ylab ko'r-ko'rona rekursiv o'zgarish qilmasdan, yangi obyektlar uchun guruh merosini yoqish.

Bu production’da rejim va egalikni o'zgartiradi. Avval test host yoki snapshot, ikkinchi administrator sessiyasi, tekshirilgan guruh a’zolari ro'yxati va rollback faylini tayyorlang.

1. Hech narsani o'zgartirmasdan joriy holatni tekshiring

getent group catalog-editors
stat -c '%A %a %u:%g %U:%G %n' -- /srv/catalog/shared
namei -l -- /srv/catalog/shared
findmnt -no TARGET,VFS-OPTIONS,FS-OPTIONS --target /srv/catalog/shared

So'ng mavjud obyektlarni bir daraja chuqurlikda ko'ring:

find /srv/catalog/shared -xdev -mindepth 1 -maxdepth 1 \
    -printf '%y %m %u:%g %p\n'

Guruh mavjudligini, kerakli foydalanuvchilar uning a’zosi ekanini va katalog boshqa fayl tizimi yoki symlink emasligini tasdiqlang.

2. Rollback ma’lumotlarini saqlang

Agar ACL vositalari o'rnatilgan bo'lsa, metama’lumotlar zaxira nusxasini oling:

( umask 077
  sudo getfacl -p /srv/catalog/shared \
      > ~/catalog-shared.before.acl
)
stat -c '%A %a %U:%G %n' ~/catalog-shared.before.acl

umask 077 faqat shu subshell ichida yaratilgan zaxira nusxaga ta’sir qiladi va uni boshqa lokal foydalanuvchilardan yopiq saqlaydi — bu keyingi maqolada chuqurroq yoritiladi. Zaxira nusxaning mazmunini ham tekshiring:

sed -n '1,20p' ~/catalog-shared.before.acl

Zaxira nusxani umumiy katalogning o'ziga qo'ymang. U ACL’lar, oddiy rejim va egalikni tiklaydi — fayl mazmunining zaxira nusxasi emas.

3. Eng kichik o'zgarish

Egasi o'zgarmaydi; faqat guruh va katalogning setgid biti sozlanadi:

sudo chgrp catalog-editors /srv/catalog/shared
sudo chmod g+rwx,o-rwx,g+s /srv/catalog/shared

Bu buyruqlar rekursiv emas. Mavjud fayllarning guruhi va rejimi o'zgarishsiz qoladi.

4. Yangi sessiyada tekshiring

stat -c '%A %a %U:%G %n' -- /srv/catalog/shared
sudo -u <group_member> -- touch /srv/catalog/shared/.inheritance-test
stat -c '%A %a %U:%G %n' \
    /srv/catalog/shared/.inheritance-test

Test faylning guruhi catalog-editors bo'lishi kerak. Guruh unga yoza oladimi-yo'qmi, yaratayotgan foydalanuvchining umask i va har qanday default ACL ga bog'liq — setgid o'zi buni kafolatlamaydi.

Test faylni aniq tekshiring, so'ng uni o'chiring:

stat -c '%A %a %U:%G %n' \
    /srv/catalog/shared/.inheritance-test
sudo rm -i -- /srv/catalog/shared/.inheritance-test

Warning

rm faylni hech qanday axlat qutisiga ko'chirmaydi. Bu buyruq faqat yuqorida yaratilgan aynan .inheritance-test faylini nishonga oladi, -i esa tasdiq so'raydi. Bu yerda boshqa nom yoki wildcard ishlatmang.

5. Rollback

Agar natija siyosatga mos kelmasa:

sudo setfacl --restore="$HOME/catalog-shared.before.acl"
stat -c '%A %a %U:%G %n' -- /srv/catalog/shared

setfacl --restore zaxira nusxadan egasi, guruhi, rejimi va ACL ni tiklaydi — uni boshqa host yoki yo'lga ko'r-ko'rona qo'llamang. Agar zaxira nusxa bo'lmasa, oldingi stat qiymatlaridan kelib chiqib, aniq rollback uchun chgrp va chmod g-s buyruqlarini o'zgarish rejangizga oldindan yozib qo'ying.

Katalog ichida allaqachon mavjud obyektlarning guruhini tuzatish — alohida migratsiya: har bir fayl kimga tegishli ekanini, hard link’larni, ACL’larni va hozir ochiq turgan fayllarni tekshirmasdan chgrp -R ni ishga tushirmang.

Keng tarqalgan xatolar

setuid skript root sifatida ishlaydi deb kutish

Linux interpretator orqali ishlaydigan skriptlardagi setuid/setgid bitlarini e’tiborsiz qoldiradi. Aylanib o'tadigan wrapper yozish o'rniga vazifani tor siyosat yoki tekshirilgan xizmat interfeysi atrofida loyihalang.

Katta S yoki T ni kuchliroq ruxsat deb o'qish

Katta harf tegishli bajarish/qidirish biti yo'qligini bildiradi. Bajariladigan fayldagi S yoki ichiga kirish mumkin bo'lishi kerak bo'lgan katalogdagi T odatda qo'shimcha himoya emas, buzilgan yoki chala rejim belgisi.

setgid katalog har bir faylni guruh yoza oladigan qiladi deb o'ylash

setgid guruh egaligini meros qilib beradi. Kirish bitlarini so'ralgan rejim, umask va har qanday default ACL hal qiladi.

Sticky bit fayl mazmunini himoya qiladi deb o'ylash

Sticky bit katalog ichidagi o'chirish va qayta nomlash qarorlarini boshqaradi. Agar faylning o'zi guruh yoki boshqalarga yozishga ruxsat bersa, uning mazmunini baribir o'zgartirish mumkin.

Internetdagi "barcha setuid fayllar" ro'yxatiga ishonish

Paketlar, versiyalar va qotirish siyosati har xil bo'ladi. Haqiqiy ma’lumot manbai — lokal stat, paket egasi, mount holati va tekshirilgan asosiy holat (baseline).

Audit topgan barcha bitlarni birdaniga olib tashlash

Qonuniy imtiyozli dasturlar ishlamay qolishi mumkin. Har bir topilmaning vazifasi, manbasi, yozish mumkin bo'lgan yo'llari va mumkin bo'lgan muqobil mexanizmini alohida tekshiring.

chmod 0755 katalogdagi setgid ni har doim tozalaydi deb kutish

GNU chmod ba’zi sonli rejim o'zgarishlarida katalogning maxsus bitlarini saqlab qolishi mumkin. Maqsadni chmod g-s bilan aniq ko'rsating, so'ng stat bilan tasdiqlang.

nosuid ni yagona kerakli himoya deb hisoblash

nosuid setuid/setgid va file capabilities orqali imtiyozga o'tishni cheklaydi, lekin oddiy bajariladigan fayl, o'qib bo'ladigan maxfiy ma’lumot, yozish mumkin bo'lgan kod yoki interpretator orqali ishga tushiriladigan skript bilan bog'liq muammolarni o'zi hal qilmaydi.

Mashqlar

  1. /usr/bin/passwd, /tmp va /var/tmp uchun stat natijasini qayd eting. Har bir s yoki t qaysi oddiy bajarish biti bilan bir o'rinda turishini tushuntiring.
  2. Xavfsiz laboratoriyani quring. mode-sample dagi S ni s ga aylantiring, so'ng chmod u-s bilan oddiy x ga qaytaring va har bir qadamdan keyin sonli va simvolik rejimni qayd eting.
  3. shared ichida fayl va ichki katalog yarating. Ularning guruhi, setgid biti va kirish rejimini solishtiring va qaysi qism merosdan, qaysi qism umask dan kelganini aniqlang.
  4. find ... -perm -2000 ni find ... -perm /6000 bilan solishtiring. Har bir topilma yordamida "barcha bitlar" va "birorta bit" ma’nolarini tushuntiring.
  5. /usr yoki alohida test mount uchun faqat o'qiydigan setuid/setgid audit rejasini yozing. Unga -xdev, paket egaligi, ota kataloglar, nosuid, asosiy holat (baseline) va rollback qarorini kiriting — topilmalarga avtomatik chmod ulamang.

Mashqni bajardim deyish uchun: har bir bit uchun obyekt turini, sonli va simvolik rejimni, kernel ta’sirini, cheklovlarini, audit usulini va o'rinli bo'lsa, xavfsizroq muqobilini ayta olishingiz kerak.

Laboratoriyani tugatganingizda avval maqsadni tekshiring:

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

Agar faqat laboratoriya obyektlari ko'rinsa:

rm -rI -- ~/lab/special-permissions

Warning

rm -rI laboratoriya daraxtini ortga qaytarish imkoniyatisiz o'chiradi. Bu yerda ishlatilgan absolyut maqsad uy katalogingiz ichidagi aniq yo'l; buyruqni faqat o'qiydigan find natijasini tekshirmasdan ishga tushirmang.

Manbalar

  • Linux man-pages: execve(2): https://man7.org/linux/man-pages/man2/execve.2.html
  • Linux man-pages: inode(7): https://man7.org/linux/man-pages/man7/inode.7.html
  • Linux man-pages: fcntl_locking(2): https://man7.org/linux/man-pages/man2/fcntl_locking.2.html
  • GNU Coreutils qo'llanmasi: mode structure: https://www.gnu.org/software/coreutils/manual/html_node/Mode-Structure.html
  • GNU Coreutils qo'llanmasi: changing special mode bits: https://www.gnu.org/software/coreutils/manual/html_node/Changing-Special-Mode-Bits.html
  • GNU Coreutils qo'llanmasi: directory setuid and setgid: https://www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html
  • GNU Coreutils qo'llanmasi: chmod invocation: https://www.gnu.org/software/coreutils/manual/html_node/chmod-invocation.html
  • GNU Findutils qo'llanmasi: numeric modes: https://www.gnu.org/software/findutils/manual/html_node/find_html/Numeric-Modes.html
  • util-linux: findmnt(8): https://man7.org/linux/man-pages/man8/findmnt.8.html