Hashicorp Vault и Apache APISIX: Усильте безопасность вашего API
November 15, 2022
В настоящее время API (Application Programming Interfaces) стали наиболее распространенным способом подключения различных программных сервисов. Например, вы можете получить данные о сегодняшней погоде через API погодных сервисов или ретвитнуть забавное сообщение через API Twitter. Взаимодействие через API делает Интернет богатым и разнообразным, но также демонстрирует и его темную сторону — угрозы, связанные с API.
Данные показывают, что API теперь представляют 90% поверхности атак веб-приложений, что означает, что API стали одним из основных векторов атак. Как же мы можем снизить риски, связанные с API?
В современных программных архитектурах люди могут выбрать шаблон API Gateway для защиты от атак на API. API Gateway — это точка входа в программный сервис, предоставляющий такие функции, как балансировка нагрузки, обнаружение сервисов и аутентификация API. Apache APISIX — один из лучших API Gateway, который помогает пользователям усилить безопасность своих API с помощью таких функций, как аутентификация, авторизация, ACL (Access Control List) и списки разрешенных/запрещенных IP-адресов. Например, аутентификация JWT — это популярный способ защиты API. Она требует от потребителей API доказать свою личность с помощью JSON Web Token. В таком случае запросы API без учетных данных или с неправильными данными будут отклонены Apache APISIX.
Apache APISIX также отвечает за подписание JSON Web Token (для чего требуется секретный ключ). С точки зрения Apache APISIX, хранение секретов пользователей становится критически важным вопросом, поскольку аутентификация перестанет работать, если секреты будут раскрыты. По умолчанию Apache APISIX сохраняет секреты в etcd, который является центром конфигурации для настроек Apache APISIX, таких как маршруты и upstream.
К сожалению, etcd не предназначен для защиты конфиденциальных данных. Если злоумышленник получит доступ к кластеру etcd, все данные внутри него будут раскрыты. Это не проблема для объекта маршрута APISIX, но будет фатальным для секретов или приватных ключей сертификатов X509. Для лучшей защиты конфиденциальных данных Apache APISIX интегрировал Hashicorp Vault начиная с версии 2.12.0. Что же такое Hashicorp Vault?
Что такое Hashicorp Vault?
Hashicorp Vault — это инфраструктура хранения для безопасного сохранения секретов пользователей (например, учетных данных базы данных, паролей, API-ключей). Он поддерживает интеграцию с множеством внешних систем, таких как Amazon Key Management Service и Google Cloud Key Management. Технически Hashicorp Vault — это распределенная система с использованием протокола консенсуса Raft. Ваши данные будут сохранены с несколькими резервными копиями, и вам не нужно беспокоиться о единой точке отказа данных.

Но что делает Hashicorp Vault особенным? Когда вы запускаете сервер Hashicorp Vault, он находится в запечатанном состоянии. Вы не можете получить доступ к каким-либо данным, пока не разблокируете этот сервер. Для разблокировки сервера Hashicorp Vault вам необходимо использовать доли ключей (сгенерированные при инициализации сервера Hashicorp Vault с использованием алгоритма Shamir Secret Sharing) для выполнения операций разблокировки несколько раз. Количество раз зависит от количества долей ключей ((X/2)+1, если количество долей ключей равно X). Более того, вы можете снова запечатать сервер Hashicorp Vault во время работы, если заметите какие-либо подозрительные признаки того, что он подвергается атаке.
Как Apache APISIX использует Hashicorp Vault?
В настоящее время Apache APISIX интегрирует Hashicorp Vault в свой плагин jwt-auth. Плагин jwt-auth используется для выполнения аутентификации JWT.

Основная логика взаимодействия между Hashicorp Vault и Apache APISIX выглядит следующим образом:
- Поступает запрос API
- Запускается плагин JWT Auth
- Apache APISIX пытается получить секрет из Hashicorp Vault
- Hashicorp Vault возвращает секрет, и Apache APISIX кэширует его
- Apache APISIX использует секрет для проверки JSON Web Token
- Аутентификация пройдена, и запрос API перенаправляется на серверную службу
- Отправляется ответ API
Вы можете настроить плагин jwt-auth в объекте потребителя Apache APISIX с опцией vault, чтобы указать Apache APISIX сохранять/получать секрет в/из Hashicorp Vault. Потребитель Apache APISIX — это абстракция потребителя API. Учетные данные API могут быть настроены на уровне потребителя.
curl http://127.0.0.1:9080/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "username": "jack", "plugins": { "jwt-auth": { "key": "your-api-key", "vault": {} } } }'
Конфигурации Hashicorp Vault могут быть заданы в файле config.yaml Apache APISIX.
vault: host: 'http://0.0.0.0:8200' timeout: 10 token: 's.KUWFVhIXgoRuQbbp3j1eMVGa' prefix: 'kv/apisix'
Важно отметить, что токен должен иметь права на чтение для пути kv/apisix/consumer, где Apache APISIX Admin API сохраняет секреты.
path "kv/apisix/consumer/*" { capabilities = ["read"] }
Когда поступают запросы API от этого потребителя, Apache APISIX попытается получить секрет из настроенного сервера Hashicorp Vault (и кэширует результат в памяти) и использует этот секрет для проверки JSON Web Token.
Будущее интеграции Apache APISIX и Hashicorp Vault
В Apache APISIX существует несколько типов конфиденциальных данных, но пока только секрет JSON Web Token может быть сохранен в Hashicorp Vault. Однако в будущем все учетные данные API, такие как API-ключи и пароли пользователей, также могут быть сохранены в Hashicorp Vault. Кроме того, приватные ключи сертификатов и ключи Admin API также могут быть сохранены там. Все эти данные будут отделены от конфигураций. Таким образом, безопасность вашего API усиливается не только благодаря использованию аутентификации API, но и благодаря надлежащей защите учетных данных API.