OpenVPN’da chroot muvaffaqiyatsiz: AppArmor qoidasimi yoki qobiliyatmi?
AppArmor profiliga yo‘l qo‘shish hech qachon CAP_SYS_CHROOT bermaydi va rad etilgan chroot uchta alohida qatlamdan kelishi mumkin. Qaysi birini o‘zgartirishni aniqlang.
Demon chroot xatosini qayd etadi va profil allaqachon keng ko‘rinadi, shuning uchun vasvasaga soladigan tuzatish yo‘l qoidasini kengaytirib, qayta ishga tushirishdir. Bu odatda hech narsani o‘zgartirmaydi, chunki chroot profil hech qachon bera olmagan imtiyoz bilan yopilgan. Qaysi qatlamga tegish kerakligini hal qilish uchun uchta tekshiruv kerak va ular arzon: jarayonga nima saqlashga ruxsat berilgan, siyosat nimaga ruxsat beradi va ishga tushiruvchi bu ikkisi ahamiyat kasb etishidan oldin nimani olib tashlagan.
Ikki alohida darvoza, va faqat bittasi AppArmorga tegishli
chroot jarayon ishlayotgan foydalanuvchi nom fazosida CAP_SYS_CHROOT talab qiladi. Bu Linuxning odatiy imtiyozi bo‘lib, yadro chaqiruv yo‘llar bilan biror ish qilishidan oldin uni tekshiradi. Bundan alohida, kuchga kirituvchi AppArmor profili jarayon qobiliyatga ega bo‘lsa ham undan bosh tortishi mumkin, chunki majburiy siyosat hisob ma’lumotlariga qo‘shimcha ravishda ko‘rib chiqiladi, ularning o‘rniga emas. Bu farq amalda muhim: ikki qatlam turli fayllarda yashaydi va odatda ularni turli odamlar saqlaydi.
Bu ikki darvoza bir xil errno bilan muvaffaqiyatsizlikka uchraydi. Ikkisi ham EPERM beradi va ikkisi ham demon jurnalida umumiy ruxsat shikoyati sifatida ko‘rinadi, shuning uchun profil mazmunini taxmin qilish shuncha vaqtni yo‘qotadi. Siz qo‘shmoqchi bo‘lgan yo‘l qoidasi chroot muvaffaqiyatli bo‘lgandan keyingi fayl kirishini boshqaradi; operatsiyaga umuman ruxsat berilganiga uning aloqasi yo‘q.
Uchinchi darvoza ikkisidan ham yuqorida turadi. Agar xizmat menejeri yoki o‘rovchi jarayonni o‘zining chegara to‘plamida bu qobiliyatsiz ishga tushirgan bo‘lsa, hech qanday AppArmor o‘zgarishi uni qaytara olmaydi va profilga qobiliyat qo‘shish yadro bajarmaydigan niyatni hujjatlashtiradi xolos.
Siyosatni tahrirlashdan oldin imtiyoz holatini o‘qing
Faol deb hisoblagan konfiguratsiyadan emas, ishlab turgan jarayondan boshlang. Holat fayli beshta qobiliyat niqobini va no-new-privileges bayrog‘ini ko‘rsatadi va ular turli savollarga javob beradi:
grep -E '^(CapInh|CapPrm|CapEff|CapBnd|CapAmb|NoNewPrivs):' /proc/$(pidof openvpn)/status
sudo aa-status | grep -i openvpn
CapEff chaqiruv uchun muhim to‘plamdir: CapBnd da bor, lekin CapEff da yo‘q qobiliyat shift tomonidan ruxsat etilgan va ayni damda saqlanmayapti. CapAmb binar odatdagi setuid ma’nosida imtiyozli bo‘lmaganda muhim, chunki ambient qobiliyatlar xizmatning exec davomida fayl qobiliyatlarsiz imtiyozni saqlash usulidir. CapInh exec davomida meros bo‘lishi mumkin bo‘lgan bitlarni saqlaydi, lekin faqat bajariladigan faylning meros to‘plami ruxsat berganida, shuning uchun u yerdagi bit o‘zi hech narsa bermaydi.
So‘ng qaysi profil haqiqatan ulanganini tasdiqlang. Jarayon siz kutmagaan profil nomi bilan cheklangan bo‘lishi mumkin, ayniqsa distributiv o‘z unitini va profilini birga yetkazsa, /proc/PID/attr/current ni o‘qish buni bir satrda hal qiladi. Tahrirlangan faylingizni yadro ko‘rsatgan profil bilan solishtirish sababni tuzatish bilan hech kim yuklamaydigan faylni tahrirlash o‘rtasidagi farq.
Qobiliyat qoidasini faqat audit izi shuni aytganda qo‘shing
Yadro va audit yozuvlari rad etgan qatlamni nomlaydi. capable operatsiyasi va sys_chroot nomi bor rad etishni, u bilan birga uni keltirib chiqargan profilni qidiring. Agar shunday yozuv bo‘lsa, jarayon qobiliyatga allaqachon ega bo‘lgan va AppArmor rad etgan, maqsadli o‘zgarish esa haqiqiy profil ichidagi qobiliyat qoidasidir:
capability sys_chroot,
Uni haqiqatan ulangan profilda parcha sifatida saqlang va qoidani aloqasiz qo‘llanmadan ko‘chirish o‘rniga kalit so‘zni apparmor.d profil ma’lumotnomasi bilan solishtiring. Uni umumiy include ichiga qo‘yish bu faylni yuklaydigan har bir cheklangan dasturga shu huquqni beradi, profilni complain rejimiga o‘tkazish esa buni hal qilish o‘rniga keyingi rad etishni yashiradi. Profil qoidasi siyosiy rad etishni olib tashlaydi; u imtiyoz yaratmaydi, shuning uchun o‘z samarali to‘plamida CAP_SYS_CHROOT hech qachon bo‘lmagan jarayon qoida joyida bo‘lsa ham muvaffaqiyatsizlikka uchraydi.
Agar audit yozuvi umuman AppArmor rad etishini ko‘rsatmasa, profilni tahrirlashni to‘xtating. Siz hisob ma’lumotlari muammosiga duch kelibsiz, qolgan ish unitda yoki ota jarayonda, siyosat tilida emas.
Xizmat menejeri o‘z shiftini saqlaydi
systemd har bir xizmat uchun qobiliyatlarning chegara to‘plamini belgilaydi va sukut bo‘yicha bu to‘plam tor. U yerda chiqarib tashlangan narsa profil nima desa ham jarayon uchun mavjud emas, shuning uchun qotirilgan unitlar demon qo‘lda ishga tushirilganda ishlagan operatsiyada muvaffaqiyatsizlikka uchrashi mumkin. Tegishli direktivalar unitda oson o‘qiladi va xatoni ilovaning o‘zi xabar qilganda oson e’tibordan chetda qoladi. Distributiv paketi yetkazadigan drop-in lar hech kim so‘zlaganini eslamaydigan shiftning odatiy manbasidir.
Shiftni ko‘tarish va qobiliyat berish ikki o‘zgarish, bitta emas. Chegara to‘plamidagi yozuv jarayon qobiliyatni saqlashi mumkinligini aytadi; u uni samarali to‘plamga qo‘shmaydi va NoNewPrivs qolgan hamma narsa mos kelsa ham keyingi ko‘tarilish muvaffaqiyatli bo‘lishiga to‘sqinlik qilishi mumkin. Faqat operatsiyaga kerak bo‘lganini qo‘shing, qolgan qotirishni saqlang va bitta chaqiruv o‘tishi uchun barcha qobiliyatlarni berish kaltakesak yo‘liga qarshi turing.
Bu yerda tartib ham muhim. Avval unit shiftini o‘zgartiring, CapEff endi o‘sha bitni saqlashini tasdiqlang, shundan keyingina AppArmor hali rad etadimi-yo‘qmi hal qiling. Ikkala o‘zgarishni birga qilsangiz, xato davom etsa yana taxmin qilishga majbur bo‘lasiz.
Rad etish yo‘qolgach, qamoqxonaning o‘zini tekshiring
Muvaffaqiyatli chroot ildizni ko‘chiradi, shuning uchun demon keyin tegadigan har bir yo‘l yangi daraxt ichida hal qilinadi. Yo‘q konfiguratsiya, mavjud bo‘lmagan qurilma tuguni yoki ko‘chirilmagan sertifikat katalogi endi fayl xatosi sifatida ko‘rinadi va bu xato qobiliyat emas, joylashuv muammosi. Yana bir keng ruxsat qo‘shish o‘rniga keyingi hodisani o‘qing. Ko‘chirish nisbiy yo‘lning ma’nosini ham o‘zgartiradi, shuning uchun qotirish bo‘yicha qo‘llanmalar demon konfiguratsiyasida mutlaq yo‘llarni talab qiladi.
chroot nima qilmasligini eslab qolish ham yordam beradi. Bu yo‘l chegarasi, sandbox emas: imtiyozni saqlab qolgan jarayon undan qochib chiqishi mumkin, shuning uchun qobiliyat odatda chaqiruvdan keyin tashlanadi va shuning uchun cheklov demon atrofida qolishi kerak. AppArmor profilini, qobiliyatlar chegara to‘plamini va fayl tizimi cheklovlarini birga saqlash mashqning maqsadi, xizmat ishga tushgach olib tashlanadigan qoldiq emas.
Qaror qoidasi qisqa. Agar audit yozuvi AppArmorni nomlasa, ulangan profilga bitta qobiliyat qoidasini qo‘shing. Agar samarali to‘plam bo‘sh bo‘lsa, unit shiftini va imtiyozni tashlash tartibini tuzating. Agar profil siz tahrirlagan narsa bo‘lmasa, tahrirlashni to‘xtating va haqiqiysini toping.