Du trenger ikke en midlertidig fil for å generere en OpenVPN-nøkkel
Å holde nøkkelmateriale i minnet unngår en fillivssyklus, ikke en lekkasje. Hold utdata- og feilstrømmene atskilt, og behandle nøkkelen som en hemmelighet etterpå.
Nøkkelgenerering trenger ikke en midlertidig fil, og å hoppe over den retter mindre enn de fleste veiledninger antyder. Det den fjerner, er en fillivssyklus og kappløpet om opprydding rundt den. Det den lar være urørt, er hver mulighet til å lekke hemmeligheten etterpå. Korrekthetsproblemet i disse skriptene sitter vanligvis et annet sted, fordi diagnostikk og nøkkelmateriale reiser på forskjellige strømmer.
Filen var aldri den eksponeringen du trodde
En midlertidig fil er en konkret risiko når den kan leses av alle, når den overlever et krasj, eller når et oppryddingstrinn hoppes over etter et unntak. Det er ekte, og det er verdt å rette. De er også lokale, synlige og enkle å teste. Navngi hver enkelt i ditt eget skript før du konkluderer med at endringen var kosmetisk.
De stillere risikoene sitter nedstrøms: nøkkelen som skrives ut under feilsøking, unntaket som serialiserer hele resultatobjektet, krasjhåndteringen som skriver en kjernedump, loggsamleren som mottar filbanen og deretter innholdet. Å unngå en midlertidig fil gjør ingenting for noen av dem, og å tro det motsatte er hvordan en velment omskriving etterlater hemmeligheten mer eksponert enn før. Behandle endringen som én forbedring i en rekke, ikke som løsningen.
Hva klienten skriver når det ikke angis et filnavn
Nåværende versjoner av klienten sender den genererte nøkkelen til standardutdata når nøkkelkommandoen gis uten en utdatasti. Nettopp denne dokumenterte atferden gjør minnetilnærmingen levedyktig, og den fjerner behovet for det eldre trikset å peke verktøyet mot en enhetssti.
import subprocess
proc = subprocess.run(
["openvpn", "--genkey", "tls-crypt"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=True,
)
key_material = proc.stdout
Send kommandoen som en liste. Det trengs ingen skallutvidelse her, og å aktivere et skall ville gjøre argumentgrensen avhengig av anførselstegn du ikke kontrollerer. Bruk den tiltenkte kjørbare filen via absolutt sti hvis skriptet kan kjøre med en annen søkesti enn du forventer.
Returkodekontrollen hindrer suksessbanen i å fortsette etter et mislykket kall. Uten den kan en tom bytestreng flyte videre og først feile mye senere, på punktet der nøkkelen brukes og feilmeldingen ikke lenger nevner generering i det hele tatt.
To strømmer, to betydninger
Standardutdata bærer nøkkelen. Standardfeil bærer alt verktøyet vil fortelle deg, inkludert advarsler om konfigurasjonen, versjonen og nøkkeltypen. Å omdirigere begge til én buffer er feilen som produserer en troverdig utseende nøkkel med en setning sydd inn i midten.
Hold også feilbanen atskilt. Når kallet feiler, rapporter kommandoen som feilet og utgangsstatusen, og bestem deretter bevisst om noen del av standardfeilen er trygg å vise. Å dumpe hele resultatobjektet til en logg er den vanlige snarveien, og den kan bære nøkkelen med seg.
Binarsikker lesing betyr noe hvis du senere hasher eller sammenligner materialet. Tekstmodus med en uventet koding kan endre bytes som aldri var ment som tekst, og en endret nøkkel kan ikke skilles fra en feil før en håndtrykk feiler.
Hvis du likevel lagrer den, gjør det bevisst
De fleste utrullinger trenger etter hvert nøkkelen på disk, på gatewayen eller i et hemmelighetslager. Skriv den én gang, med restriktive tillatelser fra opprettelsen i stedet for en senere chmod, og gjør skrivingen atomisk slik at en delvis fil aldri blir den en tjeneste leser ved oppstart. En omdøping fra en sti i samme katalog er vanligvis nok for det. Fjern stagingstien på feilgrenen, for den mislykkede skrivingen er nettopp kopien folk glemmer.
Sett filmodusen når filen opprettes, og hold katalogmodusen restriktiv også. Unngå enhver sti under et sted som en sikkerhetskopijobb feier opp uten å tenke, fordi en hemmelighet i en nattlig sikkerhetskopi er en hemmelighet i hver kopi av den sikkerhetskopien. Samme resonnement gjelder for et delt volum som andre tjenester kan lese.
En delt nøkkel er ikke en identitet
Å generere dette materialet utsteder ikke et sertifikat, registrerer ikke en klient og fastslår ikke hvem som kobler til. Den delte nøkkelen beskytter en kanal mellom parter som allerede stoler på hverandre; identiteten kommer fortsatt fra sertifikatet og enhver autentisering som står foran det.
Nøkkeltypene er heller ikke utskiftbare. En symmetrisk nøkkel for én funksjon er ikke en direkte erstatning for en annen, og nyere utgivelser legger til egne varianter med ulike filer i hver ende. Generer typen konfigurasjonen din faktisk navngir, og bruk den deretter i rollen den typen definerer.
Test resultatet med en ekte tilkobling i stedet for å inspisere filstørrelsen. Hvis håndtrykket fullføres og loggene ikke viser nøkkeladvarsler, er genereringsbanen riktig; hvis nøkkelen var blitt avkortet av en sammenslått strøm, ville tilkoblingen feile på en måte som peker på motparten i stedet for skriptet.