APISIX: Compatível com FIPS 140-2
Jinhua Luo
January 6, 2023
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.