FIPS 140 Certifikácia a Golang
FIPS 140 ( Federal Information Processing Standard Publication 140 )
FIPS 140 je štandard pre certifikáciu bezpečnosti kryptografických modulov, zavedený americkým NIST. Tento štandard hodnotí, či konkrétny kryptografický modul alebo knižnica spĺňa bezpečnostné požiadavky definované NIST. Preto certifikácia FIPS 140 znamená, že príslušný modul má oficiálne dôveryhodnú bezpečnosť a môže byť použitý v oblastiach, kde je bezpečnosť kritická, ako sú financie, zdravotníctvo a obrana.
FIPS 140 bol pôvodne zavedený v roku 1994, následne bol revidovaný na FIPS 140-2 v roku 2001 a na FIPS 140-3 v roku 2019. Dodnes mnohé systémy a aplikácie vyžadujú certifikáciu FIPS 140-2 alebo FIPS 140-3.
FIPS 140 a programovacie jazyky
Z tohto dôvodu sa kryptografické moduly s certifikáciou FIPS 140 používajú ako de facto štandard v rôznych programovacích jazykoch a prostrediach. Medzi typické príklady patria OpenSSL, BoringSSL, LibreSSL, NSS, ktoré sú najpoužívanejšími modulmi v bezpečnostne kritických aplikáciách.
Väčšina modulov certifikovaných podľa FIPS 140 je napísaná v jazyku C alebo C++. Z tohto dôvodu jazyky ako PHP, Python, Javascript konfigurujú prostredie FIPS tak, že namiesto priameho použitia týchto modulov ich integrujú prostredníctvom externých modulov Provider. Tento prístup však má niekoľko obmedzení.
Problém nekompatibility verzií
Certifikácia FIPS 140 sa udeľuje iba pre konkrétnu verziu. Preto, ak sa má použiť najnovšia verzia modulu, je potrebné prejsť opätovným certifikačným procesom, čo môže viesť k nekompatibilite verzií medzi modulom používaným aplikáciou a modulom certifikovaným FIPS. Ak sa použije neautorizovaná verzia, dané prostredie sa už nepovažuje za prostredie certifikované FIPS.
Dynamické načítanie a zníženie výkonu
Väčšina jazykov načíta moduly certifikované FIPS 140 ako dynamické knižnice. Tento prístup môže spôsobiť zníženie výkonu počas inicializácie a vykonávania a v prípade problémov počas behu existuje riziko priameho ovplyvnenia celkovej stability aplikácie.
Bezpečnostné zraniteľnosti
Ako už bolo spomenuté, v štruktúre, ktorá integruje externé moduly, ako je OpenSSL Provider, existuje riziko priameho šírenia bezpečnostných zraniteľností daného modulu do aplikácie. Okrem toho, samotná komunikačná vrstva medzi aplikáciou a externým modulom sa stáva ďalšou útočnou plochou, čo si vyžaduje samostatnú bezpečnostnú vrstvu na jej ochranu. To zvyšuje komplexnosť a môže viesť k neočakávaným zraniteľnostiam.
FIPS 140 a Golang
Z týchto dôvodov zvolil Golang inú stratégiu. Go sa nespolieha na externé nástroje pre certifikáciu FIPS 140, ale zvolil prístup priamej podpory v oficiálnej kryptografickej knižnici. Preto vývojári nemusia inštalovať ani konfigurovať samostatný Provider; stačí aktivovať režim certifikácie FIPS (GOFIPS=1) pri použití štandardného balíka crypto. V tomto procese sa eliminuje komunikačná hranica s externými modulmi, čím sa zvyšuje bezpečnosť, a prevádzka sa zjednodušuje, pretože je potrebné distribuovať iba jeden staticky skompilovaný binárny súbor.
FIPS 140-2 a Golang
Pre tento účel Golang získal certifikáciu FIPS 140-2 tým, že do Go runtime integroval modul BoringCrypto, ktorý je odvodený od BoringSSL. BoringCrypto je možné aktivovať v špecifických distribúciách po verzii Go 1.19, čo umožňuje Go aplikáciám konfigurovať prostredie certifikované FIPS 140-2 bez potreby externých modulov.
Avšak, keďže BoringCrypto je založené na OpenSSL, stále existuje závislosť na jazyku C. Preto Go aplikácie neboli zostavované ako úplne nezávislé binárne súbory a existovalo obmedzenie, že potrebné knižnice C museli byť distribuované spolu s nimi.
FIPS 140-3 a Golang
Tím Go na prekonanie týchto obmedzení vylepšil existujúcu štandardnú kryptografickú knižnicu Go tak, aby vyhovovala špecifikácii FIPS 140-3. Tento vylepšený modul je experimentálne dostupný od verzie Go 1.21 a v súčasnosti prebieha certifikačné hodnotenie NIST FIPS 140-3.Zoznam modulov v procese hodnotenia NIST FIPS 140-3
To demonštruje zrelosť kryptografickej knižnice Go a umožňuje Go poskytovať prostredie certifikované FIPS 140-3 ako úplne nezávislý samostatný binárny súbor.
Okrem toho, tím Go nielen splnil štandard FIPS 140-3, ale aj posilnil vlastnú bezpečnosť.
Fail Fast
Režim FIPS v Go implementuje bezpečnostný model Fail Fast, ktorý okamžite zastaví vykonávanie s panic pri volaní neautorizovaného algoritmu. Na rozdiel od modelov založených na Provider v iných jazykoch, ktoré ponechávajú možnosť fallbacku, tento prístup poskytuje prísnejšie a jasnejšie záruky z hľadiska bezpečnosti a súladu s predpismi.
Hedged Signature
Štandard FIPS 140-3 odporúča metódu RFC6979 pre podpis ECDSA. Go však okrem toho zavádza aj metódu Hedged, čím poskytuje silnejšiu ochranu proti útokom bočného kanála, ktoré sa môžu vyskytnúť počas procesu podpisu.
Vylepšený generátor náhodných čísel
Generátor náhodných čísel v Go používa DRBG (Deterministic Random Bit Generator) v používateľskom priestore, pričom dodatočne vkladá entropiu do jadra operačného systému, čím generuje vysokokvalitné náhodné čísla nielen v používateľskom priestore, ale aj v priestore jadra. Tým sa ďalej zvyšuje bezpečnosť generátora náhodných čísel.