OpenVPN ga root bermasdan CAP_NET_ADMIN berish
Imtiyozsiz foydalanuvchi sifatida boshlanadigan unit baribir to'g'ri qobiliyatlar to'plamiga muhtoj. Unit, jonli jarayon va exec chegarasini shu tartibda tekshiring.
Xizmat ishga tushadi, jurnal tun qurilmasini ocholmayotganidan shikoyat qiladi va marshrutlar hech qachon ko'rinmaydi. O'z shellingizda capsh --print ishga tushiring, cap_net_admin shu yerda bo'ladi, bu esa nosozlikni imkonsiz ko'rsatadi. Shellingiz bilan unit o'rtasidagi farq imtiyozlar o'tishi, yadroning qobiliyat berishga tayyorligi emas. Quyidagi to'rt tekshiruvni tartib bilan bajaring va bo'shliqni tushuntiruvchi birinchisida to'xtang.
Yo'qolgan qobiliyatni yashirin qurilmadan ajrating
Jurnal satridan ikkita nosozlik bir xil ko'rinadi. CAP_NET_ADMIN bo'lmagan jarayon tunnel interfeysini yarata olmaydi yoki sozlay olmaydi, sandbox /dev/net/tun ni yashirgan jarayon esa uni boshidan ocholmaydi. Qobiliyat qo'shish ikkinchi holatni tuzatmaydi.
Biror narsani tahrirlashdan oldin qurilma xizmatning nom maydonida bor-yo'qligini tekshiring. PrivateDevices=yes tun tugunini butunlay olib tashlaydigan keng tarqalgan qattiqlashtirish satri, cheklovchi ProtectSystem esa sozlash yo'lini ruxsat xatosi kabi o'qiladigan tarzda faqat-o'qish qilib qo'yishi mumkin. Ikkalasi ham tunnelni eslatuvchi jurnal satrlarini hosil qiladi, shuning uchun ayb qobiliyatlarga qo'yiladi. Avval tugun borligini va ochilishini tasdiqlang, keyin davom eting.
Qaysi qobiliyatlar to'plamiga qarab turganingizni biling
Linux ruxsat etilgan, samarali, meros qoladigan, cheklovchi va muhit to'plamlarini saqlaydi, exec dan keyin omon qoladigan to'plam muhit to'plamidir. Binardagi fayl qobiliyatlari exec paytida ruxsat etilgan va samarali huquqlarni topshirishi mumkin, lekin zanjirda hech narsa bu o'tkazishni to'smasagina.
Aynan shu yerda sudo odamlarni chalg'itadi. sudo -u orqali ishga tushirilgan buyruq yangi imtiyozlar o'tishini boshlaydi va muhit to'plami yo'qoladi, shu sababli root sifatida muvaffaqiyatli bo'lgan tekshiruv u yerda muvaffaqiyatsiz bo'ladi. Xizmat menejeri yana boshqa o'tish, va unit aytmasa, u muhitdan hech narsa bermaydi.
Qobiliyatni unit ichida bering, o'ramda emas
Qurilma yaratishi va marshrutlarni o'rnatishi kerak bo'lgan tunnel uchun minimal xizmat bo'limi shunday ko'rinadi.
[Unit]
Description=OpenVPN client, office profile
After=network-online.target
[Service]
Type=notify
User=openvpn
Group=openvpn
NoNewPrivileges=yes
AmbientCapabilities=CAP_NET_ADMIN
CapabilityBoundingSet=CAP_NET_ADMIN
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/office.confAmbientCapabilities jarayon boshlanishidan oldin huquqni muhit to'plamiga qo'yadi, CapabilityBoundingSet esa jarayonning o'sha ro'yxatdan tashqarida biror narsa saqlashiga yo'l qo'ymaydi. NoNewPrivileges=yes setuid yoki fayl qobiliyatlari orqali imtiyoz olishni to'sadi, unit aniq bergan qobiliyat esa amalda qolaveradi. CAP_NET_BIND_SERVICE ni faqat xizmat past portni bog'lashi kerak bo'lganda qo'shing va forumi mavzu shunday qilgani uchun hech qachon CAP_SYS_ADMIN qo'shmang.
Agar unit binarni sudo ichiga o'rasa, o'ramni olib tashlang. systemd allaqachon User= ni qo'llaydi, va aynan shu qo'shimcha qatlam muhit to'plamining bo'sh bo'lishining eng ehtimoliy sababidir.
Unit fayliga emas, jonli jarayonga qarab tekshiring
Menejer aslida nima qo'llaganini o'qing, keyin u yaratgan jarayonni o'qing.
unit=openvpn-client@office
systemctl show -p User -p AmbientCapabilities "$unit"
systemctl show -p MainPID --value "$unit" | xargs -r getpcaps
grep -E '^Cap(Eff|Amb)' /proc/$(systemctl show -p MainPID --value "$unit")/statusAgar unit qobiliyatni sanab o'tgan bo'lsa-yu, CapEff da u hali bo'lmasa, qandaydir drop-in sozlamani chetlab o'tmoqda yoki ExecStartPre qadami muhitni o'zgartirmoqda. Asosiy faylni vakolatli deb hisoblashdan oldin drop-in kataloglarida unit nomini qidiring, chunki keyingi fayl jimgina yutadi. Agar unit ham, jarayon ham qobiliyatni ko'rsatsa-yu, tunnel hali ishlamasa, cheklovchi to'plamni kengaytirish o'rniga qurilma va yo'l tekshiruvlariga qayting. Uni kengaytirish haqiqiy sababni yashiradi va xizmatni avvalgidan ko'ra imtiyozliroq qoldiradi.
Ishga tushgandan keyin imtiyozlardan voz kechishni afzal ko'ring
OpenVPN o'zining user va group opsiyalari orqali imtiyoz bilan boshlanib, keyin imtiyozsiz hisobga tushishi mumkin, persist-key va persist-tun esa tunnelni keyin ham ishlatishga yaroqli saqlaydi. Bunday tartib jarayon huquqlarga ega bo'lgan oynani toraytiradi va ko'pincha butun demonni doimiy qobiliyatlar bilan imtiyozsiz ishga tushirishdan ko'ra mosroq.
Qaysi modelni tanlasangiz ham, unitni qayta ishga tushiring va qayta yuklashdan keyin tekshiruvlarni takrorlang, chunki interaktiv root shelldan ishlab, yuklanishda muvaffaqiyatsiz bo'lgan xizmat odatda qobiliyat, qurilma yoki fayl ruxsatidagi farqdir. Unit sozlamalarini jarayonning qobiliyat chiqishi yoniga yozib qo'ying, shunda keyingi ko'rib chiquvchi paket yangilanishi yoki drop-in chegarani siljitganini ko'radi.