FIPS 140 認証と Golang
FIPS 140 ( Federal Information Processing Standard Publication 140 )
FIPS 140は、米国NISTによって制定された暗号モジュールセキュリティ認証標準です。この標準は、特定の暗号モジュールまたはライブラリがNISTによって定義されたセキュリティ要件を満たしているかどうかを評価します。したがって、FIPS 140認証を通過したということは、当該モジュールが公式に信頼可能なセキュリティを有していることを意味し、金融、医療、国防などセキュリティが重要な分野での使用が可能であることを意味します。
FIPS 140は1994年に初めて制定されて以降、2001年にFIPS 140-2へ、2019年にはFIPS 140-3へと改訂されました。現在に至るまで、多くのシステムやアプリケーションにおいて、FIPS 140-2またはFIPS 140-3認証が要求されています。
FIPS 140とプログラミング言語
こうした理由から、FIPS 140認証を受けた暗号モジュールは、複数のプログラミング言語や環境において事実上の標準として利用されています。代表的なものとしてOpenSSL, BoringSSL, LibreSSL, NSSなどがあり、これらはセキュリティが重要なアプリケーションにおいて最も広く活用されるモジュールです。
大半のFIPS 140認証モジュールはCまたはC++で記述されています。このため、PHP, Python, Javascriptなどの言語では、これらのモジュールを直接使用するのではなく、外部Providerモジュールを介して連携する形でFIPS環境を構築します。しかしながら、このようなアプローチにはいくつかの限界が存在します。
バージョン不一致の問題
FIPS 140認証は特定のバージョンに対してのみ付与されます。したがって、最新バージョンのモジュールを使用するには再度認証プロセスを経る必要があり、この過程でアプリケーションが使用するモジュールとFIPS認証モジュールとの間でバージョン不一致が発生する可能性があります。もし認可されていないバージョンを使用した場合、その環境はもはやFIPS認証環境とは見なされなくなります。
動的ローディングとパフォーマンス低下
ほとんどの言語は、FIPS 140認証モジュールを動的ライブラリの形式でロードして使用します。この方式は、初期化および実行プロセスにおいてパフォーマンス低下を誘発する可能性があり、ランタイム中に問題が発生した場合、アプリケーション全体の安定性に直接的な影響を及ぼす危険性があります。
セキュリティ脆弱性
前述の通り、OpenSSL Providerのように外部モジュールを連携させる構造においては、当該モジュールのセキュリティ脆弱性がアプリケーションへ直接伝播するリスクが存在します。また、アプリケーションと外部モジュール間の通信レイヤー自体が追加的な攻撃対象領域となり、これを保護するための別途のセキュリティレイヤーが必要となります。これは複雑性を増大させ、予期せぬ脆弱性を発生させる可能性があります。
FIPS 140とGolang
こうした理由から、Golangは異なる戦略を採用しました。Goは、FIPS 140認証を外部ツールに依存せず、公式な暗号化ライブラリで直接サポートする方式を選択しました。したがって、開発者は別途Providerをインストールまたは設定する必要なく、標準のcryptoパッケージをそのまま使用しつつ、FIPS認証モード(GOFIPS=1)を有効化するだけで済みます。この過程で外部モジュールとの通信境界が除去されセキュリティが強化され、静的コンパイルされた単一バイナリのみを配布すればよいため、運用も簡素化されます。
FIPS 140-2とGolang
このため、GolangはBoringSSLから派生したBoringCryptoモジュールをGoランタイムに内蔵し、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バージョンから実験的に提供され始め、現在NISTによるFIPS 140-3認証審査が進行中です。NIST FIPS 140-3 審査進行中モジュールリスト
これはGo暗号化ライブラリの成熟度を示しており、これによりGoは完全に独立した単一バイナリでFIPS 140-3認証環境を提供できるようになりました。
さらに、Goチームは単にFIPS 140-3標準を満たすに留まらず、独自にセキュリティを強化しました。
Fail Fast
GoのFIPSモードはFail Fastセキュリティモデルを適用しており、非認証アルゴリズムが呼び出された場合、panicにより即座に実行を中断します。これは、他言語のProviderベースモデルがfallbackの可能性を残すのとは異なり、セキュリティと規制遵守の観点からより厳格かつ明確な保証を提供します。
Hedged Signature
FIPS 140-3標準では、ECDSA署名時にRFC6979方式を推奨しています。しかし、Goはこれに加えてHedged方式を導入し、署名プロセス中に発生し得るサイドチャネル攻撃に対してより強力に対応します。
強化された乱数生成器
Goの乱数生成器は、ユーザースペースのDRBG(Deterministic Random Bit Generator)を使用しつつも、オペレーティングシステムカーネルに対するエントロピーを追加入力することで、ユーザースペースのみならずカーネルスペースにおいても高品質な乱数を生成します。これにより、乱数生成器のセキュリティがさらに強化されました。