OpenVPN-i võtme genereerimiseks pole vaja ajutist faili
Võtmematerjali mällu hoidmine väldib faili elutsüklit, mitte leket. Hoidke väljund- ja veavood eraldi ning kohelge võtit pärast salajasena.
Võtme genereerimine ei vaja ajutist faili ja selle vahelejätmine parandab vähem, kui enamik juhendeid vihjab. See, mida see eemaldab, on faili elutsükkel ja selle ümber käiv koristusvõistlus. See, mida see puutumata jätab, on iga võimalus saladus hiljem lekitada. Nende skriptide korrektsusprobleem asub tavaliselt mujal, sest diagnostika ja võtmematerjal liiguvad eri voogudel.
Fail ei olnud kunagi see paljastus, mida arvasite
Ajutine fail on konkreetne risk, kui see on kõigile loetav, kui see jääb üle kokkujooksmisest või kui erandi järel jäetakse koristusetapp vahele. Need on tõelised ja neid tasub parandada. Need on ka kohalikud, nähtavad ja kergesti testitavad. Nimetage igaüks oma skriptis enne, kui järeldate, et muudatus oli ainult kosmeetiline.
Vaiksemad riskid asuvad allavoolu: silumise ajal prinditud võti, erand, mis serialiseerib kogu tulemusobjekti, kokkujooksmise käitleja, mis kirjutab mäludumpi, logikoondaja, mis saab failitee ja seejärel sisu. Ajutise faili vältimine ei tee nende jaoks midagi ja vastupidise uskumine on viis, kuidas heatahtlik ümberkirjutus jätab saladuse varasemast paljastatumaks. Käsitlege muudatust ühe parandusena reas, mitte lahendusena.
Mida klient kirjutab, kui failinime ei anta
Kliendi praegused versioonid saadavad genereeritud võtme standardväljundisse, kui võtmekäsk antakse ilma väljundteeta. Just see dokumenteeritud käitumine teeb mälupõhise lähenemise elujõuliseks ja kõrvaldab vajaduse vanema nipi järele suunata tööriist seadme teele.
import subprocess
proc = subprocess.run(
["openvpn", "--genkey", "tls-crypt"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=True,
)
key_material = proc.stdout
Edastage käsk loendina. Siin pole kesta laiendust vaja ja kesta lubamine teeks argumendipiiri sõltuvaks jutumärkidest, mida te ei kontrolli. Kasutage kavandatud käivitatavat faili absoluutse teega, kui skript võib joosta ootamatust otsinguteest.
Tagastuskoodi kontroll takistab eduteel jätkamist ebaõnnestunud kutse järel. Ilma selleta võib tühi baidistring edasi voolata ja alles palju hiljem ebaõnnestuda, kohas, kus võtit kasutatakse ja veateade ei maini enam üldse genereerimist.
Kaks voogu, kaks tähendust
Standardväljund kannab võtit. Standardviga kannab kõike, mida tööriist tahab teile öelda, sealhulgas hoiatusi konfiguratsiooni, versiooni ja võtmetüübi kohta. Mõlema suunamine ühte puhverdusse on viga, mis toodab usutava välimusega võtme, mille keskele on lause sisse õmmeldud.
Hoidke ka ebaõnnestumise tee eraldi. Kui kutse ebaõnnestub, teatage ebaõnnestunud käsk ja väljumisolek ning otsustage seejärel teadlikult, kas mõni osa standardveast on näitamiseks ohutu. Kogu tulemusobjekti logisse valamine on tavaline otsetee ja see võib võtme endaga kaasa viia.
Binaarohutu lugemine on oluline, kui te hiljem materjali räside või võrdlete. Tekstirežiim ootamatu kodeeringuga võib muuta baite, mis polnud kunagi mõeldud tekstiks, ja muudetud võtit ei erista valest enne, kui käepigistus ebaõnnestub.
Kui te selle siiski püsivalt salvestate, tehke seda teadlikult
Enamik juurutusi vajab lõpuks võtit kettal, lüüsil või saladuste hoidlas. Kirjutage see üks kord, piiravate õigustega loomisest alates, mitte hilisema chmod-iga, ja tehke kirjutamine aatomseks, et osaline fail ei saaks kunagi selleks, mida teenus käivitamisel loeb. Ümbernimetamine sama kataloogi teelt on selleks tavaliselt piisav. Eemaldage ettevalmistustee ebaõnnestumise harul, sest ebaõnnestunud kirjutis on täpselt see koopia, mille inimesed unustavad.
Määrake faili režiim faili loomisel ja hoidke ka kataloogi režiim piiravana. Vältige ühtegi teed asukoha all, mille varundustöö mõtlemata üles koristab, sest öise varukoopia saladus on saladus selle varukoopia igas koopias. Sama loogika kehtib jagatud kettale, mida teised teenused saavad lugeda.
Jagatud võti ei ole identiteet
Selle materjali genereerimine ei väljasta sertifikaati, ei registreeri klienti ega tuvasta, kes ühendub. Jagatud võti kaitseb kanalit poolte vahel, kes juba usaldavad üksteist; identiteet tuleb endiselt sertifikaadist ja sellest, mis iganes autentimine selle ees seisab.
Ka võtmetüübid ei ole vahetatavad. Ühe funktsiooni sümmeetriline võti ei ole teise jaoks valmis asendus ja uuemad väljaanded lisavad oma variandid erinevate failidega mõlemas otsas. Genereerige tüüp, mida teie konfiguratsioon tegelikult nimetab, ja kasutage seda seejärel rollis, mille see tüüp määratleb.
Testige tulemust päris ühendusega, mitte faili suurust uurides. Kui käepigistus lõpeb ja logid ei näita võtmehoiatusi, on genereerimistee õige; kui võti oleks ühendatud voo tõttu kärbitud, ebaõnnestuks ühendus viisil, mis osutab vastaspoolele, mitte skriptile.