OpenVPN rakto generavimui nereikia laikino failo
Rakto medžiagos laikymas atmintyje išvengia failo gyvavimo ciklo, o ne nutekėjimo. Laikykite išvesties ir klaidų srautus atskirai, o paskui traktuokite raktą kaip paslaptį.
Rakto generavimui nereikia laikino failo, o jo praleidimas pataiso mažiau, nei užsimenama daugumoje vadovų. Ką jis pašalina, tai failo gyvavimo ciklas ir jo aplink vykstančios valymo lenktynės. Ką jis palieka nepaliesta, tai kiekviena proga vėliau nutekinti paslaptį. Šių skriptų korektiškumo problema paprastai glūdi kitur, nes diagnostika ir rakto medžiaga keliauja skirtingais srautais.
Failas niekada nebuvo tas atskleidimas, apie kurį manėte
Laikinas failas yra konkreti rizika, kai jis skaitomas visų, kai jis išgyvena lūžį arba kai po išimties praleidžiamas valymo žingsnis. Tai tikra, ir tai verta taisyti. Jie taip pat vietiniai, matomi ir lengvai testuojami. Įvardykite kiekvieną savo skripte, prieš darydami išvadą, kad pakeitimas buvo tik kosmetinis.
Tylesnės rizikos glūdi pasroviui: raktas, atspausdintas derinimo metu, išimtis, kuri serializuoja visą rezultato objektą, lūžio tvarkyklė, kuri rašo atminties išspaudą, žurnalų agregatorius, kuris gauna failo kelią ir tada turinį. Laikino failo vengimas nieko nedaro nė vienam iš jų, ir manyti priešingai yra būdas, kuriuo geranoriškas perrašymas palieka paslaptį labiau atskleistą nei anksčiau. Traktuokite pakeitimą kaip vieną patobulinimą sekoje, o ne kaip sprendimą.
Ką klientas rašo, kai failo vardas nenurodytas
Dabartinės kliento versijos siunčia sugeneruotą raktą į standartinę išvestį, kai rakto komanda duodama be išvesties kelio. Būtent ši dokumentuota elgsena daro metodą atmintyje gyvybingą, ir ji pašalina poreikį senesniam triukui nukreipti įrankį į įrenginio kelią.
import subprocess
proc = subprocess.run(
["openvpn", "--genkey", "tls-crypt"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=True,
)
key_material = proc.stdout
Perduokite komandą kaip sąrašą. Čia nereikia apvalkalo išplėtimo, o apvalkalo įjungimas padarytų argumentų ribą priklausomą nuo kabučių, kurių jūs nekontroliuojate. Naudokite numatytą vykdomąjį failą absoliučiu keliu, jei skriptas gali veikti su kitu paieškos keliu, nei tikitės.
Grąžinimo kodo patikra neleidžia sėkmės keliui tęstis po nepavykusio kvietimo. Be jos tuščia baitų eilutė gali tekėti toliau ir nepavykti tik daug vėliau, tame taške, kur raktas naudojamas, o klaidos pranešimas jau visai nemini generavimo.
Du srautai, dvi reikšmės
Standartinė išvestis neša raktą. Standartinė klaida neša viską, ką įrankis nori jums pasakyti, įskaitant įspėjimus apie konfigūraciją, versiją ir rakto tipą. Abu nukreipti į vieną buferį yra klaida, kuri sukuria patikimai atrodantį raktą su įsiūtu sakiniu per vidurį.
Laikykite atskirą ir nesėkmės kelią. Kai kvietimas nepavyksta, praneškite nepavykusią komandą ir išėjimo būseną, o tada sąmoningai nuspręskite, ar kuri nors standartinės klaidos dalis yra saugi rodyti. Viso rezultato objekto išpylimas į žurnalą yra įprastas trumpinys, ir jis gali nunešti raktą su savimi.
Dvejetainei saugus skaitymas svarbus, jei vėliau maišote ar lyginate medžiagą. Teksto režimas su netikėta koduote gali pakeisti baitus, kurie niekada nebuvo skirti būti tekstu, o pakeistas raktas nesiskiria nuo neteisingo, kol nepavyksta rankos paspaudimas.
Jei vis dėlto jį išsaugote, darykite tai sąmoningai
Daugumai diegimų galiausiai reikia rakto diske, tinklelyje ar slaptųjų duomenų saugykloje. Parašykite jį vieną kartą, su ribojančiomis teisėmis nuo sukūrimo, o ne vėlesniu chmod, ir padarykite rašymą atominiu, kad dalinis failas niekada netaptų tuo, kurį paslauga skaito paleidimo metu. Pervadinimas iš kelio tame pačiame kataloge paprastai tam pakanka. Pašalinkite paruošimo kelią nesėkmės šakoje, nes nepavykęs rašymas yra būtent ta kopija, kurią žmonės pamiršta.
Nustatykite failo režimą jį kuriant, ir katalogo režimą taip pat laikykite ribojantį. Venkite bet kurio kelio vietoje, kurią atsarginių kopijų užduotis nušluoja negalvodama, nes paslaptis naktinėje atsarginėje kopijoje yra paslaptis kiekvienoje tos kopijos kopijoje. Ta pati logika galioja bendram tomui, kurį gali skaityti kitos paslaugos.
Bendras raktas nėra tapatybė
Šios medžiagos generavimas neišduoda sertifikato, neįregistruoja kliento ir nenustato, kas jungiasi. Bendras raktas saugo kanalą tarp šalių, kurios jau pasitiki viena kita; tapatybė vis dar ateina iš sertifikato ir bet kurios autentifikacijos, stovinčios prieš jį.
Raktų tipai taip pat nėra keičiami. Vienos funkcijos simetrinis raktas nėra paruoštas pakaitalas kitai, o naujesni leidimai prideda savo variantus su skirtingais failais kiekviename gale. Generuokite tipą, kurį jūsų konfigūracija iš tikrųjų įvardija, o tada naudokite jį vaidmenyje, kurį tas tipas apibrėžia.
Testuokite rezultatą tikru ryšiu, o ne tikrindami failo dydį. Jei rankos paspaudimas baigiamas ir žurnalai nerodo įspėjimų apie raktą, generavimo kelias teisingas; jei raktas būtų nukirptas sujungto srauto, ryšys nepavyktų taip, kad rodytų į kitą šalį, o ne į skriptą.