Как использовать Vault для управления сертификатами в APISIX

Junduo Dong

Junduo Dong

June 9, 2023

Technology

API-шлюз является ключевым базовым компонентом в управлении жизненным циклом API. Это точка входа для всего трафика, и он отвечает за маршрутизацию запросов API от клиентов к соответствующим сервисам для обработки. Таким образом, API-шлюз обеспечивает сетевое взаимодействие между сервисами и клиентами.

Как новый облачный API-шлюз, Apache APISIX предоставляет механизм TLS/mTLS для безопасного взаимодействия между клиентами и APISIX, а также между APISIX и сервисами, что гарантирует безопасность сетевого обмена данными. APISIX сохраняет SSL-сертификаты как объекты SSL и реализует динамическую загрузку SSL-сертификатов через расширение SNI (Server Name Indication), поддерживающее протокол TLS.

Для безопасного хранения SSL-сертификатов в APISIX была реализована интеграция с HashiCorp Vault, что позволяет централизованно управлять SSL-сертификатами, используя безопасное хранилище секретов Vault. В этой статье на примере настройки HTTPS-соединения между клиентом и APISIX будет показано, как APISIX интегрируется с Vault для управления SSL-сертификатами.

Интеграция APISIX с Vault

Что такое SSL-сертификат

SSL/TLS — это криптографический протокол, который защищает безопасность сетевого взаимодействия, устанавливая зашифрованное соединение между двумя сторонами. Протокол SSL/TLS обеспечивает аутентификацию клиентов и серверов, гарантируя, что данные отправляются правильным получателям. Кроме того, SSL/TLS шифрует данные, что предотвращает их кражу, подделку или изменение во время передачи.

SSL-сертификат — это цифровой сертификат, который подтверждает подлинность веб-сайта и позволяет установить зашифрованное соединение с использованием протокола SSL/TLS. SSL-сертификат обычно выдается доверенным центром сертификации (CA) и содержит следующую информацию:

  • Доменное имя
  • Центр сертификации
  • Цифровая подпись, созданная центром сертификации
  • Связанные поддомены
  • Дата выдачи сертификата
  • Дата истечения срока действия сертификата
  • Публичный ключ (приватный ключ остается секретным)

Что такое HashiCorp Vault

HashiCorp Vault (далее Vault) — это корпоративный инструмент для управления секретами, который позволяет хранить и управлять такими чувствительными данными, как токены, пароли и сертификаты. Vault может интегрироваться с технологиями всей IT-системы, предоставлять услуги автоматизации безопасности и шифрования на основе идентификации, централизованно контролировать доступ к чувствительным данным и системам, а также помогать организациям снижать риск утечки данных, повышая безопасность облачных и прикладных решений.

HashiCorp Vault

Как хранить SSL-сертификаты APISIX в Vault

Подготовка окружения

Развертывание и настройка сервиса Vault

В этом разделе мы используем Docker для развертывания контейнера Vault. Если у вас уже есть экземпляр Vault, вы можете пропустить этот раздел.

Создайте и запустите контейнер Vault в режиме разработки с именем apisix-quickstart-vault. Укажите токен Vault как apisix-quickstart-vault-token и сопоставьте порт 8200 с хостом:

docker run -d --cap-add=IPC_LOCK \ -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200' \ -e 'VAULT_ADDR=http://0.0.0.0:8200' \ -e 'VAULT_DEV_ROOT_TOKEN_ID=apisix-quickstart-vault-token' \ -e 'VAULT_TOKEN=apisix-quickstart-vault-token' \ --network=apisix-quickstart-net \ --name apisix-quickstart-vault \ -p 8200:8200 vault:1.13.0

Выберите kv как путь для хранения SSL-сертификатов APISIX:

docker exec apisix-quickstart-vault vault secrets enable -path=kv -version=1 kv

Настройка APISIX

APISIX должен читать SSL-сертификаты из Vault, поэтому Vault должен предоставить APISIX права на чтение по указанному пути.

Создайте политику Vault с именем apisix-policy.hcl, предоставляющую APISIX доступ на чтение к пути kv/apisix/:

docker exec apisix-quickstart-vault /bin/sh -c "echo ' path \"kv/apisix/*\" { capabilities = [\"read\"] } ' > /etc/apisix-policy.hcl"

Примените созданный файл политики apisix-policy.hcl в Vault:

docker exec apisix-quickstart-vault vault policy write apisix-policy /etc/apisix-policy.hcl

Создайте объект секрета APISIX с идентификатором quickstart-secret-id, чтобы сохранить информацию о подключении к Vault и путь хранения сертификатов:

curl -i "http://127.0.0.1:9180/apisix/admin/secrets/vault/quickstart-secret-id" -X PUT -d ' { "uri": "http://apisix-quickstart-vault:8200", "prefix": "kv/apisix", "token" : "apisix-quickstart-vault-token" }'

Хранение SSL-сертификатов в Vault

Создайте самоподписанный CA-сертификат ca.crt и ключ ca.key:

openssl genrsa -out ca.key 2048 && \ openssl req -new -sha256 -key ca.key -out ca.csr -subj "/CN=ROOTCA" && \ openssl x509 -req -days 36500 -sha256 -extensions v3_ca -signkey ca.key -in ca.csr -out ca.crt

SSL-сертификат server.crt и ключ server.key выдаются CA, и его общее имя (CN) — test.com:

openssl genrsa -out server.key 2048 && \ openssl req -new -sha256 -key server.key -out server.csr -subj "/CN=test.com" && \ openssl x509 -req -days 36500 -sha256 -extensions v3_req \ -CA ca.crt -CAkey ca.key -CAserial ca.srl -CAcreateserial \ -in server.csr -out server.crt

Скопируйте выданные SSL-сертификат и ключ в контейнер Vault:

docker cp server.key apisix-quickstart-vault:/root/ docker cp server.crt apisix-quickstart-vault:/root/

Используйте команду vault kv put, чтобы сохранить SSL-сертификат и ключ как секрет с ключом ssl и путем хранения kv/apisix:

docker exec apisix-quickstart-vault vault kv put kv/apisix/ssl test.com.crt=@/root/server.crt test.com.key=@/root/server.key

С помощью этой команды мы сохранили секрет с именем ssl в Vault, который содержит 2 пары ключ-значение: сертификат и приватный ключ.

Как использовать SSL-сертификат APISIX, хранящийся в Vault

APISIX поддерживает TLS/mTLS-шифрование между клиентами и APISIX, а также между APISIX и сервисами, где могут использоваться SSL-сертификаты, хранящиеся в Vault. Мы покажем, как использовать SSL-сертификат из Vault в APISIX, на примере настройки HTTPS-соединения между клиентом и APISIX.

Настройка HTTPS-соединения между клиентом и APISIX

Создайте объект SSL-сертификата для хранения сертификата:

curl -i "http://127.0.0.1:9180/apisix/admin/ssls" -X PUT -d ' { "id": "quickstart-tls-client-ssl", "sni": "test.com", "cert": "$secret://vault/quickstart-secret-id/ssl/test.com.crt", "key": "$secret://vault/quickstart-secret-id/ssl/test.com.key" }'

Поле sni этого объекта — test.com, что соответствует CN, указанному при выдаче сертификата. Поля cert и key соответствуют выданному сертификату и приватному ключу, которые автоматически извлекаются из Vault через созданный ресурсный локатор секрета. Правила локатора ресурсов следующие:

$secret://$manager/$id/$secret_name/$key
  • manager: сервис управления ключами Vault
  • id: идентификатор ресурса секрета APISIX
  • secret_name: имя секрета в Vault
  • key: ключ пары ключ-значение в секрете с именем secret_name

Проверка HTTPS-соединения между клиентом и APISIX

Создайте маршрут для перенаправления всех запросов, отправленных на /ip, на вышестоящий сервис httpbin.org:

curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d ' { "id": "quickstart-client-ip", "uri": "/ip", "upstream": { "nodes": { "httpbin.org:80":1 }, "type": "roundrobin" } }'

Используйте cURL для отправки запроса на https://test.com:9443/ip, где test.com разрешается в 127.0.0.1:

curl -ikv --resolve "test.com:9443:127.0.0.1" "https://test.com:9443/ip"

Если настройка прошла успешно, процесс TLS-рукопожатия между клиентом и APISIX, возвращаемый cURL, будет соответствовать следующим результатам:

* Added test.com:9443:127.0.0.1 to DNS cache * Hostname test.com was found in DNS cache * Trying 127.0.0.1:9443... * Connected to test.com (127.0.0.1) port 9443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt * CApath: /etc/ssl/certs * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * 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: CN=test.com * start date: Apr 21 07:47:54 2023 GMT * expire date: Mar 28 07:47:54 2123 GMT * issuer: CN=ROOTCA * SSL certificate verify result: unable to get local issuer certificate (20), 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 0x556274d632e0) > GET /ip HTTP/2 > Host: test.com:9443 > user-agent: curl/7.74.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 HTTP/2 200 ...

Итог

Мы рассмотрели, как APISIX интегрируется с Vault для управления SSL-сертификатами, и подробно показали шаги настройки и интеграции на примере HTTPS-соединения между клиентами и APISIX.

Для получения дополнительной информации о концепциях и сценариях использования SSL-сертификатов в APISIX, обратитесь к следующим статьям:

Tags: