Apache APISIX verbessert die API-Sicherheit mit dem CSRF-Plugin
API7.ai
February 23, 2022
Der entscheidende Punkt beim Starten eines CSRF-Angriffs (Cross-Site Request Forgery) besteht darin, den Zielserver dazu zu bringen, nicht unterscheiden zu können, ob die Quelle vieler Anfragen ein echter Benutzer oder ein Angreifer ist. Der allgemeine Ablauf des Angriffs ist, dass der Angreifer den Benutzer zunächst dazu verleitet, zu einer vom Angreifer bereitgestellten Webseite zu navigieren. Diese Seite enthält eine Anfrage, die automatisch an den Zielserver gesendet wird. Die Seite lädt dann normal und die Anfrage wird automatisch an den Server gesendet. Für den Server sieht es so aus, als ob die Anfrage genau dieselbe ist wie die normalerweise vom Benutzer gesendete Anfrage, ohne zu bemerken, dass sie vom Angreifer ohne das Wissen des Benutzers initiiert wurde. Da die Anfrage einige der Anmeldeinformationen des Benutzers enthält, kann der Angreifer durch das Parsen dieser Anmeldeinformationen Zugriff auf die Informationen des Benutzers erhalten und so ein Sicherheitsrisiko schaffen.
Dieser Artikel stellt csrf
, das CSRF-Sicherheits-Plugin für Apache APISIX, vor und erläutert detailliert, wie Sie Ihre API-Informationen in Apache APISIX mit Hilfe des csrf
-Plugins sichern können.
Plugin-Einführung
Das csrf
-Plugin basiert auf dem Double Submit Cookie
-Schema. Wie in RFC 7231#section-4.2.1 definiert, betrachten wir die Methoden GET
, HEAD
und OPTIONS
als sichere Methoden. Gemäß dieser Konvention lässt das csrf
-Plugin diese drei Methoden direkt passieren, überprüft jedoch die anderen Methoden und blockiert unsichere Anfragen.
Um CSRF-Angriffe abzuwehren, müssen wir ein Token oder einen Identifikator erstellen, der nicht gefälscht werden kann, und sicherstellen, dass dieser nicht mit der Anfrage des Angreifers gesendet wird. Der Benutzer muss das Token, auf das das csrf
-Plugin angewiesen ist, im Anfrage-Header mitführen, und das Token wird mit einem Schlüssel zur Signierung berechnet. Dies stellt sicher, dass das Token nicht von anderen gefälscht werden kann und somit die API sicher ist.
Wenn das csrf
-Plugin in einer Route aktiviert ist, enthalten alle Anfrageantworten für diese Route ein Cookie, das ein csrf token
trägt.
Der Benutzer muss dieses Cookie in einer unsicheren Anfrage für diese Route mitführen und ein zusätzliches Feld im Anfrage-Header hinzufügen, um den Inhalt des Cookies zu tragen. Das Feld ist der name
-Wert in der Plugin-Konfiguration, sodass die Anfrage die Überprüfung des CSRF-Plugins besteht.
Der Benutzer stellt einen zufälligen Schlüssel in der Plugin-Konfiguration bereit, der vom Plugin verwendet wird, um die Token-Informationen mit einem SHA-256-Hash zu verschlüsseln und ein CSRF-Token zu generieren, wodurch sichergestellt wird, dass das Token nicht gefälscht werden kann.
Verwendung des Plugins
Aktivieren des CSRF-Plugins in einer Route
Erstellen Sie eine Route in APISIX mit der Admin-API und aktivieren Sie das csrf-Plugin.
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
}
}
}'
Es gibt drei Konfigurationsparameter für das Plugin.
key
: Erforderliches Feld, der Wert des zufälligen Geheimschlüssels. Der Benutzer muss einen zufälligen Schlüssel bereitstellen.expires
: Optional, die Ablaufzeit des zufälligen Geheimschlüssels, der Standardwert ist 7200 Sekunden. Da das CSRF-Token mit einem Cookie an den Client gesendet wird, wird diese Konfiguration in der Cookie-Konfiguration platziert, um die Ablaufzeit des Cookies zu steuern. Darüber hinaus berechnet das Plugin auch die Zeit, um festzustellen, ob das Token abgelaufen ist.name
: Optional, der Name des CSRF-Tokens, der Standardwert istapisix-csrf-token
.
Senden einer Anfrage
Die Route wird zunächst mit einer POST
-Anfrage aufgerufen.
curl -i http://127.0.0.1:9080/hello -X POST
Apache APISIX wird die Anfrage abfangen und einen 401
-Fehler zurückgeben. In der zurückgegebenen Header-Information finden Sie ein gesetztes Cookie, das den Standardwert apisix-csrf-token=....
enthält, wenn das name
-Feld des Plugins nicht konfiguriert ist. Dies ist das CSRF-Token, das vom CSRF-Plugin generiert wurde. In der Anfrage müssen Sie sicherstellen, dass die Anfrage dieses Cookie mitführt und dass das Token im Anfrage-Header geschrieben ist.
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"}
Beispiel für die Verwendung von JavaScript auf der Client-Seite: Lesen von Cookies mit js-cookie
und Senden von Anfragen mit axios
.
const token = Cookie.get('apisix-csrf-token');
const instance = axios.create({
headers: {'apisix-csrf-token': token}
});
Wenn das Token im Cookie nicht mit dem Token im Anfrage-Header übereinstimmt, wird die Anfrage vom csrf
-Plugin abgefangen, wie im folgenden Beispiel gezeigt.
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"}
Schließlich wird curl
verwendet, um den regulären Zugriff zu überprüfen.
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
Intern muss das Plugin überprüfen, ob das Token im Cookie mit dem im Anfrage-Header mitgeführten Token übereinstimmt und die Signatur neu berechnen, um sicherzustellen, dass das Token gültig ist.
Deaktivieren des Plugins
Entfernen Sie die relevanten Konfigurationsinformationen für das csrf
-Plugin und senden Sie dann eine Anfrage, um die Route zu aktualisieren und das Plugin zu deaktivieren.
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
}
}
}'
Zusammenfassung
Dieser Artikel beschreibt detailliert, wie das csrf
-Plugin funktioniert und wie es verwendet wird. Wir hoffen, dass dieser Artikel Ihnen ein klareres Verständnis dafür vermitteln kann, wie Sie das Plugin verwenden können, um CSRF-Angriffe in Apache APISIX abzufangen, und seine Anwendung in praktischen Szenarien erleichtert.
Apache APISIX arbeitet derzeit auch an zusätzlichen Plugins, um die Integration zusätzlicher Dienste zu unterstützen. Wenn Sie interessiert sind, können Sie gerne eine Diskussion in GitHub Discussion starten oder über die Mailing-Liste kommunizieren.