APISIX: Mematuhi FIPS 140-2

Jinhua Luo

January 6, 2023

Products

Apa itu FIPS 140-2?

FIPS adalah singkatan dari Federal Information Processing Standards, serangkaian standar keamanan komputer yang ditetapkan oleh Departemen Perdagangan federal AS melalui National Institute of Standards and Technology (NIST).

Tujuan FIPS adalah menciptakan tingkat keamanan yang seragam untuk semua lembaga federal guna melindungi informasi sensitif namun tidak diklasifikasikan - sebagian besar data elektronik yang tidak dianggap rahasia atau lebih tinggi.

Tingkat keamanan FIPS 140-2

FIPS 140-2/3 adalah standar yang sering digunakan dalam konteks keamanan siber. Keduanya berkaitan dengan persyaratan keamanan standar untuk modul kriptografi. FIPS 140-3 pada akhirnya akan menggantikan FIPS 140-2, dan transisi ini sedang berlangsung.

  • Level 1 – Tingkat keamanan terendah yang menerapkan persyaratan minimum dan mengharuskan semua komponen untuk ‘berkualitas produksi’. FIPS 140-2 Level 1 secara khusus berkaitan dengan modul kriptografi perangkat lunak dan membuat ketentuan tentang algoritma kriptografi yang dapat digunakan serta pengujian mandiri yang harus dilakukan untuk memverifikasi integritasnya.
  • Level 2 – Menambahkan persyaratan untuk bukti perusakan fisik serta autentikasi berbasis peran.
  • Level 3 – Kewajiban lebih lanjut untuk memperkuat keamanan terhadap penyerang, penggunaan autentikasi berbasis identitas, serta pemisahan fisik antara antarmuka.
  • Level 4 – Tingkat yang paling ketat yang mengharuskan langkah-langkah keamanan fisik yang kuat terhadap serangan lingkungan.

Sebagai contoh, modul kriptografi yang divalidasi FIPS 140-2 Level 1 memberikan tingkat keamanan dasar dengan mengenkripsi data yang melaluinya hingga tingkat perlindungan yang diberikan oleh AES. Namun, modul kriptografi yang divalidasi FIPS 140-2 Level 2 tidak hanya menyediakan enkripsi elektronik AES tetapi juga keamanan fisik perangkat itu sendiri.

Ini berarti bahwa modul kriptografi yang divalidasi FIPS 140-2 Level 2 tidak dapat dirusak kecuali segel pada rumah solusi rusak, dalam hal ini yang disebut petugas kriptografi akan segera mengetahui bahwa keamanan informasi telah terganggu dan dia dapat segera mengambil tindakan untuk memperbaiki pelanggaran data.

Mengapa FIPS penting?

Modul kriptografi yang divalidasi FIPS 140-2 diwajibkan oleh hukum untuk semua lembaga federal AS yang menangani informasi sensitif namun tidak diklasifikasikan. Dan sektor industri lainnya menjadikan FIPS 140-2 Level 2 sebagai item yang tidak dapat ditawar untuk keamanan backhaul mereka, termasuk keuangan, kesehatan, layanan hukum, operator seluler, dan industri keselamatan publik.

APISIX sesuai dengan FIPS 140-2

Bagaimana agar sesuai dengan FIPS 140-2?

Ketika digunakan dengan build OpenSSL 3.0 yang divalidasi FIPS 140-2 yang beroperasi dalam mode FIPS, APISIX memenuhi persyaratan FIPS 140-2 (Level 1) terkait dekripsi dan enkripsi lalu lintas jaringan yang dienkripsi SSL/TLS.

Pengaruh

Mode FIPS menonaktifkan cipher berikut:

  • TLS_ECDH_anon_WITH_RC4_128_SHA
  • TLS_ECDHE_RSA_WITH_RC4_128_SHA
  • TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  • TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  • TLS_RSA_WITH_IDEA_CBC_SHA
  • TLS_RSA_WITH_RC4_128_MD5
  • TLS_RSA_WITH_RC4_128_SHA
  • TLS_RSA_WITH_SEED_CBC_SHA

Dan, FIPS tidak mendukung kunci RSA yang lebih kecil dari 2048 bit.

Membangun OpenSSL

Membangun dan menginstal OpenSSL dengan FIPS diaktifkan

apt install -y build-essential git clone https://github.com/openssl/openssl cd openssl ./Configure --prefix=/usr/local/openssl-3.0 enable-fips make install bash -c "echo /usr/local/openssl-3.0/lib64 > /etc/ld.so.conf.d/openssl3.conf" ldconfig /usr/local/openssl-3.0/bin/openssl fipsinstall -out /usr/local/openssl-3.0/ssl/fipsmodule.cnf \ -module /usr/local/openssl-3.0/lib64/ossl-modules/fips.so sed_expr='s@# .include fipsmodule.cnf@.include /usr/local/openssl-3.0/ssl/fipsmodule.cnf@g;' sed_expr+=' s/# \(fips = fips_sect\)/\1\nbase = base_sect\n\n[base_sect]\nactivate=1\n/g' sed -i "$sed_expr" /usr/local/openssl-3.0/ssl/openssl.cnf bash -c "echo /usr/local/openssl-3.0/lib64 > /etc/ld.so.conf.d/openssl3.conf" ldconfig

Verifikasi OpenSSL

Verifikasi file konfigurasi (/usr/local/openssl-3.0/ssl/openssl.cnf).

Pastikan sesuai dengan cuplikan berikut:

config_diagnostics = 1 openssl_conf = openssl_init .include /usr/local/ssl/fipsmodule.cnf [openssl_init] providers = provider_sect [provider_sect] fips = fips_sect base = base_sect [base_sect] activate = 1

Tentukan apakah OpenSSL dapat melakukan hash SHA1: Tes ini memverifikasi operasi yang benar dari OpenSSL. Algoritma hash SHA1 diizinkan dalam semua mode, sehingga kegagalan perintah ini menunjukkan bahwa implementasi OpenSSL tidak berfungsi dengan benar:

# openssl sha1 /dev/null SHA1(/dev/null)= da39a3ee5e6b4b0d3255bfef95601890afd80709

Tentukan apakah OpenSSL dapat melakukan hash MD5: Tes ini memverifikasi bahwa OpenSSL berjalan dalam mode FIPS. MD5 bukan algoritma hash yang diizinkan dalam mode FIPS, sehingga upaya untuk menggunakannya akan gagal:

# openssl md5 /dev/null Error setting digest 80920FA8DA7F0000:error:0308010C:digital envelope routines: inner_evp_generic_fetch:unsupported:crypto/evp/evp_fetch.c:341: Global default library context, Algorithm (MD5 : 100), Properties ()

Jika OpenSSL tidak berjalan dalam mode FIPS, fungsi hash MD5 berfungsi normal:

# /usr/bin/openssl md5 /dev/null MD5(/dev/null)= d41d8cd98f00b204e9800998ecf8427e

Membangun APISIX dengan FIPS

# install pcre and zlib dependencies wget -O - https://openresty.org/package/pubkey.gpg | apt-key add - echo "deb http://openresty.org/package/${arch_path}ubuntu $(lsb_release -sc) main" | \ tee /etc/apt/sources.list.d/openresty.list apt-get update apt-get install -y openresty-pcre-dev openresty-zlib-dev # specify compile and link options export zlib_prefix=/usr/local/openresty/zlib export pcre_prefix=/usr/local/openresty/pcre export cc_opt="-DNGX_LUA_ABORT_AT_PANIC -I${zlib_prefix}/include -I${pcre_prefix}/include" cc_opt+="-I/usr/local/openssl-3.0/include" export ld_opt="-L${zlib_prefix}/lib -L${pcre_prefix}/lib -L/usr/local/openssl-3.0/lib64" ld_opt+="-Wl,-rpath,${zlib_prefix}/lib:${pcre_prefix}/lib:/usr/local/openssl-3.0/lib64" # build and install apisix-base wget https://raw.githubusercontent.com/api7/apisix-build-tools/master/build-apisix-base.sh bash build-apisix-base.sh latest

Mengonfigurasi rute uji

curl http://127.0.0.1:9180/apisix/admin/routes/httpbin -H 'X-API-KEY: YOUR-KEY' -X PUT -i -d ' { "uri": "/anything", "hosts": ["*.httpbin.org"], "methods": ["GET"], "upstream": { "type": "roundrobin", "nodes": { "httpbin.org": 1 } } }'

Menguji validasi kunci privat

Uji kasus normal, kami berharap itu berhasil.

Buat skrip python bantu untuk mengunggah sertifikat:

cfg_ssl.py

import sys import requests if len(sys.argv) <= 3: print("bad argument") sys.exit(1) with open(sys.argv[1]) as f: cert = f.read() with open(sys.argv[2]) as f: key = f.read() sni = sys.argv[3] api_key = "edd1c9f034335f136f87ad84b625c8f1" resp = requests.put("http://127.0.0.1:9180/apisix/admin/ssls/1", json={ "cert": cert, "key": key, "snis": [sni], }, headers={ "X-API-KEY": api_key, }) print(resp.status_code) print(resp.text)

Buat fungsi bash untuk memudahkan pembuatan kunci:

genkey() { keylen=${1:-4096} /usr/bin/openssl genrsa -out apisix.key $keylen /usr/bin/openssl req -key apisix.key -new -out apisix.csr -subj '/C=/ST=/L=/O=/OU=web/CN=*.httpbin.org' /usr/bin/openssl x509 -req -in apisix.csr -signkey apisix.key -out apisix.crt -days 3650 -sha256 }

Uji:

cd $(mktemp -d) genkey 2048 python3 ssl.py apisix.crt apisix.key '*.httpbin.org' curl --resolve 'www.httpbin.org:9443:127.0.0.1' https://www.httpbin.org:9443/uuid -vvv -k

Output:

... * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN, server accepted to use h2 * Server certificate: * subject: OU=web; CN=*.httpbin.org * start date: Dec 22 05:52:58 2022 GMT * expire date: Dec 19 05:52:58 2032 GMT * issuer: OU=web; CN=*.httpbin.org * SSL certificate verify result: self signed certificate (18), continuing anyway. * Using HTTP2, server supports multi-use * Connection state changed (HTTP/2 confirmed) * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0 * Using Stream ID: 1 (easy handle 0x55e125a24e30) > GET /uuid HTTP/2 > Host: www.httpbin.org:9443 > user-agent: curl/7.68.0 > accept: */* > * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * old SSL session ID is stale, removing * Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 200 < content-type: application/json < content-length: 53 < date: Thu, 22 Dec 2022 06:35:04 GMT < access-control-allow-origin: * < access-control-allow-credentials: true < server: APISIX/3.0.0 < { "uuid": "1827f239-376f-47ec-9b54-d5addaa8c7f9" }

Menguji kunci yang lebih kecil dari 2048 bit

FIPS tidak mendukung kunci RSA yang lebih kecil dari 2048 bit. Jadi, mari kita uji apakah itu gagal dengan kunci kecil.

genkey 1024 python3 cfg_ssl.py apisix.crt apisix.key '*.httpbin.org' curl --resolve 'www.httpbin.org:9443:127.0.0.1' https://www.httpbin.org:9443/uuid -vvv -k

Output:

... * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS alert, internal error (592): * error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error * Closing connection 0 curl: (35) error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error

Kesimpulan

Mengingat pengujian ketat yang dilakukan oleh FIPS, mereka dianggap sebagai standar keamanan yang dapat diandalkan. Selain itu, mereka merupakan dasar yang berguna bagi entitas apa pun yang perlu menerapkan standar keamanan dalam infrastruktur mereka.

Mudah untuk menambahkan dukungan FIPS di APISIX. APISIX dapat digunakan untuk mendekripsi dan mengenkripsi lalu lintas jaringan yang dienkripsi SSL/TLS dalam penyebaran yang memerlukan kepatuhan FIPS 140-2 Level 1.

Untuk informasi lebih lanjut tentang gateway API, silakan kunjungi blog kami atau hubungi kami.

Tags: