Якія магчымасці 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 у сеткавай прасторы імён юніта, патрэбны для змен маршрутаў пасля перападлучэння» — дастаткова, каб наступны чалавек не пашырыў выдачу зноў.
Затым перачытайце эфектыўны набор пасля кожнага абнаўлення. Пастаўшчыкі дадаюць функцыі, вобразы змяняюць прадвызначаныя значэнні, і магчымасць, якая была непатрэбнай летась, можа стаць апорнай незаўважна ні для кога.