GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara memeriksa dukungan FIPS 140-2 di OpenSSL?

Untuk memeriksa apakah openssl beroperasi dalam mode fips, keluarkan perintah berikut:

$ openssl md5 somefile

Hal di atas seharusnya gagal karena MD5 bukan Standar Hash yang disetujui fips.

$ openssl sha1 somefile

Hal di atas akan berfungsi karena SHA1 adalah Standar Hash yang Disetujui fips.

Contoh :

# 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

Referensi


OpenSSL sendiri tidak divalidasi FIPS 140-2 dan, menurut pengelolanya, tidak akan pernah. Namun, ia memiliki modul tervalidasi FIPS 140-2 yang disebut FIPS Object Module, yang sebagian menggantikan libcrypto digunakan dalam vanilla OpenSSL. Informasi lebih lanjut, termasuk panduan pengguna, dapat ditemukan di sini. Singkatnya:

OpenSSL sendiri tidak divalidasi, dan tidak akan pernah. Sebagai gantinya komponen perangkat lunak khusus yang didefinisikan dengan hati-hati yang disebut OpenSSL FIPS ObjectModule telah dibuat. Modul ini dirancang untuk kompatibilitas dengan OpenSSL sehingga produk yang menggunakan API OpenSSL dapat dikonversi untuk menggunakan kriptografi tervalidasi dengan sedikit usaha.


Bagaimana saya memeriksa apakah OpenSSL telah menyediakan kriptografi tervalidasi FIPS atau tidak?

Itu tergantung pada bagaimana dan kapan Anda ingin memeriksa. Itu juga tergantung pada aplikasinya.

FIPS dapat tersedia tetapi tidak digunakan. Jadi aplikasi harus mengaktifkan kriptografi yang divalidasi melalui FIPS_mode_set , dan panggilan harus berhasil.

Jika Anda ingin memeriksa apakah FIPS Capable Library, seperti OpenSSL 1.0.1e, telah dikonfigurasi untuk menggunakan FIPS Object Module, maka Anda dapat:

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

OPENSSL_FIPS memberi tahu Anda FIPS Capable Library telah dikonfigurasi untuk menggunakan FIPS Object Module. Jadi kriptografi tervalidasi FIPS tersedia.

OPENSSL_FIPS tidak berarti aplikasi tersebut menggunakan kriptografi tervalidasi FIPS. Aplikasi harus memanggil FIPS_mode_set , dan fungsinya harus mengembalikan success.

Saat runtime, Anda dapat mencetak string yang terkait dengan yang berikut (diambil dari kode yang saya gunakan khusus untuk ini):

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

Kode akan menghasilkan entri log yang serupa dengan berikut ini:

Version: OpenSSL 1.0.1f-fips 6 Jan 2014

Anda dapat mengaudit modul dengan beberapa trik. Misalnya, berikut ini akan menguji beberapa simbol yang harus hadir jika yang dapat dieksekusi benar-benar FIPS.

Dalam hal ini, saya sedang menguji objek bersama OpenSSL FIPS Capable. Jika aplikasi tertaut ke libcrypto.a , maka Anda dapat mengaudit program daripada objek bersama 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
...

Anda juga memiliki simbol dari 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

Sekarang, ini benar-benar licik. Anda dapat memeriksa apakah modul menyertakan tes mandiri. Misalnya, fips_drbg_selftest.h akan menyertakan byte berikut untuk pengujiannya sendiri:

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

Dan Anda dapat memverifikasi bahwa pengembang menjalankan incore atau macho_incore pada executable mereka untuk menyematkan sidik jari FIPS dengan membuang 20 byte dari simbol FIPS_signature . Jika 20 bytenya 0 (default dari fips_premain.c ), maka sidik jari tidak disematkan dan FIPS_mode_set akan gagal. Jadi, tidak mungkin menggunakan kriptografi tervalidasi FIPS dalam kasus ini.

Perbarui :Saya mengunggah dek slide yang saya miliki tentang subjek ke wiki OpenSSL. Ini disebut Membangun Aplikasi menggunakan Kriptografi yang Divalidasi OpenSSL:Catatan dari Lapangan untuk Pengembang dan Auditor. Anda sebaiknya meninjau materi mulai dari Slide 18.

Saya membuat dek slide untuk OWASP tetapi tidak ada minat untuk menerimanya. Saya tahu Stack Overflow tidak menyukai tautan seperti yang ada di wiki OpenSSL, tetapi saya tidak tahu cara menyediakan dek slide 35+ di sini.


Opsi kernel "fips=1 " harus diaktifkan. Sedikit lebih lanjut tentang itu di sini.

Untuk melihat apakah itu dimuat:

sudo sysctl -a|grep fips

Linux
  1. Bagaimana cara Memeriksa apakah Sertifikat SSL SHA1 atau SHA2 menggunakan OpenSSL?

  2. Bagaimana Mengkompilasi dan Menginstal Python dengan Dukungan OpenSSL?

  3. Bagaimana cara memeriksa sintaks sudoers

  1. Bagaimana Cara Memeriksa Kemajuan Running Cp?

  2. Cara Memeriksa Riwayat Masuk Linux

  3. Cara membuat CentOS/RHEL 7 FIPS 140-2 sesuai

  1. Cara memeriksa versi Redhat

  2. Cara Memeriksa Zona Waktu di Linux

  3. Heartbleed:bagaimana cara memeriksa versi OpenSSL dengan andal dan portabel?