Generisanje ključa ne zahtijeva privremenu datoteku, a preskakanje iste popravlja manje nego što većina vodiča implicira. Ono što uklanja jeste životni ciklus datoteke i trka čišćenja oko nje. Ono što ostavlja netaknutim jeste svaka prilika da tajna kasnije iscuri. Problem ispravnosti u ovim skriptama obično sjedi negdje drugdje, jer dijagnostika i ključni materijal putuju različitim tokovima.

Datoteka nikada nije bila izloženost koju ste mislili

Privremena datoteka je konkretan rizik kada je čitljiva svima, kada preživi pad ili kada se korak čišćenja preskoči nakon izuzetka. To je stvarno i vrijedi popraviti. Oni su i lokalni, vidljivi i laki za testiranje. Navedite svaki u vlastitoj skripti prije nego zaključite da je promjena bila kozmetička.

Tiši rizici sjede nizvodno: ključ odštampan tokom otklanjanja grešaka, izuzetak koji serijalizuje cijeli objekat rezultata, rukovalac padom koji piše dump memorije, agregator zapisa koji prima putanju datoteke i zatim sadržaj. Izbjegavanje privremene datoteke ne čini ništa ni za jedan od njih, a vjerovanje u suprotno je način na koji dobronamjerno prepisivanje ostavlja tajnu izloženijom nego prije. Tretirajte promjenu kao jedno poboljšanje u nizu, a ne kao rješenje.

Šta klijent piše kada nije dato ime datoteke

Trenutne verzije klijenta šalju generisani ključ na standardni izlaz kada se komanda za ključ zada bez izlazne putanje. Upravo to dokumentovano ponašanje čini pristup u memoriji održivim i uklanja potrebu za starijim trikom usmjeravanja alata na putanju uređaja.

import subprocess
proc = subprocess.run(
    ["openvpn", "--genkey", "tls-crypt"],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    check=True,
)
key_material = proc.stdout

Proslijedite komandu kao listu. Ovdje nije potrebno širenje školjke, a omogućavanje školjke učinilo bi granicu argumenata zavisnom od navodnika koje ne kontrolišete. Koristite namijenjenu izvršnu datoteku po apsolutnoj putanji ako skripta može raditi s drugom putanjom pretrage nego što očekujete.

Provjera povratnog koda sprječava da se putanja uspjeha nastavi nakon neuspjelog poziva. Bez nje, prazan niz bajtova može teći dalje i pasti tek mnogo kasnije, u tački gdje se ključ koristi i gdje poruka o grešci više uopće ne spominje generisanje.

Dva toka, dva značenja

Standardni izlaz nosi ključ. Standardna greška nosi sve što vam alat želi reći, uključujući upozorenja o konfiguraciji, verziji i tipu ključa. Preusmjeravanje obojega u jedan bafer je greška koja proizvodi uvjerljivo izgledajući ključ s rečenicom ušivenom u sredinu.

Držite i putanju neuspjeha odvojeno. Kada poziv ne uspije, prijavite komandu koja nije uspjela i izlazni status, a zatim svjesno odlučite da li je bilo koji dio standardne greške siguran za prikaz. Izbacivanje cijelog objekta rezultata u zapis uobičajen je prečac i može ponijeti ključ sa sobom.

Čitanje sigurno za binarne podatke važno je ako materijal kasnije heširate ili upoređujete. Tekstualni režim s neočekivanim kodiranjem može promijeniti bajtove koji nikada nisu bili namijenjeni da budu tekst, a promijenjeni ključ se ne razlikuje od pogrešnog sve dok rukovanje ne padne.

Ako ga ipak sačuvate, učinite to svjesno

Većina implementacija na kraju treba ključ na disku, na mrežnom prolazu ili u skladištu tajni. Zapišite ga jednom, s restriktivnim dozvolama od stvaranja, a ne kasnijim chmod-om, i učinite upis atomskim tako da djelimična datoteka nikada ne postane ona koju servis čita pri pokretanju. Preimenovanje s putanje u istom direktoriju obično je dovoljno za to. Uklonite pripremnu putanju na grani neuspjeha, jer je neuspjeli upis upravo kopija koju ljudi zaborave.

Postavite režim datoteke kada se datoteka stvara, i držite režim direktorija također restriktivnim. Izbjegavajte bilo koju putanju ispod lokacije koju posao sigurnosne kopije pomete bez razmišljanja, jer je tajna u noćnoj sigurnosnoj kopiji tajna u svakoj kopiji te sigurnosne kopije. Isto razmišljanje vrijedi za dijeljeni volumen koji drugi servisi mogu čitati.

Dijeljeni ključ nije identitet

Generisanje ovog materijala ne izdaje certifikat, ne upisuje klijenta i ne utvrđuje ko se povezuje. Dijeljeni ključ štiti kanal između strana koje se već uzajamno vjeruju; identitet i dalje dolazi od certifikata i bilo koje autentifikacije koja stoji ispred njega.

Tipovi ključeva također nisu zamjenjivi. Simetrični ključ za jednu funkciju nije gotova zamjena za drugu, a novija izdanja dodaju svoje varijante s različitim datotekama na svakom kraju. Generišite tip koji vaša konfiguracija zaista imenuje, a zatim ga koristite u ulozi koju taj tip definiše.

Testirajte rezultat pravom vezom, a ne pregledanjem veličine datoteke. Ako rukovanje završi i zapisi ne pokažu upozorenja o ključu, putanja generisanja je ispravna; da je ključ bio odsječen spojenim tokom, veza bi pala na način koji upućuje na drugu stranu, a ne na skriptu.

Povezani članci