OpenVPN-ге root бермей CAP_NET_ADMIN беру
Артықшылығы жоқ пайдаланушы ретінде басталатын юнитке бәрібір дұрыс мүмкіндіктер жиынтығы қажет. Юнитті, тірі процесті және exec шекарасын осы ретпен тексеріңіз.
Қызмет іске қосылады, журнал tun құрылғысын аша алмайтынын шағымданады, ал маршруттар ешқашан пайда болмайды. Өз shell-іңізде capsh --print орындаңыз, сонда cap_net_admin дәл сол жерде болады, бұл ақауды мүмкін емес көрсетеді. Сіздің shell-іңіз бен юнит арасындағы айырмашылық — артықшылықтар ауысуы, ядроның мүмкіндікті беруге дайындығы емес. Төмендегі төрт тексеруді ретімен өткізіп, айырмашылықты түсіндіретін біріншісінде тоқтаңыз.
Жетіспейтін мүмкіндікті жасырын құрылғыдан ажыратыңыз
Журнал жолынан екі ақау бірдей көрінеді. CAP_NET_ADMIN жоқ процесс туннель интерфейсін құра алмайды немесе баптай алмайды, ал sandbox-ы /dev/net/tun жасыратын процесс оны басынан аша алмайды. Мүмкіндіктер қосу екінші жағдайды түзетпейді.
Бірдеңені өңдеуден бұрын құрылғының қызметтің аттар кеңістігінде бар-жоғын тексеріңіз. PrivateDevices=yes tun түйінін толығымен жоятын кең тараған қатайту жолы, ал шектеуші ProtectSystem конфигурация жолын рұқсат қатесіндей оқылатын етіп тек оқуға болатын ете алады. Екеуі де туннельді атайтын журнал жолдарын жасайды, сондықтан кінә мүмкіндіктерге артылады. Алдымен түйіннің бар екенін және ашылатынын растаңыз, содан кейін әрі қарай жүріңіз.
Сіз қай мүмкіндіктер жиынтығын қарап отырғаныңызды біліңіз
Linux рұқсат етілген, әсерлі, мұраға берілетін, шектеуші және орта жиынтықтарын ұстайды, ал орта жиынтығы — root емес пайдаланушының exec әрекетінен кейін сақталатыны. Бинардағы файлдық мүмкіндіктер exec кезінде рұқсат етілген және әсерлі құқықтарды бере алады, бірақ тізбекте ешнәрсе бұл берілісті бөгемегенше ғана.
Осы жерде sudo адамдарды адастырады. sudo -u арқылы іске қосылған команда жаңа артықшылықтар ауысуын бастайды және орта жиынтығы жойылады, сондықтан root ретінде сәтті болатын сол тексеру онда сәтсіз аяқталады. Қызмет менеджері тағы бір ауысу, және юнит айтпаса, ол ортаға ештеңе бермейді.
Мүмкіндікті юнитте беріңіз, қаптамада емес
Құрылғы жасап, маршруттар орнатуы керек туннель үшін ең аз қызмет бөлімі былай көрінеді.
[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 процес басталмай тұрып құқықты орта жиынтығына салады, ал CapabilityBoundingSet процестің сол тізімнен тыс ештеңе ұстауына жол бермейді. NoNewPrivileges=yes setuid немесе файлдық мүмкіндіктер арқылы артықшылық алуды бөгейді, ал юнит анық берген мүмкіндік бәрібір қолданылады. CAP_NET_BIND_SERVICE-ны қызмет төмен портты байлауға тиіс болғанда ғана қосыңыз, ал CAP_SYS_ADMIN-ты форум ағыны солай істеді деп ешқашан қоспаңыз.
Егер юнит бинарды sudo ішіне ораса, қаптаманы алып тастаңыз. systemd User=-ны әлдеқашан қолданады, және сол қосымша қабат орта жиынтығының бос болуының ең ықтимал себебі.
Юнит файлына емес, тірі процеске қарсы тексеріңіз
Менеджер іс жүзінде нені қолданғанын оқыңыз, содан кейін ол жасаған процесті оқыңыз.
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")/statusЕгер юнит мүмкіндікті тізіп тұрса, ал CapEff-де ол әлі жоқ болса, қандай да бір drop-in параметрді басып озады немесе ExecStartPre қадамы ортаны өзгертеді. Негізгі файлды беделді деп есептемес бұрын drop-in каталогтарынан юнит атын іздеңіз, өйткені кейінірек келген файл үнсіз жеңеді. Егер юнит те, процесс те мүмкіндікті көрсетсе, ал туннель әлі істемесе, шектеуші жиынтықты кеңейтудің орнына құрылғы мен жол тексерулеріне қайтыңыз. Оны кеңейту нақты себепті жасырады және қызметті бұрынғыдан да артықшылықты етіп қалдырады.
Іске қосылғаннан кейін артықшылықтардан бас тартқанды қалаңыз
OpenVPN артықшылықпен басталып, содан кейін өзінің user және group опциялары арқылы артықшылығы жоқ тіркелгіге түсе алады, ал persist-key мен persist-tun туннельді кейін де пайдалануға жарамды ұстайды. Мұндай тәртіп процестің құқықтары бар терезені тарылтады және бүкіл демонды тұрақты мүмкіндіктермен артықшылықсыз іске қосудан жиі қолайлырақ.
Қай модельді таңдасаңыз да, юнитті қайта іске қосыңыз және қайта жүктеуден кейін тексерулерді қайталаңыз, өйткені интерактивті root shell-ден жұмыс істеп, жүктелу кезінде сәтсіз аяқталатын қызмет әдетте мүмкіндік, құрылғы немесе файл рұқсатының айырмашылығы. Юнит параметрлерін процестің мүмкіндік шығысының қасына жазып қойыңыз, сонда келесі шолушы пакет жаңартуы немесе drop-in шекараны жылжытқанын көре алады.