За последние несколько месяцев группа хранения 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, вы можете поместить эти операции в три категории:
- Сервисные операции
- Контейнерные операции — Контейнер — это общий термин, означающий контейнеры BLOB-объектов, общие ресурсы файловой службы, таблицы и очереди.
- Операции с объектами — Объект — это общий термин, означающий 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-подпись-и-другие-улучшения / .