Apache APISIX mejora la seguridad de las API con el plugin CSRF
API7.ai
February 23, 2022
El punto clave de lanzar un ataque CSRF (falsificación de solicitud entre sitios) es hacer que el servidor objetivo no pueda distinguir si el origen de muchas solicitudes es un usuario real o un atacante. El flujo general del ataque es que primero el atacante atraerá al usuario para que navegue a una página web proporcionada por el atacante. Esta página contiene una solicitud que se envía automáticamente al servidor objetivo. Luego, la página se carga normalmente y la solicitud se envía automáticamente al servidor. Para el servidor, la solicitud parece exactamente igual que la solicitud enviada normalmente por el usuario, sin darse cuenta de que fue iniciada por el atacante sin el conocimiento del usuario. Dado que la solicitud lleva algunas de las credenciales del usuario, el atacante puede acceder a la información del usuario al analizar estas credenciales, creando así un riesgo de seguridad.
Este artículo presenta csrf
, el complemento de seguridad CSRF para Apache APISIX, y detalla cómo proteger la información de su API en Apache APISIX con la ayuda del complemento csrf
.
Introducción al Complemento
El complemento csrf
se implementa basándose en el esquema Double Submit Cookie
. Como se define en RFC 7231#section-4.2.1, consideramos los métodos GET
, HEAD
y OPTIONS
como métodos seguros. Según esta convención, el complemento csrf
permitirá que estos tres métodos pasen directamente, pero verificará los otros métodos e interceptará cualquier solicitud insegura.
Para defenderse de los ataques CSRF, necesitamos crear un token o identificador que no pueda ser falsificado y asegurarnos de que este no se envíe con la solicitud del atacante. El usuario necesita llevar en la cabecera de la solicitud el token en el que se basa el complemento csrf
, y el token se calcula utilizando una clave para firmar. Esto asegura que el token no pueda ser falsificado por otros, protegiendo así la API.
Cuando el complemento csrf
está habilitado en una ruta, todas las respuestas de solicitud a esa ruta contendrán una Cookie que lleva un token csrf
.
El usuario necesita llevar esta Cookie en una solicitud insegura para esta ruta y agregar un campo adicional en la cabecera de la solicitud para llevar el contenido de la cookie. El campo es el valor name
en la configuración del complemento, de modo que la solicitud pase las verificaciones del complemento CSRF.
El usuario proporciona una clave aleatoria en la configuración del complemento, que el complemento utiliza para cifrar la información del token con un hash sha256 y generar un token CSRF, asegurando así que el token no pueda ser falsificado.
Cómo Usar el Complemento
Habilitar el Complemento CSRF en una Ruta
Cree una ruta en APISIX utilizando la API de Admin y habilite el complemento 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
}
}
}'
Hay tres parámetros de configuración para el complemento.
key
: Campo obligatorio, el valor de la clave secreta aleatoria. El usuario necesita proporcionar una clave aleatoria.expires
: Opcional, el tiempo de expiración de la clave secreta aleatoria, el valor predeterminado es 7200 segundos. Dado que el token CSRF se envía al cliente mediante una Cookie, esta configuración se coloca en la configuración de la Cookie para controlar el tiempo de expiración de la Cookie. Además, el complemento también calculará el tiempo para determinar si el token ha expirado.name
: Opcional, el nombre del token CSRF, el valor predeterminado esapisix-csrf-token
.
Enviar una Solicitud
Primero se accede a la ruta utilizando una solicitud POST
.
curl -i http://127.0.0.1:9080/hello -X POST
Apache APISIX interceptará la solicitud y devolverá un error 401
. En la cabecera devuelta encontrará una Cookie configurada, que debería ser el valor predeterminado apisix-csrf-token=....
dentro de la Cookie si no se ha configurado el campo name
del complemento. Este es el token CSRF generado por el complemento CSRF. En la solicitud, debe asegurarse de que la solicitud lleve esta Cookie y que el token esté escrito en la cabecera de la solicitud.
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"}
Ejemplo de uso de JavaScript en el lado del cliente: leer Cookies usando js-cookie
y enviar solicitudes usando axios
.
const token = Cookie.get('apisix-csrf-token');
const instance = axios.create({
headers: {'apisix-csrf-token': token}
});
Si el token en la Cookie no coincide con el token en la cabecera de la solicitud, la solicitud será interceptada por el complemento csrf
, como se muestra en el siguiente ejemplo.
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"}
Finalmente, use curl
para verificar el acceso regular.
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
Internamente, el complemento necesita verificar que el token en la Cookie coincida con el token llevado en la cabecera de la solicitud y recalcular la firma para verificar que el token sea válido.
Desactivar el Complemento
Elimine la información de configuración relevante para el complemento csrf
y luego envíe una solicitud para actualizar la ruta y desactivar el complemento.
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
}
}
}'
Resumen
Este artículo describe en detalle cómo funciona el complemento csrf
y cómo usarlo. Esperamos que este artículo le brinde una comprensión más clara sobre el uso del complemento para interceptar ataques CSRF en Apache APISIX y facilite su aplicación en escenarios prácticos.
Apache APISIX también está trabajando actualmente en complementos adicionales para admitir la integración de servicios adicionales, por lo que si está interesado, no dude en iniciar una discusión en GitHub Discussion, o comunicarse a través de la lista de correo.