Bearbeiten

Absicherung von OAuth 2.0-On-Behalf-Of-Aktualisierungstoken für Webdienste

Azure CLIs
Azure DevOps
Azure-Funktionen
Azure-Schlüsseltresor
Azure Pipelines

Beim Entwickeln von Webdiensten müssen Sie möglicherweise Token über den OAuth 2.0-On-Behalf-Of-Fluss (OBO) abrufen. Der OBO-Fluss wird verwendet, wenn eine Anwendung einen Dienst oder eine Web-API aufruft, der bzw. die wiederum einen anderen Dienst oder eine andere Web-API aufrufen muss. Dabei werden die delegierte Benutzeridentität und die delegierten Berechtigungen durch die Anforderungskette weitergegeben. Wenn eine Anwendung Zugriffs- und Aktualisierungstoken unbegrenzt verwenden muss (in der Regel in Offlinezugriffsszenarios), ist wichtig, dass die Aktualisierungstoken sicher gespeichert werden.

Warnung

Stellen Sie sorgfältige Überlegungen hinsichtlich der Risiken und der Verantwortung in Bezug auf die Speicherung von Sicherheitstoken an, da diese Token böswilligen Akteuren Zugriff auf Ressourcen verschaffen können, die durch die Microsoft Entra ID-Instanz der Organisation geschützt werden. Eine Sicherheitsverletzung bei einer Anwendung, die Konten in einem beliebigen Organisationsverzeichnis (beliebiges Microsoft Entra-Verzeichnis – mehrinstanzenfähig) zum Ziel hat, kann besonders katastrophal sein.

Das Speichern von Zugriffstoken stellt ein höheres Sicherheitsrisiko dar, da Zugriffstoken dafür gedacht sind, auf Ressourcen zuzugreifen. Die empfohlene Vorgehensweise ist, Zugriffstoken nicht zu speichern, sondern bei Bedarf abzurufen. Speichern Sie nur die Aktualisierungstoken sicher, und seien Sie dabei so sorgfältig, als wären es Zugriffstoken.

Sofern erforderlich, können Sie Aktualisierungstoken widerrufen, wenn diese kompromittiert wurden.

Mögliche Anwendungsfälle

Diese Lösung verwendet Azure Key Vault, Azure Functions und Azure DevOps, um OBO-Aktualisierungstoken sicher zu aktualisieren und zu speichern.

Aufbau

Diagramm: Aktualisierungsprozess für Schlüssel und Token

Laden Sie eine Visio-Datei dieser Architektur herunter.

Datenfluss

  • In Azure Key Vault sind geheime Verschlüsselungsschlüssel für alle Microsoft Entra ID-Mandanten gespeichert.
  • Eine durch einen Timer ausgelöste Azure Functions-Funktion ruft den aktuellen geheimen Schlüssel aus Key Vault ab. Eine weitere Azure Functions-Funktion ruft das Aktualisierungstoken von der Microsoft Identity Platform ab und speichert es mit der aktuellen Version des geheimen Schlüssels.
  • Der aktuelle verschlüsselte Schlüssel und die opaken Daten werden in einer Datenbank gespeichert.
  • Eine Azure DevOps-Continuous-Delivery-Pipeline verwaltet und synchronisiert die Vorgänge für die Geheimnisrotation und die Tokenaktualisierung.

In Azure Pipelines können Sie einfach Ihre Schlüsselrotationsstrategie hinzufügen, wenn Sie bereits Pipelines für Infrastructure as Code (IaC) oder Continuous Integration und Continuous Delivery (CI/CD) verwenden. Sie müssen Azure Pipelines nicht verwenden, solange Sie die Pfade für das Festlegen und Abrufen von Geheimnissen beschränken.

Wenden Sie die folgende Richtlinie an, um ein Festlegen von Geheimnissen in Key Vault durch den Dienstprinzipal für Ihre Azure DevOps-Dienstverbindung zu erlauben. Ersetzen Sie die Variablen <Key Vault Name> und <Service Connection Principal> durch die richtigen Werte für Ihre Umgebung.

az keyvault set-policy --name $<Key Vault Name> --spn $<Service Connection Principal> --secret-permissions set

Wenn Sie Azure Pipelines zum Erstellen und Aktualisieren von Schlüsseln eingerichtet haben, können Sie die Pipeline so konfigurieren, dass sie regelmäßig ausgeführt wird. Die Pipeline aktualisiert das Key Vault-Geheimnis so, dass es mit der Schlüsselrotation synchronisiert wird, und speichert das verschlüsselte Token mit der neuen Version des Geheimnisses. Weitere Informationen finden Sie unter Konfigurieren von Zeitplänen für Pipelines.

Verwaltete Identität

Die bevorzugte Methode für den Zugriff eines Azure-Diensts wie Azure Functions auf Key Vault ist die Verwendung der verwalteten Identität des Diensts. Sie können den Zugriff über das Azure-Portal, die Azure CLI oder eine Azure Resource Manager-Vorlage (ARM) für IaC-Szenarios gewähren.

Azure-Portal

Fügen Sie im Azure-Portal eine Key Vault-Zugriffsrichtlinie hinzu, um die Objekt-ID der verwalteten Identität für Azure Functions für das Abrufen und Festlegen von Geheimnissen zuzulassen. Weitere Informationen finden Sie unter Hinzufügen einer systemseitig zugewiesenen Identität und Verwenden von Key Vault-Verweisen für App Service und Azure Functions.

Screenshot: Aktivieren einer verwalteten Identität im Azure-Portal

Azure CLI

Sie können die Azure Key Vault-Richtlinie auch über die Azure CLI festlegen:

az keyvault set-policy --name $<Key Vault Name> --spn $<Service Connection Principal> --secret-permissions set
az keyvault set-policy --name $<Key Vault Name> --spn $<Managed Identity Principal> --secret-permissions get

ARM-Vorlage

Die folgende Resource Manager-Vorlage gewährt Azure Functions Zugriff auf Azure Key Vault. Ersetzen Sie die Variable *** jeweils durch den richtigen Wert für Ihre Umgebung.

{
  "type": "Microsoft.KeyVault/vaults",
  "apiVersion": "2019-09-01",
  "name": "***",
  "location": "***",
  "properties": {
    "sku": {
      "family": "A",
      "name": "standard"
    },
    "tenantId": "***",
    "enableSoftDelete": true,
    "enabledForDeployment": false,
    "enabledForTemplateDeployment": false,
    "enabledForDiskEncryption": false,
    "accessPolicies": [
      {
        "tenantId": "***",
        "objectId": "<Managed Identity Principal>",
        "permissions": {
          "secrets": [
            "get"
          ]
        }
      },
      {
        "tenantId": "***",
        "objectId": "<Service Connection Principal>",
        "permissions": {
          "secrets": [
            "set"
          ]
        }
      }
    ]
  }
}

Speicherung von Token

Sie können eine beliebige Datenbank verwenden, um die Token in verschlüsselter Form zu speichern. Das folgende Diagramm zeigt die Sequenz für die Speicherung von Aktualisierungstoken in einer Datenbank:

Diagramm: Sequenz zum Hinzufügen eines Tokens

Die Sequenz verfügt über zwei Funktionen: userId() und secretId(). Sie können diese Funktionen als eine Kombination aus token.oid, token.tid und token.sub definieren. Weitere Informationen finden Sie unter Verwenden des ID-Tokens.

Wenn der Kryptografieschlüssel als Geheimnis gespeichert wurde, können Sie die jeweils aktuelle Version des Schlüssels in Azure Key Vault abrufen.

Verwendung von Token

Die Verwendung des Schlüssels ist einfach. Die folgende Sequenz fragt den Schlüssel basierend auf der jeweils aktuellen Schlüsselversion ab.

Diagramm: Sequenz für die Verwendung von gespeicherten Token

Die Tokenaktualisierung ist orthogonal zur DoWork-Funktion, sodass Azure Functions DoWork und die Tokenaktualisierung mithilfe von Durable Functions asynchron ausführen kann. Weitere Informationen zu durch HTTP ausgelösten Funktionen mit Durable Functions finden Sie unter HTTP-Features.

Es wird nicht empfohlen, Azure Key Vault in der HTTP-Anforderungspipeline zu verwenden. Speichern Sie Antworten daher immer zwischen, wenn dies sinnvoll ist. Im angeführten Beispiel ist die Antwort von Key Vault auf den Aufruf von getSecret(secretId, secretVersion) zwischenspeicherbar.

Schlüsselrotation und Tokenaktualisierung

Sie können den geheimen Schlüssel zu dem Zeitpunkt rotieren, zu dem Sie auch das Aktualisierungstoken aktualisieren, sodass das aktuelle Token mit der aktuellen Version des Verschlüsselungsgeheimnisses verschlüsselt wird. Bei diesem Prozess wird die in Azure Functions integrierte Unterstützung für Trigger mit Timer genutzt. Weitere Informationen finden Sie unter Trigger mit Timer für Azure Functions.

Das folgende Sequenzdiagramm veranschaulicht den Prozess der Synchronisierung der Tokenaktualisierung mit der Schlüsselrotation:

Diagramm: Sequenz für Synchronisierung der Tokenaktualisierung mit der Schlüsselrotation

Benutzer- und Zugriffssteuerung

Die Microsoft Identity Platform bietet die Möglichkeit, Aktualisierungstoken bei Kompromittierung zu widerrufen. Weitere Informationen finden Sie unter Widerrufen von Token und Revoke-AzureADUserAllRefreshToken.

Hinweis

Azure AD- und MSOnline PowerShell-Module sind ab dem 30. März 2024 veraltet. Weitere Informationen finden Sie im Update zur Unterstützungseinstellung. Nach diesem Datum wird die Unterstützung für diese Module auf die Migrationsunterstützung für das Microsoft Graph PowerShell-SDK und Sicherheitskorrekturen beschränkt. Die veralteten Module funktionieren weiterhin bis zum 30. März 2025.

Es wird empfohlen, für die Interaktion mit Microsoft Entra ID (früher Azure AD) zu Microsoft Graph PowerShell zu migrieren. Informationen zu allgemeinen Migrationsfragen finden Sie in den häufig gestellten Fragen zur Migration. Hinweis: Bei der Version 1.0.x von MSOnline können nach dem 30. Juni 2024 Unterbrechungen auftreten.

Wenn Sie eine*n Benutzer*in aus Azure AD entfernen möchten, entfernen Sie einfach den Datensatz für diese*n. Wenn Sie den Zugriff auf Anwendungen auf Benutzerbasis entfernen möchten, entfernen Sie den refreshToken-Teil der entsprechenden Benutzerdaten.

Zum Entfernen des Zugriffs für eine Gruppe von Benutzern (z. B. alle Benutzer in einem Zielmandanten) können Sie Azure Pipelines verwenden, um das Geheimnis der Gruppe basierend auf secretId() zu löschen.

Beitragende

Dieser Artikel wird von Microsoft gepflegt. Er wurde ursprünglich von folgenden Mitwirkenden geschrieben:

Hauptautor:

Nächste Schritte