Как использовать Secret Manager с API Gateway
Shirui Zhao
January 13, 2023
Что такое секрет?
В IT-среде секрет — это привилегированные учетные данные, не предназначенные для использования человеком, обычно используемые системами и приложениями для аутентификации или в качестве входных данных для алгоритмов шифрования. Например, пароли, необходимые для подключения программы к базе данных, ключи/сертификаты для зашифрованной связи — все это относится к секретам.
Распространенные типы секретов включают:
- Ключи шифрования
- Учетные данные для доступа к облачным сервисам
- Ключи API (Application Programming Interface)
- Токены доступа
- SSH-ключи (Secure Shell)
Менеджер секретов
Менеджер секретов хранит, извлекает, обновляет и аудирует секреты на протяжении всего их жизненного цикла. HashiCorp Vault — один из наиболее часто используемых сервисов для управления секретами, и его принцип работы следующий (изображение с официального сайта HashiCorp):

Помимо HashiCorp Vault, облачные провайдеры, такие как AWS, Google и Azure, также предоставляют сервисы для управления секретами.
Использование менеджера секретов для создания приложений не только повышает безопасность, но и предоставляет следующие функции:
- Позволяет легко обновлять секреты на нескольких машинах без влияния на приложение.
- Разработчикам не нужно уделять слишком много внимания хранению секретов, они могут сосредоточиться на бизнес-логике.
- Обновление и отзыв секретов можно выполнять без повторного развертывания или прерывания работы активных приложений.
- Менеджер секретов предоставляет гибкие и детализированные журналы аудита, которые могут отслеживать историю всех пользовательских доступов и легче соответствовать требованиям аудита и соответствия.
Использование менеджера секретов в API Gateway
Как входная точка для бизнес-трафика, API Gateway часто содержит огромное количество секретной информации, такой как ключи API и токены для аутентификации. Поэтому крайне важно интегрировать менеджер секретов в API Gateway.
Сценарии использования секретов в API Gateway
Key Auth — это простой метод аутентификации в API Gateway. Пользователям необходимо заранее установить ключ, и когда клиент отправляет API-запросы, предустановленный ключ добавляется в соответствующий заголовок запроса или передается как параметр запроса для прохождения аутентификации. Однако утечки ключей — это распространенная проблема, и ключи часто хранятся в конфигурационных файлах или сохраняются как переменные в коде. Если ключи не хранятся должным образом, они могут даже появиться в публичных репозиториях кода, таких как GitHub, что представляет значительную угрозу безопасности. Администраторы часто обновляют эти ключи регулярно, чтобы предотвратить серьезный ущерб от утечек ключей. Однако для некоторых статических ключей индивидуальное обновление конфигурационного файла на каждой машине также может представлять значительную угрозу для стабильности сервиса.
Интеграция менеджера секретов в API Gateway
Интеграция менеджера секретов в API Gateway позволяет хранить предустановленный ключ для аутентификации Key Auth в сервисе менеджера секретов, что эффективно решает ряд проблем, вызванных утечками ключей. API Gateway является лишь пользователем ключа, а фактическое значение ключа хранится во внешнем сервисе менеджера секретов. Более того, API Gateway хранит только ссылку на ключ, поэтому даже если API Gateway будет взломан, фактический ключ нельзя будет получить из кода или конфигурационного файла. Кроме того, если необходимо обновить значение ключа, это можно сделать только в менеджере секретов без изменения кода или конфигурации API Gateway, что также эффективно избегает перезапуска API Gateway.

Ниже мы используем Apache APISIX в качестве примера, чтобы показать, как использовать менеджер секретов для хранения предустановленного ключа для аутентификации Key Auth в API Gateway.
Пример использования Apache APISIX с менеджером секретов на практике
Apache APISIX — это динамический, высокопроизводительный API Gateway, предоставляющий сотни функций, таких как балансировка нагрузки, динамический апстрим, канареечное развертывание, детализированная маршрутизация, ограничение скорости, деградация сервиса, автоматическое отключение, аутентификация и наблюдаемость.
В версии 3.1.0 Apache APISIX представил APISIX Secret для интеграции различных сервисов управления секретами. Его последовательность работы следующая:

Ниже мы используем Vault в качестве сервиса управления секретами. Мы будем использовать аутентификацию Key Auth, чтобы проиллюстрировать, как использовать менеджер секретов для сохранения ключей в Apache APISIX.
Создание ключей в Vault
Перед созданием ключа необходимо запустить сервис Vault. Поскольку этот раздел посвящен лучшим практикам использования Vault в экосистеме Apache APISIX, конфигурация самого Vault не описывается подробно и может быть найдена здесь.
Для создания соответствующего ключа в Vault можно использовать следующую команду:
vault secrets enable -version=1 -path=apisix kv vault kv put apisix/jack auth-key=secret-key
После выполнения вышеуказанной команды вы найдете ключ с именем auth-key по пути apisix/jack, со значением secret-key.
Конфигурация в APISIX
Сначала добавьте ресурс секрета через Admin API и настройте адрес, а также другую информацию для подключения к Vault:
- Идентификатор ресурса APISIX Secret — "gateway", см. https://apisix.apache.org/docs/apisix/terminology/secret/#usage-1
- Поле
prefix— это путь к ключу в Vault, а полеtoken— это токен Vault.
curl http://127.0.0.1:9180/apisix/admin/secrets/vault/gateway \ -H 'X-API-KEY: Your-API-KEY' -X PUT -d ' { "uri": "https://127.0.0.1:8200", "prefix": "apisix", "token": "hvs.chjDFWvZRcihoq2vpSsVenmR" }'
Затем используйте плагин key-auth для создания потребителя и выполнения аутентификации Key Auth для соответствующего маршрута или сервиса. Поле key ссылается на ресурс APISIX Secret:
curl http://127.0.0.1:9180/apisix/admin/consumers \ -H 'X-API-KEY: Your-API-KEY' -X PUT -d ' { "username": "jack", "plugins": { "key-auth": { "key": "$secret://vault/gateway/jack/auth-key" } } }'
С помощью вышеуказанных двух шагов, когда запрос пользователя попадает на плагин key-auth, компонент Secret вызовет настроенный пользователем менеджер секретов через предоставленный интерфейс, чтобы получить фактическое значение ключа в Vault. Если значение ключа не найдено, плагин запишет ошибку и не сможет выполнить проверку Key Auth.
Затем создайте маршрут для выполнения аутентификации Key Auth:
curl -i "http://127.0.0.1:9180/apisix/admin/routes" -H 'X-API-KEY: Your-API-KEY' -X PUT -d ' { "id": "getting-started-ip", "uri": "/ip", "plugins": { "key-auth": {} }, "upstream": { "type": "roundrobin", "nodes": { "httpbin.org:80": 1 } } }'
Наконец, отправьте запрос без ключа к API Gateway, чтобы проверить результат:
curl -i "http://127.0.0.1:9080/ip"
Результат будет следующим:
HTTP/1.1 401 Unauthorized ... {"message":"Missing API key found in request"}
Затем отправьте запрос с ключом к API Gateway, чтобы проверить результат:
curl -i "http://127.0.0.1:9080/ip" -H 'apikey: secret-key'
Результат будет похож на следующий:
HTTP/1.1 200 OK ... { "origin": "127.0.0.1, 59.172.90.243" }
Кроме того, Apache APISIX расширил переменные окружения до простого сервиса управления секретами, и токен APISIX для подключения к Vault также может храниться в переменных окружения. Поэтому перед запуском APISIX можно установить переменные окружения следующей командой:
export VAULT_TOKEN="root"
Ссылайтесь на переменные окружения при добавлении ресурса Secret:
curl http://127.0.0.1:9180/apisix/admin/secrets/vault/1 -H 'X-API-KEY: Your-API-KEY' -X PUT -d ' { "uri": "https://127.0.0.1:8200", "prefix": "apisix", "token": "$ENV://VAULT_TOKEN" }'
С помощью вышеуказанных шагов вы можете хранить ключ, необходимый для аутентификации Key Auth, в Vault, вместо того чтобы отображать его в открытом виде при настройке плагина.
Заключение
В API Gateway содержится огромное количество секретной информации. Использование менеджера секретов для управления секретами гарантирует, что в API Gateway не будет открытого текста секретной информации, что эффективно повышает безопасность и стабильность API Gateway. Как самый активный в мире API Gateway с открытым исходным кодом, Apache APISIX также активно поддерживает менеджеры секретов. В этой статье также используется аутентификация Key Auth, чтобы проиллюстрировать, как использовать менеджер секретов для управления ключевой информацией в APISIX.
Для получения дополнительной информации об API Gateway, пожалуйста, посетите наш блог или свяжитесь с нами.