Como verificar o suporte FIPS 140-2 no OpenSSL?
FIPS (Federal Information Processing Standard) 140-2
: Redhat 5 Linux
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.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.
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
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
# 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