OpenSSL FIPS (Federal Information Processing Standard) 140-2
について質問しているクライアントがあります 準拠サポート 検証済みの暗号化の使用。 OpenSSLかどうかを確認するにはどうすればよいですか FIPS文句を言う FIPS検証済みの暗号化を提供しているかどうか?
OS:Redhat 5 Linux
OpenSSLがFIPS検証済みの暗号化を提供しているかどうかを確認するにはどうすればよいですか?
いつどのようにチェックしたいかによります。また、アプリケーションによっても異なります。
FIPSは利用可能である可能性がありますが、使用されていません。したがって、アプリケーションはFIPS_mode_set
を介して検証済みの暗号化を有効にする必要があり、呼び出しは成功する必要があります。
FIPS OpenSSL1.0.1eなどの対応ライブラリが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対応の共有オブジェクトをテストしています。アプリケーションが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検証済み暗号化を使用できません)この場合。
更新:OpenSSLwikiに件名のスライドデッキをアップロードしました。その名前は OpenSSL検証済み暗号化を使用したアプリケーションの構築:開発者と監査人のためのフィールドからのメモ 。スライド18以降の資料を確認することをお勧めします。
[〜#〜] owasp [〜#〜] のスライドデッキを作成しましたが、受け取ることに興味はありませんでした。 OpenSSL wikiのようなリンクでStackOverflowが眉をひそめることは知っていますが、ここで35以上のスライドデッキを提供する方法がわかりません。
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検証済みではなく、メンテナによると、決して検証されません。ただし、FIPS 140-2検証済みモジュールが呼び出されますFIPSオブジェクトモジュール、Vanilla OpenSSLで使用されるlibcryptoを部分的に置き換えます。 serガイド 、見つけることができます ここ 。要するに:
OpenSSL自体は検証されておらず、検証されることもありません。代わりに、OpenSSL FIPSオブジェクトモジュールと呼ばれる特別に注意深く定義されたソフトウェアコンポーネントが作成されました。このモジュールは、OpenSSLとの互換性のために設計されているため、OpenSSL APIを使用する製品は、最小限の検証済み暗号化を使用するように変換できます。努力。
ダイナミックリンクを使用している場合、このcコードは次のことを確認します。
#include <openssl/err.h>
#include <string.h>
int main() {
if (FIPS_mode() || FIPS_mode_set(1)) {
printf("Installed library has FIPS support\n");
return 0;
}
const char* err_str = ERR_error_string(ERR_get_error(), 0);
printf("Failed to enable FIPS mode, %s\n", err_str);
if (strstr(err_str, "0F06D065")) {
printf("Installed library does not have FIPS support\n");
}
return 0;
}
Linuxでは、次の方法でコンパイルして実行できます。
そのようにコンパイルします:
gcc fips_openssl_check.c -lcrypto
または
gcc fips_openssl_check.c -l:libcrypto.so.1.0.2
複数のlibcryptoバージョンがインストールされていて、特定のバージョンを確認したい場合。 clangなどの他のコンパイラも問題ありません。
実行してチェックを実行します。
./a.out