SAS: O que é e como usar no Armazenamento do Azure
Published: 2024-03-08 16:05:54

Neste artigo vamos falar sobre o SAS e como usar o mesmo no serviço de Armazenamento do Azure.

**O que é uma SAS?**

SAS (Signature Access Shared) ou Assinatura de Acesso Compartilhado é um URI (Identificador de Recurso Uniforme), que concede direitos de acesso a um recurso, conta ou serviço. O uso de SAS é para atender os cenários onde é necessário fornecer um acesso para os clientes a determinados recursos por um período especificado de tempo e com um conjunto pré-definido de permissões.

Uma SAS fornece um controle granular sobre que tipo de acesso você concede aos clientes que tem uma SAS. Se você definiu uma SAS a nível de conta pode delegar acesso a um ou diversos serviços de Armazenamento no Azure. É possível definir uma duração para a SAS. A SAS no nível de serviço delega acesso em um recurso de um dos serviços de Armazenamento do Azure apenas. 

E por fim, a SAS de delegação de usuário se aplica apenas ao armazenamento de blobs, ela é protegida com as credenciais do Microsoft Entra e também pelas permissões definidas na SAS.
No momento ainda não se tem suporte para políticas de acesso armazenadas em uma SAS de conta.


**Criando uma SAS de Conta**


Para criar uma SAS de conta precisamos ter em mente os cuidados com a mesma, então as recomendações de uso de uma chave se aplica a uma SAS, usando discrição para distribuir uma SAS e um plano de contigência em caso de comprometimento de uma SAS. Use apenas conexões HTTPS para as operações de uso da SAS e defina tempo de duração da SAS para garantir que em caso de vazamento, os invasores tenham acesso por tempo limitado.
Proteja a SAS de conta com uma chave de conta de armazenamento, ao criar uma SAS lembre-se de garantir que o aplicativo cliente tenha a chave de conta correspondente.

O URI da SAS de conta tem nele o URI do recurso para qual você deseja fornecer acesso, seguido de um token SAS. O token SAS é uma cadeia de caracteres que inclui as informações para autorizar uma solicitação ao recurso desejado. Ele especifica o serviço, o recurso e as permissões configuradas para o acesso e o tempo de validade da assinatura.

A seguir iremos ver os parâmetros para o token SAS.:

✔ **Opcionais.:** api-version, SignedStart (st), SignedIP (sip), SignedProtocol (spr), SignedEncryptionScope (ses).

✔ **Obrigatórios.:** SignedVersion(sv), SignedResourceTypes (srt), SignedServices (ss), SignedPermissions (sp), SignedExpiry (se), Signature (sig).

Dentro os campos obrigatórios, é importante especificar o campo SignedVersion (sv), pois ele contém a versão de serviço da assinatura de acesso compartilhado. Logo ele especifica a versão da autorização de chave compartilhada, apontada no campo Signature. Desde 04/2015 o campo opcional SignedIP especifica um endereço IP público ou um intervalo de endereços IP públicos dos quais aceitar solicitações. Lembrando que este campo só suporta a versão IPv4.

Assim como o campo SignedIP, o campo opcional SignedProtocol (spr) permite definir o protocolo permitido para a solicitação feita via SAS. No caso as opções são HTTPS, HTTP ou somente HTTPS.
Desde 12/2020 é possível também definir o tipo de criptografia a ser utilizada para criptografar o conteúdo da solicitação.


**Construindo a cadeia de caracteres de assinatura para uma SAS**


A SAS de conta necessita ter uma cadeia de caracteres de assinatura, então é necessário primeiro construir a cadeia de caracteres para assinar os campos que compõem a solicitação e em seguida, construa a cadeia de caracteres como UTF-8 e compute a assinatura usando o algoritmo HMAC-SHA256. ATENÇÃO.: Os campos incluídos na cadeia de caracteres a assinar devem ser decodificados por URL.

A seguir iremos ver dois exemplos, um baseado na versão disponível até 11/2020 e um na versão lançada em 12/2020.

✔ **Exemplo versão até 11/2020.:**

```
StringToSign = accountname + "\n" +  
    signedpermissions + "\n" +  
    signedservice + "\n" +  
    signedresourcetype + "\n" +  
    signedstart + "\n" +  
    signedexpiry + "\n" +  
    signedIP + "\n" +  
    signedProtocol + "\n" +  
    signedversion + "\n"
```

✔ **Exemplo versão 12/2020, nesta foi adicionado o suporte ao campo de escopo de criptografia assinado, que é opcional.:**

```
StringToSign = accountname + "\n" +  
    signedpermissions + "\n" +  
    signedservice + "\n" +  
    signedresourcetype + "\n" +  
    signedstart + "\n" +  
    signedexpiry + "\n" +  
    signedIP + "\n" +  
    signedProtocol + "\n" +  
    signedversion + "\n" +
    signedEncryptionScope + "\n"
```

Então um exemplo de URI de SAS de conta ficaria assim para um URI de serviço Blob com um token SAS de conta acrescentado a ele.:

https://blobsamples.blob.core.windows.net/?sv=2022-11-02&ss=b&srt=sco&sp=rwlc&se=2023-05-24T09:51:36Z&st=2023-05-24T01:51:36Z&spr=https&sig=<signature>


Vamos detalhar a seguir o que cada um faz.:


✔**URI de recurso.:** O ponto de extremidade de serviço, com parâmetros para obter propriedade de serviço (quando chamado com GET) ou definir propriedades de serviço (quando chamado com SET). Com base no valor do campo serviços assinados (ss), essa SAS pode ser usada com o Armazenamento de Blobs ou Arquivos do Azure.
**Parte SAS.:** https://myaccount.blob.core.windows.net/?restype=service&comp=properties

✔**Delimitador.:** O delimitador que precede a cadeia de caracteres de consulta. O delimitador não pertence ao token SAS.
**Parte SAS.:** ?

✔**Versão dos serviços de armazenamento.:** Para os serviços de Armazenamento do Azure a partir de 12/2012 e posteriores, esse parâmetro indica qual versão usar.
**Parte SAS.:** sv=2022-11-02

✔**Serviços.:** A SAS do exemplo se aplica aos serviços de Blob.
**Parte SAS.:** ss=b

✔**Tipos de recurso.:** A SAS de exemplo se aplica a operação no nível de serviço, no nível do contêiner e no nível do objeto.
**Parte SAS.:** srt=sco

✔**Permissões.:** As permissões concedem acesso a operações de leitura, gravação, lista e criação no exemplo de SAS que usamos.
**Parte SAS.:** rwlc

✔**Hora de início.:** Especificado no horário UTC no exemplo utilizado. É possível deixar a SAS válida imediatamente omitindo este campo.
**Parte SAS.:** st=2023-05-24T01:51:36Z

✔**Hora de expiração.:** Assim como a hora de início, é especificado no horário UTC.
**Parte SAS.:** se=2023-05-24T09:51:36Z

✔**Protocolo.:** Somente solicitações que usam HTTPS são permitidas no exemplo acima.
**Parte SAS.:** sp=https

✔**Assinatura.:** A assinatura é usada para autorizar o acesso ao blob, ela é um HMAC calculado em uma cadeia de caracteres para assinar uma chave usando o algoritmo de criptografia SHA256 e codificando usando a codificação Base64.
**Parte SAS.:** sig=<signature>

Neste exemplo os acessos estão restritas ao nível de serviço, então as operações permitidas são.: Obter Propriedades do Serviço Blob (leitura) e Definir Propriedades do Serviço Blob (gravação). 

Neste exemplo, se usar um URI de recurso diferente junto com o mesmo token SAS pode-se também ter acesso a operação Obter status do serviço Blob (leitura).
Assim mostramos o que é uma SAS e como criar uma SAS de conta para uso num recurso dentro do Armazenamento do Azure.



**Referências.:**


https://learn.microsoft.com/pt-br/training/modules/configure-storage-security/3-create-shared-access-signatures

https://learn.microsoft.com/pt-br/rest/api/storageservices/create-account-sas

https://learn.microsoft.com/pt-br/rest/api/storageservices/create-service-sas

https://learn.microsoft.com/pt-br/training/modules/configure-storage-security/4-identify-uri-sas-parameters

https://learn.microsoft.com/pt-br/azure/storage/blobs/storage-blob-user-delegation-sas-create-cli

https://learn.microsoft.com/pt-br/rest/api/storageservices/delegate-access-with-shared-access-signature

https://learn.microsoft.com/pt-br/azure/storage/common/storage-sas-overview