OpenVPN llegeix la contrasenya del terminal, no de stdin
On llegeix realment OpenVPN una contrasenya, per què falla un fitxer a stdin i les tres vies admeses per iniciar sessió amb scripts a Linux i macOS.
OpenVPN demana un nom d'usuari i una contrasenya al terminal de control, i un fitxer redirigit a l'entrada estàndard no és aquest terminal. Aquest sol detall explica l'script que es penja amb la contrasenya allà mateix dins de la canonada. El client dibuixa l'indicador i la lectura es pren del dispositiu de terminal, així que redirigir stdin no canvia res. Alimenteu el client per una de les seves vies d'entrada documentades i el mateix script es connectarà al primer intent.
Tres vies cobreixen gairebé tots els casos, i cadascuna falla a la seva manera. Trieu per l'indicador que el client mostra realment, no per l'opció que sigui més fàcil d'escriure en un script.
L'indicador no ve de stdin
Quan OpenVPN necessita credencials, obre el terminal de control i llegeix allà. Per això una prova interactiva sembla correcta i la mateixa ordre sota cron o un fitxer d'unitat queda aturada amb l'indicador escrit en un registre que ningú no mira. Algunes compilacions tornen a l'entrada estàndard quan no hi ha terminal, i aquesta inconsistència és pitjor que un error dur perquè amaga el problema fins al desplegament.
Comproveu l'entorn abans d'escriure cap codi: executeu el client amb el mateix usuari, amb el mateix stdin, que farà servir el planificador o el gestor de serveis. Si l'indicador no apareix mai al registre i el procés no avança, alguna cosa espera un terminal que no existeix.
Primera via: un fitxer de credencials de dues línies
L'opció d'autenticació pren un camí, i el fitxer conté exactament dues línies, primer el nom d'usuari i després la contrasenya, sense res més. Passeu el camí explícitament en lloc de confiar en un nom de fitxer per defecte, perquè un fitxer de credencials perdut al directori de treball és com el compte equivocat acaba en ús. Fixeu el mode a 0600 i doneu la propietat al compte que executa el client.
El client llegeix aquest fitxer una vegada en arrencar, així que rotar la contrasenya vol dir reiniciar el procés. Normalment aquest és el comportament que voleu, i pertany al runbook al costat del procediment de rotació.
Segona via: askpass per a la contrasenya de la clau
Una clau privada protegida amb contrasenya planteja un segon indicador diferent, i té la seva pròpia resposta en fitxer: l'opció askpass llegeix la contrasenya de la primera línia d'un fitxer. Per als túnels basats en SSH l'equivalent és un programa askpass que el client executa, i la seva sortida estàndard es converteix en el secret.
Cap de les dues formes posa el secret a la llista d'arguments, i totes dues el deixen existint com a fitxer o com a executable que l'imprimeix. La protecció són els permisos del fitxer i la propietat del procés, no l'ocultació. Un ajudant que fa eco d'una cadena escrita al codi és un secret amb passos extres.
Tercera via: la CLI pròpia del client del portal
Els clients empresarials solen incloure un punt d'entrada de línia d'ordres que es connecta a un portal amb nom sense cap finestra, i aquesta és la via admesa. A Linux el client GlobalProtect exposa les operacions de connexió i d'importació de certificat a través de la seva CLI, i els portals que fan servir autenticació per certificat necessiten el pas d'importació abans que una connexió automatitzada pugui funcionar. Preferiu-lo a les pulsacions sintetitzades: obteniu un estat de sortida real, cap dependència del focus de la finestra, i sobreviu a una pantalla bloquejada.
Si la primera connexió encara necessita una persona per acceptar un certificat, l'automatització no està acabada. Feu la importació durant la configuració i registreu-la com a prerequisit.
Quan el flux necessita un pseudo-terminal
Una seqüència que demana una contrasenya i després un codi d'un sol ús no té cap fitxer únic per llegir. Un controlador de terminal com Expect és l'eina correcta perquè espera cada patró per torn, i necessita el procés engegat abans de poder coincidir amb res.
Dos errors dominen. Un script que espera un indicador sense engegar el client espera per sempre, i Tcl no és un shell, així que l'aritmètica de shell escrita dins d'un bloc expect no s'avalua com es llegeix. Manteniu la bandera de depuració activa mentre construïu els patrons, i després apagueu-la.
Secrets que es filtren, i on s'amaguen
Tot el que es passa com a argument és visible a la llista de processos, així que les credencials van en un fitxer o darrere d'un ajudant, mai a la línia d'ordres. Els codis d'un sol ús es consumeixen per disseny i s'han de produir per a cada intent. Els registres de fallades sovint porten el nom d'usuari i de vegades més, així que redacteu-los abans d'enviar-los enlloc, i manteniu el secret fora del mateix perfil, perquè un fitxer de configuració amb una contrasenya incrustada s'enganxa a tiquets i repositoris. Rotar el compte després vol dir caçar cada còpia, que és exactament el cost que aquesta disposició evita.
Auditeu les vies que heu triat i connecteu-les al fitxer d'unitat o al planificador que realment executarà el client. El túnel viu exactament tant com viu aquest procés.