APISIX: Соответствие стандарту FIPS 140-2
Jinhua Luo
January 6, 2023
Что такое FIPS 140-2?
FIPS расшифровывается как Федеральные стандарты обработки информации (Federal Information Processing Standards) — это набор стандартов компьютерной безопасности, установленных Национальным институтом стандартов и технологий (NIST) Министерства торговли США.
Цель FIPS — создать единый уровень безопасности для всех федеральных агентств, чтобы защищать чувствительную, но несекретную информацию — значительную часть электронных данных, которые не считаются секретными или выше.
Уровни безопасности FIPS 140-2
FIPS 140-2/3 — это часто используемые стандарты в контексте кибербезопасности. Оба они относятся к стандартным требованиям безопасности для криптографических модулей. FIPS 140-3 в конечном итоге заменит FIPS 140-2, и этот переход в настоящее время осуществляется.
- Уровень 1 – Самый низкий уровень безопасности, который накладывает минимальные требования и требует, чтобы все компоненты были «производственного уровня». FIPS 140-2 Уровень 1 относится конкретно к программным криптографическим модулям и устанавливает требования к криптографическим алгоритмам, которые могут использоваться, а также к самопроверкам, которые должны проводиться для проверки их целостности.
- Уровень 2 – Дополнительные требования к физической защите от несанкционированного доступа, а также аутентификации на основе ролей.
- Уровень 3 – Дополнительные обязательства по усилению безопасности против атак, использование аутентификации на основе идентификации, а также физическое разделение интерфейсов.
- Уровень 4 – Самый строгий уровень, который требует надежных мер физической безопасности против атак на окружающую среду.
Например, криптографический модуль, сертифицированный по FIPS 140-2 Уровень 1, обеспечивает базовый уровень безопасности, шифруя данные, проходящие через него, до уровня защиты, предоставляемого AES. Однако криптографический модуль, сертифицированный по FIPS 140-2 Уровень 2, не только обеспечивает электронное шифрование AES, но и физическую безопасность самого устройства.
Это означает, что криптографический модуль, сертифицированный по FIPS 140-2 Уровень 2, не может быть взломан, если не нарушены пломбы на корпусе устройства. В таком случае так называемый криптографический офицер сразу узнает, что безопасность информации была нарушена, и сможет немедленно принять меры для устранения утечки данных.
Почему FIPS важен?
Криптографические модули, сертифицированные по FIPS 140-2, требуются по закону для всех федеральных агентств США, которые обрабатывают чувствительную, но несекретную информацию. Другие отрасли также делают FIPS 140-2 Уровень 2 обязательным требованием для своей безопасности, включая финансы, здравоохранение, юридические услуги, мобильных операторов и отрасли общественной безопасности.
APISIX соответствует FIPS 140-2
Как соответствовать FIPS 140-2?
При использовании с FIPS 140-2 сертифицированной сборкой OpenSSL 3.0, работающей в режиме FIPS, APISIX соответствует требованиям FIPS 140-2 (Уровень 1) в отношении расшифровки и шифрования SSL/TLS‑зашифрованного сетевого трафика.
Влияния
Режим FIPS отключает следующие шифры:
- 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
Кроме того, FIPS не поддерживает RSA-ключи меньше 2048 бит.
Сборка OpenSSL
Сборка и установка OpenSSL с включенным FIPS
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
Проверка OpenSSL
Проверьте конфигурационный файл (/usr/local/openssl-3.0/ssl/openssl.cnf).
Убедитесь, что он соответствует следующему фрагменту:
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
Проверьте, может ли OpenSSL выполнять хэши SHA1: Этот тест проверяет правильность работы OpenSSL. Алгоритм хэширования SHA1 разрешен во всех режимах, поэтому ошибка этой команды указывает на то, что реализация OpenSSL работает некорректно:
# openssl sha1 /dev/null SHA1(/dev/null)= da39a3ee5e6b4b0d3255bfef95601890afd80709
Проверьте, может ли OpenSSL выполнять хэши MD5: Этот тест проверяет, что OpenSSL работает в режиме FIPS. MD5 не является разрешенным алгоритмом хэширования в режиме FIPS, поэтому попытка его использования завершается ошибкой:
# 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 ()
Если OpenSSL не работает в режиме FIPS, функция хэширования MD5 работает нормально:
# /usr/bin/openssl md5 /dev/null MD5(/dev/null)= d41d8cd98f00b204e9800998ecf8427e
Сборка APISIX с FIPS
# установка зависимостей pcre и 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 # указание опций компиляции и линковки 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" # сборка и установка apisix-base wget https://raw.githubusercontent.com/api7/apisix-build-tools/master/build-apisix-base.sh bash build-apisix-base.sh latest
Настройка тестового маршрута
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 } } }'
Проверка приватного ключа
Проверка нормального случая, ожидаем успешного выполнения.
Создайте вспомогательный скрипт на Python для загрузки сертификата:
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)
Создайте функцию в bash для упрощения генерации ключей:
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 }
Тест:
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
Вывод:
... * 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" }
Проверка ключа меньше 2048 бит
FIPS не поддерживает RSA-ключи меньше 2048 бит. Поэтому давайте проверим, завершится ли операция с ошибкой при использовании маленького ключа.
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
Вывод:
... * 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
Заключение
Учитывая строгие тесты, которые включает FIPS, они считаются надежным стандартом безопасности. Кроме того, они являются полезной базой для любых организаций, которым необходимо внедрить стандарты безопасности в своей инфраструктуре.
Добавить поддержку FIPS в APISIX легко. APISIX может использоваться для расшифровки и шифрования SSL/TLS‑зашифрованного сетевого трафика в развертываниях, требующих соответствия FIPS 140-2 Уровень 1.
Для получения дополнительной информации о API-шлюзах, пожалуйста, посетите наш блог или свяжитесь с нами.