Услугата стартува, дневникот се жали дека не може да го отвори tun уредот, а рутите никогаш не се појавуваат. Извршете capsh --print во вашата обвивка и cap_net_admin е токму таму, што го прави дефектот да изгледа невозможен. Она што се разликува меѓу вашата обвивка и единицата е преминот на привилегии, а не подготвеноста на јадрото да ја даде способноста. Поминете ги четирите проверки подолу по ред и застанете на првата што ја објаснува разликата.

Одделете ја способноста што недостасува од скриениот уред

Два дефекти изгледаат исто од линијата на дневникот. Процес без CAP_NET_ADMIN не може да го создаде или конфигурира интерфејсот на тунелот, а процес чија песочна кутија го крие /dev/net/tun не може воопшто да го отвори. Додавањето способности нема да го поправи вториот случај.

Проверете дали уредот постои во именскиот простор на услугата пред да уредите нешто. PrivateDevices=yes е вообичаена линија за зацврстување што целосно го отстранува tun јазолот, а ограничувачката ProtectSystem може да ја направи патеката за конфигурација само за читање на начин што се чита како грешка во дозволите. Двете создаваат линии во дневникот што го споменуваат тунелот, затоа способностите се обвинуваат. Прво потврдете дека јазолот е присутен и отворалив, потоа продолжете.

Знајте кое множество способности го гледате

Linux држи дозволени, ефективни, наследливи, ограничувачки и амбиентални множества, а амбиенталното множество е она што го преживува exec од корисник што не е root. Датотечните способности на бинарниот файл можат да пренесат дозволени и ефективни права при 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.conf

AmbientCapabilities го става правото во амбиенталното множество пред процесот да стартува, а 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 обвивка и не успева при подигање обично е разлика во способност, уред или дозволи за датотека. Запишете ги поставките на единицата до излезот за способностите на процесот, за да може следниот рецензент да види дали ажурирање на пакет или drop-in ја поместил границата.

Поврзани статии