De dienst start, een client associeert, en aan de serverkant verschijnt nooit een route. Of de daemon weigert te starten en noemt een opdracht die hij niet kon uitvoeren. Beide uitkomsten volgen dezelfde drie regels, die meestal samen uit een hardening-gids worden gekopieerd: overstappen naar een onbevoorrecht account, de groep laten vallen en de bestandssysteemroot wijzigen. Slechts één van de drie verbergt bestanden, en slechts één ervan neemt de bevoegdheid weg om de routingtabel te wijzigen. Ze uit elkaar halen is hoe je leert welke regel je echt wilt.

Wat de jail wegneemt en de daemon nog nodig heeft

De root wijzigen gebeurt na het starten, dus de daemon houdt alles wat hij al had geopend en verliest alles wat hij later zou openen. Elke helper die de verbinding daarna uitvoert, moet binnen de nieuwe root bestaan, samen met de gedeelde bibliotheken die hij laadt. Een jail opgebouwd uit een configuratiebestand en een certificaat heeft geen van beide.

Overstappen naar een onbevoorrecht account is een aparte beperking. Een proces dat root heeft opgegeven kan misschien geen routes wijzigen of een interface omhoog brengen, zelfs wanneer de binary er precies naast ligt, dus de twee storingen moeten apart worden gediagnosticeerd.

Drie voorwaarden bepalen welke oplossing je nodig hebt

De eerste voorwaarde is hoe je build routes installeert. Recente OpenVPN releases configureren de interface en de routingtabel in-process, terwijl oudere pakketten en eigen opstellingen op externe hulpmiddelen of op up- en down-scripts leunen. Noemt het log een opdracht, dan is er een extern hulpmiddel in het spel en verbergt de jail het. Toont het log in plaats daarvan een bevoegdheidsfout, dan is het account het probleem.

De tweede is onderhoud. Een jail met gekopieerde binaries moet worden vernieuwd telkens wanneer het pakket dat ze levert wordt bijgewerkt, anders laat de eerste upgrade een kapotte tunnel achter. De derde is of een specifieke controle echt een chroot vereist; gaat het bij de eis eigenlijk om privilege-scheiding, dan kan het laten vallen van het account alleen al volstaan.

Signal in the logOther side of the boundaryRepair direction
Command not found after startupBinary and its libraries absent inside the new rootPopulate the jail, or drop the chroot line
Operation not permittedAccount lost the privilege to edit routesKeep the account privileged, or pre-create routes elsewhere
No such deviceJail lacks the tun device nodeCreate the node inside, or open it before the root change

Wat een werkende jail moet bevatten

Een jail die opdrachten uitvoert heeft de binary nodig, elke bibliotheek waartegen hij linkt, en elk apparaatknooppunt dat de daemon laat opent. Kopieer de onderdelen en test ze zonder de VPN in beeld:

ldd /usr/sbin/ip
chroot /etc/openvpn/jail /sbin/ip route show
chroot /etc/openvpn/jail /sbin/ip link set tun0 up

De eerste opdracht somt de afhankelijkheden op, en dat is degene die mensen overslaan. Een gekopieerde binary die een bibliotheek niet vindt, faalt met een andere melding dan een ontbrekende binary, en beide zien er vanaf de clientkant uit als een OpenVPN-storing. De opdracht met de hand in de jail uitvoeren reproduceert de storing zonder de dienst te herstarten.

Kopieer ook de configuratie, certificaten en een eventuele CRL naar de jail, want een bestand dat de daemon na het starten opnieuw wil lezen, wordt niet gevonden zodra de root is gewijzigd. Leg vast wat je hebt gekopieerd, want de volgende upgrade van het netwerkpakket vervangt de originelen en laat de jail achter op de oude kopie.

In plaats daarvan de hardening verkleinen

Als de jail alleen bestaat omdat een gids dat zei, is het verwijderen van die ene regel terwijl de accountbeperkingen blijven staan een verdedigbaar resultaat. De daemon behoudt zijn bestandssysteemzicht en raakt het probleem kwijt, en de bevoegdheidsdaling haalt nog steeds root uit het langlevende proces.

Schrijf op wat overblijft, en waarom. Een configuratie die stilletjes een controle kwijtraakte zonder notitie, is hoe hardening afdrijft, en de volgende audit vraagt waarom de regel verdween.

De drie regels eerst bisecteren voordat je kiest

Kopieer de configuratie, schakel alle drie de richtlijnen uit en bevestig dat een client verbindt en dat de verwachte routes verschijnen. Zet dan alleen de accountregels weer aan, daarna alleen de chroot. De stap waar de tunnel breekt wijst de grens aan, en je vermijdt het herbouwen van een jail die nooit de oorzaak was.

Zodra het weer routeert, draai één clientsessie met hogere verbosity en lees de regel die de opdracht of de mislukte bevoegdheid noemt. Die regel is meer waard dan de timeout die de client uiteindelijk meldt.

Gerelateerde artikelen