Como verificar o suporte FIPS 140-2 no OpenSSL?

Temos um cliente que está a perguntar pelo OpenSSL.FIPS (Federal Information Processing Standard) 140-2 suporte conforme utilização validada de criptografia. Como posso verificar se o OpenSSL tem FIPS a queixar-se que está a fornecer criptografia validada FIPS ou não?

: Redhat 5 Linux

Author: jww, 2013-09-04

5 answers

Como posso verificar se o OpenSSL fornece criptografia validada pelo FIPS ou não?
Depende de como e quando queres verificar. Também depende da aplicação.

Os FIPS podem estar disponíveis mas não são utilizados. Assim, uma aplicação deve permitir a criptografia validada via FIPS_mode_set, e a chamada deve ter sucesso.


Se quiser verificar se a Biblioteca capaz do FIPS, como o OpenSSL 1. 0. 1 e, foi configurada para usar o objecto FIPS Módulo, então você pode:

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

OPENSSL_FIPS diz-lhe que a Biblioteca capaz do FIPS foi configurada para usar o módulo de objectos FIPS. Então a criptografia validada FIPS está disponível.

OPENSSL_FIPS no entanto, não significa que a aplicação esteja a utilizar a criptografia validada FIPS. A aplicação deve chamar FIPS_mode_set, e a função deve retornar o sucesso.


À hora de execução, pode imprimir o texto associado ao seguinte (retirado do código que uso especificamente para isto):

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

O código produzirá um registo semelhante ao seguinte:

Version: OpenSSL 1.0.1f-fips 6 Jan 2014

Podes auditar o módulo com alguns truques. Por exemplo, o seguinte irá testar alguns símbolos que devem estar presente se o executável for realmente FIPS. Neste caso, estou a testar o Objecto partilhado do OpenSSL FIPS. Se a aplicação ligar para libcrypto.a, então você pode auditar o programa em vez do objeto compartilhado 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
...

Tu também ter os símbolos de 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

Isto é muito sorrateiro. Você pode verificar se o módulo inclui os auto-testes. Por exemplo, fips_drbg_selftest.h irá incluir os seguintes bytes:
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 pode verificar se o programador executou incore ou macho_incore no seu executável para incorporar a impressão digital FIPS desprendendo os 20 bytes do símbolo FIPS_signature. Se seus 20 bytes de 0's( o padrão de fips_premain.c), Então a impressão digital não foi incorporada e FIPS_mode_set vai falhar. Entao não é possível usar criptografia validada FIPS neste caso.


actualizar: fiz um upload de um slide deck que tenho sobre o assunto no wiki OpenSSL. Seu chamado De Construção de aplicações usando criptografia validada OpenSSL: notas do Campo para desenvolvedores e auditores . Você vai querer rever o material começando em torno de Slide 18.

Construí o diapositivo para o OWASP, mas não havia interesse em recebê-lo. Eu sei Stack. Overflow não gosta de links como o do OpenSSL wiki, mas eu não sei como fornecer um deck 35+ slide aqui.
 13
Author: jww, 2016-03-29 11:46:08
[[1]}o OpenSSL em si não está validado FIPS 140-2 e, de acordo com os seus mantenedores, nunca estará. No entanto, ele tem um módulo validado FIPS 140-2 chamado FIPS Object Module, que em parte substitui libcrypto Usado no vanilla OpenSSL. Mais informações, incluindo Guia do utilizador , podem ser encontradas aqui . Resumindo:

O OpenSSL em si não é validado, e nunca será. Em vez disso, um especial componente de software cuidadosamente definido chamado objecto FIPS OpenSSL O módulo foi criado. Este módulo foi projetado para compatibilidade com OpenSSL para que os produtos que utilizam a API OpenSSL possam ser convertidos usar criptografia validada com o mínimo de esforço.

 2
Author: KBart, 2014-02-01 00:28:07

Para verificar se o openssl está a funcionar em modo fips, emitir o seguinte:

$ openssl md5 somefile

O acima deve falhar, uma vez que a MD5 não é uma norma de Hash aprovada pela fips.

$ openssl sha1 somefile

O acima funcionaria como SHA1 é o padrão de Hash aprovado fips.

Exemplo:

# 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

Referência

 2
Author: a coder, 2015-05-26 19:35:58

A opção do Kernel " fips=1" deve estar activa. Um pouco mais sobre isso aqui.

Para ver se está carregada:

sudo sysctl -a|grep fips
 0
Author: Gavin, 2016-04-06 21:21:39
Aqui está o que encontrei para verificar o suporte.
# openssl ciphers FIPS -v
ADH-AES256-SHA          SSLv3 Kx=DH       Au=None Enc=AES(256)  Mac=SHA1
DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
DHE-DSS-AES256-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA1
AES256-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA1
ADH-AES128-SHA          SSLv3 Kx=DH       Au=None Enc=AES(128)  Mac=SHA1
DHE-RSA-AES128-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA1
DHE-DSS-AES128-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(128)  Mac=SHA1
AES128-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA1
KRB5-DES-CBC3-SHA       SSLv3 Kx=KRB5     Au=KRB5 Enc=3DES(168) Mac=SHA1
ADH-DES-CBC3-SHA        SSLv3 Kx=DH       Au=None Enc=3DES(168) Mac=SHA1
EDH-RSA-DES-CBC3-SHA    SSLv3 Kx=DH       Au=RSA  Enc=3DES(168) Mac=SHA1
EDH-DSS-DES-CBC3-SHA    SSLv3 Kx=DH       Au=DSS  Enc=3DES(168) Mac=SHA1
DES-CBC3-SHA            SSLv3 Kx=RSA      Au=RSA  Enc=3DES(168) Mac=SHA1
 -2
Author: Satish, 2013-09-04 15:32:59