FIPS 140 인증과 Golang
FIPS 140 (Federal Information Processing Standard Publication 140)
FIPS 140 е стандарт за сертификация на сигурността на криптографски модули, установен от NIST на САЩ. Този стандарт оценява дали даден криптографски модул или библиотека отговаря на изискванията за сигурност, определени от NIST. Следователно, преминаването на FIPS 140 сертификация означава, че съответният модул притежава официално надеждна сигурност и може да бъде използван във важни за сигурността области като финанси, здравеопазване и отбрана.
FIPS 140 е създаден за първи път през 1994 г., след което е ревизиран до FIPS 140-2 през 2001 г. и до FIPS 140-3 през 2019 г. Досега много системи и приложения все още изискват FIPS 140-2 или FIPS 140-3 сертификация.
FIPS 140 и езици за програмиране
Поради тази причина, криптографските модули, сертифицирани по FIPS 140, се използват като de facto стандарт в различни езици за програмиране и среди. Типични примери включват OpenSSL, BoringSSL, LibreSSL, NSS и други, които са най-широко използваните модули в критични за сигурността приложения.
Повечето FIPS 140 сертифицирани модули са написани на C или C++. Поради това, езици като PHP, Python, Javascript конфигурират FIPS среда чрез свързване с външни Provider модули, вместо да използват тези модули директно. Въпреки това, този подход има няколко ограничения.
Проблем с несъответствие на версиите
FIPS 140 сертификацията се дава само за конкретна версия. Следователно, за да се използва най-новата версия на модула, е необходимо да се премине отново през процеса на сертификация, като през този процес може да възникне несъответствие на версиите между модула, използван от приложението, и FIPS сертифицирания модул. Ако се използва несертифицирана версия, съответната среда вече не се счита за FIPS сертифицирана.
Динамично зареждане и намалена производителност
Повечето езици зареждат FIPS 140 сертифицирани модули като динамични библиотеки. Този метод може да доведе до намаляване на производителността по време на инициализация и изпълнение, и съществува риск от пряко въздействие върху общата стабилност на приложението, ако възникне проблем по време на изпълнение.
Уязвимости в сигурността
Както бе споменато по-горе, в структурата, която свързва външни модули като OpenSSL Provider, съществува риск уязвимостите в сигурността на тези модули да се разпространят директно към приложението. Освен това, комуникационният слой между приложението и външния модул сам по себе си се превръща в допълнителна атакуема повърхност, и е необходим отделен слой за сигурност, за да се защити. Това увеличава сложността и може да доведе до неочаквани уязвимости.
FIPS 140 и Golang
Поради тези причини Golang възприема различна стратегия. Go не разчита на външни инструменти за FIPS 140 сертификация, а избира директна поддръжка в официалната криптографска библиотека. Следователно, разработчиците не трябва да инсталират или конфигурират отделен Provider, а просто да активират FIPS режим (GOFIPS=1), докато използват стандартния crypto пакет. В този процес се премахва комуникационната граница с външни модули, което повишава сигурността, а операциите се опростяват, тъй като е необходимо да се разпространява само един статично компилиран двоичен файл.
FIPS 140-2 и Golang
За тази цел Golang вгради BoringCrypto модул, произлязъл от BoringSSL, в Go runtime и получи FIPS 140-2 сертификация. BoringCrypto може да бъде активиран в определени дистрибуции след Go 1.19, което позволява на Go приложенията да конфигурират FIPS 140-2 сертифицирана среда без отделни външни модули.
Въпреки това, тъй като BoringCrypto е базиран на OpenSSL, все още съществува зависимост от езика C. Следователно, Go приложенията не се компилират като напълно независими двоични файлове, и съществуваше ограничението да се разпространяват необходимите C библиотеки заедно с тях.
FIPS 140-3 и Golang
Екипът на Go преодоля тези ограничения, като подобри съществуващата стандартна Go crypto библиотека, за да отговаря на спецификациите на FIPS 140-3. Този подобрен модул започна да се предлага експериментално от Go 1.21, и в момента тече процес на FIPS 140-3 сертификация от NIST.Списък на модули, които се разглеждат за FIPS 140-3 от NIST
Това демонстрира зрелостта на Go криптографската библиотека, и чрез нея Go успя да предостави FIPS 140-3 сертифицирана среда като напълно независим единичен двоичен файл.
Освен това, екипът на Go не само отговаря на стандарта FIPS 140-3, но и самостоятелно подобрява сигурността.
Fail Fast
FIPS режимът на Go прилага модела за сигурност Fail Fast, който незабавно прекъсва изпълнението с panic при извикване на несертифициран алгоритъм. За разлика от моделите, базирани на Provider в други езици, които оставят възможност за fallback, това предоставя по-строга и ясна гаранция от гледна точка на сигурността и съответствието с регулациите.
Hedged Signature
Стандартът FIPS 140-3 препоръчва метода RFC6979 за ECDSA подписване. Въпреки това, Go въвежда и Hedged метод, за да се справи по-мощно със страничните атаки, които могат да възникнат по време на процеса на подписване.
Подобрен генератор на случайни числа
Генераторът на случайни числа на Go използва потребителско пространство DRBG (Deterministic Random Bit Generator), като същевременно инжектира допълнителна ентропия в ядрото на операционната система, за да генерира висококачествени случайни числа не само в потребителското пространство, но и в ядрото. Това допълнително подобрява сигурността на генератора на случайни числа.