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-teamguruhiga tegishli bo'ladi va har bir yangi fayl shu guruhni avtomatik meros qilib oladi (setgid); - har bir
project-teama’zosiga fayl yaratish va tahrirlash imkonini beradi, lekin boshqa a’zolarga tegishli fayllarni o'chirishga ruxsat bermaydi (sticky bit); - bitta qo'shimcha foydalanuvchiga,
auditorga, uniproject-teamga 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/getfacluchun o'rnatilganaclpaketi:
- 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:
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:
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
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.
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.
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
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.
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:
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:
# 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
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.
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+sni alohida qo'llash kerak, yoki agar bu haqiqatan butun daraxt uchun mo'ljallangan bo'lsa,chmod -R g+sdan foydalaniladi (quyidagi danger eslatmasiga qarang). getfaclumuman ACL yozuvlarini ko'rsatmaydi.aclpaketi o'rnatilmagan bo'lishi yoki fayl tizimi ACL qo'llab-quvvatlashisiz mount qilingan bo'lishi mumkin.mount | grep <mountpoint>bilanaclopsiyasini tekshiring va agar yo'q bo'lsa, uni/etc/fstabga qo'shing (remount talab qilinadi).- Qo'llanilishi kerak bo'lgan ruxsat qo'llanilmayapti va
getfaclchiqishidagimask::kutilganidan qat’iyroq. ACL mask har bir nomlangan foydalanuvchi va guruh yozuvining haqiqiy ruxsatlarini cheklaydi.mask::r--rwxberadigan ACL yozuvini jimginar--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:
dev1tomonidan/srv/shared-projectichida yaratilgan fayldev1ning o'z asosiy guruhiga emas,project-teamguruhiga tegishli;dev1bir xil katalogdadev2yaratgan faylni o'chira olmaydi va aksincha;auditorkatalogdagi 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
getfaclchiqishiauditoruchun ham oddiy, ham default ACL yozuvini ko'rsatadi.
Mashqlar
- Bu labni tugatgandan keyin
project-teamga uchinchi dasturchi —dev3ni qo'shing va hech qandaysetfaclyokichmodbuyrug'ini qayta ishga tushirmasdan,dev3darholdev1vadev2bilan bir xil guruhga asoslangan kirish huquqiga ega ekanini tasdiqlang. Buning uchun nega ACL o'zgarishi kerak bo'lmaganini,auditoruchun esa kerak bo'lishini tushuntiring. - 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. finddan foydalanib, Maxsus ruxsatlar maqolasidagi audit bo'limi uslubida/srvni setgid biti o'rnatilgan har qanday katalog uchun tekshiradigan bitta buyruq yozing.- Fayl darajasidagi ACL yozuvi yordamida
auditorga butun katalogga emas, katalogdagi aynan bitta faylga yozish huquqini bering va faqat o'sha faylgagetfaclbilan ruxsat katalogning default qiymatidan farq qilishini tekshiring.