クラウド内のアプリケーションのデータへのアクセスをセキュリティで保護するSecure access to an application's data in the cloud

このチュートリアルは、シリーズの第 3 部です。This tutorial is part three of a series. ストレージ アカウントへのアクセスをセキュリティで保護する方法について説明します。You learn how to secure access to the storage account.

シリーズの第 3 部で学習する内容は次のとおりです。In part three of the series, you learn how to:

  • SAS トークンを使用してサムネイル画像にアクセスするUse SAS tokens to access thumbnail images
  • サーバー側暗号化を有効にするTurn on server-side encryption
  • HTTPS のみの転送を有効にするEnable HTTPS-only transport

Azure Blob Storage には、アプリケーションのファイルを格納する堅牢なサービスを提供しています。Azure blob storage provides a robust service to store files for applications. このチュートリアルでは、前のトピックの続きとして、Web アプリケーションのストレージ アカウントに対するアクセスをセキュリティで保護する方法について説明します。This tutorial extends the previous topic to show how to secure access to your storage account from a web application. 完了すると、画像は暗号化され、Web アプリは安全な SAS トークンを使用してサムネイル画像にアクセスできるようになります。When you're finished the images are encrypted and the web app uses secure SAS tokens to access the thumbnail images.

前提条件Prerequisites

このチュートリアルを完了するには、前の Storage のチュートリアル「Event Grid を使用して、アップロードされたイメージのサイズ変更を自動化する」を完了している必要があります。To complete this tutorial you must have completed the previous Storage tutorial: Automate resizing uploaded images using Event Grid.

コンテナーのパブリック アクセスを設定するSet container public access

チュートリアル シリーズの今回は、サムネイルへのアクセスに SAS トークンを使用します。In this part of the tutorial series, SAS tokens are used for accessing the thumbnails. この手順では、thumbnails コンテナーのパブリック アクセスを off に設定します。In this step, you set the public access of the thumbnails container to off.

blobStorageAccount=<blob_storage_account>

blobStorageAccountKey=$(az storage account keys list -g myResourceGroup \
-n $blobStorageAccount --query [0].value --output tsv) 

az storage container set-permission \ --account-name $blobStorageAccount \ --account-key $blobStorageAccountKey \ --name thumbnails  \
--public-access off

サムネイルの SAS トークンを構成するConfigure SAS tokens for thumbnails

このチュートリアル シリーズの第 1 部では、Web アプリケーションでパブリック コンテナーの画像を表示しました。In part one of this tutorial series, the web application was showing images from a public container. シリーズの今回は、Shared Access Signature (SAS) トークンを使用してサムネイル画像を取得します。In this part of the series, you use shared access signatures (SAS) tokens to retrieve the thumbnail images. SAS トークンを使用すると、IP、プロトコル、間隔、または許可されている権限に基づいて、コンテナーまたは BLOB へのアクセスを制限することができます。SAS tokens allow you to provide restricted access to a container or blob based on IP, protocol, time interval, or rights allowed. SAS の詳細については、「Shared Access Signatures (SAS) を使用して Azure Storage リソースへの制限付きアクセスを許可する」を参照してください。For more information about SAS, see Grant limited access to Azure Storage resources using shared access signatures (SAS).

この例では、ソース コード リポジトリが sasTokens ブランチを使用します。このブランチには更新されたコード サンプルがあります。In this example, the source code repository uses the sasTokens branch, which has an updated code sample. az webapp deployment source delete を使用して、既存の GitHub デプロイを削除します。Delete the existing GitHub deployment with the az webapp deployment source delete. 次に、az webapp deployment source config コマンドを使用して、Web アプリへの GitHub デプロイを構成します。Next, configure GitHub deployment to the web app with the az webapp deployment source config command.

次のコマンドの <web-app> は、Web アプリの名前です。In the following command, <web-app> is the name of your web app.

az webapp deployment source delete --name <web-app> --resource-group myResourceGroup

az webapp deployment source config --name <web_app> \
--resource-group myResourceGroup --branch sasTokens --manual-integration \
--repo-url https://github.com/Azure-Samples/storage-blob-upload-from-webapp

リポジトリの sasTokens ブランチによって StorageHelper.cs ファイルが更新されます。The sasTokens branch of the repository updates the StorageHelper.cs file. GetThumbNailUrls タスクは以下のコード例で置き換えられます。It replaces the GetThumbNailUrls task with the code example below. 更新されたタスクは、SAS トークンの開始時刻、有効期限、およびアクセス許可を指定するように SharedAccessBlobPolicy を設定し、サムネイルの URL を取得します。The updated task retrieves the thumbnail URLs by setting a SharedAccessBlobPolicy to specify the start time, expiry time, and permissions for the SAS token. Web アプリがデプロイされると、Web アプリは SAS トークンを使用し、URL を指定してサムネイルを取得します。Once deployed the web app now retrieves the thumbnails with a URL using a SAS token. 更新されたタスクは次の例のようになります。The updated task is shown in the following example:

public static async Task<List<string>> GetThumbNailUrls(AzureStorageConfig _storageConfig)
{
    List<string> thumbnailUrls = new List<string>();

    // Create storagecredentials object by reading the values from the configuration (appsettings.json)
    StorageCredentials storageCredentials = new StorageCredentials(_storageConfig.AccountName, _storageConfig.AccountKey);

    // Create cloudstorage account by passing the storagecredentials
    CloudStorageAccount storageAccount = new CloudStorageAccount(storageCredentials, true);

    // Create blob client
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

    // Get reference to the container
    CloudBlobContainer container = blobClient.GetContainerReference(_storageConfig.ThumbnailContainer);

    BlobContinuationToken continuationToken = null;

    BlobResultSegment resultSegment = null;

    //Call ListBlobsSegmentedAsync and enumerate the result segment returned, while the continuation token is non-null.
    //When the continuation token is null, the last page has been returned and execution can exit the loop.
    do
    {
        //This overload allows control of the page size. You can return all remaining results by passing null for the maxResults parameter,
        //or by calling a different overload.
        resultSegment = await container.ListBlobsSegmentedAsync("", true, BlobListingDetails.All, 10, continuationToken, null, null);

        foreach (var blobItem in resultSegment.Results)
        {
            CloudBlockBlob blob = blobItem as CloudBlockBlob;
            //Set the expiry time and permissions for the blob.
            //In this case, the start time is specified as a few minutes in the past, to mitigate clock skew.
            //The shared access signature will be valid immediately.
            SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy();

            sasConstraints.SharedAccessStartTime = DateTimeOffset.UtcNow.AddMinutes(-5);

            sasConstraints.SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddHours(24);

            sasConstraints.Permissions = SharedAccessBlobPermissions.Read;

            //Generate the shared access signature on the blob, setting the constraints directly on the signature.
            string sasBlobToken = blob.GetSharedAccessSignature(sasConstraints);

            //Return the URI string for the container, including the SAS token.
            thumbnailUrls.Add(blob.Uri + sasBlobToken);

        }

        //Get the continuation token.
        continuationToken = resultSegment.ContinuationToken;
    }

    while (continuationToken != null);

    return await Task.FromResult(thumbnailUrls);
}

上のタスクでは、次のクラス、プロパティ、およびメソッドが使用されています。The following classes, properties, and methods are used in the preceding task:

クラスClass propertiesProperties メソッドMethods
StorageCredentialsStorageCredentials
CloudStorageAccountCloudStorageAccount CreateCloudBlobClientCreateCloudBlobClient
CloudBlobClientCloudBlobClient GetContainerReferenceGetContainerReference
CloudBlobContainerCloudBlobContainer SetPermissionsAsyncSetPermissionsAsync
ListBlobsSegmentedAsyncListBlobsSegmentedAsync
BlobContinuationTokenBlobContinuationToken
BlobResultSegmentBlobResultSegment 結果Results
CloudBlockBlobCloudBlockBlob GetSharedAccessSignatureGetSharedAccessSignature
SharedAccessBlobPolicySharedAccessBlobPolicy SharedAccessStartTimeSharedAccessStartTime
SharedAccessExpiryTimeSharedAccessExpiryTime
アクセス許可Permissions

サーバー側暗号化Server-side encryption

Azure Storage Service Encryption (SSE) を使用すると、データを保護できます。Azure Storage Service Encryption (SSE) helps you protect and safeguard your data. SSE は、暗号化、復号化、キー管理を処理して、保存データを暗号化します。SSE encrypts data at rest, handling encryption, decryption, and key management. 現在利用できるブロック暗号化の中でも最強レベルの 256 ビット AES 暗号化によってすべてのデータを暗号化します。All data is encrypted using 256-bit AES encryption, one of the strongest block ciphers available.

SSE は、すべてのパフォーマンス レベル (Standard および Premium)、すべてのデプロイ モデル (Azure Resource Manager とクラシック)、すべての Azure Storage サービス (BLOB、Queue、Table、File) のデータを自動的に暗号化します。SSE automatically encrypts data in all performance tiers (Standard and Premium), all deployment models (Azure Resource Manager and Classic), and all of the Azure Storage services (Blob, Queue, Table, and File).

HTTPS のみを有効にするEnable HTTPS only

ストレージ アカウントから送受信されるデータの要求をセキュリティで保護するには、要求を HTTPS のみに制限する方法があります。In order to ensure that requests for data to and from a storage account are secure, you can limit requests to HTTPS only. az storage account update コマンドを使用して、ストレージ アカウントが必要なプロトコルを更新します。Update the storage account required protocol by using the az storage account update command.

az storage account update --resource-group myresourcegroup --name <storage-account-name> --https-only true

HTTP プロトコルで curl を使用して接続をテストします。Test the connection using curl using the HTTP protocol.

curl http://<storage-account-name>.blob.core.windows.net/<container>/<blob-name> -I

これでセキュリティで保護された転送が必要になり、次のメッセージを受け取ります。Now that secure transfer is required, you receive the following message:

HTTP/1.1 400 The account being accessed does not support http.

次の手順Next steps

シリーズの第 3 部では、ストレージ アカウントに対するアクセスをセキュリティで保護する方法について学びました。In part three of the series, you learned how to secure access to the storage account, such as how to:

  • SAS トークンを使用してサムネイル画像にアクセスするUse SAS tokens to access thumbnail images
  • サーバー側暗号化を有効にするTurn on server-side encryption
  • HTTPS のみの転送を有効にするEnable HTTPS-only transport

次はシリーズの第 4 部に進み、クラウド ストレージ アプリケーションの監視とトラブルシューティングの方法を学びます。Advance to part four of the series to learn how to monitor and troubleshoot a cloud storage application.