Utilizar assinaturas de acesso partilhado para delegar o acesso ao Armazenamento do Azure

Concluído

Pode delegar o acesso aos recursos através de uma assinatura de acesso partilhado (SAS). Os clientes não tem acesso direto às credenciais da sua conta de armazenamento e, a um nível granular, detém o controlo dos conteúdos aos quais acedem.

Depois de investigar todas as opções de autorização, decide analisar uma SAS de modo mais aprofundado. Você deseja criar e usar uma SAS em um aplicativo Web C# .NET. Também quer seguir as melhores práticas da Microsoft sobre quando e como utilizar uma SAS.

Nesta unidade, você analisa como um SAS funciona em um nível técnico e qual código C# você deve escrever para usá-lo.

Como funcionam as assinaturas de acesso partilhado

Uma SAS tem dois componentes: um URI que aponta para um ou mais recursos de armazenamento e um token que indica como o cliente pode acessar os recursos.

Num único URI, como https://medicalrecords.blob.core.windows.net/patient-images/patient-116139-nq8z7f.jpg?sp=r&st=2020-01-20T11:42:32Z&se=2020-01-20T19:42:32Z&spr=https&sv=2019-02-02&sr=b&sig=SrW1HZ5Nb6MbRzTbXCaPm%2BJiSEn15tC91Y4umMPwVZs%3D, pode separar o URI do token de SAS da seguinte forma:

URI Token de SAS
https://medicalrecords.blob.core.windows.net/patient-images/patient-116139-nq8z7f.jpg? sp=r&st=2020-01-20T11:42:32Z&se=2020-01-20T19:42:32Z&spr=https&sv=2019-02-02&sr=b&sig=SrW1HZ5Nb6MbRzTbXCaPm%2BJiSEn15tC91Y4umMPwVZs%3D

O token SAS contém os seguintes componentes ou parâmetros de consulta.

Parâmetro de consulta Nome do Campo Exemplo Description
sp permissão assinada sp=r Indica uma ou mais operações que o cliente pode executar. Os valores podem ser compostos: a (adicionar), c (criar), d (excluir), l (lista), r (ler) e w (gravar). sp=r é somente leitura; sp=acdlrw concede todos os direitos disponíveis.
st hora de início st=2020-01-20T11:42:32Z A data e hora em que o acesso é iniciado.
origens de dados Prazo de validade se=2020-01-20T19:42:32Z A data e hora em que o acesso é terminado. Com base na data de início, este exemplo concede oito horas de acesso.
RPS protocolo assinado spr=https O protocolo permitia um pedido feito com o SAS. Um campo opcional que tem valores possíveis de HTTPS e HTTP (o valor padrão) ou somente HTTPS.
sv versão assinada sv=2019-02-02 A versão de serviço da API de armazenamento a ser usada.
SR Âmbito do recurso sr=b O tipo de armazenamento a ser acedido. Os valores disponíveis incluem b (blob), c (container), d (directory), f (file), s (share)
sig assinatura sig=SrW1... wVZs%3D A assinatura criptográfica.

A assinatura é assinada com a chave da conta de armazenamento quando você cria uma assinatura de acesso compartilhado de serviço ou conta. Se você usar uma entidade de segurança do Microsoft Entra com acesso ao armazenamento, criará uma assinatura de acesso compartilhado de delegação de usuário. Também concede ao principal a ação Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey.

Criar uma SAS em .NET

Como sua empresa fornece acesso a terceiros, você não pode usar o Microsoft Entra ID para criar entidades de serviço para cada terceiro que exija acesso a imagens médicas. Seu aplicativo usa uma chave de conta de armazenamento para cada arquivo individual. As etapas a seguir mostram como criar uma SAS usando código C#.

Criar um cliente de contêiner de blob para se conectar à conta de armazenamento no Azure

BlobContainerClient container = new BlobContainerClient( "ConnectionString", "Container" );

Obtenha o blob para o qual pretende criar um token de SAS e crie um BlobClient

foreach (BlobItem blobItem in container.GetBlobs())
{
    BlobClient blob = container.GetBlobClient(blobItem.Name);
}

Crie um objeto BlobSasBuilder para o blob que irá utilizar para gerar o token de SAS

BlobSasBuilder sas = new BlobSasBuilder
{
    BlobContainerName = blob.BlobContainerName,
    BlobName = blob.Name,
    Resource = "b",
    ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(1)
};

// Allow read access
sas.SetPermissions(BlobSasPermissions.Read);

Autentique a chamada para o método ToSasQueryParameters do objeto BlobSasBuilder

StorageSharedKeyCredential storageSharedKeyCredential = new StorageSharedKeyCredential( "AccountName", "AccountKey");

sasToken = sas.ToSasQueryParameters(storageSharedKeyCredential).ToString();

Melhores práticas

Para reduzir potenciais riscos da utilização de uma SAS, a Microsoft fornece alguma orientação:

  • Para distribuir um SAS com segurança e ajudar a evitar ataques man-in-the-middle, use sempre HTTPS.
  • A SAS mais segura é a delegação de usuários. Utilize-a sempre que possível, pois remove a necessidade de armazenar a chave da conta de armazenamento em código. O Microsoft Entra ID deve ser usado para gerenciar credenciais; Esta opção pode não ser possível para a sua solução.
  • Experimente definir a hora de expiração para o valor útil mais baixo. Se uma chave de SAS for comprometida, poderá ser explorada apenas durante um curto espaço de tempo.
  • Aplique a regra de privilégios mínimos necessários. Conceda apenas o acesso que é necessário. Por exemplo, na sua aplicação, o acesso só de leitura é suficiente.
  • Existem algumas situações onde uma SAS não é a solução correta. Quando existir um risco inaceitável na utilização de uma SAS, crie um serviço de camada intermediária para gerir os utilizadores e o respetivo acesso ao armazenamento.

A forma mais flexível e segura de utilizar uma SAS de conta ou serviço é associar os tokens de SAS a uma política de acesso armazenada. Em uma unidade posterior, você explora esses benefícios e como eles funcionam.