GNU/Linux >> Linux Esercitazione >  >> Linux

Come verificare il supporto FIPS 140-2 in OpenSSL?

Per verificare se openssl funziona in modalità fips, emettere quanto segue:

$ openssl md5 somefile

Quanto sopra dovrebbe fallire poiché MD5 non è uno standard hash approvato da FIPS.

$ openssl sha1 somefile

Quanto sopra funzionerebbe poiché SHA1 è lo standard hash approvato da fips.

Esempio :

# 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

Riferimento


Lo stesso OpenSSL non è convalidato FIPS 140-2 e, secondo i suoi manutentori, non lo sarà mai. Tuttavia, ha un modulo convalidato FIPS 140-2 chiamato FIPS Object Module, che sostituisce in parte libcrypto utilizzato in Vanilla OpenSSL. Ulteriori informazioni, inclusa la guida per l'utente, sono disponibili qui. In breve:

Lo stesso OpenSSL non è convalidato e non lo sarà mai. Invece è stato creato un componente software appositamente definito chiamato OpenSSL FIPS ObjectModule. Questo modulo è stato progettato per la compatibilità con OpenSSL in modo che i prodotti che utilizzano l'API OpenSSL possano essere convertiti per utilizzare la crittografia convalidata con il minimo sforzo.


Come posso verificare se OpenSSL fornisce o meno crittografia convalidata FIPS?

Dipende da come e quando vuoi controllare. Dipende anche dall'applicazione.

FIPS potrebbe essere disponibile ma non utilizzato. Quindi un'applicazione deve abilitare la crittografia convalidata tramite FIPS_mode_set e la chiamata must avere successo.

Se desideri verificare se la libreria compatibile con FIPS, come OpenSSL 1.0.1e, è stata configurata per utilizzare il modulo oggetto FIPS, puoi:

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

OPENSSL_FIPS indica che la libreria compatibile con FIPS è stata configurata per utilizzare il modulo oggetto FIPS. Quindi la crittografia convalidata FIPS è disponibile.

OPENSSL_FIPS tuttavia, non significa che l'applicazione stia utilizzando la crittografia convalidata FIPS. L'applicazione deve chiamare FIPS_mode_set , e la funzione deve restituire successo.

In fase di esecuzione, puoi stampare la stringa associata a quanto segue (è presa dal codice che uso appositamente per questo):

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

Il codice produrrà una voce di log simile alla seguente:

Version: OpenSSL 1.0.1f-fips 6 Jan 2014

Puoi controllare il modulo con alcuni trucchi. Ad esempio, quanto segue verificherà alcuni simboli che devono essere presente se l'eseguibile è veramente FIPS.

In questo caso, sto testando l'oggetto condiviso compatibile con FIPS OpenSSL. Se l'applicazione si collega a libcrypto.a , allora puoi controllare il programma piuttosto che l'oggetto condiviso 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
...

Hai anche i simboli di 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

Ora, questo è davvero subdolo. È possibile verificare che il modulo includa gli autotest. Ad esempio, fips_drbg_selftest.h includerà i seguenti byte nei suoi test automatici:

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

E puoi verificare che lo sviluppatore abbia eseguito incore o macho_incore sul loro eseguibile per incorporare l'impronta digitale FIPS scaricando i 20 byte del simbolo FIPS_signature . Se sono 20 byte di 0 (il valore predefinito da fips_premain.c ), quindi l'impronta digitale non è stata incorporata e FIPS_mode_set avrà esito negativo. Quindi in questo caso non è possibile utilizzare la crittografia convalidata FIPS.

Aggiorna :Ho caricato un mazzo di diapositive che ho sull'argomento nel wiki di OpenSSL. Si chiama Creazione di applicazioni utilizzando la crittografia convalidata da OpenSSL:note dal campo per sviluppatori e revisori. Ti consigliamo di rivedere il materiale a partire dalla diapositiva 18.

Ho costruito lo slide deck per OWASP ma non c'era interesse a riceverlo. So che Stack Overflow disapprova link come quello sul wiki di OpenSSL, ma non so come fornire qui una presentazione di oltre 35 diapositive.


Opzione del kernel "fips=1 " dovrebbe essere abilitato. Qui ne parleremo un po' di più.

Per vedere se è caricato:

sudo sysctl -a|grep fips

Linux
  1. Come controllare il fuso orario in Linux

  2. Come controllare lo stato di avanzamento dell'esecuzione di Cp?

  3. Come controllare la cronologia di accesso di Linux

  4. Come controllare la versione di CentOS

  5. Heartbleed:come controllare in modo affidabile e portabile la versione di OpenSSL?

Come controllare la versione di Kali Linux

Come controllare la versione di Linux

Come controllare la versione di Python

Come controllare la versione Java

Come controllare la versione OpenGL?

Come controllare lo spazio di scambio in Linux