Akkreditivfil eller styresokkel i OpenVPN: hvad skal skriptes
auth-user-pass dækker kontoprompten; styresoklen dækker alle fire. Sammenlign eksponeringen, skriptomkostningen og hvordan hver især fejler i en tjeneste.
Et script, der starter OpenVPN og aldrig forbinder, er normalt ikke et netværksproblem: klienten sidder ved en prompt uden en terminal at tegne den på. OpenVPN har præcis to understøttede måder at besvare den prompt uden et menneske, en akkreditivfil bag auth-user-pass og styresoklen, og de kan ikke udskiftes. Filen koster én direktiv og besvarer én prompt; soklen besvarer enhver prompt og giver alt, der kan åbne en loopback-port, en uautentificeret kontrolkanal. Hvilken der hører til din udrulning afhænger af, hvilken prompt der faktisk blokerer, og hvilken hemmelighed du har råd til at lade ligge i ro.
Navngiv prompten, før du vælger en mekanisme
Fire prompts ser identiske ud på en terminal. Kontoparret kommer fra serverens PAM- eller auth-user-pass-verify-opsætning og besvares af auth-user-pass. En adgangssætning til en privat nøgle hører til nøglefilen og læses via --askpass eller tastes manuelt. Et PKCS#12-bundt spørger om sin egen adgangskode. Proxy-godkendelse bruger den auth-fil, som --http-proxy tager, ikke kontooplysningerne.
Når OpenVPN kører som barn af systemd, PHP eller Node, er der ingen terminal, så enhver af disse blokerer lydløst. Processen sidder der, loggen stopper efter cipher-linjen, og enheden løber til sidst ud i en timeout; den tavshed er grunden til, at folk tilføjer en genforsøgsløkke eller et sleep i stedet for at se, hvilken prompt der venter. Kun styresoklen kan besvare alle fire. Akkreditivfilen besvarer den første og intet andet.
auth-user-pass: én fil, én prompt
Filen rummer brugernavnet på første linje og adgangskoden på anden, og intet andet: ingen anførselstegn, ingen nøglenavne, ingen kommentar. Sæt tilstand 600 og gør ejeren til den konto, der kører openvpn, som for en tjeneste ofte er en dedikeret bruger frem for din egen login. En fil ejet af root under /root er forskellen mellem en kommando, der virker i din shell, og en enhed, der fejler ved opstart.
To detaljer gør en korrekt fil til en prompt. En editor, der gemmer CRLF, efterlader et vognretur klæbet til adgangskoden, så serveren afviser en adgangskode, der ser korrekt ud i filen; kontroller med cat -A eller od -c i stedet for med øjet. Og en auth-user-pass uden argument inde i profilen betyder «spørg brugeren» efter design, hvilket en anden direktiv på kommandolinjen måske ikke tilsidesætter, fordi profilen parses, hvor den ligger.
Rækkefølgen af tilvalg er den tredje fælde, og den er versionsafhængig. Nogle OpenVPN 2.4-builds ignorerer --auth-user-pass, når det står før --config, så de samme to tilvalg i den anden rækkefølge forbinder. Sæt direktivet inde i profilen eller efter --config på kommandolinjen, og grep profilen for hver forekomst, før du ændrer noget andet.
auth-nocache hører til denne mekanisme, men leverer intet. Det begrænser, hvor længe klienten holder akkreditivet i hukommelsen, hvilket hjælper efter et nedbrud og slet ikke, når filen mangler. En genforbindelse efter en sessionstimeout på serversiden læser filen igen, så et akkreditiv, der virkede ved opstart, kan stadig udløbe midt på dagen.
Styresoklen: enhver prompt, mere overflade
Start klienten med en lytter og angiv udtrykkeligt, at prompts vil blive rapporteret på den, ved at bruge de direktiver, der er dokumenteret i OpenVPN 2.6-manualen:
management 127.0.0.1 3030
management-query-passwords
Fra bash holder du forbindelsen på en ledig fildeskriptor og svarer efter promptnavn i stedet for efter position, fordi en genforbindelse kan spørge i en anden rækkefølge:
exec 3<>/dev/tcp/127.0.0.1/3030
while read -r -u 3 line; do
case "$line" in
*"Need 'Auth' username/password"*)
echo 'username "Auth" alice' >&3
echo 'password "Auth" secret' >&3 ;;
*"Need 'Private Key' password"*)
echo 'password "Private Key" secret' >&3 ;;
esac
done
Grænsen er transporten. Styringsprotokollen er klartekst over TCP på loopback, så lytteren må ikke offentliggøres på en LAN- eller tunneladresse, for at en fjernbetjening kan nå den; en fjernbetjening betyder en SSH-videresendelse, ikke en bredere binding. Fællesskabsdæmonen accepterer også kun én styringsklient ad gangen, så en GUI eller en skærm kan ikke dele soklen med dit script. Den anden forbindelse afvises, ikke sat i kø, og fejlen ser ud som et script, der er blevet døvt.
Den sokkel er også en kontrolkanal. Uden en styringskode kan alt, der kan oprette forbindelse til 127.0.0.1:3030, læse status, dræbe tunnelen eller selv besvare en prompt. Styringskoden og akkreditivfilen er samme klasse hemmelighed, og begge fortjener samme omhu.
Hvilken passer til udrulningen
Vælg akkreditivfilen, når den eneste prompt er kontoparret, klienten kører som tjeneste med en stabil ejer, og du kan holde en 600-fil uden for backup, du ikke kontrollerer. Vælg styresoklen, når en nøgleadgangssætning eller en PKCS#12-adgangskode er i spil, når wrapperen allerede overvåger processen, eller når du skal se status og prompts, mens du fejlfinder en genforbindelse.
To betingelser flytter beslutningen. Hvis wrapperen er /bin/sh, en systemd-enhed, der kalder binæren direkte, eller en minimal container, er bash-only sokkelklister ikke tilgængeligt, og filen er det billigere svar. Hvis hemmeligheden roterer ofte, er ingen af filerne et godt hjem for den: forespørg en nøglering fra en lille wrapper og lad enheden kalde wrapperen, hvilket holder rotationen på ét sted og adgangskoden ude af shell-historikken.
Procesudskiftning står mellem de to og hører til ingen af dem. Den ene linje nedenfor virker, fordi bash udvider den, før openvpn starter, ikke fordi klienten forstår syntaksen:
openvpn --config client.ovpn --auth-user-pass <(printf "%s
%s
" "$USER" "$PASS")
Den brækker under /bin/sh, i en enhed der omgår shellen, og i images uden bash eller /dev/fd. Behold den til interaktiv test, aldrig som den kontrakt, en tjeneste afhænger af.
Beskyt hemmeligheden, og verificér derefter fra loggen
Begge mekanismer efterlader en hemmelighed, som OpenVPN-processen kan læse. Læg aldrig adgangskoden på kommandolinjen eller i enhedsfilen, hvor ps og systemctl viser den til enhver lokal bruger; giv stien til filen, ikke værdien i den. Hvor certifikater kan erstatte kontoparret, fjerner det promptkategorien i stedet for at skjule den.
En korrekt kørsel viser promptsekvensen fuldføres og sessionen nå «Initialization Sequence Completed». Hvis klienten stopper ved den samme prompt, fejlede matchningen: udskriv de præcise linjer, soklen sendte, kontroller anførselstegn og promptnavnet, og ret mønsteret i stedet for at tilføje et sleep. En tunnel, der rapporterer succes og ikke bærer noget, er et routing- eller push-problem, ikke et akkreditivproblem.
Test derefter genforbindelsen, ikke kun den første start. Drop serversessionen, eller vent dens timeout ud; klienten spørger igen, og det er der, en fil, der så korrekt ud ved opstart, viser, om den stadig kan læses af den konto, der genopretter forbindelsen.