Apache APISIX улучшает безопасность API с помощью плагина CSRF
API7.ai
February 23, 2022
Ключевым моментом запуска атаки CSRF (межсайтовая подделка запроса) является то, что целевой сервер не может определить, исходят ли многие запросы от реального пользователя или от злоумышленника. Общий процесс атаки заключается в том, что сначала злоумышленник заманивает пользователя на веб-страницу, предоставленную злоумышленником. Эта страница содержит запрос, который автоматически отправляется на целевой сервер. Затем страница загружается нормально, и запрос автоматически отправляется на сервер. Для сервера запрос выглядит точно так же, как запрос, обычно отправляемый пользователем, и он не знает, что запрос был инициирован злоумышленником без ведома пользователя. Поскольку запрос несет некоторые учетные данные пользователя, злоумышленник может получить доступ к информации пользователя, анализируя эти учетные данные, что создает угрозу безопасности.
В этой статье представлен плагин csrf, предназначенный для обеспечения безопасности от CSRF в Apache APISIX, и подробно описано, как защитить информацию вашего API в Apache APISIX с помощью плагина csrf.
Введение в плагин
Плагин csrf реализован на основе схемы Double Submit Cookie. Как определено в RFC 7231#section-4.2.1, мы считаем методы GET, HEAD и OPTIONS безопасными методами. В соответствии с этим соглашением плагин csrf пропустит эти три метода напрямую, но будет проверять другие методы и блокировать любые небезопасные запросы.
Для защиты от атак CSRF нам необходимо создать токен или идентификатор, который нельзя подделать, и убедиться, что он не отправляется с запросом злоумышленника. Пользователь должен передать токен, на который полагается плагин csrf, в заголовке запроса, и токен вычисляется с использованием ключа для подписи. Это гарантирует, что токен не может быть подделан другими, что обеспечивает безопасность API.

Когда плагин csrf включен в маршруте, все ответы на запросы к этому маршруту будут содержать Cookie с csrf токеном.
Пользователь должен передать этот Cookie в небезопасном запросе для этого маршрута и добавить дополнительное поле в заголовке запроса, чтобы передать содержимое cookie. Это поле является значением name в конфигурации плагина, чтобы запрос прошел проверку плагина CSRF.
Пользователь предоставляет случайный ключ в конфигурации плагина, который используется плагином для шифрования информации токена с использованием хэша sha256 и генерации CSRF токена, что гарантирует, что токен не может быть подделан.
Как использовать плагин
Включение плагина CSRF в маршруте
Создайте маршрут в APISIX с использованием Admin API и включите плагин csrf.
curl -i http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/hello", "plugins": { "csrf": { "key": "edd1c9f034335f136f87ad84b625c8f1" } }, "upstream": { "type": "roundrobin", "nodes": { "127.0.0.1:9001": 1 } } }'
Плагин имеет три параметра конфигурации.
key: Обязательное поле, значение случайного секретного ключа. Пользователь должен предоставить случайный ключ.expires: Необязательное, время истечения срока действия случайного секретного ключа, по умолчанию 7200 секунд. Поскольку CSRF токен отправляется клиенту с использованием Cookie, эта конфигурация помещается в конфигурацию Cookie для управления временем истечения срока действия Cookie. Кроме того, плагин также будет рассчитывать время, чтобы определить, истек ли срок действия токена.name: Необязательное, имя CSRF токена, по умолчаниюapisix-csrf-token.
Отправка запроса
Сначала маршрут доступен с использованием запроса POST.
curl -i http://127.0.0.1:9080/hello -X POST
Apache APISIX перехватит запрос и вернет ошибку 401. В возвращенном заголовке вы найдете установленный Cookie, который должен быть значением по умолчанию apisix-csrf-token=.... внутри Cookie, если поле name плагина не настроено. Это CSRF токен, сгенерированный плагином CSRF. В запросе необходимо убедиться, что запрос несет этот Cookie и что токен записан в заголовке запроса.
HTTP/1.1 401 Unauthorized Set-Cookie: apisix-csrf-token= ${apisix-csrf-token};path=/;Expires=Mon, 13-Dec-21 09:33:55 GMT {"error_msg":"no csrf token in headers"}
Пример использования JavaScript на стороне клиента: чтение Cookie с использованием js-cookie и отправка запросов с использованием axios.
const token = Cookie.get('apisix-csrf-token'); const instance = axios.create({ headers: {'apisix-csrf-token': token} });
Если токен в Cookie не совпадает с токеном в заголовке запроса, запрос будет перехвачен плагином csrf, как показано в следующем примере.
curl -i http://127.0.0.1:9080/hello -X POST -H 'apisix-csrf-token: ${apisix-csrf-token}' -b 'apisix-csrf-token= ${apisix-csrf-token}'
HTTP/1.1 401 Unauthorized Set-Cookie: apisix-csrf-token= ${apisix-csrf-token};path=/;Expires=Mon, 13-Dec-21 09:33:55 GMT {"error_msg":"csrf token mismatch"}
Наконец, используйте curl для проверки регулярного доступа.
curl -i http://127.0.0.1:9080/hello -X POST -H 'apisix-csrf-token: ${apisix-csrf-token}' -b 'apisix-csrf-token= ${apisix-csrf-token}'
HTTP/1.1 200 OK
Внутри плагин должен проверить, что токен в Cookie совпадает с токеном, переданным в заголовке запроса, и пересчитать подпись, чтобы убедиться, что токен действителен.
Отключение плагина
Удалите соответствующую информацию о конфигурации плагина csrf, а затем отправьте запрос на обновление маршрута, чтобы деактивировать плагин.
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/hello", "upstream": { "type": "roundrobin", "nodes": { "127.0.0.1:1980": 1 } } }'
Заключение
В этой статье подробно описано, как работает плагин csrf и как его использовать. Мы надеемся, что эта статья поможет вам лучше понять, как использовать плагин для перехвата атак CSRF в Apache APISIX, и облегчит его применение в практических сценариях.
Apache APISIX также в настоящее время работает над дополнительными плагинами для поддержки интеграции дополнительных сервисов, поэтому, если вы заинтересованы, не стесняйтесь начать обсуждение в GitHub Discussion или через список рассылки для общения.