Du treng ikkje ei mellombels fil for å laga ein OpenVPN-nøkkel
Å halda nøkkelmateriale i minnet unngår ein fillivssyklus, ikkje ein lekkasje. Hald utdata- og feilstraumane åtskilde, og handsame nøkkelen som ein hemmelegheit etterpå.
Nøkkelgenerering treng ikkje ei mellombels fil, og å hoppa over ho rettar mindre enn dei fleste rettleiarane antydar. Det ho fjernar, er ein fillivssyklus og kapplaupet om opprydding rundt han. Det ho lèt vera urørt, er kvar moglegheit til å leka hemmelegheita etterpå. Korrektheitsproblemet i desse skripta sit vanlegvis ein annan stad, fordi diagnostikk og nøkkelmateriale reiser på ulike straumar.
Fila var aldri den eksponeringa du trudde
Ei mellombels fil er ein konkret risiko når ho kan lesast av alle, når ho overlever eit krasj, eller når eit oppryddingsteg blir hoppa over etter eit unntak. Det er ekte, og det er verdt å retta. Dei er også lokale, synlege og enkle å testa. Namngje kvar einskild i ditt eige skript før du konkluderer med at endringa var kosmetisk.
Dei stillare risikoane sit nedstraums: nøkkelen som blir skriven ut under feilsøking, unntaket som serialiserer heile resultatobjektet, krasjhandteringa som skriv ein kjernedump, loggsamlaren som tek imot filbanen og deretter innhaldet. Å unngå ei mellombels fil gjer ingenting for nokon av dei, og å tru det motsette er korleis ein velmeint omskriving lèt hemmelegheita vera meir eksponert enn før. Handsame endringa som éi forbetring i ei rekkje, ikkje som løysinga.
Kva klienten skriv når det ikkje blir gitt eit filnamn
Noverande versjonar av klienten sender den genererte nøkkelen til standardutdata når nøkkelkommandoen blir gitt utan ein utdatasti. Nettopp denne dokumenterte åtferda gjer minnetilnærminga levedyktig, og ho fjernar behovet for det eldre trikset å peika verktøyet mot ein einingststi.
import subprocess
proc = subprocess.run(
["openvpn", "--genkey", "tls-crypt"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=True,
)
key_material = proc.stdout
Send kommandoen som ei liste. Det trengst inga skalutviding her, og å slå på eit skal ville gjera argumentgrensa avhengig av hermeteikn du ikkje kontrollerer. Bruk den tiltenkte køyrbare fila via absolutt sti dersom skriptet kan køyra med ein annan søkjesti enn du ventar.
Returkodekontrollen hindrar suksessbanen i å halda fram etter eit mislukka kall. Utan han kan ein tom bytestreng flyta vidare og først mislukkast mykje seinare, på punktet der nøkkelen blir brukt og feilmeldinga ikkje lenger nemner generering i det heile.
To straumar, to tydingar
Standardutdata ber nøkkelen. Standardfeil ber alt verktøyet vil fortelja deg, inkludert åtvaringar om konfigurasjonen, versjonen og nøkkeltypen. Å omdirigera begge til éin buffer er feilen som lagar ein truverdig utsjånad nøkkel med ei setning sydd inn i midten.
Hald også feilbanen åtskild. Når kallet feilar, rapporter kommandoen som feila og utgangsstatusen, og avgjer deretter medvite om nokon del av standardfeilen er trygg å visa. Å dumpa heile resultatobjektet til ein logg er den vanlege snarvvegen, og han kan bera nøkkelen med seg.
Binarsikker lesing betyr noko dersom du seinare hashar eller samanliknar materialet. Tekstmodus med ei uventa koding kan endra bytar som aldri var meint som tekst, og ein endra nøkkel kan ikkje skiljast frå ein feil før eit handtrykk feilar.
Dersom du likevel lagrar han, gjer det medvite
Dei fleste utrullingar treng etter kvart nøkkelen på disk, på gatewayen eller i eit hemmelegheitslager. Skriv han éin gong, med restriktive løyve frå opprettinga i staden for ein seinare chmod, og gjer skrivinga atomisk slik at ei delvis fil aldri blir den ei teneste les ved oppstart. Ei omdøyping frå ein sti i same katalog er vanlegvis nok for det. Fjern stagingstien på feilgreina, for den mislukka skrivinga er nettopp kopien folk gløymer.
Set filmodusen når fila blir oppretta, og hald katalogmodusen restriktiv også. Unngå ein kvar sti under ein stad som ein tryggleikskopijobb feiar opp utan å tenkja, fordi ei hemmelegheit i ein nattleg tryggleikskopi er ei hemmelegheit i kvar kopi av den tryggleikskopien. Same resonnementet gjeld for eit delt volum som andre tenester kan lesa.
Ein delt nøkkel er ikkje ein identitet
Å generera dette materialet gjev ikkje ut eit sertifikat, registrerer ikkje ein klient og fastset ikkje kven som koplar til. Den delte nøkkelen vernar ein kanal mellom partar som allereie stolar på kvarandre; identiteten kjem framleis frå sertifikatet og kvar som helst autentisering som står framfor det.
Nøkkeltypane er heller ikkje utskiftbare. Ein symmetrisk nøkkel for éin funksjon er ikkje ei direkte erstatning for ein annan, og nyare utgjevingar legg til eigne variantar med ulike filer i kvar ende. Generer typen konfigurasjonen din faktisk namngjev, og bruk han deretter i rolla den typen definerer.
Test resultatet med ei ekte tilkopling i staden for å inspisera filstorleiken. Dersom handtrykket blir fullført og loggane ikkje viser nøkkelåtvaringar, er genereringsbanen riktig; dersom nøkkelen var blitt avkorta av ein samanslått straum, ville tilkoplinga feila på ein måte som peikar på motparten i staden for skriptet.