OpenVPN auth-user-pass: Datei, stdin oder Ufruff? Wéi auswielen
Wielt tëscht dem Konsol-Ufruff, enger Umeldungsdatei, engem Stroum an der Verwaltungs-Schnittstell, a fléckt duerno d'Feeler, déi nëmmen wéi en falscht Passwuert ausgesinn.
Dräi Saachen entscheeden, wéi eng Umeldungsquell Dir benotze sollt: ob eng Persoun um Konsol sëtzt, ob de Geheimnis op der Festplack liewe darf, an ob en aneren Prozess d'Ufro muss beäntweren. Wielt falsch a mëttelt de Client e stdin-Problem, obwuel d'Passwuert komplett gëlteg ass, an dat schéckt déi meescht Leit ouni Grond op de Server. Wielt éischt de Wee; d'Fehlermeldunge maachen nëmme Sënn, wa Dir wësst, wéi en Wee se gemaach huet.
Déi dräi Konditiounen, déi dat entscheeden
De Konsol-Ufruff ass deen eenzege Wee, dee Mënsch brauch, also deen eenzegen, dee still a systemd-Eenheet oder engem Container versot. Wann eng Persoun de Client start an d'Passwuert tippt, ass keng Datei am Spill an et kënnt näischt Sensibles op d'Festplack. Wann de Client beim Start lassgeet, gëtt deen Ufruff zu engem Hänger, an den Timeout erschéngt meeschtens als allgemenge Verbindungsfehler an net als Umeldungsfehler.
Eng Umeldungsdatei ass déi richteg Äntwert, wann de Prozess ouni Iwwerwaachung start an de Geheimnis ënner engem kontrolléierte Permissiounsset op der Festplack iwwerliewe darf. Wann de Geheimnis guer net dierf geschriwwe ginn - eng Richtlinie nëmme fir de Safe, en Tok vun kuerzer Dauer - brauch Dir e Stroum, deen de Client kann oppemaachen, wat an der Praxis Prozessauswiesselung oder en Hëllefe bedeit, deen an en Dateideskriptor schreift. D'Verwaltungs-Schnittstell deckt de véierte Fall: e Kontroller, deen de Liewenszyklus vum Tunnel schonn iwwerwacht an Ufroen iwwer e Socket beäntwerten kann.
- Mënsch um Konsol, keng Automatiséierung: interaktiven Ufruff.
- Start ouni Iwwerwaachung, de Geheimnis dierf gespäichert ginn: Umeldungsdatei mat Modus 0600.
- Start ouni Iwwerwaachung, de Geheimnis dierf net gespäichert ginn: Prozessauswiesselung oder en fd, an deen en Geheimnisagent schreift.
- En aneren Prozess besëtzt de Client: Verwaltungs-Schnittstell.
Wann zwou Äntwerten passen, hëlt déi, déi de Geheimnis aus argv an aus der Shell-Historik eraushält. E Passwuert, dat als Programmargument iwwergi gëtt, ass duerch d'Prozesslëscht vu jidderengem lokale Benotzer liesbar, an dës Expositioun ass schwéier z'ënnerdrécken.
Wat all Input-Wee tatsächlech mécht
--auth-user-pass eleng freet um Konsol no Benotzernumm a Passwuert. Mat engem Dateinumm hëlt de Client déi éischt Zeil als Benotzernumm an déi zweet als Passwuert; näischt ënnerstëtzt Zitater, Kommentaren oder Schlëssel-Wäert-Syntax. Dat ass de ganze Format, also wien en an Erwaardung vun enger INI-Datei änneren, brécht en. En inline <auth-user-pass>-Block hält déiselwecht zwou Zeilen am Profil, wat de Profil selwer zu engem Geheimnis mécht an en an déiselwecht Behandlungsklass wéi e private Schlëssel setzt.
Déi aner zwee Weeë sinn e Stroum an e Socket. OpenVPN brauch just en liesbaren Dateideskriptor, also akzeptéiert et eng Prozessauswiesselung, en duerch eng Pipe gestäipten /dev/fd-Antrag oder en Dateinumm, deen tatsächlech e FIFO ass. D'Verwaltungs-Schnittstell ass anescht vun der Natur: de Client freet en iwwerwaachende Prozess no de Wäerter, amplaz se selwer ze liesen. Dee Ënnerscheed zielt bei der Neiverbindung: eng Umeldungsdatei, e FIFO, an deen en Geheimnishëllefe ka nees schreiwen, an d'Verwaltungs-Schnittstell kënnen ouni Mënsch nees liwweren; Prozessauswiesselung kann dat net, well den Deskriptor bei der éischter Liesung verbraucht gëtt.
D'Datei muss genee zwou Zeilen hunn
Zwee Feelermuster decken déi meescht futti Umeldungsdateien. En Windows-Editor hannerléisst CRLF-Enner, de Wagonretour gëtt en Deel vum Passwuert, an de Server refuséiert e Wäert, deen um Bildschierm richteg ausgesäit. Eng eidel zweet Zeil - eng eidel Zeil do, wou d'Passwuert gehéiert - léisst de Client mat engem eidele Passwuert, dat de Server refuséiert, obwuel de Wäert um Bildschierm richteg ausgesäit. En zousätzlechen Zeilennëmbroch nom Passwuert ass harmlos. Schreift d'Datei aus der Shell, net aus engem Editor, a kontrolléiert d'Byten:
install -m 600 /dev/null /etc/openvpn/client.creds
printf '%s\n%s\n' "$VPN_USER" "$VPN_PASS" > /etc/openvpn/client.creds
od -c /etc/openvpn/client.creds | head -3De Wee ass esou wichteg wéi den Inhalt. E relativ Wee gëtt géint den Aarbechtsverzeechnis vum Prozess opgeléist, wat fir e Service selen dat Verzeechnis ass, wou Dir getest hutt. Benotzt en absolute Wee, maacht d'Datei zum Besëtz vum Kont, deen de Client leeft, a behält de Modus 0600, sou datt Grupp an anerer se net kënne liesen. D'OpenVPN-2.6-Handbuch lëscht d'akzeptéiert Forme vun der Direktiv; kuckt et un, ier Dir eng drëtt erfinden.
Test d'Datei, ier Dir de Server beschëllegt. D'Lafe vu openvpn --config client.ovpn --auth-user-pass /etc/openvpn/client.creds --verb 4 dréckt aus, ob d'Datei opgemaach gouf an duerno, ob d'Umeldunge akzeptéiert goufen, wat Iech seet, wéi eng Schicht Dir als nächst ännert.
Stroum, stdin an d'Feeler, déi se produzéieren
D'Passwuert an eng Pipe ze ginn ass dat éischt, wat déi meescht Leit probéieren, an de Wee mat de meeschte Iwwerraschungen. Prozessauswiesselung funktionéiert, well de Client just en liesbaren Deskriptor brauch: openvpn --config client.ovpn --verb 3 --auth-user-pass <(printf '%s\n%s\n' "$VPN_USER" "$VPN_PASS"). /dev/stdin ze iwwerginn funktionéiert nëmmen, wann stdin nach op a liesbar ass zu deem Moment, wou de Client freet, wat an enger Pipeline, déi et schonn verbraucht huet, net wouer ass.
ERROR: could not read Auth username from stdin huet zwee verschidde Grënn. Bei verschiddenen 2.3.x-Cliente koum d'Meldung vun engem stdin-Behandlungsfeeler, deen spéider 2.3-Versiounen behuewen hunn, also verbessert esou en ale Client sech nëmmen duerch en Upgrade. Bei engem aktuelle Client heescht déiselwecht Formuléierung, datt de Client Konsolinput gefrot huet an stdin keen Terminal war - genee d'Situatioun an enger systemd-Eenheet, engem Cron-Job oder engem Container, deen ouni -t gestart gouf.
auth-nocache füügt eng drëtt Schleif bäi, déi wéi e futti Passwuert ausgesäit. Et verwërft d'Umeldungen nom Gebrauch aus dem Späicher, also huet eng Neiverbindung, déi duerch eng Netzwierkännerung ausgeléist gëtt, näischt zum Neesofspillen an den Ufruff kënnt zréck. Dat ass d'Direktiv, déi wéi designéiert funktionéiert. auth-nocache ännert, wat de Client am Späicher behält, net wat de Server oder den Identitéitsprovider iwwer de Kont denkt, also ass déi ganz Léisung, déiselwecht Datei nees ze liwweren, déi beim Restart nees gelies gëtt - an fir eng geréiert Verbindung sollt déi Liwwerung aus dem approuvéierte Geheimnisspäicher kommen, net aus engem Passwuert an engem Skript.
D'Verwaltungs-Schnittstell, wann en aneren Prozess den Ufruff besëtzt
E Kontroller, deen den Tunnel schonn iwwerwaacht, kann och seng Froen beäntweren. Start de Client mat --management 127.0.0.1 7505, liest d'Statuszeilen a kuckt op >PASSWORD:Need 'Auth' username/password. De Kontroller äntwert mat username "Auth" alice, gefollegt vun password "Auth" ... op getrennte Kommandozeilen. Den 'Auth'-Token widderhëlt d'Kennung aus der Ufro an muss passen, soss gëtt d'Äntwert ignoréiert an de Client waart.
De Präis ass eng Zoustandmaschinn, déi Dir elo besëtzt: Verbindungsuerdnung, Client-Restarts an en lokale Socket, deen aner Benotzer um Host net solle kënnen erreechen. Wat Dir kaaft, ass eng Umeldung, déi zur Lafzäit geliwwert gëtt, ouni Datei op der Festplack an ouni Ufruff, dee ka hänken. Wann soss näischt an Ärem Stack de Protokoll schonn schwätzt, füügt dëse Wee eng Komponent derbäi, déi ënnerhale muss ginn.
Feeler, déi wéi Umeldungsproblemer ausgesinn
En TLS-Handshake, deen ni fäerdeg gëtt, oder VERIFY ERROR: depth=0, error=certificate signature failure, ass e Vertrauensproblem an geschitt, ier en Numm vum Benotzer gelies gëtt. En proto tcp-Client, deen op en UDP-Listener weist, versot op déiselwechter Plaz: d'Pakete kréien ni d'Authentifizéierungsphas, also gesäit all Passwuert duerch Associatioun falsch aus. Loosst d'Zertifikatverifikatioun ugeschalt, ier d'Umeldung geschéckt gëtt; en gewinnten Ufruff seet näischt doriwwer, wien d'Passwuert kritt. Kontrolléiert d'Zertifikatskette, den Common Name an den Transport, ier Dir d'Umeldung beréiert.
Shell-Feeler am Skript, dee de Profil zesummesetzt, sinn dat anert falscht Spuer. E fehlende Raum an [ ! -f "$file" ] produzéiert command not found, d'Skript stoppt fréi, de Profil gëtt ni nees opgebaut, an de Client start mam viregten. Dee Feeler gehéiert zu der Shell, net zu der Authentifizéierung, an et hëlleft näischt, d'Passwuert nach eng Kéier ze tippen.
Net all Ufruff an dësem Floss ass dës Umeldung. Eng Passphras fir e private Schlëssel, eng HTTP-Proxy-Anmeldung an d'Passwuert vum Service sinn dräi verschidde Geheimnisser, déi an ënnerschiddlechen Phasen gefrot ginn, an eng Schlësselpassphras gëtt meeschtens vum Client oder engem Agent behandelt an net vun auth-user-pass. Wann den Ufruff erschéngt, ier d'TLS-Sessioun steet, äntwert Dir op déi falsch Fro an eng Kontzrécksetzung hëlleft net. Nodeems den falschen Ufruff ausgeschloss ass, fänken déi verbleiwen Kontrollen an der fréister Schicht un:
- Liest den éischte Protokollfeeler, net déi lescht Umeldungszeil: TLS, duerno Authentifizéierung, duerno push.
- Bestätegt, datt d'Datei zwou Zeilen huet, keng Wagonretoure enthält an iwwer en absolute Wee referenzéiert gëtt.
- Bestätegt, datt Profil a Kommandozeil sech iwwer d'Direktiv net widerspriechen.
- Trennt "Umeldungen akzeptéiert" vu "Verkehr fléisst" - Routing an DNS sinn eng méi spéit Schicht.
Wann de Client d'Push-Phas erreecht, hält op d'Umeldungen ze kucken a fänkt un, d'Routen an DNS-Server ze liesen, déi de Server geschéckt huet. Dat ass déi nächst Fro, an si huet näischt mat deem Passwuert ze dinn, dat Dir just verbessert hutt.