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ベースのモデルがフォールバックの可能性を残すのと異なり、セキュリティと規制遵守の側面でより厳格かつ明確な保証を提供します。
Hedged Signature
FIPS 140-3標準ではECDSA署名時にRFC6979方式を推奨しています。しかしGoはこれに加え、Hedged方式を導入することで、署名過程で発生しうるサイドチャネル攻撃に対し、より強力に対応します。
강화된 난수 생성기
Go の乱数生成器はユーザー空間DRBG(Deterministic Random Bit Generator)を使用しながらも、オペレーティングシステムカーネルへのエントロピーをさらに注入することで、ユーザー空間だけでなくカーネル空間でも高品質の乱数を生成します。これにより、乱数生成器のセキュリティをさらに強化します。