Статьи

Хранилище Azure — улучшения подписи общего доступа

За последние несколько месяцев группа хранения Azure выпустила два основных обновления. Оба эти обновления включают в себя некоторые действительно интересные новые функции и улучшения. В число этих новых функций и улучшений входят изменения в функциональности подписи общего доступа (SAS). В облаке портам SAS играет действительно важную роль. Мы используем его везде, где можем, чтобы упростить прямую связь между браузером пользователя и его учетной записью хранения.

В этой записи блога я хочу обобщить изменения, внесенные в SAS в двух последних версиях. Я сгруппирую эти изменения по версиям библиотеки REST API / .Net Storage Storage Service.

REST API версии 2015-02-21 / .Net Storage Client Library версии 5.XX

В этом выпуске было сделано два основных изменения, когда речь заходит о SAS.

SAS для файловой службы

Начиная с этой версии вы можете создать SAS для файловой службы. Вы можете создать SAS для общего ресурса файловой службы, а также файлы внутри общего ресурса.

SAS для файловой службы работает так же, как SAS для службы BLOB-объектов. В Blob Service вы можете создать SAS с разрешениями «Чтение», «Запись», «Удалить» и «Список» для контейнера BLOB-объектов. Аналогично в файловой службе вы можете создать SAS с правами «Чтение», «Запись», «Удалить» и «Список» для общего ресурса. В Blob Service вы можете создать SAS с разрешениями «Чтение», «Запись» и «Удалить» для BLOB-объекта. Аналогично, в File Service вы можете создать SAS с правами «Чтение», «Запись» и «Удалить» для файла.

Вы также можете определить политику доступа для общего ресурса файловой службы и использовать эту политику доступа при создании SAS для общего ресурса или файла на этом общем ресурсе.

Некоторые примеры того, как создать SAS на ресурсах файловой службы, см. В моем блоге: http://gauravmantri.com/2015/08/17/whats-new-in-azure-storage/ .

«Канонизированный ресурс» Создание

Это было серьезное изменение, введенное в этой версии, и оно применимо только в том случае, если вы создаете токен SAS самостоятельно, не используя какую-либо клиентскую библиотеку. По сути, вы должны добавить имя службы (blob, table, queue или file) к канонизированному ресурсу.

REST API версии 2015-04-05 / .Net Storage Client Library версии 6.XX

В этом выпуске было сделано три основных изменения, когда речь идет о SAS.

IP-адрес / ограничение диапазона

Теперь при создании SAS вы можете ограничить использование SAS IP-адресом или диапазоном IP-адресов. Затем, когда кто-то использует этот SAS, служба хранилища разрешает ему доступ к ресурсам хранилища только тогда, когда он обращается к URL-адресу SAS с IP-адреса, указанного в SAS.

Вы можете указать уникальный IP-адрес, например, 192.168.0.1 или диапазон IP-адресов, например, 192.168.0.0 — 192.168.0.255.

ИМХО, это очень полезная функция, когда вы хотите избежать попадания SAS в руки не тех людей.

Я бы хотел, чтобы Storage Team разрешила несколько диапазонов IP-адресов (например, 192.168.0.0 — 192.168.0.255, 10.10.1.0 — 10.10.1.255). В настоящее время мне придется создать несколько URL-адресов SAS для каждого диапазона IP-адресов, который я хочу поддерживать.

Пример 1. Список BLOB-объектов, ограниченных SAS по IP-адресу


        static void ListBlobsSasRestrictByIpAddressExample(string ipAddress)
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var containerName = "a00";
            var container = blobClient.GetContainerReference(containerName);
            var ipAddressRange = new IPAddressOrRange(ipAddress);
            var sasToken = container.GetSharedAccessSignature(new SharedAccessBlobPolicy()
                {
                    Permissions = SharedAccessBlobPermissions.List,
                    SharedAccessExpiryTime = new DateTimeOffset(DateTime.UtcNow.AddHours(1))
                }, null, null, ipAddressRange);
            Console.WriteLine(string.Format("Blob listing URL: {0}{1}&restype=container&comp=list", container.Uri, sasToken));
        }

Пример 2. Список BLOB-объектов SAS Ограничение диапазоном IP-адресов


        static void ListBlobsSasRestrictByIpAddressRangeExample(string ipAddressFrom, string ipAddressTo)
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var containerName = "a00";
            var container = blobClient.GetContainerReference(containerName);
            var ipAddressRange = new IPAddressOrRange(ipAddressFrom, ipAddressTo);
            var sasToken = container.GetSharedAccessSignature(new SharedAccessBlobPolicy()
            {
                Permissions = SharedAccessBlobPermissions.List,
                SharedAccessExpiryTime = new DateTimeOffset(DateTime.UtcNow.AddHours(1))
            }, null, null, ipAddressRange);
            Console.WriteLine(string.Format("Blob listing URL: {0}{1}&restype=container&comp=list", container.Uri, sasToken));
        }

Ограничение протокола

Когда вы создаете SAS, по сути вы получаете токен SAS, который добавляете в URL ресурса. Теперь этот URL может обслуживаться по протоколу HTTPS или HTTP. В предыдущих версиях вы не имели над этим контроля. С последней версией вы делаете. С помощью функции «Ограничение протокола» вы можете контролировать, будет ли URL-адрес SAS доступен только по протоколу HTTPS или по протоколам HTTPS и HTTP.

Пример 1: список BLOB-объектов SAS, ограниченный протоколом


        static void ListBlobsSasRestrictByProtocolExample(bool allowBothHttpAndHttpsProtocols)
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var containerName = "a00";
            var container = blobClient.GetContainerReference(containerName);
            SharedAccessProtocol protocol = allowBothHttpAndHttpsProtocols ? SharedAccessProtocol.HttpsOrHttp : SharedAccessProtocol.HttpsOnly;
            var sasToken = container.GetSharedAccessSignature(new SharedAccessBlobPolicy()
            {
                Permissions = SharedAccessBlobPermissions.List,
                SharedAccessExpiryTime = new DateTimeOffset(DateTime.UtcNow.AddHours(1))
            }, null, protocol, null);
            Console.WriteLine(string.Format("Blob listing URL: {0}{1}&restype=container&comp=list", container.Uri, sasToken));
        }

Аккаунт SAS

Это, безусловно, самое значительное улучшение, сделанное в SAS с момента его запуска IMHO. Если вы посмотрите на операции, поддерживаемые Storage Service, вы можете поместить эти операции в три категории:

  1. Сервисные операции
  2. Контейнерные операции — Контейнер — это общий термин, означающий контейнеры BLOB-объектов, общие ресурсы файловой службы, таблицы и очереди.
  3. Операции с объектами — Объект — это общий термин, означающий Blobs, Files, Entities и Messages.

Ранее с SAS обычно вы выполняли операции с объектами и в некоторой степени с контейнерами. Например, вы можете загрузить большой двоичный объект (пример операции объекта) или список больших двоичных объектов в контейнере (пример операции контейнера), используя SAS, но для других операций, таких как создание контейнера, вам потребуется использовать ключ учетной записи хранения.

Аккаунт SAS позволяет выполнять практически все операции (сервис, контейнер и объект) с использованием SAS.

Способ создания учетной записи SAS заключается в том, что вы начинаете с выбора одной или нескольких служб (BLOB-объектов, файлов, очередей и таблиц), а затем указываете операции (службу, контейнер и объект), которые вы хотите включить через SAS. Затем вы определяете разрешения (Чтение, Запись, Список, Удалить, Добавить, Создать, Обновить и Обработать), которые вы хотите включить в SAS. Кроме того, вы можете определить дату / время начала / окончания срока действия для SAS, IP-адрес и ограничения протокола.

Важное замечание: На момент написания этого блога аккаунт SAS поддерживается только для BLOB-объектов и файловой службы. Он не поддерживается для службы очередей и таблиц. Хотя вы можете создать учетную запись SAS для службы очередей и таблиц, используя REST API или поддерживаемые клиентские библиотеки, вы получите сообщение об ошибке от службы хранения при попытке использовать этот SAS (я потратил на это 1 день :)).

Теперь давайте посмотрим на некоторые примеры учетной записи SAS.

Пример 1. Учетная запись SAS для перечисления контейнеров BLOB-объектов и общих файловых служб.


        static void AccountSasForListingBlobContainersAndFileServiceShares()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            SharedAccessAccountServices servicesSupportedInSas = SharedAccessAccountServices.Blob | SharedAccessAccountServices.File;
            SharedAccessAccountResourceTypes resourceTypesSupportedInSas = SharedAccessAccountResourceTypes.Service;//Since we want to list top level containers only.
            SharedAccessAccountPermissions permissionsSupportedInSas = SharedAccessAccountPermissions.List;//Since we want to give list permissions only.
            var sasToken = account.GetSharedAccessSignature(new SharedAccessAccountPolicy()
                {
                    Services = servicesSupportedInSas,
                    ResourceTypes = resourceTypesSupportedInSas,
                    Permissions = permissionsSupportedInSas,
                    SharedAccessExpiryTime = new DateTimeOffset(DateTime.UtcNow.AddHours(1))
                });
            Console.WriteLine(string.Format("Blob containers listing URL: {0}{1}&comp=list", account.BlobStorageUri.PrimaryUri, sasToken));
            Console.WriteLine(string.Format("File shares listing URL: {0}{1}&comp=list", account.FileStorageUri.PrimaryUri, sasToken));
        }

Пример 2: учетная запись SAS для создания контейнера BLOB-объектов


        static void AccountSasForCreatingBlobContainers()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            SharedAccessAccountServices servicesSupportedInSas = SharedAccessAccountServices.Blob;
            SharedAccessAccountResourceTypes resourceTypesSupportedInSas = SharedAccessAccountResourceTypes.Container;//Since we want SAS for top level containers only.
            SharedAccessAccountPermissions permissionsSupportedInSas = SharedAccessAccountPermissions.Create;//Since we want to give create permission only.
            var sasToken = account.GetSharedAccessSignature(new SharedAccessAccountPolicy()
            {
                Services = servicesSupportedInSas,
                ResourceTypes = resourceTypesSupportedInSas,
                Permissions = permissionsSupportedInSas,
                SharedAccessExpiryTime = new DateTimeOffset(DateTime.UtcNow.AddHours(1))
            });
            Console.WriteLine("Sas Token = " + sasToken);
        }

Пример 3: Учетная запись SAS для удаления любого общего ресурса файловой службы


        static void AccountSasForDeletingShares()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            SharedAccessAccountServices servicesSupportedInSas = SharedAccessAccountServices.File;
            SharedAccessAccountResourceTypes resourceTypesSupportedInSas = SharedAccessAccountResourceTypes.Container;//Since we want SAS for top level containers only.
            SharedAccessAccountPermissions permissionsSupportedInSas = SharedAccessAccountPermissions.Delete;//Since we want to give delete permission only.
            var sasToken = account.GetSharedAccessSignature(new SharedAccessAccountPolicy()
            {
                Services = servicesSupportedInSas,
                ResourceTypes = resourceTypesSupportedInSas,
                Permissions = permissionsSupportedInSas,
                SharedAccessExpiryTime = new DateTimeOffset(DateTime.UtcNow.AddHours(1))
            });
            Console.WriteLine("Sas Token = " + sasToken);
        }

Для получения дополнительной информации об учетной записи SAS посетите страницу документации REST API здесь: https://msdn.microsoft.com/en-US/library/azure/mt584140.aspx .

Сервис САС

Я хочу воспользоваться моментом и написать что-нибудь о «Сервисе САС», так как это меня смутило. Поскольку это упоминалось вместе с учетной записью SAS, у меня было первоначальное впечатление, что вы используете Service SAS для создания службы SAS, например SAS для службы BLOB-объектов, файлов, очередей или таблиц, а учетную запись SAS создаете на уровне учетной записи хранения, которая может включать в себя множество Сервисы.

Только прочитав об этом больше, я узнал, что старый SAS теперь называется Service SAS :). По сути, Service SAS — это SAS, который вы создаете для отдельного контейнера больших двоичных объектов, большого двоичного объекта, общего файлового сервиса, файла, таблицы и очереди. Это не ново :). Думаю, я должен упомянуть об этом здесь.

Вывод

Вот именно для этого поста. Как всегда, ваши отзывы приветствуются. Если вы обнаружите какие-либо проблемы с этим сообщением, пожалуйста, дайте мне знать, и я исправлю это как можно скорее.

В качестве примечания хочу отметить, что Cloud Portam полностью поддерживает эти функции. Вы можете узнать больше о поддержке всех этих функций в Cloud Portam здесь: http://blog.cloudportam.com/cloud-portam-updates-support-for-account-level-shared-access-signature-ip-address-and -protocol-constraints-in-shared-access-подпись-и-другие-улучшения / .