Skydda OAuth 2.0 On-Behalf-Of-uppdateringstoken för webbtjänster

Azure CLIs
Azure DevOps
Azure Functions
Azure Key Vault
Azure Pipelines

När du utvecklar webbtjänster kan du behöva hämta token med hjälp av OAuth 2.0 On-Behalf-Of-flödet (OBO). OBO-flödet hanterar användningsfallet där ett program anropar en tjänst eller ett webb-API, som i sin tur måste anropa en annan tjänst eller ett annat webb-API. OBO sprider den delegerade användaridentiteten och behörigheterna via begärandekedjan. När ett program behöver använda åtkomst- och uppdateringstoken på obestämd tid, vanligtvis i offlineåtkomstscenarier, är det viktigt att lagra uppdateringstoken på ett säkert sätt.

Varning

Överväg noggrant risken och ansvaret för att lagra säkerhetstoken, eftersom dessa token kan ge en obehörig aktör åtkomst till resurser som skyddas av organisationens Microsoft Entra-ID. Ett säkerhetsintrång för ett program som riktar sig mot konton i en organisationskatalog (alla Microsoft Entra-kataloger – multitenanter) kan vara särskilt katastrofalt.

Lagring av åtkomsttoken utgör en större säkerhetsrisk eftersom en åtkomsttoken i sig själv kan komma åt resurser. Den rekommenderade metoden är inte att lagra åtkomsttoken, utan hämta åtkomsttoken efter behov. Lagra endast uppdateringstoken på ett säkert sätt, med lika mycket stränghet som om de vore åtkomsttoken.

Om det behövs kan du återkalla uppdateringstoken om de komprometteras.

Potentiella användningsfall

Den här lösningen använder Azure Key Vault, Azure Functions och Azure DevOps för att på ett säkert sätt uppdatera och lagra OBO-uppdateringstoken.

Arkitektur

Diagram som visar processerna för nyckel- och tokenuppdatering.

Ladda ned en Visio-fil med den här arkitekturen.

Dataflöde

Azure Pipelines är en praktisk plats för att lägga till din nyckelrotationsstrategi om du redan använder Pipelines för infrastruktur som kod (IaC) eller kontinuerlig integrering och leverans (CI/CD). Du behöver inte använda Azure Pipelines så länge du begränsar sökvägarna för att ange och hämta hemligheter.

Använd följande princip för att tillåta att tjänstens huvudnamn för din Azure DevOps-tjänstanslutning anger hemligheter i Key Vault. Ersätt variablerna <Key Vault Name> och <Service Connection Principal> med rätt värden för din miljö.

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

När du har konfigurerat Azure Pipelines för att skapa och uppdatera nycklar kan du schemalägga pipelinen så att den körs regelbundet. Pipelinen uppdaterar Key Vault-hemligheten så att den synkroniseras med nyckelrotation och sparar den krypterade token med den nya hemliga versionen. Mer information finns i Konfigurera scheman för pipelines.

Hanterad identitet

Det bästa sättet för en Azure-tjänst som Azure Functions att komma åt Key Vault är att använda tjänstens hanterade identitet. Du kan bevilja åtkomst via Azure-portalen, Azure CLI eller via en ARM-mall (Azure Resource Manager) för IaC-scenarier.

Azure Portal

I Azure-portalen lägger du till en Key Vault-åtkomstprincip så att Azure Functions-hanterade identitetsobjekt-ID :t kan hämta och ange hemligheter. Mer information finns i Lägga till en systemtilldelad identitet och Använda Key Vault-referenser för App Service och Azure Functions.

Skärmbild som visar hur du aktiverar hanterad identitet i Azure-portalen.

Azure CLI

Du kan också ange Azure Key Vault-princip med hjälp av 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-mall

Följande ARM-mall ger Azure Functions åtkomst till Azure Key Vault. Ersätt variablerna *** med rätt värden för din miljö.

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

Tokenlagring

Du kan använda valfri databas för att lagra token i krypterat format. Följande diagram visar sekvensen för att lagra uppdateringstoken i en databas:

Diagram som visar sekvensen lägg till token.

Sekvensen har två funktioner och userId()secretId(). Du kan definiera dessa funktioner som en kombination av token.oid, token.tidoch token.sub. Mer information finns i Använda id_token.

Med den kryptografiska nyckeln lagrad som en hemlighet kan du leta upp den senaste versionen av nyckeln i Azure Key Vault.

Tokenanvändning

Det är enkelt att använda nyckeln. Följande sekvens frågar nyckeln baserat på den senaste nyckelversionen.

Diagram som visar den lagrade tokenanvändningssekvensen.

Tokenuppdateringen DoWork är ortoggonisk för funktionen, så Azure Functions kan utföra DoWork och tokenuppdatering asynkront med hjälp av Durable Functions. Mer information om HTTP-utlösta funktioner med Durable Functions finns i HTTP-funktioner.

Vi rekommenderar inte att du använder Azure Key Vault i HTTP-begärandepipelinen, så cachesvar när det är rimligt. I exemplet är Key Vaults svar på anropet getSecret(secretId, secretVersion) cachelagrat.

Nyckelrotation och tokenuppdatering

Du kan rotera den hemliga nyckeln samtidigt som du uppdaterar uppdateringstoken, så att den senaste token krypteras med den senaste versionen av krypteringshemligheten. Den här processen använder det inbyggda Azure Functions-stödet för timerutlösare. Mer information finns i Timer-utlösare för Azure Functions.

Följande sekvensdiagram illustrerar processen för att synkronisera tokenuppdateringen med nyckelrotationen:

Diagram som visar sekvensen för uppdatering av synkroniseringstoken med nyckelrotation.

Användar- och åtkomstkontroll

Microsofts identitetsplattform ger möjlighet att återkalla uppdateringstoken vid komprometterande. Se Tokenåterkallning och Revoke-AzureADUserAllRefreshToken.

Kommentar

Azure AD- och MSOnline PowerShell-moduler är inaktuella från och med den 30 mars 2024. Mer information finns i utfasningsuppdateringen. Efter det här datumet är stödet för dessa moduler begränsat till migreringshjälp till Microsoft Graph PowerShell SDK och säkerhetskorrigeringar. De inaktuella modulerna fortsätter att fungera till och med mars 30 2025.

Vi rekommenderar att du migrerar till Microsoft Graph PowerShell för att interagera med Microsoft Entra-ID (tidigare Azure AD). Vanliga migreringsfrågor finns i Vanliga frågor och svar om migrering. Obs! Versioner 1.0.x av MSOnline kan uppleva störningar efter den 30 juni 2024.

Ta bort en användare från Microsoft Entra-ID genom att ta bort användarens post. Om du vill ta bort programåtkomst per användare tar du bort delen refreshToken av användardata.

Om du vill ta bort åtkomst för en grupp användare, till exempel alla användare i en målklientorganisation, kan du använda Azure Pipelines för att ta bort gruppens hemlighet baserat på secretId().

Deltagare

Den här artikeln underhålls av Microsoft. Det har ursprungligen skrivits av följande medarbetare.

Huvudförfattare:

Nästa steg