Panoramica sull’autenticazione di Hub eventi e sul modello di protezioneEvent Hubs authentication and security model overview

Il modello di sicurezza di Hub eventi di Azure soddisfa i requisiti seguenti:The Azure Event Hubs security model meets the following requirements:

  • Solo i client che presentano le credenziali valide possono inviare dati a un hub eventi.Only clients that present valid credentials can send data to an event hub.
  • Un client non può rappresentare un altro client.A client cannot impersonate another client.
  • A un client non autorizzato può essere impedito l'invio di dati a un hub eventi.A rogue client can be blocked from sending data to an event hub.

Autenticazione clientClient authentication

Il modello di sicurezza di Hub eventi si basa su una combinazione di token di firma di accesso condiviso e autori di eventi.The Event Hubs security model is based on a combination of Shared Access Signature (SAS) tokens and event publishers. Un autore di eventi definisce un endpoint virtuale per un hub eventi.An event publisher defines a virtual endpoint for an event hub. L'autore è utilizzabile solo per inviare messaggi a un hub eventi.The publisher can only be used to send messages to an event hub. Non è possibile ricevere messaggi da un autore.It is not possible to receive messages from a publisher.

In genere, un Hub eventi usa un autore per ogni client.Typically, an event hub employs one publisher per client. Tutti i messaggi inviati a uno qualsiasi degli autori di un Hub eventi vengono accodati all'interno di tale Hub eventi.All messages that are sent to any of the publishers of an event hub are enqueued within that event hub. Gli autori consentono la limitazione e il controllo di accesso con granularità fine.Publishers enable fine-grained access control and throttling.

A ogni client di Hub eventi viene assegnato un token univoco, che viene caricato nel client.Each Event Hubs client is assigned a unique token, which is uploaded to the client. I token vengono prodotti in modo tale che ogni token univoco conceda l'accesso a un diverso autore univoco.The tokens are produced such that each unique token grants access to a different unique publisher. Un client che possiede un token può inviare a un solo autore e a nessun altro autore.A client that possesses a token can only send to one publisher, but no other publisher. Se più client condividono lo stesso token, ognuno di essi condivide un autore.If multiple clients share the same token, then each of them shares a publisher.

Sebbene non sia consigliato, è possibile dotare i dispositivi di token che concedono l'accesso diretto a un Hub eventi.Although not recommended, it is possible to equip devices with tokens that grant direct access to an event hub. Qualsiasi dispositivo che contiene un token di questo tipo può inviare messaggi direttamente a tale hub eventi.Any device that holds this token can send messages directly into that event hub. Tale dispositivo non sarà soggetto alla limitazione.Such a device will not be subject to throttling. Non è possibile disattivare l'invio a tale Hub eventi per il dispositivo.Furthermore, the device cannot be blacklisted from sending to that event hub.

Tutti i token sono firmati con una chiave SAS.All tokens are signed with a SAS key. In genere, tutti i token sono firmati con la stessa chiave.Typically, all tokens are signed with the same key. I client non conoscono la chiave, per cui altri client non possono produrre token.Clients are not aware of the key; this prevents other clients from manufacturing tokens.

Creare la chiave SASCreate the SAS key

Quando si crea uno spazio dei nomi di Hub eventi, il servizio genera automaticamente una chiave di firma di accesso condiviso a 256 bit denominata RootManageSharedAccessKey.When creating an Event Hubs namespace, the service automatically generates a 256-bit SAS key named RootManageSharedAccessKey. Questa regola ha una coppia associata di chiavi primaria e secondaria che concedono i diritti di invio, ascolto e gestione per lo spazio dei nomi.This rule has an associated pair of primary and secondary keys that grant send, listen, and manage rights to the namespace. È anche possibile creare chiavi aggiuntive.You can also create additional keys. Si consiglia di produrre una chiave che concede le autorizzazioni di invio allo specifico Hub eventi.It is recommended that you produce a key that grants send permissions to the specific event hub. Nella parte restante di questo argomento si presuppone che questa chiave sia denominata EventHubSendKey.For the remainder of this topic, it is assumed that you named this key EventHubSendKey.

Nell'esempio seguente viene creata una chiave di solo invio durante la creazione dell'Hub eventi:The following example creates a send-only key when creating the event hub:

// Create namespace manager.
string serviceNamespace = "YOUR_NAMESPACE";
string namespaceManageKeyName = "RootManageSharedAccessKey";
string namespaceManageKey = "YOUR_ROOT_MANAGE_SHARED_ACCESS_KEY";
Uri uri = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, string.Empty);
TokenProvider td = TokenProvider.CreateSharedAccessSignatureTokenProvider(namespaceManageKeyName, namespaceManageKey);
NamespaceManager nm = new NamespaceManager(namespaceUri, namespaceManageTokenProvider);

// Create event hub with a SAS rule that enables sending to that event hub
EventHubDescription ed = new EventHubDescription("MY_EVENT_HUB") { PartitionCount = 32 };
string eventHubSendKeyName = "EventHubSendKey";
string eventHubSendKey = SharedAccessAuthorizationRule.GenerateRandomKey();
SharedAccessAuthorizationRule eventHubSendRule = new SharedAccessAuthorizationRule(eventHubSendKeyName, eventHubSendKey, new[] { AccessRights.Send });
ed.Authorization.Add(eventHubSendRule); 
nm.CreateEventHub(ed);

Generare tokenGenerate tokens

È possibile generare token utilizzando la chiave SAS.You can generate tokens using the SAS key. È necessario ottenere solo un token per client.You must produce only one token per client. È possibile produrre token utilizzando il metodo riportato di seguito.Tokens can then be produced using the following method. Tutti i token vengono generati utilizzando la chiave EventHubSendKey .All tokens are generated using the EventHubSendKey key. A ogni token viene assegnato un URI univoco.Each token is assigned a unique URI.

public static string SharedAccessSignatureTokenProvider.GetSharedAccessSignature(string keyName, string sharedAccessKey, string resource, TimeSpan tokenTimeToLive)

Quando si chiama questo metodo, l'URI deve essere specificato come //<NAMESPACE>.servicebus.windows.net/<EVENT_HUB_NAME>/publishers/<PUBLISHER_NAME>.When calling this method, the URI should be specified as //<NAMESPACE>.servicebus.windows.net/<EVENT_HUB_NAME>/publishers/<PUBLISHER_NAME>. Per tutti i token l'URI è identico, ad eccezione di PUBLISHER_NAME, che deve essere diverso per ogni token.For all tokens, the URI is identical, with the exception of PUBLISHER_NAME, which should be different for each token. In teoria, PUBLISHER_NAME rappresenta l'ID del client che riceve il token.Ideally, PUBLISHER_NAME represents the ID of the client that receives that token.

Questo metodo genera un token con la struttura seguente:This method generates a token with the following structure:

SharedAccessSignature sr={URI}&sig={HMAC_SHA256_SIGNATURE}&se={EXPIRATION_TIME}&skn={KEY_NAME}

L'ora di scadenza del token è espressa in secondi dal 1 gennaio 1970.The token expiration time is specified in seconds from Jan 1, 1970. Di seguito è riportato un esempio di token:The following is an example of a token:

SharedAccessSignature sr=contoso&sig=nPzdNN%2Gli0ifrfJwaK4mkK0RqAB%2byJUlt%2bGFmBHG77A%3d&se=1403130337&skn=RootManageSharedAccessKey

In genere, i token hanno una durata simile o superiore a quella del client.Typically, the tokens have a lifespan that resembles or exceeds the lifespan of the client. Se il client è in grado di ottenere un nuovo token, è possibile usare token con una durata più breve.If the client has the capability to obtain a new token, tokens with a shorter lifespan can be used.

Invio di datiSending data

Dopo avere creato i token, viene eseguito il provisioning di ogni client con il proprio token univoco.Once the tokens have been created, each client is provisioned with its own unique token.

Quando il client invia dati a un hub eventi, contrassegna la richiesta di invio con il token.When the client sends data into an event hub, it tags its send request with the token. Per evitare che un utente malintenzionato intercetti e rubi il token, la comunicazione tra il client e l'Hub eventi deve verificarsi su un canale crittografato.To prevent an attacker from eavesdropping and stealing the token, the communication between the client and the event hub must occur over an encrypted channel.

Disattivazione dei clientBlacklisting clients

In caso di furto di un token da parte di un utente malintenzionato, l'autore dell'attacco può rappresentare il client il cui token è stato rubato.If a token is stolen by an attacker, the attacker can impersonate the client whose token has been stolen. La disattivazione di un client rende il rendering di tale client inutilizzabile fino a che non riceve un nuovo token che usa un autore diverso.Blacklisting a client renders that client unusable until it receives a new token that uses a different publisher.

Autenticazione delle applicazioni back-endAuthentication of back-end applications

Per autenticare le applicazioni back-end che usano i dati generati dai client di Hub eventi, Hub eventi usa un modello di sicurezza simile al modello usato per gli argomenti del bus di servizio.To authenticate back-end applications that consume the data generated by Event Hubs clients, Event Hubs employs a security model that is similar to the model that is used for Service Bus topics. Un gruppo di consumer di Hub eventi equivale a una sottoscrizione a un argomento del bus di servizio.An Event Hubs consumer group is equivalent to a subscription to a Service Bus topic. Un client può creare un gruppo di consumer se la richiesta di creazione è accompagnata da un token che concede privilegi di gestione per l'hub eventi o per lo spazio dei nomi a cui appartiene l'hub eventi.A client can create a consumer group if the request to create the consumer group is accompanied by a token that grants manage privileges for the event hub, or for the namespace to which the event hub belongs. Un client può usare dati di un gruppo di consumer se la richiesta di ricezione è accompagnata da un token che concede i diritti di ricezione in tale gruppo di consumer, l'Hub eventi o lo spazio dei nomi a cui appartiene l'Hub eventi.A client is allowed to consume data from a consumer group if the receive request is accompanied by a token that grants receive rights on that consumer group, the event hub, or the namespace to which the event hub belongs.

La versione corrente del bus di servizio non supporta regole di firma di accesso condiviso per sottoscrizioni singole.The current version of Service Bus does not support SAS rules for individual subscriptions. Lo stesso vale per i gruppi di consumer di Hub eventi.The same holds true for Event Hubs consumer groups. In futuro verrà aggiunto il supporto SAS per entrambe le funzionalità.SAS support will be added for both features in the future.

In assenza di autenticazione SAS per gruppi di consumer singoli, è possibile utilizzare chiavi SAS per proteggere tutti i gruppi di consumer con una chiave comune.In the absence of SAS authentication for individual consumer groups, you can use SAS keys to secure all consumer groups with a common key. Questo approccio consente a un'applicazione di usare dati di tutti i gruppi di consumer di un Hub eventi.This approach enables an application to consume data from any of the consumer groups of an event hub.

Passaggi successiviNext steps

Per altre informazioni su Hub eventi, vedere gli argomenti seguenti:To learn more about Event Hubs, visit the following topics: