Klíče WireGuard na ESP32: pro každé zařízení, nebo jeden zabudovaný?
Klíč zkompilovaný do firmwaru ESP32 je identita protějšku, ne heslo. Rozhodněte podle tří podmínek: držení zařízení, ochrana flash a opakované použití v celé flotile.
Náčrt ukládá soukromý klíč WireGuardu do pole znaků a tunel funguje, proto se otázka stále vrací. Rozhodnutí, které skutečně musíte udělat, není „je to bezpečné“, ale „která ze tří podmínek platí pro toto nasazení“. Jsou to: kdo může zařízení fyzicky držet, co dá čtení flash u vaší součástky a zda flotila sdílí jeden klíč, nebo každá jednotka nese vlastní. Odpovězte na to a návrh vyplyne, protože každá podmínka mění cenu uniklého klíče, ne fakt, že uniknout může.
Co klíč opravňuje
WireGuard ověřuje protějšky veřejným klíčem. Server přiřazuje veřejnému klíči každého protějšku adresu a AllowedIPs seznam, takže právě soukromý klíč umožňuje klientovi odesílat provoz z této adresy.
Stejný záznam určuje, kterých cílů zařízení dosáhne, takže uniklý klíč odhalí síť za tunelem i adresu tunelu.
Podmínka první: kdo může zařízení držet
Pokud jednotka stojí v zamčené skříni a nikdo mimo váš tým na ni nesahá, je expozice hlavně otázkou distribuce firmwaru. Pokud se posílá zákazníkům, stojí ve vozidle nebo se vrací v záruce, je fyzické držení pověřením a utajení binárky druhotné. Kdo zařízení drží v ruce, nemusí klíč číst, protože běžící firmware mu tunel otevře. Proto musí odpověď na straně serveru obsahovat odvolání a omezenou životnost, ne jen chráněný obraz.
Tuto podmínku rozhodněte dřív než zbylé dvě, protože určuje rozpočet pro obě.
Podmínka druhá: co dá čtení flash
Kdo dokáže přečíst obraz flash, získá zpět klíč uložený jako literál, ať už přes ladicí spojení, aktualizační soubor, zálohu nebo vrácenou jednotku. Šifrování flash zvyšuje cenu přímého dumpu a dokumentace ESP-IDF popisuje, co funkce pro danou součástku a konfiguraci pokrývá. Nedělá klíč nevyextrahovatelný při každém modelu útoku a pro případ zařízení v ruce nedělá nic. Berte ho jako jednu vrstvu, která mění cenu, ne jako odpověď.
Přečtěte si dokumentaci platformy pro svůj přesný čip a konfiguraci, než v recenzi návrhu tvrdíte nějakou vlastnost.
Podmínka třetí: opakované použití v celé flotile
Jeden klíč na výrobní sérii znamená, že každá jednotka sdílí jednu identitu. Server je v protokolech nerozliší, nemůže odvolat jeden, aniž by odvolal všechny, a nerozliší klon od originálu. Klíče pro každé zařízení řeší všechny tři, za cenu kroku registrace a mapování sériového čísla na veřejný klíč. Právě to mapování je aktivum, které mění odvolání v jednořádkovou změnu místo přeflashování celé flotily.
Je-li flotila pět jednotek na stole, může být sdílení klíče rozumná výměna. Je-li to pět set v terénu, není to výměna vůbec.
Vzor registrace, který dělá klíče pro zařízení praktickými
Vygenerujte pár klíčů v zařízení při prvním startu, soukromou polovinu držte v chráněném energeticky nezávislém úložišti a posílejte jen veřejný klíč do registrační služby, která přidělí adresu a zapíše záznam protějšku. Ověřujte odpověď registrace, jinak si útočník v místní síti zaregistruje vlastní klíč na váš účet. Nikdy netiskněte soukromý klíč na sériovou konzoli při zprovozňování. Zapište sériové číslo zařízení vedle veřejného klíče, aby ztracená jednotka odpovídala právě jednomu záznamu protějšku.
Je to malá služba a je to rozdíl mezi flotilou, kterou můžete auditovat, a flotilou, kterou můžete jen přeflashovat.
Čas, koncové body a rozhodnutí
Příklad synchronizuje čas před spuštěním tunelu a to je důležité i mimo TLS: handshake WireGuardu nese časové razítko pro ochranu proti opakování, takže zařízení startující se špatnými hodinami může mít handshaky odmítnuté. Koncový bod je název hostitele, což staví DNS do cesty důvěry, i když veřejný klíč serveru protějšek pořád ověřuje. Špatná adresa plýtvá pokusy a prozradí, kdy je zařízení online. Vyřešte obojí, než se budete hádat o klíči.
Pak rozhodněte: sdílený klíč jen dokud je držení pod kontrolou a flotila malá, klíče pro zařízení hned, jak přestane platit jedno z toho.