GNU/Linux >> Linux の 問題 >  >> Linux

OpenSSL での FIPS 140-2 のサポートを確認するには?

openssl が fips モードで動作しているかどうかを確認するには、次を発行します。

$ openssl md5 somefile

MD5 は fips 承認のハッシュ標準ではないため、上記は失敗するはずです。

$ openssl sha1 somefile

SHA1 は fips 承認済みハッシュ標準であるため、上記は機能します。

:

# openssl md5 message.txt
Error setting digest md5
140062425388872:error:060800A3:digital envelope routines:EVP_DigestInit_ex:disabled for fips:digest.c:251:

# openssl sha1 message.txt 
SHA1(messagetext.txt)= 9f5080758dbf71537cc44a4d8cb67564f2ad938a

参照


OpenSSL 自体は FIPS 140-2 で検証されておらず、メンテナーによると今後も検証されることはありません。ただし、libcrypto を部分的に置き換える FIPS オブジェクト モジュールと呼ばれる FIPS 140-2 検証済みモジュールがあります。 バニラ OpenSSL で使用されます。ユーザー ガイドを含む詳細情報は、こちらでご覧いただけます。要するに:

<ブロック引用>

OpenSSL 自体は検証されておらず、検証されることもありません。代わりに、OpenSSL FIPS ObjectModule と呼ばれる特別に慎重に定義されたソフトウェア コンポーネントが作成されました。このモジュールは、OpenSSL との互換性を考慮して設計されているため、OpenSSL API を使用する製品を、最小限の労力で検証済みの暗号化を使用するように変換できます。


<ブロック引用>

OpenSSL が FIPS 検証済みの暗号化を提供しているかどうかを確認するにはどうすればよいですか?

いつ、どのように確認するかによって異なります。また、アプリケーションによって異なります。

FIPS は利用可能ですが、使用されていない可能性があります。したがって、アプリケーションは FIPS_mode_set を介して検証済みの暗号化を有効にする必要があります 、および呼び出しはしなければならない 成功します。

OpenSSL 1.0.1e などの FIPS 対応ライブラリが FIPS オブジェクト モジュールを使用するように構成されているかどうかを確認するには、次の方法があります。

$ cat /usr/local/ssl/include/openssl/opensslconf.h  | grep -A 2 -i fips
#ifndef OPENSSL_FIPS
# define OPENSSL_FIPS
#endif

OPENSSL_FIPS は、FIPS 対応ライブラリが FIPS オブジェクト モジュールを使用するように構成されたことを示します。したがって、FIPS 検証済みの暗号化が利用可能です。

OPENSSL_FIPS ただし、アプリケーションが FIPS 検証済みの暗号化を使用していることを意味するわけではありません。アプリケーションは FIPS_mode_set を呼び出す必要があります 、関数は成功を返す必要があります。

実行時に、以下に関連付けられた文字列を出力できます (これは、私が特に使用するコードから取得したものです):

ostringstream oss;
oss << OPENSSL_VERSION_TEXT;
LogVersion(oss.str().c_str());

このコードは、次のようなログ エントリを生成します:

Version: OpenSSL 1.0.1f-fips 6 Jan 2014

いくつかのトリックでモジュールを監査できます。たとえば、次の例では、しなければならないいくつかのシンボルをテストします。 実行可能ファイルが本当に FIPS である場合に存在します。

この場合、OpenSSL FIPS Capable 共有オブジェクトをテストしています。アプリケーションが libcrypto.a にリンクしている場合 の場合、OpenSSL 共有オブジェクトではなくプログラムを監査できます。

$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_*
00000000000c7f60 T ERR_load_FIPS_strings
00000000000c2250 T FIPS_add_error_data
00000000000c3900 T FIPS_add_lock
0000000000082820 T FIPS_bn_bin2bn
0000000000082980 T FIPS_bn_bn2bin
0000000000082760 T FIPS_bn_clear
0000000000082350 T FIPS_bn_clear_free
00000000000823d0 T FIPS_bn_free
0000000000087c90 T FIPS_bn_generate_prime_ex
0000000000082790 T FIPS_bn_get_word
0000000000082d20 T FIPS_bn_is_bit_set
0000000000087c80 T FIPS_bn_is_prime_ex
0000000000087750 T FIPS_bn_is_prime_fasttest_ex
...

fips_premain.c のシンボルもあります :

$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_text_*
00000000000c4520 T FIPS_text_end
000000000007b340 T FIPS_text_start
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_rodata*
00000000001e1e20 R FIPS_rodata_end
00000000001d8ce0 R FIPS_rodata_start
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_signature*
00000000004696c0 B FIPS_signature
$ nm /usr/local/ssl/lib/libcrypto.so | grep -i fips_incore*
000000000007b5a0 T FIPS_incore_fingerprint

もうね、これは本当にずるいです。モジュールにセルフテストが含まれていることを確認できます。例:fips_drbg_selftest.h 次のバイトの自己テストが含まれます:

0x2e,0xbf,0x98,0xf9,0x85,0x27,0x8b,0xff,0x36,0xb9,0x40,0x0b,
0xc0,0xa1,0xa0,0x13,0x20,0x06,0xcc,0xe6,0x2a,0x03,0x77,0x7d,
0xee,0xde,0xcc,0x34,0xe3,0xcd,0x77,0xea,0xd0,0x3e,0xbe,0xdd,
0xf6,0x15,0xfb,0xa7,0xd7,0x8e,0xd0,0x2e,0x2f,0x82,0x4c,0xc7,
0x87,0xb1,0x6f,0xc5,0xf8,0x5c,0x78,0xde,0x77,0x9b,0x15,0x9a,
0xb9,0x3c,0x38

そして、開発者が incore を実行したことを確認できます または macho_incore シンボル FIPS_signature の 20 バイトをダンプして FIPS フィンガープリントを埋め込む実行​​可能ファイル . 20 バイトの 0 の場合 (fips_premain.c からのデフォルト) )、指紋は埋め込まれておらず、FIPS_mode_set 失敗します。したがって、この場合、FIPS で検証された暗号化を使用することはできません。

更新 :OpenSSL wiki にテーマに関するスライド デッキをアップロードしました。これは、OpenSSL Validated Cryptography を使用したアプリケーションの構築:開発者および監査担当者向けの現場からのメモと呼ばれています。スライド 18 あたりから資料を確認してください。

OWASP のスライド デッキを作成しましたが、受け取ることに興味がありませんでした。スタック オーバーフローが OpenSSL wiki のようなリンクに眉をひそめていることは知っていますが、ここで 35 以上のスライド デッキを提供する方法がわかりません。


カーネルオプション "fips=1 " を有効にする必要があります。ここでもう少し詳しく説明します。

ロードされているかどうかを確認するには:

sudo sysctl -a|grep fips

Linux
  1. Redhatのバージョンを確認する方法

  2. Linuxでタイムゾーンを確認する方法

  3. VPSの帯域幅使用率を確認するにはどうすればよいですか?

  1. OpenSSLを使用してSSL証明書がSHA1またはSHA2であるかどうかを確認するにはどうすればよいですか?

  2. OpenSSLサポートを使用してPythonをコンパイルおよびインストールする方法は?

  3. CentOS のバージョンを確認する方法

  1. sudoers構文を確認する方法

  2. CentOS/RHEL 7 を FIPS 140-2 に準拠させる方法

  3. Heartbleed:OpenSSL のバージョンを確実かつ移植可能にチェックする方法は?