GNU/Linux >> Znalost Linux >  >> Linux

Jak zkontrolovat podporu FIPS 140-2 v OpenSSL?

Chcete-li zkontrolovat, zda openssl funguje v režimu fips, proveďte následující:

$ openssl md5 somefile

Výše uvedené by mělo selhat, protože MD5 není hash Standard schválený pro fips.

$ openssl sha1 somefile

Výše uvedené by fungovalo jako SHA1 je schválený hash standard fips.

Příklad :

# 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

Reference


Samotné OpenSSL není ověřeno FIPS 140-2 a podle jeho správců nikdy nebude. Má však ověřený modul FIPS 140-2 nazvaný FIPS Object Module, který částečně nahrazuje libcrypto používá se ve vanilla OpenSSL. Více informací včetně uživatelské příručky naleznete zde. Ve zkratce:

Samotné OpenSSL není ověřeno a nikdy nebude. Místo toho byla vytvořena speciálně pečlivě definovaná softwarová komponenta nazvaná OpenSSL FIPS ObjectModule. Tento modul byl navržen pro kompatibilitu s OpenSSL, takže produkty využívající OpenSSL API lze s minimálním úsilím převést na ověřenou kryptografii.


Jak zjistím, zda OpenSSL poskytuje kryptografii ověřenou FIPS nebo ne?

Záleží na tom, jak a kdy chcete zkontrolovat. Záleží také na aplikaci.

FIPS může být k dispozici, ale nepoužívá se. Aplikace tedy musí povolit ověřenou kryptografii pomocí FIPS_mode_set a hovor musí uspět.

Pokud chcete zkontrolovat, zda byla FIPS Capable Library, jako je OpenSSL 1.0.1e, nakonfigurována pro použití FIPS Object Module, můžete:

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

OPENSSL_FIPS říká, že FIPS Capable Library byla nakonfigurována pro použití FIPS Object Module. Takže je k dispozici kryptografie ověřená FIPS.

OPENSSL_FIPS neznamená to však, že aplikace používá kryptografii ověřenou FIPS. Aplikace musí volat FIPS_mode_set a funkce musí vrátit úspěch.

Za běhu můžete vytisknout řetězec spojený s následujícím (je převzat z kódu, který k tomu používám speciálně):

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

Kód vytvoří záznam protokolu podobný následujícímu:

Version: OpenSSL 1.0.1f-fips 6 Jan 2014

Modul můžete auditovat pomocí několika triků. Následující příklad otestuje některé symboly, které musí být přítomen, pokud je spustitelný soubor skutečně FIPS.

V tomto případě testuji sdílený objekt OpenSSL FIPS Capable. Pokud aplikace odkazuje na libcrypto.a , pak můžete auditovat program spíše než sdílený objekt 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
...

Máte také symboly z 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

Tak tohle je opravdu záludné. Můžete zkontrolovat, zda modul obsahuje samotesty. Například fips_drbg_selftest.h bude obsahovat následující bajty své vlastní testy:

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

A můžete ověřit, že vývojář spustil incore nebo macho_incore na jejich spustitelném souboru pro vložení otisku FIPS vypuštěním 20 bajtů symbolu FIPS_signature . Pokud je jeho 20 bajtů 0 (výchozí hodnota je fips_premain.c ), pak otisk prstu nebyl vložen a FIPS_mode_set selže. Takže v tomto případě není možné použít kryptografii ověřenou FIPS.

Aktualizovat :Nahrál jsem slide deck, který mám na toto téma, na OpenSSL wiki. Jmenuje se Vytváření aplikací pomocí OpenSSL Validated Cryptography:Notes from the Field for Developers and Auditors. Budete chtít zkontrolovat materiál od snímku 18.

Postavil jsem slide deck pro OWASP, ale nebyl o to zájem. Vím, že Stack Overflow se mračí na odkazy, jako je ten na wiki OpenSSL, ale nevím, jak zde poskytnout 35+ slide deck.


Možnost jádra "fips=1 " by mělo být povoleno. Trochu více o tom zde.

Chcete-li zjistit, zda je načten:

sudo sysctl -a|grep fips

Linux
  1. Jak zkontrolovat verzi Redhat

  2. Jak zkontrolovat, zda je certifikát SSL SHA1 nebo SHA2 pomocí OpenSSL?

  3. Jak zkontrolovat historii přihlášení k systému Linux

  1. Jak zkontrolovat časové pásmo v Linuxu

  2. Jak zkompilovat a nainstalovat Python s podporou OpenSSL?

  3. Jak zajistit, aby vyhovoval CentOS/RHEL 7 FIPS 140-2

  1. Jak zkontrolovat syntaxi sudoers

  2. Jak zkontrolovat průběh běhu Cp?

  3. Jak zkontroluji využití šířky pásma VPS?