Een browser die een bestaande Linux-VPN gebruikt, opent /dev/net/tun niet. Hij opent een socket, en de kernel beslist via welke interface de pakketten van die socket vertrekken. Het proces dat de tunnel heeft gemaakt, doet ander werk dan het proces waarvan het verkeer wordt vervoerd. Die twee rollen gescheiden houden beantwoordt de meeste rechtenvragen voordat ze worden gesteld.

Volg één pakket van socket naar tunnel

Een gewone applicatie roept connect of send aan, en de kernel zoekt een route naar de bestemming. Als de gekozen route naar de tunnelinterface wijst, wordt het pakket in de wachtrij gezet bij het apparaat dat de VPN-daemon leest. De daemon versleutelt het en stuurt het via de fysieke interface naar buiten. Elke pijl in die beschrijving is een plek waar een rechtenvraag kan worden beantwoord.

Niets op dat pad vereist dat de applicatie het apparaat kent. De daemon houdt de bestandsdescriptor vast en voert de interfacebewerkingen uit, terwijl de applicatie alleen een normale netwerk-API ziet.

Teken de twee helften één keer, en rechtenvragen worden makkelijker te plaatsen. De bovenste helft is de wereld van de applicaties, en de onderste helft hoort bij de daemon.

Bepaal wie het apparaat nodig heeft en wie niet

Een TUN-interface maken of eraan koppelen vereist toegang tot het apparaat plus de mogelijkheid om het te configureren, daarom begint een ondersteunde VPN-dienst met netwerkbeheerrechten of gebruikt een bevoorrechte helper. Die eis hoort bij de daemon. Ze zegt niets over de browser, de databaseclient of het bestandsoverdrachtshulpmiddel. Een dienst die de mogelijkheid nodig heeft, heeft die nodig voor zijn eigen installatiestap, niet voor zijn clients.

Zodra de route en het beleid op hun plaats staan, gebruikt een gewoon proces het resulterende pad via zijn gebruikelijke socket-aanroepen. Het heeft het apparaatknooppunt niet nodig, en het heeft geen root nodig.

Het wijzigen van apparaatrechten is geen manier om een applicatie toegang tot de bestemming te geven. Het verplaatst alleen de apparaatgrens ergens anders heen.

Controleer de namespace waarin de applicatie echt draait

Een container, of een tweede netwerknamespace, geeft zijn processen een aparte set interfaces en routetabel. Een tunnel op de host verschijnt daar niet automatisch, en geen enkele wijziging van apparaatrechten verandert dat. De applicatie routeert eenvoudigweg via wat die namespace biedt. Daarom kan een containerimage niet per ongeluk een hosttunnel erven.

Controleer met ip netns list en ip -n NAME route, of door de namespacelink van het proces te bekijken. Het antwoord is meestal in één commando te zien.

Twee gebruikers op dezelfde host kunnen ook verschillende paden krijgen via beleid. Dat is een netwerkbeslissing, geen bewijs over eigenaarschap van het apparaat.

Scheid mogelijkheden van netwerkbeleid

Sommige hulpmiddelen hebben meer nodig dan een socket. Pakketten opvangen vereist een raw socket, en routes wijzigen vereist beheerrechten. Dat zijn aparte bewerkingen met aparte toekenningen, en het toekennen van één mag niet worden gelezen als een algemene eis om de VPN te gebruiken.

Een programma dat zijn eigen tunnel implementeert, is een derde geval. Het opent echt TUN omdat het de rol van de daemon overneemt, daarom heeft het de rechten van de daemon nodig.

Benoem de bewerking voordat je het recht benoemt. De twee zijn meestal makkelijker te scheiden dan ze lijken.

Verifieer de splitsing met twee accounts

Verbind de tunnel als de dienst, voer daarna de applicatie uit als een gewone gebruiker en bevestig dat die de privébron bereikt. Controleer ip route get voor de bestemming vanuit de shell van die gebruiker om te zien welke interface is gekozen. Als de route klopt en de verbinding toch mislukt, is het probleem beleid en niet recht.

Het ontwerp dat daaruit volgt is minimale rechten met een expliciete grens: één component bezit de installatie en de tunnelbronnen, workloads behouden hun normale accounts, en netwerkbeleid beslist wat er door mag. Alles als root draaien laat die rollen instorten zonder iets uit te leggen.

Gerelateerde artikelen