Beveiligde OAuth 2.0 OBO-vernieuwingstokens voor webservices

Azure CLIs
Azure DevOps
Azure Functions
Azure Key Vault
Azure Pipelines

Bij het ontwikkelen van webservices moet u mogelijk tokens ophalen met behulp van de OAuth 2.0 On-Behalf-Of-stroom (OBO). De OBO-stroom dient de use case waarbij een toepassing een service of web-API aanroept, die op zijn beurt een andere service of web-API moet aanroepen. OBO doorgeeft de gedelegeerde gebruikersidentiteit en machtigingen via de aanvraagketen. Wanneer een toepassing voor onbepaalde tijd toegangs- en vernieuwingstokens moet gebruiken, meestal in scenario's voor offlinetoegang, is het essentieel om de vernieuwingstokens veilig op te slaan.

Waarschuwing

Houd zorgvuldig rekening met het risico en de verantwoordelijkheid voor het opslaan van beveiligingstokens, omdat deze tokens een kwaadwillende actor toegang kunnen geven tot resources die worden beveiligd door de Microsoft Entra-id van de organisatie. Een beveiligingsschending van een toepassing die is gericht op accounts in elke organisatiedirectory (Elke Microsoft Entra-directory - Multitenant) kan met name een ramp zijn.

Het opslaan van toegangstokens vormt een groter beveiligingsrisico, omdat een toegangstoken op en van zichzelf toegang heeft tot resources. De aanbevolen methode is niet om toegangstokens op te slaan, maar de toegangstokens indien nodig op te halen. Sla alleen de vernieuwingstokens veilig op, met zo veel rigor alsof ze toegangstokens waren.

Indien nodig kunt u vernieuwingstokens intrekken als ze worden aangetast.

Potentiƫle gebruikscases

Deze oplossing maakt gebruik van Azure Key Vault, Azure Functions en Azure DevOps om OBO-vernieuwingstokens veilig bij te werken en op te slaan.

Architectuur

Diagram met de processen voor sleutel- en tokenvernieuwing.

Een Visio-bestand van deze architectuur downloaden.

Gegevensstroom

Azure Pipelines is een handige plek om uw strategie voor sleutelrotatie toe te voegen, als u pijplijnen al gebruikt voor infrastructure-as-code (IaC) of continue integratie en levering (CI/CD). U hoeft Azure Pipelines niet te gebruiken, zolang u de paden voor het instellen en ophalen van geheimen beperkt.

Pas het volgende beleid toe om de service-principal voor uw Azure DevOps-serviceverbinding toe te staan om geheimen in Key Vault in te stellen. Vervang de <Key Vault Name> en <Service Connection Principal> variabelen door de juiste waarden voor uw omgeving.

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

Nadat u Azure Pipelines hebt ingesteld om sleutels te maken en bij te werken, kunt u plannen dat de pijplijn periodiek wordt uitgevoerd. De pijplijn werkt het Key Vault-geheim bij om te synchroniseren met sleutelrotatie en slaat het versleutelde token op met de nieuwe geheime versie. Zie Planningen configureren voor pijplijnen voor meer informatie.

Beheerde identiteit

De voorkeursmethode voor een Azure-service zoals Azure Functions voor toegang tot Key Vault is het gebruik van de beheerde identiteit van de service. U kunt toegang verlenen via Azure Portal, Azure CLI of via een ARM-sjabloon (Azure Resource Manager) voor IaC-scenario's.

Azure Portal

Voeg in Azure Portal een Key Vault-toegangsbeleid toe om de object-id van de beheerde identiteit van Azure Functions toe te staan om geheimen op te halen en in te stellen. Zie Een door het systeem toegewezen identiteit toevoegen en Key Vault-verwijzingen voor App Service en Azure Functions gebruiken voor meer informatie.

Schermopname van het inschakelen van een beheerde identiteit in Azure Portal.

Azure-CLI

U kunt ook Azure Key Vault-beleid instellen met behulp van de Azure CLI:

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-sjabloon

De volgende ARM-sjabloon biedt Azure Functions toegang tot Azure Key Vault. Vervang de *** variabelen door de juiste waarden voor uw omgeving.

{
  "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"
          ]
        }
      }
    ]
  }
}

Tokenopslag

U kunt elke database gebruiken om de tokens op te slaan in versleutelde vorm. In het volgende diagram ziet u de volgorde voor het opslaan van vernieuwingstokens in een database:

Diagram met de reeks token toevoegen.

De reeks heeft twee functies en userId()secretId(). U kunt deze functies definiƫren als een combinatie van token.oid, token.tiden token.sub. Zie De id_token gebruiken voor meer informatie.

Met de cryptografische sleutel die is opgeslagen als geheim, kunt u de nieuwste versie van de sleutel opzoeken in Azure Key Vault.

Tokengebruik

Het gebruik van de sleutel is eenvoudig. De volgende reeks voert een query uit op de sleutel op basis van de meest recente sleutelversie.

Diagram met de opgeslagen gebruiksreeks voor tokens.

Het vernieuwen van het token is orthogonaal voor de DoWork functie, zodat Azure Functions asynchroon kan worden vernieuwd DoWork en tokenvernieuwt met behulp van Durable Functions. Zie HTTP-functies voor meer informatie over door HTTP geactiveerde functies met Durable Functions.

Het wordt afgeraden Om Azure Key Vault te gebruiken in de HTTP-aanvraagpijplijn, dus cachereacties wanneer dit redelijk is. In het voorbeeld kan het antwoord van Key Vault op de aanroep in de getSecret(secretId, secretVersion) cache worden opgeslagen.

Sleutelrotatie en token vernieuwen

U kunt de geheime sleutel tegelijkertijd roteren wanneer u het vernieuwingstoken vernieuwt, zodat het meest recente token wordt versleuteld met de nieuwste versie van het versleutelingsgeheim. Dit proces maakt gebruik van de ingebouwde Azure Functions-ondersteuning voor timertriggers. Zie Timertrigger voor Azure Functions voor meer informatie.

In het volgende sequentiediagram ziet u het proces voor het synchroniseren van het vernieuwen van het token met de sleutelrotatie:

Diagram met de volgorde van het synchroniseren van tokenvernieuwing met sleutelrotatie.

Gebruikers- en toegangsbeheer

Microsoft Identity Platform biedt de mogelijkheid om vernieuwingstokens in te trekken in geval van inbreuk. Zie Tokenintrekking en Revoke-AzureADUserAllRefreshToken.

Notitie

Azure AD- en MSOnline PowerShell-modules zijn vanaf 30 maart 2024 afgeschaft. Lees de afschaffingsupdate voor meer informatie. Na deze datum is ondersteuning voor deze modules beperkt tot migratieondersteuning voor Microsoft Graph PowerShell SDK en beveiligingsoplossingen. De afgeschafte modules blijven functioneren tot en met 30 maart 2025.

Het is raadzaam om te migreren naar Microsoft Graph PowerShell om te communiceren met Microsoft Entra ID (voorheen Azure AD). Raadpleeg de veelgestelde vragen over migratie voor veelgestelde vragen over migratie. Opmerking: versies 1.0.x van MSOnline kunnen na 30 juni 2024 onderbrekingen ondervinden.

Als u een gebruiker uit Microsoft Entra ID wilt verwijderen, verwijdert u de record van de gebruiker. Als u toepassingstoegang per gebruiker wilt verwijderen, verwijdert u het refreshToken deel van de gebruikersgegevens.

Als u de toegang voor een groep gebruikers, zoals alle gebruikers in een doeltenant, wilt verwijderen, kunt u Azure Pipelines gebruiken om het geheim van de groep te verwijderen op secretId()basis van.

Medewerkers

Dit artikel wordt onderhouden door Microsoft. De tekst is oorspronkelijk geschreven door de volgende Inzenders.

Hoofdauteur:

Volgende stappen