Zabezpieczanie dostępu do danych aplikacji w chmurzeSecure access to an application's data in the cloud

Ten samouczek jest trzecią częścią serii.This tutorial is part three of a series. Zawiera informacje o sposobach zabezpieczania dostępu do konta magazynu.You learn how to secure access to the storage account.

Część trzecia serii zawiera informacje na temat wykonywania następujących czynności:In part three of the series, you learn how to:

  • Używanie tokenów SAS do uzyskiwania dostępu do obrazów miniaturyUse SAS tokens to access thumbnail images
  • Włączanie szyfrowania po stronie serweraTurn on server-side encryption
  • Włączanie transportu tylko przy użyciu protokołu HTTPSEnable HTTPS-only transport

Usługa Azure Blob Storage to niezawodna usługa do przechowywania plików dla aplikacji.Azure blob storage provides a robust service to store files for applications. Ten samouczek rozszerza Poprzedni temat, aby pokazać, jak zabezpieczyć dostęp do konta magazynu z aplikacji sieci Web.This tutorial extends the previous topic to show how to secure access to your storage account from a web application. Po zakończeniu obrazy będą szyfrowane, a aplikacja internetowa będzie używać tokenów SAS w celu uzyskania dostępu do obrazów miniatury.When you're finished the images are encrypted and the web app uses secure SAS tokens to access the thumbnail images.

Wymagania wstępnePrerequisites

Aby ukończyć ten samouczek, konieczne jest ukończenie poprzedniego samouczka na temat usługi Storage: Automatyzuj zmianę rozmiarów załadowanych obrazów przy użyciu Event Grid.To complete this tutorial you must have completed the previous Storage tutorial: Automate resizing uploaded images using Event Grid.

Włączanie dostępu publicznego do konteneraSet container public access

W tej części serii samouczków do uzyskania dostępu do miniatur zostaną użyte tokeny SAS.In this part of the tutorial series, SAS tokens are used for accessing the thumbnails. W tym kroku ustawisz wartość off w konfiguracji publicznego dostępu do kontenera thumbnails.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

Konfigurowanie tokenów SAS dla miniaturConfigure SAS tokens for thumbnails

W części pierwszej serii tej serii samouczków aplikacja internetowa wyświetlała obrazy z publicznego kontenera.In part one of this tutorial series, the web application was showing images from a public container. W tej części serii są używane tokeny sygnatur dostępu współdzielonego (SAS) do pobierania obrazów miniatur.In this part of the series, you use shared access signatures (SAS) tokens to retrieve the thumbnail images. Tokeny SAS umożliwiają ograniczenie dostępu do kontenera lub obiektu blob na podstawie adresu IP, protokołu, interwałów czasowych lub przyznanych uprawnień.SAS tokens allow you to provide restricted access to a container or blob based on IP, protocol, time interval, or rights allowed. Aby uzyskać więcej informacji na temat SAS, zobacz udzielanie ograniczonego dostępu do zasobów usługi Azure Storage za pomocą sygnatur dostępu współdzielonego (SAS).For more information about SAS, see Grant limited access to Azure Storage resources using shared access signatures (SAS).

W tym przykładzie repozytorium kodu źródłowego korzysta z gałęzi sasTokens, która zawiera zaktualizowany kod przykładowy.In this example, the source code repository uses the sasTokens branch, which has an updated code sample. Usuń istniejące wdrożenie kodu z usługi GitHub za pomocą polecenia az webapp deployment source delete.Delete the existing GitHub deployment with the az webapp deployment source delete. Następnie skonfiguruj wdrożenie aplikacji internetowej z usługi GitHub za pomocą polecenia az webapp deployment source config.Next, configure GitHub deployment to the web app with the az webapp deployment source config command.

W poniższym poleceniu wartość <web-app> to nazwa aplikacji internetowej.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

Gałąź sasTokens repozytorium aktualizuje plik StorageHelper.cs.The sasTokens branch of the repository updates the StorageHelper.cs file. Zastępuje zadanie GetThumbNailUrls przykładowym kodem pokazanym poniżej.It replaces the GetThumbNailUrls task with the code example below. Zaktualizowane zadanie pobiera adresy URL miniatur przez skonfigurowanie zasad SharedAccessBlobPolicy, określających czas rozpoczęcia, czas wygaśnięcia i uprawnienia tokenu SAS.The updated task retrieves the thumbnail URLs by setting a SharedAccessBlobPolicy to specify the start time, expiry time, and permissions for the SAS token. Po wdrożeniu aplikacja internetowa pobiera miniatury przy użyciu adresu URL i tokenu SAS.Once deployed the web app now retrieves the thumbnails with a URL using a SAS token. Zaktualizowane zadanie jest pokazane na poniższym przykładzie: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);
}

W poprzednim zadaniu użyto następujących klas, właściwości i metod:The following classes, properties, and methods are used in the preceding task:

KlasaClass WłaściwościProperties MetodyMethods
StorageCredentialsStorageCredentials
CloudStorageAccountCloudStorageAccount CreateCloudBlobClientCreateCloudBlobClient
CloudBlobClientCloudBlobClient GetContainerReferenceGetContainerReference
CloudBlobContainerCloudBlobContainer SetPermissionsAsyncSetPermissionsAsync
ListBlobsSegmentedAsyncListBlobsSegmentedAsync
BlobContinuationTokenBlobContinuationToken
BlobResultSegmentBlobResultSegment ResultsResults
CloudBlockBlobCloudBlockBlob GetSharedAccessSignatureGetSharedAccessSignature
SharedAccessBlobPolicySharedAccessBlobPolicy SharedAccessStartTimeSharedAccessStartTime
SharedAccessExpiryTimeSharedAccessExpiryTime
UprawnieniaPermissions

Szyfrowanie po stronie serweraServer-side encryption

Szyfrowanie usługi Azure Storage (SSE) pomaga chronić dane.Azure Storage Service Encryption (SSE) helps you protect and safeguard your data. Usługa SSE szyfruje dane magazynowane, obsługując szyfrowanie, odszyfrowywanie i zarządzanie kluczami.SSE encrypts data at rest, handling encryption, decryption, and key management. Wszystkie dane są szyfrowane za pomocą 256-bitowego szyfrowania AES, jednego z najsilniejszych szyfrów blokowych.All data is encrypted using 256-bit AES encryption, one of the strongest block ciphers available.

Usługa SSE automatycznie szyfruje dane we wszystkich warstwach wydajności (Standardowa i Premium), wszystkich modelach wdrażania (model usługi Azure Resource Manager i model klasyczny) oraz wszystkich usługach Azure Storage (Blob, Queue, Table i 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).

Włączanie używania tylko protokołu HTTPSEnable HTTPS only

Aby mieć pewność, że żądania danych wysyłane do i z konta magazynu są bezpieczne, można zezwolić tylko na żądania używające protokołu HTTPS.In order to ensure that requests for data to and from a storage account are secure, you can limit requests to HTTPS only. Zaktualizuj protokół wymagany przez konto magazynu przy użyciu polecenia 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

Sprawdź połączenie, używając polecenia curl i protokołu HTTP.Test the connection using curl using the HTTP protocol.

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

Teraz, gdy wymagany jest bezpieczny transfer, otrzymasz następujący komunikat:Now that secure transfer is required, you receive the following message:

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

Następne krokiNext steps

W trzeciej części serii przedstawiono, sposób zabezpieczania dostępu do konta magazynu, w tym następujące czynności:In part three of the series, you learned how to secure access to the storage account, such as how to:

  • Używanie tokenów SAS do uzyskiwania dostępu do obrazów miniaturyUse SAS tokens to access thumbnail images
  • Włączanie szyfrowania po stronie serweraTurn on server-side encryption
  • Włączanie transportu tylko przy użyciu protokołu HTTPSEnable HTTPS-only transport

Przejdź do czwartej części serii, aby dowiedzieć się, jak monitorować aplikację magazynu w chmurze i rozwiązywać problemy.Advance to part four of the series to learn how to monitor and troubleshoot a cloud storage application.