Utilizar assinaturas de acesso partilhado para delegar o acesso ao Armazenamento do Azure
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.