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: