APISIX: Compatível com FIPS 140-2

Jinhua Luo

January 6, 2023

Products

O que é FIPS 140-2?

FIPS significa Federal Information Processing Standards, um conjunto de padrões de segurança de computadores estabelecidos pelo National Institute of Standards and Technology (NIST), do Departamento de Comércio dos EUA.

O objetivo do FIPS é criar um nível uniforme de segurança para todas as agências federais, a fim de proteger informações sensíveis, mas não classificadas - uma grande parte dos dados eletrônicos que não são considerados secretos ou de classificação superior.

Níveis de segurança do FIPS 140-2

FIPS 140-2/3 são padrões frequentemente usados no contexto de cibersegurança. Ambos se relacionam com os requisitos de segurança padrão para módulos criptográficos. O FIPS 140-3 eventualmente substituirá o FIPS 140-2, e essa transição está em andamento.

  • Nível 1 – O nível de segurança mais baixo, que impõe requisitos mínimos e exige que todos os componentes sejam ‘de grau de produção’. O FIPS 140-2 Nível 1 se refere especificamente a módulos criptográficos de software e estabelece regras sobre os algoritmos criptográficos que podem ser usados e os autotestes que devem ser realizados para verificar sua integridade.
  • Nível 2 – Requisitos adicionais para evidência de violação física e autenticação baseada em função.
  • Nível 3 – Obrigação adicional de fortalecer a segurança contra atacantes, o uso de autenticação baseada em identidade, bem como separação física entre interfaces.
  • Nível 4 – O nível mais rigoroso, que exige medidas robustas de segurança física contra ataques ambientais.

Por exemplo, um módulo criptográfico validado como FIPS 140-2 Nível 1 fornece esse nível básico de segurança ao criptografar os dados que passam por ele com o nível de proteção fornecido pelo AES. No entanto, um módulo criptográfico validado como FIPS 140-2 Nível 2 não apenas fornece criptografia eletrônica AES, mas também segurança física do próprio dispositivo.

Isso significa que um módulo criptográfico validado como FIPS 140-2 Nível 2 não pode ser violado, a menos que os selos da solução sejam quebrados, caso em que o chamado oficial de criptografia saberá imediatamente que a segurança da informação foi comprometida e poderá agir imediatamente para remediar qualquer violação de dados.

Por que o FIPS é importante?

Módulos criptográficos validados pelo FIPS 140-2 são exigidos por lei para todas as agências federais dos EUA que lidam com informações sensíveis, mas não classificadas. E outros setores estão tornando o FIPS 140-2 Nível 2 um item não negociável para sua segurança de backhaul, incluindo finanças, saúde, serviços jurídicos, operadoras móveis e indústrias de segurança pública.

APISIX em conformidade com o FIPS 140-2

Como estar em conformidade com o FIPS 140-2?

Quando usado com uma compilação do OpenSSL 3.0 validada pelo FIPS 140-2 operando no modo FIPS, o APISIX está em conformidade com os requisitos do FIPS 140-2 (Nível 1) em relação à descriptografia e criptografia do tráfego de rede criptografado por SSL/TLS.

Influências

O modo FIPS desativa os seguintes cifradores:

  • 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

Além disso, o FIPS não suporta chaves RSA menores que 2048 bits.

Compilar o OpenSSL

Compilar e instalar o OpenSSL com FIPS habilitado

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

Verificar o OpenSSL

Verifique o arquivo de configuração (/usr/local/openssl-3.0/ssl/openssl.cnf).

Certifique-se de que corresponda ao trecho abaixo:

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

Determine se o OpenSSL pode realizar hashes SHA1: Este teste verifica a operação correta do OpenSSL. O algoritmo de hash SHA1 é permitido em todos os modos, então uma falha neste comando indica que a implementação do OpenSSL não está funcionando corretamente:

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

Determine se o OpenSSL pode realizar hashes MD5: Este teste verifica se o OpenSSL está sendo executado no modo FIPS. O MD5 não é um algoritmo de hash permitido no modo FIPS, então uma tentativa de usá-lo falha:

# 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 ()

Se o OpenSSL não estiver sendo executado no modo FIPS, a função de hash MD5 funciona normalmente:

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

Compilar o APISIX com FIPS

# instalar dependências pcre e zlib 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 # especificar opções de compilação e link 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" # compilar e instalar apisix-base wget https://raw.githubusercontent.com/api7/apisix-build-tools/master/build-apisix-base.sh bash build-apisix-base.sh latest

Configurar uma rota de teste

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 } } }'

Testar a validação de chave privada

Teste o caso normal, esperamos que seja bem-sucedido.

Crie um script Python auxiliar para enviar o certificado:

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)

Crie uma função bash para facilitar a geração de chaves:

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 }

Teste:

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

Saída:

... * 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" }

Testar chave menor que 2048 bits

O FIPS não suporta chaves RSA menores que 2048 bits. Então, vamos testar se ele falha com uma chave pequena.

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

Saída:

... * 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

Conclusão

Dada a rigorosa testagem que o FIPS envolve, ele é considerado um padrão de segurança confiável. Além disso, é uma linha de base útil para qualquer entidade que precise implementar padrões de segurança em sua infraestrutura.

É fácil adicionar suporte ao FIPS no APISIX. O APISIX pode ser usado para descriptografar e criptografar o tráfego de rede criptografado por SSL/TLS em implantações que exigem conformidade com o FIPS 140-2 Nível 1.

Para mais informações sobre gateway de API, visite nossos blogs ou entre em contato conosco.

Tags: