A Go standard cryptographic library FIPS 140-2 és FIPS 140-3 megvalósítási szerkezete

FIPS 140 (Federal Information Processing Standard Publication 140)
A FIPS 140 az Egyesült Államok NIST által kidolgozott kriptográfiai modulok biztonsági tanúsítási szabvány. Ez a szabvány értékeli, hogy egy adott kriptográfiai modul vagy könyvtár megfelel-e a NIST által meghatározott biztonsági követelményeknek. Ezért a FIPS 140 tanúsítvány megszerzése azt jelenti, hogy az adott modul hivatalosan megbízható biztonsággal rendelkezik, és olyan területeken, mint a pénzügy, az egészségügy vagy a honvédelem, ahol a biztonság kiemelten fontos, használható.
A FIPS 140 1994-es első megjelenése óta 2001-ben FIPS 140-2 néven, 2019-ben pedig FIPS 140-3 néven került felülvizsgálatra. A mai napig számos rendszer és alkalmazás követeli meg a FIPS 140-2 vagy a FIPS 140-3 tanúsítványt.
A FIPS 140 és a programozási nyelvek
Ennek okán a FIPS 140 tanúsítvánnyal rendelkező kriptográfiai modulokat számos programozási nyelv és környezet de facto szabványként használja. Ilyen többek között az OpenSSL, a BoringSSL, a LibreSSL és az NSS, amelyek a biztonság szempontjából kritikus alkalmazásokban a leggyakrabban használt modulok.
A legtöbb FIPS 140 tanúsított modul C vagy C++ nyelven készült. Emiatt a PHP, a Python, a JavaScript és más nyelvek ezeket a modulokat általában nem közvetlenül használják, hanem külső Provider modulokon keresztül kapcsolódva alakítják ki a FIPS környezetet. Ennek a megközelítésnek azonban több korlátja van.
Verzióeltérési probléma
A FIPS 140 tanúsítás csak meghatározott verziókra vonatkozik. Ezért a modul újabb verziójának használatához újra el kell végezni a tanúsítási eljárást, és ez során előfordulhat, hogy az alkalmazás által használt modul és a FIPS-tanúsított modul verziója eltér egymástól. Ha nem engedélyezett verziót használnak, a környezet már nem tekinthető FIPS-tanúsított környezetnek.
Dinamikus betöltés és teljesítménycsökkenés
A legtöbb nyelv a FIPS 140 tanúsított modulokat dinamikus könyvtár formájában tölti be és használja. Ez a módszer teljesítménycsökkenést okozhat az inicializálás és a végrehajtás során, továbbá futásidejű hiba esetén közvetlenül befolyásolhatja az alkalmazás egészének stabilitását.
Biztonsági sebezhetőségek
Ahogy fentebb említettük, olyan architektúrákban, mint az OpenSSL Provider, ahol külső modult kapcsolnak be, fennáll annak a veszélye, hogy a modul biztonsági sebezhetőségei közvetlenül átterjednek az alkalmazásra. Emellett maga az alkalmazás és a külső modul közötti kommunikációs réteg is újabb támadási felületet jelent, amelynek védelméhez külön biztonsági réteg szükséges. Ez növeli a komplexitást, és váratlan sebezhetőségekhez vezethet.
A FIPS 140 és a Golang
Ennek okán a Golang más stratégiát követett. A Go nem külső eszközökre támaszkodva biztosítja a FIPS 140 megfelelést, hanem úgy döntött, hogy azt a hivatalos kriptográfiai könyvtárából közvetlenül támogatja. Ennek következtében a fejlesztőnek nem kell külön Providert telepítenie vagy konfigurálnia: a standard crypto csomagot használhatja változatlanul, és elegendő a FIPS tanúsítási mód (GOFIPS=1) engedélyezése. Ebben a folyamatban megszűnik a külső modulokkal való kommunikációs határ, ami erősíti a biztonságot, és mivel csak egy statikusan fordított, önálló bináris fájlt kell terjeszteni, az üzemeltetés is egyszerűbbé válik.
A FIPS 140-2 és a Golang
Ennek érdekében a Golang a BoringSSL-ből származó BoringCrypto modult építette be a Go futtatókörnyezetbe, így megszerezte a FIPS 140-2 tanúsítványt. A BoringCrypto a Go 1.19 verziótól kezdve bizonyos disztribúciókban engedélyezhető, és ennek segítségével a Go alkalmazások külön külső modul nélkül is kialakíthatnak FIPS 140-2 tanúsított környezetet.
A BoringCrypto azonban OpenSSL alapú, ezért továbbra is függ a C nyelvtől. Emiatt a Go alkalmazások nem épülnek teljesen önálló bináris fájlba, és a szükséges C könyvtárakat együtt kell terjeszteni, ami korlátot jelentett.
A FIPS 140-3 és a Golang
A Go csapata e korlátok leküzdésére a meglévő Go standard crypto könyvtárat a FIPS 140-3 szabványnak megfelelően fejlesztette tovább. Ez a továbbfejlesztett modul a Go 1.21 verziótól kezdve kísérleti jelleggel érhető el, és jelenleg is folyamatban van a NIST FIPS 140-3 tanúsítási vizsgálata.NIST FIPS 140-3 vizsgálat alatt álló modulok listája
Ez a Go kriptográfiai könyvtárának érettségét mutatja, és ennek révén a Go már teljesen önálló, egyetlen bináris fájlként is képes FIPS 140-3 tanúsított környezetet biztosítani.
Emellett a Go csapata nem csupán a FIPS 140-3 szabvány teljesítésére szorítkozott, hanem saját eszközökkel is megerősítette a biztonságot.
Fail Fast
A Go FIPS módja a Fail Fast biztonsági modellt alkalmazza: nem tanúsított algoritmus hívásakor panic hibával azonnal megszakítja a végrehajtást. Ez szemben áll azzal, hogy más nyelvek Provider-alapú modelljei fallback lehetőséget hagynak, és így a biztonság és a jogszabályi megfelelés szempontjából szigorúbb és egyértelműbb garanciát nyújt.
Hedged Signature
A FIPS 140-3 szabvány ECDSA aláírásnál az RFC6979 módszer alkalmazását javasolja. A Go ezen felül bevezette a Hedged módszert, amely erősebben védekezik az aláírási folyamat során előforduló oldalcsatornás támadások ellen.
Megerősített véletlenszám-generátor
A Go véletlenszám-generátora felhasználói térben DRBG (Deterministic Random Bit Generator) algoritmust használ, ugyanakkor az operációs rendszer kernelétől további entrópiát von be, így nemcsak a felhasználói térben, hanem a kerneltérben is magas minőségű véletlen számokat állít elő. Ezáltal a véletlenszám-generátor biztonsága tovább erősödik.