Du behøver ikke en midlertidig fil for at generere en OpenVPN-nøgle
At holde nøglemateriale i hukommelsen undgår et fillivsforløb, ikke en lækage. Hold output- og fejlstrømme adskilt, og behandl nøglen som en hemmelighed bagefter.
Nøglegenerering behøver ikke en midlertidig fil, og at springe den over retter mindre, end de fleste vejledninger antyder. Det, den fjerner, er et fillivsforløb og det oprydningskapløb, der hører til. Det, den lader urørt, er enhver mulighed for at lække hemmeligheden bagefter. Korrekthedsproblemet i disse scripts ligger oftest et andet sted, fordi diagnostik og nøglemateriale rejser på forskellige strømme.
Filen var aldrig den eksponering, du troede
En midlertidig fil er en konkret risiko, når den kan læses af alle, når den overlever et nedbrud, eller når et oprydningstrin springes over efter en undtagelse. Det er virkeligt, og det er værd at rette. De er også lokale, synlige og nemme at teste. Navngiv hver enkelt i dit eget script, før du konkluderer, at ændringen var kosmetisk.
De mere stille risici ligger nedstrøms: nøglen, der printes under fejlfinding, undtagelsen, der serialiserer hele resultatobjektet, nedbrudshåndteringen, der skriver et kernedump, logaggregatoren, der modtager filstien og derefter indholdet. At undgå en midlertidig fil gør intet for nogen af dem, og at tro andet er, hvordan en velment omskrivning efterlader hemmeligheden mere udsat end før. Behandl ændringen som én forbedring i en række, ikke som løsningen.
Hvad klienten skriver, når der ikke angives et filnavn
Nuværende versioner af klienten sender den genererede nøgle til standardoutput, når nøglekommandoen gives uden en outputsti. Netop den dokumenterede adfærd gør hukommelsestilgangen levedygtig, og den fjerner behovet for det ældre trick at pege værktøjet mod en enhedssti.
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. Der er ingen skaludvidelse behov her, og at aktivere en skal ville gøre argumentgrænsen afhængig af citater, du ikke kontrollerer. Brug den tilsigtede eksekverbare fil via absolut sti, hvis scriptet kan køre med en anden søgesti, end du forventer.
Returkodekontrollen forhindrer successtien i at fortsætte efter et mislykket kald. Uden den kan en tom byte-streng flyde videre og først fejle meget senere, på det punkt hvor nøglen bruges, og fejlmeddelelsen nævner slet ikke generering mere.
To strømme, to betydninger
Standardoutput bærer nøglen. Standardfejl bærer alt, hvad værktøjet vil fortælle dig, inklusive advarsler om konfigurationen, versionen og nøgletypen. At omdirigere begge til én buffer er den fejl, der frembringer en troværdigt udseende nøgle med en sætning syet ind i midten.
Hold også fejlvejen adskilt. Når kaldet fejler, rapporter den kommando, der fejlede, og exitstatus, og beslut derefter bevidst, om nogen del af standardfejlen er sikker at vise. At dumpe hele resultatobjektet til en log er den sædvanlige genvej, og den kan bære nøglen med sig.
Binærsikker læsning betyder noget, hvis du senere hasher materialet eller sammenligner det. Teksttilstand med en uventet kodning kan ændre bytes, der aldrig var ment som tekst, og en ændret nøgle kan ikke skelnes fra en forkert, før et handshake fejler.
Hvis du alligevel gemmer den, så gør det bevidst
De fleste udrulninger får på et tidspunkt brug for nøglen på disken, på gatewayen eller i et hemmelighedslager. Skriv den én gang, med restriktive tilladelser fra oprettelsen i stedet for en senere chmod, og gør skrivningen atomisk, så en delvis fil aldrig bliver den, en tjeneste læser ved opstart. En omdøbning fra en sti i samme mappe er normalt nok til det. Fjern stagingstien på fejlgrenen, for den mislykkede skrivning er netop den kopi, folk glemmer.
Sæt filens tilstand, når filen oprettes, og hold også mappens tilstand restriktiv. Undgå enhver sti under et sted, som et backupjob fejer op uden at tænke, for en hemmelighed i en natlig backup er en hemmelighed i hver kopi af den backup. Samme ræsonnement gælder for et delt drev, som andre tjenester kan læse.
En delt nøgle er ikke en identitet
At generere dette materiale udsteder ikke et certifikat, tilmelder ikke en klient og fastslår ikke, hvem der forbinder. Den delte nøgle beskytter en kanal mellem parter, der allerede stoler på hinanden; identitet kommer stadig fra certifikatet og den autentificering, der står foran det.
Nøgletyperne kan heller ikke udskiftes. En symmetrisk nøgle til én funktion er ikke en direkte erstatning for en anden, og nyere udgivelser tilføjer deres egne varianter med forskellige filer i hver ende. Generer den type, din konfiguration faktisk navngiver, og brug den derefter i den rolle, den type definerer.
Test resultatet med en rigtig forbindelse i stedet for at inspicere filstørrelsen. Hvis handshaket fuldføres, og loggene ikke viser nøgleadvarsler, er genereringsvejen korrekt; hvis nøglen var blevet afkortet af en sammenlagt strøm, ville forbindelsen fejle på en måde, der peger på modparten i stedet for scriptet.