GoSuda

FIPS 140-Zertifizierung und Golang

By Gosunuts
views ...

FIPS 140 (Federal Information Processing Standard Publication 140)

FIPS 140 ist ein Standard zur Sicherheitszertifizierung von Kryptomodulen, der vom NIST in den USA festgelegt wurde. Dieser Standard bewertet, ob ein bestimmtes Kryptomodul oder eine Bibliothek die vom NIST definierten Sicherheitsanforderungen erfüllt. Folglich bedeutet das Bestehen der FIPS 140-Zertifizierung, dass das betreffende Modul offiziell als vertrauenswürdig und sicher gilt und in sicherheitskritischen Bereichen wie Finanzen, Gesundheitswesen und Verteidigung eingesetzt werden kann.

FIPS 140 wurde erstmals 1994 erlassen und seitdem 2001 zu FIPS 140-2 und 2019 zu FIPS 140-3 überarbeitet. Bis heute verlangen viele Systeme und Anwendungen die Zertifizierung nach FIPS 140-2 oder FIPS 140-3.

FIPS 140 und Programmiersprachen

Aus diesem Grund werden FIPS 140-zertifizierte Kryptomodule in verschiedenen Programmiersprachen und Umgebungen faktisch als Standard verwendet. Dazu gehören OpenSSL, BoringSSL, LibreSSL und NSS, die zu den am weitesten verbreiteten Modulen in sicherheitskritischen Anwendungen zählen.

Die meisten FIPS 140-zertifizierten Module sind in C oder C++ geschrieben. Aus diesem Grund konfigurieren Sprachen wie PHP, Python und Javascript eine FIPS-Umgebung, indem sie diese Module nicht direkt verwenden, sondern über externe Provider-Module integrieren. Dieser Ansatz weist jedoch einige Einschränkungen auf.

  • Versionsinkonsistenzen

    Die FIPS 140-Zertifizierung wird nur für bestimmte Versionen erteilt. Um die neueste Version eines Moduls zu verwenden, muss der Zertifizierungsprozess erneut durchlaufen werden, was zu Versionsinkonsistenzen zwischen dem von der Anwendung verwendeten Modul und dem FIPS-zertifizierten Modul führen kann. Wenn eine nicht autorisierte Version verwendet wird, gilt die betreffende Umgebung nicht mehr als FIPS-zertifizierte Umgebung.

  • Dynamisches Laden und Leistungsbeeinträchtigung

    Die meisten Sprachen laden FIPS 140-zertifizierte Module als dynamische Bibliotheken. Dieser Ansatz kann während der Initialisierung und Ausführung zu Leistungseinbußen führen und birgt das Risiko, dass Probleme während der Laufzeit die Gesamtstabilität der Anwendung direkt beeinträchtigen.

  • Sicherheitslücken

    Wie bereits erwähnt, besteht in Architekturen, die externe Module wie OpenSSL Provider integrieren, das Risiko, dass Sicherheitslücken dieser Module direkt auf die Anwendung übertragen werden. Darüber hinaus wird die Kommunikationsschicht zwischen der Anwendung und externen Modulen selbst zu einer zusätzlichen Angriffsfläche, die eine separate Sicherheitsschicht zum Schutz erfordert. Dies erhöht die Komplexität und kann zu unerwarteten Schwachstellen führen.

FIPS 140 und Golang

Aus diesen Gründen verfolgte Golang eine andere Strategie. Go entschied sich dafür, die FIPS 140-Zertifizierung nicht von externen Tools abhängig zu machen, sondern direkt in der offiziellen Kryptografie-Bibliothek zu unterstützen. Daher müssen Entwickler keine separaten Provider installieren oder konfigurieren; sie können einfach das Standard-crypto-Paket verwenden und den FIPS-zertifizierten Modus (GOFIPS=1) aktivieren. Dieser Prozess eliminiert die Kommunikationsgrenze mit externen Modulen, erhöht die Sicherheit und vereinfacht den Betrieb, da nur ein statisch kompiliertes, einzelnes Binärprogramm bereitgestellt werden muss.

FIPS 140-2 und Golang

Zu diesem Zweck hat Golang das BoringCrypto-Modul, das von BoringSSL abgeleitet ist, in die Go-Laufzeitumgebung integriert, um die FIPS 140-2-Zertifizierung zu erhalten. BoringCrypto kann ab Go-Version 1.19 in bestimmten Distributionen aktiviert werden, wodurch Go-Anwendungen eine FIPS 140-2-zertifizierte Umgebung ohne separate externe Module konfigurieren können.

Da BoringCrypto jedoch auf OpenSSL basiert, besteht immer noch eine Abhängigkeit von der Sprache C. Daher wurden Go-Anwendungen nicht als vollständig unabhängige Binärdateien erstellt, und es bestand die Einschränkung, dass die erforderlichen C-Bibliotheken zusammen bereitgestellt werden mussten.

FIPS 140-3 und Golang

Das Go-Team hat diese Einschränkungen überwunden, indem es die bestehende Go-Standard-Kryptobibliothek an die FIPS 140-3-Spezifikationen angepasst hat. Dieses verbesserte Modul wird seit Go-Version 1.21 experimentell zur Verfügung gestellt, und die FIPS 140-3-Zertifizierungsprüfung durch das NIST läuft derzeit.Liste der Module, die sich im NIST FIPS 140-3-Zertifizierungsprozess befinden

Dies demonstriert die Reife der Go-Kryptographie-Bibliothek und ermöglicht es Go, eine FIPS 140-3-zertifizierte Umgebung als vollständig unabhängige Einzelbinärdatei bereitzustellen.

Darüber hinaus hat das Go-Team nicht nur den FIPS 140-3-Standard erfüllt, sondern auch die Sicherheit eigenständig verbessert.

  • Fail Fast

    Der FIPS-Modus von Go wendet das Fail Fast-Sicherheitsmodell an, bei dem der Aufruf eines nicht zertifizierten Algorithmus sofort mit einem panic beendet wird. Im Gegensatz zu Provider-basierten Modellen in anderen Sprachen, die Fallback-Möglichkeiten zulassen, bietet dies eine strengere und klarere Gewährleistung in Bezug auf Sicherheit und Compliance.

  • Hedged Signature

    Der FIPS 140-3-Standard empfiehlt die RFC6979-Methode für ECDSA-Signaturen. Go geht jedoch noch einen Schritt weiter und implementiert die Hedged-Methode, um Seitenkanalangriffen während des Signaturprozesses noch robuster entgegenzuwirken.

  • Verbesserter Zufallszahlengenerator

    Der Zufallszahlengenerator von Go verwendet einen DRBG (Deterministic Random Bit Generator) im Benutzermodus und injiziert zusätzlich Entropie in den Betriebssystemkern, um hochwertige Zufallszahlen nicht nur im Benutzermodus, sondern auch im Kernelmodus zu erzeugen. Dies erhöht die Sicherheit des Zufallszahlengenerators weiter.