OpenVPN atslēgas ģenerēšanai nav nepieciešams pagaidu fails
Atslēgas materiāla turēšana atmiņā izvairās no faila dzīves cikla, nevis noplūdes. Turiet izvades un kļūdu plūsmas atsevišķi, un pēc tam uzskatiet atslēgu par noslēpumu.
Atslēgas ģenerēšanai nav nepieciešams pagaidu fails, un tā izlaišana salabo mazāk, nekā liek domāt lielākā daļa rokasgrāmatu. Ko tas noņem, ir faila dzīves cikls un tīrīšanas sacensība ap to. Ko tas atstāj neskartu, ir katra iespēja vēlāk noplūdināt noslēpumu. Šo skriptu pareizības problēma parasti atrodas citur, jo diagnostika un atslēgas materiāls ceļo pa dažādām plūsmām.
Fails nekad nebija tā atklātība, ko jūs domājāt
Pagaidu fails ir konkrēts risks, kad to var lasīt visi, kad tas pārdzīvo avāriju vai kad pēc izņēmuma tiek izlaists tīrīšanas solis. Tie ir reāli, un tos ir vērts labot. Tie ir arī lokāli, redzami un viegli pārbaudāmi. Nosauciet katru savā skriptā, pirms secināt, ka izmaiņa bija tikai kosmētiska.
Klusākie riski atrodas lejpus: atslēga, kas izdrukāta atkļūdošanas laikā, izņēmums, kas serializē visu rezultāta objektu, avārijas apstrādātājs, kas raksta atmiņas izgāztuvi, žurnālu apkopotājs, kas saņem faila ceļu un pēc tam saturu. Pagaidu faila izvairīšanās neko nedara ne vienam no tiem, un ticēt pretējam ir veids, kā labi domāta pārrakstīšana atstāj noslēpumu vairāk atklātu nekā iepriekš. Uzskatiet izmaiņu par vienu uzlabojumu virknē, nevis par risinājumu.
Ko klients raksta, kad faila nosaukums nav dots
Pašreizējās klienta versijas sūta ģenerēto atslēgu uz standarta izvadi, kad atslēgas komanda tiek dota bez izvades ceļa. Tieši šī dokumentētā uzvedība padara atmiņā balstīto pieeju dzīvotspējīgu, un tā novērš vajadzību pēc vecākā trika vērst rīku uz ierīces ceļu.
import subprocess
proc = subprocess.run(
["openvpn", "--genkey", "tls-crypt"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=True,
)
key_material = proc.stdout
Nododiet komandu kā sarakstu. Šeit nav nepieciešama čaulas paplašināšana, un čaulas iespējošana padarītu argumentu robežu atkarīgu no pēdiņām, ko jūs nekontrolējat. Izmantojiet paredzēto izpildāmo failu ar absolūtu ceļu, ja skripts var darboties ar citu meklēšanas ceļu, nekā gaidāt.
Atgriešanās koda pārbaude neļauj veiksmes ceļam turpināties pēc neveiksmīga izsaukuma. Bez tās tukša baitu virkne var plūst tālāk un neizdoties tikai daudz vēlāk, tajā punktā, kur atslēga tiek izmantota un kļūdas ziņojums vairs nemaz nemin ģenerēšanu.
Divas plūsmas, divas nozīmes
Standarta izvade nes atslēgu. Standarta kļūda nes visu, ko rīks vēlas jums pateikt, tostarp brīdinājumus par konfigurāciju, versiju un atslēgas veidu. Abu novirzīšana vienā buferī ir kļūda, kas rada ticami izskatīgu atslēgu ar ielāpītu teikumu tās vidū.
Turiet atsevišķi arī neveiksmes ceļu. Kad izsaukums neizdodas, ziņojiet par neveiksmīgo komandu un iziešanas statusu, un pēc tam apzināti izlemiet, vai kāda standarta kļūdas daļa ir droša rādīšanai. Visa rezultāta objekta izliešana žurnālā ir ierastais saīsinājums, un tas var aiznest atslēgu līdzi.
Bināri droša lasīšana ir svarīga, ja vēlāk jūs hešojat vai salīdzināt materiālu. Teksta režīms ar negaidītu kodējumu var mainīt baitus, kas nekad nebija domāti kā teksts, un mainīta atslēga nav atšķirama no nepareizas, līdz neizdodas rokas spiediens.
Ja tomēr to saglabājat, dariet to apzināti
Lielākajai daļai izvietojumu galu galā vajag atslēgu diskā, vārtejā vai noslēpumu krātuvē. Ierakstiet to vienreiz, ar ierobežojošām atļaujām no izveides, nevis vēlāku chmod, un padariet rakstīšanu atomisku, lai daļējs fails nekad nekļūtu par to, ko pakalpojums lasa startēšanas laikā. Pārdēvēšana no ceļa tajā pašā direktorijā tam parasti ir pietiekama. Noņemiet sagatavošanas ceļu neveiksmes atzarā, jo neveiksmīgā rakstīšana ir tieši tā kopija, ko cilvēki aizmirst.
Iestatiet faila režīmu, kad fails tiek izveidots, un turiet arī direktorijas režīmu ierobežojošu. Izvairieties no jebkura ceļa vietā, ko dublēšanas darbs noslauka bez domāšanas, jo noslēpums nakts dublējumā ir noslēpums katrā šī dublējuma kopijā. Tā pati loģika attiecas uz koplietotu sējumu, ko var lasīt citi pakalpojumi.
Koplietota atslēga nav identitāte
Šī materiāla ģenerēšana neizsniedz sertifikātu, nereģistrē klientu un nenosaka, kas pieslēdzas. Koplietotā atslēga aizsargā kanālu starp pusēm, kas jau uzticas viena otrai; identitāte joprojām nāk no sertifikāta un jebkuras autentifikācijas, kas stāv tā priekšā.
Arī atslēgu veidi nav savstarpēji aizstājami. Vienas funkcijas simetriskā atslēga nav gatavs aizstājējs citai, un jaunāki laidieni pievieno savus variantus ar atšķirīgiem failiem katrā galā. Ģenerējiet veidu, ko jūsu konfigurācija patiešām nosauc, un pēc tam izmantojiet to lomā, ko šis veids definē.
Pārbaudiet rezultātu ar īstu savienojumu, nevis apskatot faila lielumu. Ja rokas spiediens tiek pabeigts un žurnāli neuzrāda atslēgas brīdinājumus, ģenerēšanas ceļš ir pareizs; ja atslēga būtu nogriezta apvienotā plūsmā, savienojums neizdotos tā, ka norādītu uz otru pusi, nevis uz skriptu.