Generovanie kľúča nepotrebuje dočasný súbor a jeho vynechanie opraví menej, než naznačuje väčšina návodov. Čo odstraňuje, je životný cyklus súboru a preteky s upratovaním okolo neho. Čo necháva nedotknuté, je každá príležitosť tajomstvo neskôr vyzradiť. Problém správnosti v týchto skriptoch zvyčajne sedí inde, pretože diagnostika a kľúčový materiál cestujú rôznymi tokmi.

Súbor nikdy nebol tým vystavením, ktoré ste si mysleli

Dočasný súbor je konkrétne riziko, keď je čitateľný pre všetkých, keď prežije pád alebo keď sa po výnimke preskočí krok upratovania. To je skutočné a stojí za opravu. Sú tiež lokálne, viditeľné a ľahko testovateľné. Pomenujte každý z nich vo vlastnom skripte, než usúdite, že zmena bola kozmetická.

Tichšie riziká sedia nižšie po prúde: kľúč vytlačený pri ladení, výnimka, ktorá serializuje celý objekt výsledku, obsluha pádu, ktorá zapisuje výpis pamäte, agregátor logov, ktorý dostane cestu k súboru a potom obsah. Vyhýbanie sa dočasnému súboru nič nerobí pre žiadne z nich, a viera v opak je spôsob, akým dobre mienený prepis necháva tajomstvo vystavenejšie než predtým. Berte zmenu ako jedno zlepšenie v rade, nie ako opravu.

Čo klient zapíše, keď nie je zadaný názov súboru

Súčasné verzie klienta posielajú vygenerovaný kľúč na štandardný výstup, keď je príkaz pre kľúč zadaný bez výstupnej cesty. Práve toto zdokumentované správanie robí prístup v pamäti životaschopným a odstraňuje potrebu staršieho triku mieriť nástrojom na cestu zariadenia.

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

Odovzdajte príkaz ako zoznam. Nie je tu potrebné rozbalenie shellom a zapnutie shellu by urobilo hranicu argumentov závislou od úvodzoviek, ktoré nekontrolujete. Použite zamýšľaný spustiteľný súbor absolútnou cestou, ak skript môže bežať s inou cestou hľadania, než očakávate.

Kontrola návratového kódu bráni tomu, aby cesta úspechu pokračovala po neúspešnom volaní. Bez nej môže prázdny bajtový reťazec prúdiť ďalej a zlyhať až oveľa neskôr, v bode, kde sa kľúč používa a chybová správa už vôbec nespomína generovanie.

Dva toky, dva významy

Štandardný výstup nesie kľúč. Štandardná chyba nesie všetko, čo vám nástroj chce povedať, vrátane varovaní o konfigurácii, verzii a type kľúča. Presmerovanie oboch do jedného buffera je chyba, ktorá vytvorí vierohodne vyzerajúci kľúč s vetou prišitou v strede.

Držte oddelene aj cestu zlyhania. Keď volanie zlyhá, nahláste príkaz, ktorý zlyhal, a stav ukončenia, a potom vedome rozhodnite, či je niektorá časť štandardnej chyby bezpečná na zobrazenie. Vysypanie celého objektu výsledku do logu je obvyklá skratka a môže so sebou odniesť kľúč.

Čítanie bezpečné pre binárne dáta je dôležité, ak materiál neskôr hashujete alebo porovnávate. Textový režim s neočakávaným kódovaním môže zmeniť bajty, ktoré nikdy nemali byť textom, a zmenený kľúč je na nerozoznanie od nesprávneho, kým nezlyhá handshake.

Ak ho predsa uložíte, urobte to vedome

Väčšina nasadení nakoniec potrebuje kľúč na disku, na bráne alebo v úložisku tajomstiev. Zapíšte ho raz, s obmedzujúcimi právami od vytvorenia, nie neskorším chmod, a zápis urobte atomickým, aby sa čiastočný súbor nikdy nestal tým, ktorý služba číta pri štarte. Premenovanie z cesty v tom istom adresári na to zvyčajne stačí. Odstráňte prípravnú cestu na vetve zlyhania, pretože neúspešný zápis je presne tá kópia, na ktorú ľudia zabúdajú.

Nastavte režim súboru pri vytvorení a režim adresára držte tiež obmedzujúci. Vyhnite sa akejkoľvek ceste pod miestom, ktoré úloha zálohovania zmetie bez premýšľania, pretože tajomstvo v nočnej zálohe je tajomstvo v každej kópii tej zálohy. Rovnaká úvaha platí pre zdieľaný zväzok, ktorý môžu čítať iné služby.

Zdieľaný kľúč nie je identita

Generovanie tohto materiálu nevydáva certifikát, nezapisuje klienta a neurčuje, kto sa pripája. Zdieľaný kľúč chráni kanál medzi stranami, ktoré si už navzájom dôverujú; identita stále pochádza z certifikátu a z akejkoľvek autentifikácie, ktorá stojí pred ním.

Typy kľúčov tiež nie sú zameniteľné. Symetrický kľúč pre jednu funkciu nie je hotovou náhradou za inú a novšie vydania pridávajú svoje varianty s rôznymi súbormi na každom konci. Generujte typ, ktorý vaša konfigurácia skutočne pomenúva, a potom ho použite v role, ktorú tento typ definuje.

Otestujte výsledok skutočným pripojením, nie pohľadom na veľkosť súboru. Ak handshake prebehne a logy neukážu varovania o kľúči, cesta generovania je správna; keby bol kľúč skrátený zlúčeným tokom, pripojenie by zlyhalo spôsobom, ktorý ukazuje na protistranu, nie na skript.

Súvisiace články