Služba sa spustí, log sa sťažuje, že nemôže otvoriť zariadenie tun, a trasy sa nikdy neobjavia. Spustite capsh --print vo svojom shelli a cap_net_admin je hneď tam, čo robí zlyhanie nemožným. To, čo sa líši medzi vaším shellom a jednotkou, je prechod oprávnení, nie ochota jadra schopnosť udeliť. Prejdite štyri kontroly nižšie v poradí a zastavte sa pri prvej, ktorá tú medzeru vysvetlí.

Oddeľte chýbajúcu schopnosť od skrytého zariadenia

Dve zlyhania vyzerajú z riadka logu rovnako. Proces bez CAP_NET_ADMIN nemôže vytvoriť ani nakonfigurovať rozhranie tunela a proces, ktorého sandbox skrýva /dev/net/tun, ho nemôže vôbec otvoriť. Pridanie schopností druhý prípad neopraví.

Skôr než čokoľvek upravíte, skontrolujte, či zariadenie existuje v mennom priestore služby. PrivateDevices=yes je bežný riadok spevnenia, ktorý uzol tun úplne odstráni, a reštriktívny ProtectSystem môže urobiť cestu ku konfigurácii iba na čítanie spôsobom, ktorý sa číta ako chyba oprávnení. Obe vytvárajú riadky logu, ktoré spomínajú tunel, a preto sa vina zvaľuje na schopnosti. Najprv potvrďte, že uzol existuje a dá sa otvoriť, a potom pokračujte.

Vedzte, na ktorú sadu schopností sa pozeráte

Linux drží povolenú, efektívnu, dediteľnú, ohraničujúcu a ambientnú sadu, a práve ambientná sada prežije exec od používateľa, ktorý nie je root. Súborové schopnosti na binárke môžu pri exec odovzdať povolené a efektívne práva, ale len dovtedy, kým nič v reťazi tento prenos neblokuje.

Práve tu sudo zavádza ľudí. Príkaz spustený cez sudo -u začína nový prechod oprávnení a ambientná sada zmizne, takže tá istá kontrola, ktorá uspeje ako root, tam zlyhá. Správca služieb je ďalší prechod a nič ambientné neudelí, ak to jednotka nepovie.

Udeľte schopnosť v jednotke, nie v obale

Minimálna sekcia služby pre tunel, ktorý musí vytvoriť zariadenie a nainštalovať trasy, vyzerá takto.

[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 vloží právo do ambientnej sady pred spustením procesu a CapabilityBoundingSet bráni procesu držať čokoľvek mimo tohto zoznamu. NoNewPrivileges=yes blokuje získanie oprávnení cez setuid alebo súborové schopnosti, zatiaľ čo schopnosť, ktorú jednotka výslovne udeľuje, stále platí. Pridajte CAP_NET_BIND_SERVICE len vtedy, keď služba musí naviazať nízky port, a nikdy nepridávajte CAP_SYS_ADMIN len preto, že to urobila nejaká vlákno na fóre.

Ak jednotka obaľuje binárku do sudo, obal odstráňte. systemd už uplatňuje User= a táto extra vrstva je najpravdepodobnejší dôvod, prečo je ambientná sada prázdna.

Overujte na živom procese, nie na súbore jednotky

Prečítajte si, čo správca skutočne použil, a potom si prečítajte proces, ktorý spustil.

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

Ak jednotka uvádza schopnosť a CapEff ju stále nemá, nejaký drop-in prepisuje nastavenie alebo krok ExecStartPre mení prostredie. Skôr než budete hlavný súbor považovať za smerodajný, prehľadajte drop-in adresáre podľa názvu jednotky, pretože neskorší súbor ticho vyhrá. Ak schopnosť ukazujú jednotka aj proces a tunel stále zlyháva, vráťte sa ku kontrolám zariadenia a cesty namiesto rozširovania ohraničujúcej sady. Jej rozšírenie skryje skutočnú príčinu a nechá službu privilegovanejšiu, než bola.

Radšej sa vzdajte oprávnení po štarte

OpenVPN môže začať s oprávneniami a potom prejsť na neprivilegovaný účet pomocou vlastných volieb user a group, pričom persist-key a persist-tun udržia tunel ďalej použiteľný. Také usporiadanie zužuje okno, v ktorom proces drží práva, a často sa hodí viac než spúšťať celý démon neprivilegovane s trvalými schopnosťami.

Nech si vyberiete akýkoľvek model, reštartujte jednotku a po reštarte systému kontroly zopakujte, pretože služba, ktorá funguje z interaktívneho root shellu a pri boote zlyhá, je zvyčajne rozdiel v schopnosti, zariadení alebo súborových oprávneniach. Zapíšte nastavenia jednotky vedľa výstupu schopností procesu, aby ďalší recenzent videl, či hranicu posunula aktualizácia balíka alebo drop-in.

Súvisiace články