GoSuda

FIPS 140 tanúsítás és Golang

By Gosunuts
views ...

FIPS 140 (Federal Information Processing Standard Publication 140)

A FIPS 140 az Egyesült Államok NIST intézete által meghatározott kriptográfiai modul biztonsági tanúsítási szabvány. Ez a szabvány azt értékeli, hogy egy adott kriptográfiai modul vagy könyvtár megfelel-e a NIST által meghatározott biztonsági követelményeknek. Ebből adódóan, ha egy modul átmegy a FIPS 140 tanúsításon, az azt jelenti, hogy az adott modul hivatalosan megbízható biztonsággal rendelkezik, és felhasználható olyan, biztonságkritikus területeken, mint a pénzügy, az egészségügy vagy a honvédelem.

A FIPS 140-et 1994-ben hozták létre először, majd 2001-ben FIPS 140-2-re, 2019-ben pedig FIPS 140-3-ra módosították. A mai napig számos rendszer és alkalmazás megköveteli a FIPS 140-2 vagy FIPS 140-3 tanúsítványt.

FIPS 140 és programozási nyelvek

Ezen okokból a FIPS 140 tanúsítvánnyal rendelkező kriptográfiai modulokat számos programozási nyelvben és környezetben de facto szabványként használják. Ilyenek például az OpenSSL, BoringSSL, LibreSSL és NSS, amelyek a leggyakrabban használt modulok a biztonságkritikus alkalmazásokban.

A legtöbb FIPS 140 tanúsított modul C vagy C++ nyelven íródott. Emiatt az olyan nyelvek, mint a PHP, Python, Javascript, a FIPS környezetet nem közvetlenül ezeknek a moduloknak a használatával, hanem külső Provider modulokon keresztül történő integrációval hozzák létre. Azonban ennek a megközelítésnek van néhány korlátja.

  • Verzióinkompatibilitási probléma

    A FIPS 140 tanúsítványt csak bizonyos verziókra adják ki. Ezért a modulok legújabb verzióinak használatához új tanúsítási folyamaton kell keresztülmenni, és ez a folyamat verzióinkompatibilitást okozhat az alkalmazás által használt modul és a FIPS tanúsított modul között. Ha egy nem engedélyezett verziót használnak, az adott környezet többé nem minősül FIPS tanúsított környezetnek.

  • Dinamikus betöltés és teljesítményromlás

    A legtöbb nyelv a FIPS 140 tanúsított modulokat dinamikus könyvtárak formájában tölti be és használja. Ez a módszer teljesítményromlást okozhat az inicializálás és a végrehajtás során, és fennáll a kockázata, hogy futásidejű problémák esetén közvetlenül befolyásolja az alkalmazás általános stabilitását.

  • Biztonsági rések

    Ahogy fentebb említettük, egy olyan struktúrában, amely külső modulokat, például az OpenSSL Provider-t integrálja, fennáll a veszélye, hogy az adott modul biztonsági rései közvetlenül átterjednek az alkalmazásra. Emellett az alkalmazás és a külső modul közötti kommunikációs réteg önmagában is további támadási felületet jelent, és ennek védelméhez külön biztonsági rétegre van szükség. Ez növeli a komplexitást, és váratlan biztonsági réseket eredményezhet.

FIPS 140 és Golang

Ezen okokból a Golang más stratégiát alkalmazott. A Go nem külső eszközökre támaszkodik a FIPS 140 tanúsításhoz, hanem az official kriptográfiai könyvtárban közvetlenül támogatja azt. Ennek eredményeként a fejlesztőknek nem kell külön Provider-t telepíteniük vagy konfigurálniuk, hanem egyszerűen aktiválniuk kell a FIPS tanúsított módot (GOFIPS=1) a standard crypto csomag használata mellett. Ez a folyamat megszünteti a külső modulokkal való kommunikációs határokat, növelve a biztonságot, és egyszerűsíti az üzemeltetést, mivel csak egy statikusan fordított binárist kell telepíteni.

FIPS 140-2 és Golang

Ennek érdekében a Golang a BoringSSL-ből származó BoringCrypto modult beépítette a Go runtime-ba, és ezzel megszerezte a FIPS 140-2 tanúsítványt. A BoringCrypto a Go 1.19-es verziója óta bizonyos disztribúciókban aktiválható, és lehetővé teszi a Go alkalmazások számára, hogy külső modulok nélkül is FIPS 140-2 tanúsított környezetet hozzanak létre.

Azonban a BoringCrypto OpenSSL alapú, így továbbra is van C nyelvi függősége. Emiatt a Go alkalmazások nem teljesen független binárisként épülnek fel, és korlátozás volt, hogy a szükséges C könyvtárakat együtt kell terjeszteni.

FIPS 140-3 és Golang

A Go csapat ezen korlátok leküzdése érdekében a meglévő Go standard crypto könyvtárat a FIPS 140-3 specifikációhoz igazította. Ez a továbbfejlesztett modul a Go 1.21-es verziójától kezdve kísérleti jelleggel elérhetővé vált, és jelenleg is folyik a NIST FIPS 140-3 tanúsítási felülvizsgálata.A NIST FIPS 140-3 felülvizsgálat alatt álló moduljainak listája

Ez a Go kriptográfiai könyvtár érettségét mutatja, és lehetővé tette a Go számára, hogy teljesen független, önálló binárisként biztosítson FIPS 140-3 tanúsított környezetet.

Emellett a Go csapat nem elégedett meg csupán a FIPS 140-3 szabvány teljesítésével, hanem saját maga is megerősítette a biztonságot.

  • Fail Fast

    A Go FIPS módja a Fail Fast biztonsági modellt alkalmazza, amely szerint az engedélyezetlen algoritmusok meghívása esetén azonnal leállítja a végrehajtást egy panic-kal. Ez, ellentétben más nyelvek Provider alapú modelljeivel, amelyek fallback lehetőséget hagynak, szigorúbb és egyértelműbb garanciát nyújt a biztonság és a szabályozási megfelelés szempontjából.

  • Hedged Signature

    A FIPS 140-3 szabvány az ECDSA aláírásokhoz az RFC6979 módszert ajánlja. A Go azonban ezen felül a Hedged módszert is bevezette, hogy erősebben ellenálljon az aláírási folyamat során előforduló oldalcsatornás támadásoknak.

  • Megerősített véletlenszám-generátor

    A Go véletlenszám-generátora felhasználói térbeli DRBG-t (Deterministic Random Bit Generator) használ, miközben további entrópiát injektál az operációs rendszer kernelébe, így nemcsak a felhasználói térben, hanem a kernel térben is magas minőségű véletlenszámokat generál. Ezáltal tovább erősíti a véletlenszám-generátor biztonságát.