Usar assinaturas de acesso compartilhado para delegar acesso ao Armazenamento do Azure

Concluído

Pelo uso de uma SAS (assinatura de acesso compartilhado), você pode delegar acesso aos seus recursos. Os clientes não têm acesso direto às suas credenciais de conta de armazenamento e, em um nível granular, você controla o que eles acessam.

Depois de investigar todas as opções de autorização, você examinará a SAS mais detalhadamente. Você deseja criar e usar um SAS em um aplicativo Web .NET em C#. Você também gostaria de seguir as práticas recomendadas da Microsoft sobre quando e como usar uma SAS.

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

Como as assinaturas de acesso compartilhado funcionam

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.

Em um ú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, você pode separar o URI do token SAS da seguinte maneira:

URI Token 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 Descrição
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 (listar), 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.
se hora de expiração se=2020-01-20T19:42:32Z A data e hora em que o acesso termina. Com base na data de início, este exemplo concede oito horas de acesso.
spr protocolo assinado spr=https O protocolo permitido para uma solicitação feita com a SAS. Um campo opcional que tem valores possíveis 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 escopo do recurso sr=b O tipo de armazenamento que está sendo acessado. Os valores disponíveis incluem b (blob), c (contêiner), d (diretório), f (arquivo), s (compartilhamento)
sig assinatura sig=SrW1...wVZs%3D A assinatura criptográfica.

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

Criar uma SAS no .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 fornecedor que precisa de acesso às 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 em C#.

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

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

Recuperar o blob para o qual você gostaria de criar um token SAS e crie um BlobClient

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

Criar um objeto BlobSasBuilder para o blob que você usa para gerar o token 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);

Autenticar uma 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 os riscos potenciais de usar uma SAS, a Microsoft fornece algumas diretrizes de melhores práticas:

  • Para distribuir com segurança uma SAS e impedir ataques man-in-the-middle, sempre use HTTPS.
  • A SAS mais segura é a de delegação de usuário. Use-a sempre que possível, pois ela elimina a necessidade de armazenar sua chave de conta de armazenamento no código. O Microsoft Entra ID deve ser usado para gerenciar credenciais; essa opção pode não ser possível para a sua solução.
  • Tente definir o tempo de término para o menor valor útil. Se uma chave SAS for comprometida, ela só poderá ser explorada por um curto período.
  • Aplique a regra de privilégios mínimos necessários. Permita somente o acesso necessário. Por exemplo, em seu aplicativo, o acesso somente leitura é suficiente.
  • Há algumas situações em que uma SAS não é a solução correta. Quando houver um risco inaceitável de usar uma SAS, crie um serviço de nível intermediário para gerenciar os usuários e acesso deles ao armazenamento.

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