Које су Linux способности потребне вашем VPN процесу?
Подешавање интерфејса, руте, приступ уређајима и обични сокети су одвојене привилегије. Наведите операцију која није успела пре него што доделите CAP_NET_ADMIN.
VPN демон захтева привилеговане мрежне операције, иако обичне апликације отварају одлазне сокете без икаквих привилегија. Управо у тој празнини почиње већина грешака са способностима: неко види грешку дозволе, додели цео скуп, и услуга ради из разлога које касније нико не може да објасни. Преглед испод почиње од операције која није успела, повезује је са једним овлашћењем и затим проверава контекст у ком процес заиста ради. Рад као неограничени root валидан је одговор за нека распоређивања, али то треба да буде одлука, а не подразумевана вредност.
Почните од операције која није успела
Прочитајте грешку пре него што прочитате упутство. „Операција није дозвољена“ при промени интерфејса, одбијање отварања чвора уређаја и неуспело повезивање на низак порт три су различита проблема са три различите дозволе. Ако се процес покрене и не успе само при првој промени руте, то такође говори да је креирање интерфејса већ успело, што одговор знатно сужава.
Репродукујте неуспех док је услуга заустављена, затим је покрените у првом плану под истим корисником ако имплементација то дозвољава. Грешка коју видите боља је од линије дневника коју морате да погађате, и чини очигледном разлику између проблема са способностима и одбијања SELinux-а или AppArmor-а.
Повежите сваку операцију са једним овлашћењем
Табела је почетна мапа, а не замена за документацију имплементације:
| Operation | Usual authority | Watch for |
|---|---|---|
| Create or configure tun/tap | CAP_NET_ADMIN in the relevant namespace | Creating the device and opening it are separate steps |
| Add routes, rules, firewall entries | CAP_NET_ADMIN | Same capability, different namespace than you think |
| Open /dev/net/tun | Device permissions, not a capability | Group membership or a udev rule may be enough |
| Raw sockets | CAP_NET_RAW | Needed by some user-space tunnel implementations |
| Bind a port below 1024 | CAP_NET_BIND_SERVICE | Irrelevant for most modern tunnel ports |
Два реда у тој табели су они које људи мешају. Отварање /dev/net/tun питање је дозволе за датотеку; захтев језгру да конфигурише оно што сте отворили питање је способности. Додела CAP_NET_ADMIN не поправља чвор уређаја који ваш корисник услуге не може да чита, а поправљање чвора не даје вам овлашћење над рутама. Проверите обоје пре него што промените било шта.
WireGuard у језгру и тунелски програми у корисничком простору такође немају исте захтеве. Пут кроз модул језгра конфигурише постојећи интерфејс преко netlink-а, док имплементација у корисничком простору може да захтева и уређај, а за неке транспорте и сирове сокете.
Прочитајте контекст: услуга, контејнер или љуска
Способност у мрежном простору имена хоста може утицати много више од исте операције у намерно изолованом стеку. Контејнерско окружење обично почиње са смањеним скупом граница; додавање NET_ADMIN контејнеру који дели мрежу хоста много је већа дозвола од додавања оном са сопственим мрежним простором имена и без монтирања хоста.
За systemd јединице читајте шта се стварно примењује, а не шта се чини да јединична датотека каже: systemctl show -p CapabilityBoundingSet -p AmbientCapabilities пријављује ефективне вредности, које може поставити drop-in који сте заборавили. Тражите ефективну вредност, никада намеравану. Ambient способности су важне јер услуга која није root губи способности кроз exec без њих.
Узмите подржано подешавање пакета или слике као основу. Не додајте дозволе за сирове сокете ни привилеговани режим само зато што их је друго упутство навело за други алат; то закључивање ништа не преноси и кошта вас изолације коју сте платили. Када сумњате, не додељујте ништа и прочитајте белешке имплементације за тачну операцију која вам је потребна.
Гледајте шта се дешава после пада привилегија
Многи демони почињу привилеговано, конфигуришу интерфејс, затим пређу на непривилегованог корисника и задрже тунел. Од тог тренутка процес више не може да дода руту, препише правило заштитног зида или отвори нови привилеговани уређај, што је у реду док поновно повезивање не затражи управо то. Каснија читања датотека и извршавање кукица могу да не успеју из истог разлога.
Тестирајте цео животни циклус, а не прву секунду: покретање, обнављање или поновно повезивање и чишћење при заустављању. Прво успешно креирање интерфејса не доказује да ће свака каснија привилегована операција и даље радити, а неуспех се обично појави сатима касније у продукцији.
Имплементације које држе тунел отворен током промене корисника обично то повезују са опцијама за чување тунела и кључева. На страни systemd-а еквивалентно питање је да ли скуп способности јединице преживљава промену корисника коју сте конфигурисали.
Запишите доделу и њен разлог
Запишите тачну доделу, операцију коју она омогућава и грешку коју је исправила. Један ред у белешкама за распоређивање — „CAP_NET_ADMIN у мрежном простору имена јединице, потребан за промене рута после поновног повезивања“ — довољан је да спречи следећу особу да поново прошири дозволу.
Затим поново прочитајте ефективни скуп после сваког надограђивања. Добављачи додају функције, слике мењају подразумеване вредности, а способност која је прошле године била непотребна може постати носећа без да ико примети.