script-security-nivåer i OpenVPN från 0 till 3, och vad varje nivå öppnar
Varje script-security-nivå utökar vad en profil får köra: först administrativa hjälpare, sedan användarskript, till slut lösenord i miljön. Läs direktiven.
Importera en profil i en skrivbordsklient och det första felet är ofta en rad som klienten vägrar att följa: en skriptkrok som den inte kör, eller ett script-security-värde som den anser vara för tillåtande. Att höja talet får dialogen att försvinna. Det utökar också vad den profilen får köra på din maskin, vilket är en märklig sak att ge bara för att bli av med en varning. Följ importen hela vägen till direktivet och beslutet blir konkret.
Från importdialogen till direktivet
Profilen är en textfil med direktiv, och klienten läser dem innan någon tunnel finns. Ett direktiv som up, down eller tls-verify namnger ett externt program som OpenVPN ska köra vid en bestämd tidpunkt. Om OpenVPN är villigt att köra det är en separat inställning som heter script-security, och profilen sätter oftast den också.
Varningen handlar alltså inte om kryptografi eller certifikat. Den handlar om en konfigurationsfil som ber klienten köra något på värden, och om klienten som kontrollerar om dess nuvarande behörighetsnivå tillåter den begäran.
Två olika fel ser likadana ut i detta skede. En profil som begär en nivå som klienten inte ger ger ett avslag. En profil som begär en nivå som klienten ger men där skriptet saknas ger i stället ett fel vid körning, och de två blandas ihop i supporttrådar. Det ena är en behörighetsfråga, det andra en paketeringsfråga.
Vad varje nivå faktiskt öppnar
Nivå 0 förbjuder externa programanrop helt, vilket är konsekvent för en klient som konfigurerar sitt eget gränssnitt utan hjälp och inkonsekvent för en som anropar operativsystemet. Nivå 1, standard, tillåter de inbyggda körbara filerna som gränssnitts- och ruttkonfiguration behöver. Ingen av nivåerna kör något som användaren har bidragit med.
| Level | What OpenVPN may execute | What it exposes |
|---|---|---|
| 0 | No external programs at all | Interface and route setup must not depend on helpers |
| 1 (default) | Built-in helpers such as ip, ifconfig, route or netsh | Privileged commands the platform already ships |
| 2 | Built-in helpers plus user-defined scripts | Whatever the named script does with the client's privileges |
| 3 | Everything above, plus passwords in environment variables | Credentials visible to child processes and their logs |
Nivå 2 är den intressanta gränsen, eftersom den släpper in användardefinierade skript. Från den punkten gäller klientens privilegier för kod som du kanske aldrig har läst, anropad vid tidpunkter du inte valde, i en miljö som innehåller anslutningsdetaljer. Nivå 3 går längre och tillåter att lösenord skickas via miljövariabler, och därför beskriver handboken det som potentiellt osäkert.
Ingen av dessa siffror är en styrkeinställning. En profil på nivå 3 har inte bättre kryptering än en på nivå 1; den har bara en större körningsyta, och tunneln är identisk.
Bestäm vad profilen förtjänar
Fråga vad skriptet är till för innan du frågar vilken nivå det behöver. En krok som trycker ut DNS-inställningar eller reparerar en rutt efter anslutning är ett legitimt skäl att köra något. En krok som anropar en okänd binär i en tillfällig katalog är ett skäl att stoppa.
Skriptets sökväg spelar lika stor roll som skriptet. En relativ sökväg löses mot den katalog klienten använder, och en skrivbar katalog gör en engångsimport till en permanent körningsplats. Absoluta sökvägar i en katalog som användaren inte kan ändra är den form som bör föredras.
Skript ärver också klientens miljö, där inloggningsuppgifter och anslutningsmetadata bor. Just det arvet är vad som gör nivå 3 farlig tillsammans med ett skript som loggar sin miljö, och det är därför en diagnostisk utskrift från en klient med skript förtjänar en andra titt innan den klistras in i ett ärende. Ta bort miljön innan du delar den.
grep -nE 'script-security|^up |^down |tls-verify' client.ovpnÄndra en sak, och följ sedan också nedmonteringen
Om profilen verkligen behöver ett skript, ändra bara nivån och bara för den profilen. Kör klienten i förgrunden med utförlig utdata så att skriptets egna fel syns i stället för att slukas av en tjänstehanterare.
openvpn --config client.ovpn --script-security 2 --verb 3
ip route show default
Testa hela livscykeln, inte bara anslutningen. En krok för nedkoppling som misslyckas lämnar rutter som pekar på en död tunnel, vilket ger en maskin som ser ansluten ut och inte når något. Återanslut en gång och koppla från en gång innan du kallar ändringen klar, och kontrollera routingtabellen efter varje.
Spara en kopia av den ursprungliga profilen. Om en plattformsklient inte implementerar samma skriptmodell kan borttagning av direktiv tills importen lyckas ta bort den DNS- eller ruttdelning som tunneln behövde, och den resulterande anslutningen autentiserar perfekt utan att lösa något.
Beslutet som ska registreras är smalt: vilket skript, på vilken sökväg, beviljat på vilken nivå, för vilken profil. Allt annat i profilen är oförändrat, och det är en mening som en granskare kan kontrollera.