Service Bus åtkomstkontroll med signaturer för delad åtkomst

Den här artikeln beskriver signaturer för delad åtkomst (SAS), hur de fungerar och hur du använder dem på ett plattformsoberoende sätt.

SAS skyddar åtkomsten till Service Bus baserat på auktoriseringsregler. De konfigureras antingen på ett namnområde eller en meddelandeentitet (kö eller ämne). En auktoriseringsregel har ett namn, är associerad med specifika rättigheter och har ett par kryptografiska nycklar. Du kan använda regelns namn och nyckel via Service Bus SDK eller i din egen kod för att generera en SAS-token. En klient kan sedan skicka token till Service Bus att bevisa auktoriseringen för den begärda åtgärden.

Anteckning

Azure Service Bus har stöd för auktorisering av åtkomst Service Bus ett namnområde och dess entiteter med Azure Active Directory (Azure AD). Auktorisering av användare eller program med OAuth 2.0-token som returneras av Azure AD ger överlägsen säkerhet och användarvänlighet över signaturer för delad åtkomst (SAS). Med Azure AD behöver du inte lagra token i din kod och riskera potentiella säkerhetsrisker.

Microsoft rekommenderar att du använder Azure AD med dina Azure Service Bus program när det är möjligt. Mer information finns i följande artiklar:

Översikt över SAS

Signaturer för delad åtkomst är en anspråksbaserad auktoriseringsmekanism som använder enkla token. Med hjälp av SAS skickas aldrig nycklar på kabeln. Nycklar används för att kryptografiskt signera information som senare kan verifieras av tjänsten. SAS kan användas på liknande sätt som ett schema för användarnamn och lösenord där klienten har omedelbar tillgång till ett auktoriseringsregelnamn och en matchande nyckel. SAS kan också användas på liknande sätt som en federerad säkerhetsmodell, där klienten får en tidsbegränsad och signerad åtkomsttoken från en säkerhetstokentjänst utan att någon gång behöva ha signeringsnyckeln.

SAS-autentisering Service Bus konfigureras med namngivna auktoriseringsprinciper för delad åtkomst med associerade åtkomsträttigheter och ett par primära och sekundära kryptografiska nycklar. Nycklarna är 256-bitarsvärden i Base64-representationen. Du kan konfigurera regler på namnområdesnivå, i Service Bus köer och ämnen.

Token för signatur för delad åtkomst innehåller namnet på den valda auktoriseringsprincipen, URI:n för resursen som ska nås, ett utgångsdatum omedelbart och en kryptografisk HMAC-SHA256-signatur som beräknas över dessa fält med antingen den primära eller sekundära kryptografiska nyckeln för den valda auktoriseringsregeln.

Auktoriseringsprinciper för delad åtkomst

Varje Service Bus och varje entitet Service Bus har en princip för auktorisering för delad åtkomst som består av regler. Principen på namnområdesnivå gäller för alla entiteter i namnområdet, oavsett deras enskilda principkonfiguration.

För varje auktoriseringsprincipregel bestämmer du dig för tre uppgifter: namn, omfång och rättigheter. Namnet är just det; ett unikt namn inom det omfånget. Omfånget är tillräckligt enkelt: det är URI:en för resursen i fråga. För ett Service Bus-namnområde är omfånget det fullständigt kvalificerade namnområdet, till exempel https://<yournamespace>.servicebus.windows.net/ .

Rättigheter som omfattas av principregeln kan vara en kombination av:

  • "Skicka" – det vill säga rättigheten att skicka meddelanden till entiteten
  • "Lyssna" – Ger rätt att ta emot (kö, prenumerationer) och all relaterad meddelandehantering
  • "Hantera" – Rättigheten att hantera namnområdets topologi, inklusive att skapa och ta bort entiteter

Rättigheten "Hantera" innehåller behörigheterna "Skicka" och "Ta emot".

En namnområdes- eller entitetsprincip kan innehålla upp till 12 regler för auktorisering för delad åtkomst, vilket ger utrymme för tre uppsättningar regler som var och en täcker grundläggande rättigheter och kombinationen av Skicka och lyssna. Den här gränsen visar att SAS-principlagret inte är avsett att vara ett användar- eller tjänstkontoarkiv. Om ditt program behöver bevilja åtkomst till Service Bus baserat på användar- eller tjänstidentiteter bör det implementera en säkerhetstokentjänst som utfärdar SAS-token efter en autentisering och åtkomstkontroll.

En auktoriseringsregel tilldelas en primärnyckel och en sekundär nyckel. Det här är kryptografiskt starka nycklar. Tappa inte bort dem eller läck dem – de kommer alltid att vara tillgängliga i Azure Portal. Du kan använda någon av de genererade nycklarna och du kan återskapa dem när som helst. Om du återskapar eller ändrar en nyckel i principen blir alla tidigare utfärdade token baserade på den nyckeln omedelbart ogiltiga. Pågående anslutningar som skapats baserat på sådana token fortsätter dock att fungera tills token upphör att gälla.

När du skapar Service Bus namnområdet skapas automatiskt en principregel med namnet RootManageSharedAccessKey för namnområdet. Den här principen har hantera behörigheter för hela namnområdet. Vi rekommenderar att du behandlar den här regeln som ett administrativt rotkonto och inte använder den i ditt program. Du kan skapa ytterligare principregler på fliken Konfigurera för namnområdet i portalen via PowerShell eller Azure CLI.

Metodtips när du använder SAS

När du använder signaturer för delad åtkomst i dina program måste du vara medveten om två potentiella risker:

  • Om en SAS läcks kan den användas av alla som får den, vilket potentiellt kan äventyra dina Service Bus resurser.
  • Om en SAS som tillhandahålls till ett klientprogram upphör att gälla och programmet inte kan hämta en ny SAS från tjänsten kan programmets funktioner hindras.

Följande rekommendationer för att använda signaturer för delad åtkomst kan hjälpa dig att minska dessa risker:

  • Låt klienterna förnya SAS automatiskt om det behövs: Klienterna bör förnya SAS i en bra tid innan den upphör att gälla, för att ge tid för återförsök om tjänsten som tillhandahåller SAS inte är tillgänglig. Om din SAS är avsedd att användas för ett litet antal omedelbara, kortvariga åtgärder som förväntas slutföras inom förfalloperioden, kan det vara onödigt eftersom SAS inte förväntas förnyas. Men om du har en klient som regelbundet gör begäranden via SAS gäller risken för förfallotid. Det viktigaste att beakta är att balansera behovet av att SAS är kortvarigt (som tidigare nämnts) med behovet av att säkerställa att klienten begär förnyelse tillräckligt tidigt (för att undvika avbrott på grund av att SAS upphör att gälla innan en lyckad förnyelse).
  • Var försiktig med SAS-starttiden: Om du anger starttiden för SAS till nu kan fel observeras tillfälligt under de första minuterna på grund av klockfördrång (skillnader i aktuell tid beroende på olika datorer). I allmänhet anger du starttiden till minst 15 minuter i det förflutna. Eller ange den inte alls, vilket gör den giltig direkt i samtliga fall. Samma gäller vanligtvis även för förfallotiden. Kom ihåg att du kan observera upp till 15 minuters fördrurning i endera riktningen på en begäran.
  • Var specifik för den resurs som ska användas: En bra säkerhetspraxis är att ge användaren minsta nödvändiga behörigheter. Om en användare bara behöver läsbehörighet till en enda entitet ger du dem läsbehörighet till den enda entiteten och inte läs-/skriv-/borttagningsåtkomst till alla entiteter. Det hjälper också till att minska skadorna om en SAS komprometteras eftersom SAS har mindre kraft i händerna på en angripare.
  • Använd inte alltid SAS: Ibland uppväger riskerna som är associerade med en viss åtgärd Event Hubs fördelarna med SAS. För sådana åtgärder skapar du en mellannivåtjänst som skriver till Event Hubs efter validering, autentisering och granskning av affärsregel.
  • Använd alltid HTTPs: Använd alltid Https för att skapa eller distribuera en SAS. Om en SAS skickas via HTTP och fångas upp kan en angripare som utför en man-in-the-middle-anslutning läsa SAS:en och sedan använda den precis som den avsedda användaren kan ha gjort, potentiellt äventyra känsliga data eller tillåta att data skadas av den skadliga användaren.

Konfiguration för autentisering med signatur för delad åtkomst

Du kan konfigurera auktoriseringsprincipen för delad åtkomst Service Bus för namnområden, köer eller ämnen. Konfiguration av den på Service Bus prenumeration stöds för närvarande inte, men du kan använda regler som konfigurerats på ett namnområde eller ämne för att skydda åtkomsten till prenumerationer.

SAS

I den här bilden gäller auktoriseringsreglerna manageRuleNS, sendRuleNS och listenRuleNS för både kön Q1 och ämnet T1, medan listenRuleQ och sendRuleQ endast gäller för kön Q1 och sendRuleT gäller endast för ämnet T1.

Generera en token för signatur för delad åtkomst

Alla klienter som har åtkomst till namnet på en auktoriseringsregel och en av dess signeringsnycklar kan generera en SAS-token. Token genereras genom att skapa en sträng i följande format:

SharedAccessSignature sig=<signature-string>&se=<expiry>&skn=<keyName>&sr=<URL-encoded-resourceURI>
  • se – Token upphör att gälla direkt. Heltal återspeglar sekunder sedan epoken den 1 januari 00:00:00 UTC 1970 (UNIX epok) när token upphör att gälla.

  • skn – Namnet på auktoriseringsregeln.

  • sr – URL-kodad URI för den resurs som används.

  • sig – URL-kodad HMACSHA256-signatur. Hash-beräkningen liknar följande pseudokod och returnerar base64 av binära råutdata.

    urlencode(base64(hmacsha256(urlencode('https://<yournamespace>.servicebus.windows.net/') + "\n" + '<expiry instant>', '<signing key>')))
    

Viktigt

Exempel på hur du genererar en SAS-token med olika programmeringsspråk finns i Generera SAS-token.

Token innehåller icke-hashvärdena så att mottagaren kan kompilera om hashen med samma parametrar, vilket verifierar att utfärdaren har en giltig signeringsnyckel.

Resurs-URI är den fullständiga URI:en Service Bus resurs som åtkomsten begärts till. Till exempel eller http://<namespace>.servicebus.windows.net/<entityPath> ; det vill säga sb://<namespace>.servicebus.windows.net/<entityPath> http://contoso.servicebus.windows.net/contosoTopics/T1/Subscriptions/S3 .

URI:en måste vara procentkodad.

Auktoriseringsregeln för delad åtkomst som används för signering måste konfigureras på den entitet som anges av denna URI, eller av någon av dess hierarkiska föräldrar. Till exempel http://contoso.servicebus.windows.net/contosoTopics/T1 eller i föregående http://contoso.servicebus.windows.net exempel.

En SAS-token är giltig för alla resurser med prefixet <resourceURI> som används i signature-string .

Återskapa nycklar

Vi rekommenderar att du regelbundet återskapar de nycklar som används i auktoriseringsprincipen för delad åtkomst. De primära och sekundära nyckelfacken finns så att du kan rotera nycklar gradvis. Om ditt program vanligtvis använder den primära nyckeln kan du kopiera primärnyckeln till den sekundära nyckelplatsen och först sedan återskapa den primära nyckeln. Det nya primärnyckelvärdet kan sedan konfigureras i klientprogrammen, som har fortsatt åtkomst med hjälp av den gamla primärnyckeln på den sekundära platsen. När alla klienter har uppdaterats kan du återskapa den sekundära nyckeln för att slutligen dra tillbaka den gamla primära nyckeln.

Om du vet eller misstänker att en nyckel har komprometterats och du måste återkalla nycklarna kan du återskapa både den primära nyckeln och den sekundära nyckeln för en auktoriseringsprincip för delad åtkomst genom att ersätta dem med nya nycklar. Den här proceduren gör alla token signerade med de gamla nycklarna ogiltiga.

Autentisering med signatur för delad åtkomst med Service Bus

Scenariot som beskrivs nedan omfattar konfiguration av auktoriseringsregler, generering av SAS-token och klientauktorisering.

Ett exempel på ett program Service Bus som illustrerarkonfigurationen och använder SAS-auktorisering finns i Autentisering med signatur för delad åtkomst med Service Bus .

Åtkomst till auktoriseringsregler för delad åtkomst för en entitet

Använd åtgärden get/update i köer eller ämnen i i hanteringsbiblioteken för att Service Bus åtkomst till/uppdatera motsvarande auktoriseringsregler för delad åtkomst. Du kan också lägga till regler när du skapar köer eller ämnen med hjälp av dessa bibliotek.

Använda auktorisering för signatur för delad åtkomst

Program som använder något av Service Bus SDK:n på något av de språk som stöds officiellt, till exempel .NET, Java, JavaScript och Python, kan använda SAS-auktorisering via anslutningssträngarna som skickas till klientkonstruktorn.

Anslutningssträngar kan innehålla ett regelnamn (SharedAccessKeyName) och regelnyckel (SharedAccessKey) eller en tidigare utfärdad token (SharedAccessSignature). När de finns i anslutningssträngen som skickas till en konstruktor eller fabriksmetod som accepterar en anslutningssträng, skapas och fylls SAS-tokenprovidern i automatiskt.

Om du vill använda SAS-Service Bus prenumerationer kan du använda SAS-nycklar som konfigurerats på en Service Bus eller i ett ämne.

Använd signaturen för delad åtkomst (på HTTP-nivå)

Nu när du vet hur du skapar signaturer för delad åtkomst för alla entiteter i Service Bus, är du redo att utföra en HTTP POST:

POST https://<yournamespace>.servicebus.windows.net/<yourentity>/messages
Content-Type: application/json
Authorization: SharedAccessSignature sr=https%3A%2F%2F<yournamespace>.servicebus.windows.net%2F<yourentity>&sig=<yoursignature from code above>&se=1438205742&skn=KeyName
ContentType: application/atom+xml;type=entry;charset=utf-8

Kom ihåg att detta fungerar för allt. Du kan skapa SAS för en kö, ett ämne eller en prenumeration.

Om du ger en avsändare eller klient en SAS-token har de inte nyckeln direkt och de kan inte återställa hashen för att hämta den. Därför har du kontroll över vad de kan komma åt och hur länge. En viktig sak att komma ihåg är att om du ändrar den primära nyckeln i principen ogiltigförklaras eventuella signaturer för delad åtkomst som skapats från den.

Använd signaturen för delad åtkomst (på AMQP-nivå)

I föregående avsnitt såg du hur du använder SAS-token med en HTTP POST-begäran för att skicka data till Service Bus. Som du vet kan du komma Service Bus med hjälp av Advanced Message Queueing Protocol (AMQP) som är det föredragna protokollet att använda av prestandaskäl, i många scenarier. SAS-tokenanvändningen med AMQP beskrivs i dokumentet AMQP Claim-Based Security Version 1.0 som är i arbetsutkast sedan 2013 men som stöds av Azure i dag.

Innan du börjar skicka data till Service Bus måste utgivaren skicka SAS-token i ett AMQP-meddelande till en väldefinierad AMQP-nod med namnet $cbs (du kan se den som en "särskild" kö som används av tjänsten för att hämta och validera alla SAS-token). Utgivaren måste ange fältet ReplyTo i AMQP-meddelandet. Det här är den nod där tjänsten svarar utgivaren med resultatet av tokenverifieringen (ett enkelt mönster för begäran/svar mellan utgivare och tjänst). Den här svarsnoden skapas "i farten" och talar om "dynamiskt skapande av fjärrnod" enligt beskrivningen i AMQP 1.0-specifikationen. När du har kontrollerat att SAS-token är giltig kan utgivaren gå vidare och börja skicka data till tjänsten.

Följande steg visar hur du skickar SAS-token med AMQP-protokollet med hjälp av AMQP.NET Lite. Detta är användbart om du inte kan använda den officiella Service Bus SDK (till exempel på WinRT, .NET Compact Framework, .NET Micro Framework och Mono) som utvecklas i C # . Det här biblioteket är naturligtvis användbart för att förstå hur anspråksbaserad säkerhet fungerar på AMQP-nivå, som du såg hur det fungerar på HTTP-nivå (med en HTTP POST-begäran och SAS-token som skickas i rubriken "Authorization" (Auktorisering). Om du inte behöver så djupgående kunskap om AMQP kan du använda den officiella Service Bus SDK:n på något av de språk som stöds, till exempel .NET, Java, JavaScript, Python och Go, vilket gör det åt dig.

C#

/// <summary>
/// Send claim-based security (CBS) token
/// </summary>
/// <param name="shareAccessSignature">Shared access signature (token) to send</param>
private bool PutCbsToken(Connection connection, string sasToken)
{
    bool result = true;
    Session session = new Session(connection);

    string cbsClientAddress = "cbs-client-reply-to";
    var cbsSender = new SenderLink(session, "cbs-sender", "$cbs");
    var cbsReceiver = new ReceiverLink(session, cbsClientAddress, "$cbs");

    // construct the put-token message
    var request = new Message(sasToken);
    request.Properties = new Properties();
    request.Properties.MessageId = Guid.NewGuid().ToString();
    request.Properties.ReplyTo = cbsClientAddress;
    request.ApplicationProperties = new ApplicationProperties();
    request.ApplicationProperties["operation"] = "put-token";
    request.ApplicationProperties["type"] = "servicebus.windows.net:sastoken";
    request.ApplicationProperties["name"] = Fx.Format("amqp://{0}/{1}", sbNamespace, entity);
    cbsSender.Send(request);

    // receive the response
    var response = cbsReceiver.Receive();
    if (response == null || response.Properties == null || response.ApplicationProperties == null)
    {
        result = false;
    }
    else
    {
        int statusCode = (int)response.ApplicationProperties["status-code"];
        if (statusCode != (int)HttpStatusCode.Accepted && statusCode != (int)HttpStatusCode.OK)
        {
            result = false;
        }
    }

    // the sender/receiver may be kept open for refreshing tokens
    cbsSender.Close();
    cbsReceiver.Close();
    session.Close();

    return result;
}

Metoden tar emot anslutningen (AMQP-anslutningsklassinstansen som tillhandahålls av PutCbsToken() AMQP .NET Lite-biblioteket) som representerar TCP-anslutningen till tjänsten och den sasToken-parameter som är den SAS-token som ska skickas.

Anteckning

Det är viktigt att anslutningen skapas med SASL-autentiseringsmekanismen inställd på ANONYM (och inte standardvärdet PLAIN med användarnamn och lösenord som används när du inte behöver skicka SAS-token).

Därefter skapar utgivaren två AMQP-länkar för att skicka SAS-token och ta emot svaret (tokenvalideringsresultatet) från tjänsten.

AMQP-meddelandet innehåller en uppsättning egenskaper och mer information än ett enkelt meddelande. SAS-token är brödtexten i meddelandet (med hjälp av dess konstruktor). Egenskapen "ReplyTo" är inställd på nodnamnet för att ta emot valideringsresultatet på mottagarlänken (du kan ändra dess namn om du vill och det skapas dynamiskt av tjänsten). De sista tre program-/anpassade egenskaperna används av tjänsten för att ange vilken typ av åtgärd den måste köra. Enligt beskrivningen av CBS-utkastspecifikationen måste de vara åtgärdsnamnet ("put-token"), typen av token (i det här fallet en ) och "namnet" för målgruppen som token gäller servicebus.windows.net:sastoken för (hela entiteten).

När du har skickat SAS-token på avsändarlänken måste utgivaren läsa svaret på mottagarlänken. Svaret är ett enkelt AMQP-meddelande med en programegenskap med namnet "status-code" som kan innehålla samma värden som en HTTP-statuskod.

Rättigheter som krävs för Service Bus åtgärder

I följande tabell visas de åtkomsträttigheter som krävs för olika åtgärder på Service Bus resurser.

Åtgärd Anspråk krävs Anspråksomfång
Namnområde
Konfigurera auktoriseringsregel för ett namnområde Hantera Valfri namnrymdsadress
Service Registry
Räkna upp privata principer Hantera Valfri namnrymdsadress
Börja lyssna på ett namnområde Lyssna Valfri namnrymdsadress
Skicka meddelanden till en lyssnare i ett namnområde Skicka Valfri namnrymdsadress
Skapa en kö Hantera Valfri namnrymdsadress
Ta bort en kö Hantera Valfri giltig köadress
Räkna upp köer Hantera /$Resources/Queues
Hämta köbeskrivningen Hantera Valfri giltig köadress
Konfigurera auktoriseringsregel för en kö Hantera Valfri giltig köadress
Skicka till kön Skicka Valfri giltig köadress
Ta emot meddelanden från en kö Lyssna Valfri giltig köadress
Avbryta eller slutföra meddelanden när du har tagit emot meddelandet i peek-lock-läge Lyssna Valfri giltig köadress
Skjuta upp ett meddelande för senare hämtning Lyssna Valfri giltig köadress
Deadletter – ett meddelande Lyssna Valfri giltig köadress
Hämta det tillstånd som är associerat med en meddelandekösession Lyssna Valfri giltig köadress
Ange det tillstånd som är associerat med en meddelandekösession Lyssna Valfri giltig köadress
Schemalägga ett meddelande för senare leverans Lyssna Valfri giltig köadress
Avsnitt
Skapa ett ämne Hantera Valfri namnrymdsadress
Ta bort ett ämne Hantera Valfri giltig ämnesadress
Räkna upp ämnen Hantera /$Resources/Ämnen
Hämta ämnesbeskrivningen Hantera Valfri giltig ämnesadress
Konfigurera auktoriseringsregel för ett ämne Hantera Valfri giltig ämnesadress
Skicka till ämnet Skicka Valfri giltig ämnesadress
Prenumeration
Skapa en prenumeration Hantera Valfri namnrymdsadress
Ta bort prenumeration Hantera .. /myTopic/Subscriptions/mySubscription
Räkna upp prenumerationer Hantera .. /myTopic/Subscriptions
Hämta prenumerationsbeskrivning Hantera .. /myTopic/Subscriptions/mySubscription
Avbryta eller slutföra meddelanden när du har tagit emot meddelandet i peek-lock-läge Lyssna .. /myTopic/Subscriptions/mySubscription
Skjuta upp ett meddelande för senare hämtning Lyssna .. /myTopic/Subscriptions/mySubscription
Deadletter – ett meddelande Lyssna .. /myTopic/Subscriptions/mySubscription
Hämta tillståndet som är associerat med en ämnessession Lyssna .. /myTopic/Subscriptions/mySubscription
Ange det tillstånd som är associerat med en ämnessession Lyssna .. /myTopic/Subscriptions/mySubscription
Regler
Skapa en regel Lyssna .. /myTopic/Subscriptions/mySubscription
Ta bort en regel Lyssna .. /myTopic/Subscriptions/mySubscription
Räkna upp regler Hantera eller lyssna .. /myTopic/Subscriptions/mySubscription/Rules

Nästa steg

I följande ämnen kan du lära dig mer om Service Bus-meddelanden.