Tarkibga o'tish

Lab: umumiy katalogda ruxsatlar va ACL’lar

Ruxsatlar, egalik va maxsus ruxsatlar maqolalarining har biri bitta mexanizmni alohida ko'rib chiqdi. Haqiqiy production hodisasi kamdan-kam hollarda faqat bittasini o'z ichiga oladi. Odatda bu uchta turli jamoa turli darajadagi kirish huquqiga muhtoj bo'lgan umumiy katalog bo'ladi: yangi fayllar doim noto'g'ri guruh bilan paydo bo'lib turadi va oxir-oqibat kimdir sizga "dasturchilar ops log'larini o'qiy olmayapti" deb qo'ng'iroq qiladi. Bu lab aynan shu holatni bir martalik lab mashinasida qayta yaratadi va uni DAC (chmod/chgrp), guruhni avtomatik meros qilib olish uchun setgid, sticky bit va oddiy Unix ruxsatlari o'z-o'zidan ifodalay olmaydigan yagona istisno uchun POSIX ACL’lar yordamida tuzatadi.

Maqsad va yakuniy natija

Bu lab oxirida /srv/shared-project:

  • umumiy project-team guruhiga tegishli bo'ladi va har bir yangi fayl shu guruhni avtomatik meros qilib oladi (setgid);
  • har bir project-team a’zosiga fayl yaratish va tahrirlash imkonini beradi, lekin boshqa a’zolarga tegishli fayllarni o'chirishga ruxsat bermaydi (sticky bit);
  • bitta qo'shimcha foydalanuvchiga, auditor ga, uni project-team ga umuman qo'shmasdan faqat o'qish huquqini beradi (ACL);
  • faqat root sifatida emas, har bir foydalanuvchi nuqtai nazaridan alohida tekshiriladi.

Topologiya va boshlang'ich holat

Bitta lab VM yoki container yetarli, tarmoq kerak emas. Siz uchta oddiy foydalanuvchi va bitta umumiy guruh yaratasiz.

sudo groupadd project-team
sudo useradd -m -G project-team dev1
sudo useradd -m -G project-team dev2
sudo useradd -m auditor
sudo passwd dev1
sudo passwd dev2
sudo passwd auditor

Talablar

  • setfacl/getfacl uchun o'rnatilgan acl paketi:
sudo apt install acl
  • xatti-harakatni faqat root sifatida emas, har bir akkaunt nuqtai nazaridan tekshirish uchun foydalanuvchilar o'rtasida almashish imkoniyati (su - <user>).

Xavfsizlik va snapshot haqida eslatma

Warning

Bu lab haqiqiy foydalanuvchi akkauntlarini yaratadi va /srv ostidagi ruxsatlarni o'zgartiradi. Agar siz umumiy yoki production’ga yaqin mashinada bo'lsangiz, buning o'rniga uni bir martalik VM yoki container’da bajaring. Biror narsani o'zgartirishdan oldin joriy holatni yozib qo'ying, shunda solishtirish va orqaga qaytish uchun nimadir bo'ladi:

ls -ld /srv
getent group project-team 2>/dev/null && echo "group already exists — stop and check"

1-qadam: umumiy katalogni yaratish

sudo mkdir -p /srv/shared-project
sudo chgrp project-team /srv/shared-project
sudo chmod 2775 /srv/shared-project

2775 Maxsus ruxsatlar maqolasida tushuntirilganidek tahlil qilinadi: boshidagi 2 setgid bitini o'rnatadi, 775 esa egasi va guruhga to'liq o'qish/yozish/bajarish huquqini, boshqalarga esa faqat o'qish/bajarish huquqini beradi.

Tekshirish:

ls -ld /srv/shared-project
drwxrwsr-x 2 root project-team 4096 Jul 29 10:00 /srv/shared-project

Guruhning execute biti o'rnidagi s setgid faol ekanini tasdiqlaydi. Agar bu labda keyinroq yangi fayllar noto'g'ri guruh bilan paydo bo'la boshlasa, darhol tekshirish kerak bo'lgan tafsilot aynan shu.

2-qadam: setgid meros olinishini tasdiqlash

su - dev1
touch /srv/shared-project/dev1-notes.txt
ls -l /srv/shared-project/dev1-notes.txt
-rw-rw-r-- 1 dev1 project-team 0 Jul 29 10:02 dev1-notes.txt

Faylning guruhi dev1 ning asosiy guruhi emas, project-team — aynan sinab ko'rilayotgan setgid xatti-harakati. Ota katalogda setgid bo'lmaganida, bu fayl dev1 ning o'z asosiy guruhini meros qilib olgan bo'lardi va ikkalasi ham project-team da bo'lishiga qaramay, dev2 unga yoza olmagan bo'lardi.

exit

3-qadam: bir-birining fayllarini o'chirishning oldini olish uchun sticky bit qo'shish

Hozir har qanday project-team a’zosi boshqa har qanday a’zoning faylini o'chira oladi, chunki ikkalasida ham katalogning o'ziga yozish huquqi bor. rm aslida faylga emas, katalogga yozish huquqini tekshiradi.

sudo chmod +t /srv/shared-project
ls -ld /srv/shared-project
drwxrwsr-t 2 root project-team 4096 Jul 29 10:02 /srv/shared-project

Sticky bit boshqa foydalanuvchi faylini o'chirishni haqiqatan bloklayotganini tekshirish:

su - dev2
touch /srv/shared-project/dev2-file.txt
exit

su - dev1
rm /srv/shared-project/dev2-file.txt
rm: cannot remove '/srv/shared-project/dev2-file.txt': Operation not permitted

Bu Maxsus ruxsatlar maqolasidagi aynan o'sha mexanizmni tasdiqlaydi: sticky bit guruhning har bir a’zosi faylni o'z ichiga olgan katalogga yozish huquqiga ega bo'lsa ham, o'chirishni faylning egasi (yoki root) bilan cheklaydi.

su - dev2
rm /srv/shared-project/dev2-file.txt
exit

dev2 o'z faylini baribir o'chira oladi — sticky bit egasi tomonidan emas, faqat boshqa foydalanuvchilar tomonidan o'chirishni bloklaydi.

4-qadam: ACL bilan bitta qo'shimcha foydalanuvchiga faqat o'qish huquqini berish

auditor /srv/shared-project dagi hamma narsani o'qishi kerak. Lekin u to'liq project-team a’zosi bo'lmasligi kerak (bu yozish huquqini ham beradi) va katalog tizimdagi boshqa har bir foydalanuvchiga ochilmasligi kerak. Oddiy Unix ruxsatlari bu talabni ifodalay olmaydi, chunki "aynan shu bitta qo'shimcha foydalanuvchi" uchun to'rtinchi ruxsat o'rni yo'q.

sudo setfacl -m u:auditor:rx /srv/shared-project
sudo setfacl -d -m u:auditor:rx /srv/shared-project

Birinchi buyruq auditor ga katalogning o'zida o'qish va execute (kirib o'tish) huquqini beradi. Ikkinchisi default ACL o'rnatadi va u keyin yaratiladigan har bir fayl va quyi katalogga meros bo'lib o'tadi. Usiz auditor ning kirish huquqi uning ichidagi fayllarning birortasiga emas, faqat katalog yozuviga tegishli bo'lardi.

getfacl ni ishga tushirishdan oldin e’tibor bering: oddiy ls -ld ACL mavjudligini allaqachon aytib turibdi:

ls -ld /srv/shared-project
drwxrwsr-t+ 2 root project-team 4096 Jul 29 10:05 /srv/shared-project

Ruxsat satri oxiridagi + (drwxrwsr-t+) bu yo'lda standart owner/group/other bitlaridan tashqari ACL mavjudligining belgisi. Intervyuerlar bu tafsilot haqida bevosita so'raydi ("getfacl ni ishga tushirmasdan faylda ACL borligini qanday bilasiz?"). ls -l ko'rsatadigan oddiy mode bitlarining o'zi nega adashtirishi mumkinligining sababi ham shu: + haqiqiy ruxsatlar faqat rwx uchliklari bilan to'liq tasvirlanmasligini anglatadi.

Tekshirish:

getfacl /srv/shared-project
# file: srv/shared-project
# owner: root
# group: project-team
user::rwx
user:auditor:r-x
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:auditor:r-x
default:group::rwx
default:mask::rwx
default:other::r-x
su - auditor
ls /srv/shared-project
cat /srv/shared-project/dev1-notes.txt
touch /srv/shared-project/should-fail.txt
touch: cannot touch '/srv/shared-project/should-fail.txt': Permission denied

auditor aynan berilganidek ro'yxatni ko'ra oladi va o'qiy oladi, lekin fayl yarata olmaydi — ACL yozuvi w siz, aynan rx da to'xtadi.

exit

Troubleshooting bo'yicha maslahatlar

  • setgid o'rnatilgan bo'lsa ham yangi faylning guruhi noto'g'ri. setgid yuqoriroqdagi ota katalogda emas, fayl yaratilgan katalogning o'zida o'rnatilganini tekshiring. setgid bit o'rnatilishidan oldin yaratilgan quyi kataloglarga avtomatik ravishda rekursiv o'tmaydi. Har bir mavjud quyi katalogga chmod g+s ni alohida qo'llash kerak, yoki agar bu haqiqatan butun daraxt uchun mo'ljallangan bo'lsa, chmod -R g+s dan foydalaniladi (quyidagi danger eslatmasiga qarang).
  • getfacl umuman ACL yozuvlarini ko'rsatmaydi. acl paketi o'rnatilmagan bo'lishi yoki fayl tizimi ACL qo'llab-quvvatlashisiz mount qilingan bo'lishi mumkin. mount | grep <mountpoint> bilan acl opsiyasini tekshiring va agar yo'q bo'lsa, uni /etc/fstab ga qo'shing (remount talab qilinadi).
  • Qo'llanilishi kerak bo'lgan ruxsat qo'llanilmayapti va getfacl chiqishidagi mask:: kutilganidan qat’iyroq. ACL mask har bir nomlangan foydalanuvchi va guruh yozuvining haqiqiy ruxsatlarini cheklaydi. mask::r-- rwx beradigan ACL yozuvini jimgina r-- gacha kamaytiradi. Agar bu ataylab qilinmagan bo'lsa, setfacl -m mask::rwx <path> buni tuzatadi.

Orqaga qaytarish va tozalash

Danger

chmod -R va userdel -r haqiqiy ma’lumotlarda buzuvchi va qaytarib bo'lmaydigan amallar. Quyidagilarni ishga tushirishdan oldin haqiqiy mazmunga ega bo'lgan narsani emas, faqat lab uchun yaratilgan akkauntlar va kataloglarni o'chirayotganingizni tasdiqlang.

sudo rm -rf /srv/shared-project
sudo userdel -r dev1
sudo userdel -r dev2
sudo userdel -r auditor
sudo groupdel project-team

userdel -r har bir foydalanuvchining home katalogini ham o'chiradi. Bu yerda bu o'rinli, chunki bular boshlang'ich bosqichda yaratilgan faqat lab uchun akkauntlar. Lekin haqiqiy ma’lumotlarni saqlashi mumkin bo'lgan akkauntga nisbatan buni avval tasdiqlamasdan hech qachon ishga tushirmang.

Yakuniy baholash mezoni

Quyidagilarning hammasi bajarilsa, bu lab yakunlangan hisoblanadi:

  • dev1 tomonidan /srv/shared-project ichida yaratilgan fayl dev1 ning o'z asosiy guruhiga emas, project-team guruhiga tegishli;
  • dev1 bir xil katalogda dev2 yaratgan faylni o'chira olmaydi va aksincha;
  • auditor katalogdagi har bir faylni o'qiy oladi va uning mazmunini ro'yxatga chiqara oladi, lekin uning ichida hech narsa yarata yoki o'zgartira olmaydi;
  • katalog uchun getfacl chiqishi auditor uchun ham oddiy, ham default ACL yozuvini ko'rsatadi.

Mashqlar

  1. Bu labni tugatgandan keyin project-team ga uchinchi dasturchi — dev3 ni qo'shing va hech qanday setfacl yoki chmod buyrug'ini qayta ishga tushirmasdan, dev3 darhol dev1 va dev2 bilan bir xil guruhga asoslangan kirish huquqiga ega ekanini tasdiqlang. Buning uchun nega ACL o'zgarishi kerak bo'lmaganini, auditor uchun esa kerak bo'lishini tushuntiring.
  2. Sticky bit’ni olib tashlang (chmod -t /srv/shared-project) va 3-qadamdagi boshqa foydalanuvchi faylini o'chirish sinovini takrorlang. Endi o'chirish muvaffaqiyatli bo'lishini tasdiqlang, keyin sticky bit’ni qayta tiklang.
  3. find dan foydalanib, Maxsus ruxsatlar maqolasidagi audit bo'limi uslubida /srv ni setgid biti o'rnatilgan har qanday katalog uchun tekshiradigan bitta buyruq yozing.
  4. Fayl darajasidagi ACL yozuvi yordamida auditor ga butun katalogga emas, katalogdagi aynan bitta faylga yozish huquqini bering va faqat o'sha faylga getfacl bilan ruxsat katalogning default qiymatidan farq qilishini tekshiring.

Manbalar