Настройка защиты данных в ASP.NET CoreConfigure ASP.NET Core Data Protection

При инициализации системы защиты данных, оно применяется параметры по умолчанию зависимости от рабочей среды.When the Data Protection system is initialized, it applies default settings based on the operational environment. Эти параметры обычно подходят для приложений, выполняющихся на одном компьютере.These settings are generally appropriate for apps running on a single machine. Бывают случаи, где разработчик может потребоваться изменить параметры по умолчанию:There are cases where a developer may want to change the default settings:

  • Приложения распределены между несколькими компьютерами.The app is spread across multiple machines.
  • Для обеспечения соответствия.For compliance reasons.

В таких случаях системы защиты данных предлагает широкие возможности настройки API.For these scenarios, the Data Protection system offers a rich configuration API.

Предупреждение

Как и файлы конфигурации, набора ключей защиты данных должны быть защищены с помощью соответствующих разрешений.Similar to configuration files, the data protection key ring should be protected using appropriate permissions. Можно выбрать для шифрования ключей при хранении, но это не предотвращает злоумышленники созданием новых ключей.You can choose to encrypt keys at rest, but this doesn't prevent attackers from creating new keys. Следовательно это повлияет на безопасность приложения.Consequently, your app's security is impacted. Место хранения, настроен с защитой данных должны иметь его доступ возможен только из самого, аналогично тому, как бы Защита файлов конфигурации приложения.The storage location configured with Data Protection should have its access limited to the app itself, similar to the way you would protect configuration files. Например если вы решили хранить на диске вашего набора ключей, используйте разрешения файловой системы.For example, if you choose to store your key ring on disk, use file system permissions. Убедитесь, удостоверение, под которой запущено приложение чтения, записи и доступа к этому каталогу.Ensure only the identity under which your web app runs has read, write, and create access to that directory. Если вы используете хранилище BLOB-объектов, веб-приложения должны иметь возможность читать, записывать и создавать новые записи в хранилище больших двоичных объектов и т. д.If you use Azure Blob Storage, only the web app should have the ability to read, write, or create new entries in the blob store, etc.

Метод расширения AddDataProtection возвращает IDataProtectionBuilder.The extension method AddDataProtection returns an IDataProtectionBuilder. IDataProtectionBuilder Предоставляет методы расширения, что вы можете связать вместе, чтобы настроить защиту данных.IDataProtectionBuilder exposes extension methods that you can chain together to configure Data Protection options.

ProtectKeysWithAzureKeyVaultProtectKeysWithAzureKeyVault

Для хранения ключей в Azure Key Vault, настройки системы с ProtectKeysWithAzureKeyVault в Startup класса:To store keys in Azure Key Vault, configure the system with ProtectKeysWithAzureKeyVault in the Startup class:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToAzureBlobStorage(new Uri("<blobUriWithSasToken>"))
        .ProtectKeysWithAzureKeyVault("<keyIdentifier>", "<clientId>", "<clientSecret>");
}

Задать место хранения набора ключей (например, PersistKeysToAzureBlobStorage).Set the key ring storage location (for example, PersistKeysToAzureBlobStorage). Необходимо задать расположение, так как вызов ProtectKeysWithAzureKeyVault реализует IXmlEncryptor , отключает параметры защиты автоматические данные, включая место хранения набора ключей.The location must be set because calling ProtectKeysWithAzureKeyVault implements an IXmlEncryptor that disables automatic data protection settings, including the key ring storage location. Предыдущий пример использует хранилище BLOB-объектов для хранения набора ключей.The preceding example uses Azure Blob Storage to persist the key ring. Дополнительные сведения см. в разделе поставщики хранилища ключей: службы хранилища Azure.For more information, see Key storage providers: Azure Storage. Также можно сохранить локально с помощью набора ключей PersistKeysToFileSystem.You can also persist the key ring locally with PersistKeysToFileSystem.

keyIdentifier Является идентификатор ключа хранилища ключей, используемый для шифрования ключа.The keyIdentifier is the key vault key identifier used for key encryption. Например, ключ, созданный в хранилище ключей с именем dataprotection в contosokeyvault имеет идентификатор ключа https://contosokeyvault.vault.azure.net/keys/dataprotection/.For example, a key created in key vault named dataprotection in the contosokeyvault has the key identifier https://contosokeyvault.vault.azure.net/keys/dataprotection/. Укажите приложение с распаковку ключа и Wrap Key разрешений в хранилище ключей.Provide the app with Unwrap Key and Wrap Key permissions to the key vault.

ProtectKeysWithAzureKeyVault перегрузки:ProtectKeysWithAzureKeyVault overloads:

PersistKeysToFileSystemPersistKeysToFileSystem

Для хранения ключей UNC-ресурсе, а не в % LOCALAPPDATA % расположение по умолчанию, настроить систему с PersistKeysToFileSystem:To store keys on a UNC share instead of at the %LOCALAPPDATA% default location, configure the system with PersistKeysToFileSystem:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));
}

Предупреждение

При изменении ключа постоянном расположении, система шифрует больше не будет автоматически ключей при хранении, так как он не знает, является ли DPAPI соответствующего механизма шифрования.If you change the key persistence location, the system no longer automatically encrypts keys at rest, since it doesn't know whether DPAPI is an appropriate encryption mechanism.

ProtectKeysWith*ProtectKeysWith*

Можно настроить систему для защиты неактивных ключей можно вызвать любую из ProtectKeysWith* интерфейсов API настройки.You can configure the system to protect keys at rest by calling any of the ProtectKeysWith* configuration APIs. Рассмотрим пример ниже, в котором хранятся ключи на общем ресурсе UNC и шифрует эти ключи хранятся с конкретным сертификатом X.509:Consider the example below, which stores keys on a UNC share and encrypts those keys at rest with a specific X.509 certificate:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"))
        .ProtectKeysWithCertificate("thumbprint");
}

В ASP.NET Core 2.1 или более поздней версии, вы можете предоставить X509Certificate2 для ProtectKeysWithCertificate, такие как сертификат, загруженная из файла:In ASP.NET Core 2.1 or later, you can provide an X509Certificate2 to ProtectKeysWithCertificate, such as a certificate loaded from a file:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"))
        .ProtectKeysWithCertificate(
            new X509Certificate2("certificate.pfx", "password"));
}

См. в разделе ключ шифрования неактивных Дополнительные примеры и обсуждения на механизмы встроенного ключа шифрования.See Key Encryption At Rest for more examples and discussion on the built-in key encryption mechanisms.

UnprotectKeysWithAnyCertificateUnprotectKeysWithAnyCertificate

В ASP.NET Core 2.1 или более поздней версии, могут обеспечивать циркуляцию сертификатов и расшифровки ключей при хранении, используя массив X509Certificate2 сертификаты с UnprotectKeysWithAnyCertificate:In ASP.NET Core 2.1 or later, you can rotate certificates and decrypt keys at rest using an array of X509Certificate2 certificates with UnprotectKeysWithAnyCertificate:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"))
        .ProtectKeysWithCertificate(
            new X509Certificate2("certificate.pfx", "password"));
        .UnprotectKeysWithAnyCertificate(
            new X509Certificate2("certificate_old_1.pfx", "password_1"),
            new X509Certificate2("certificate_old_2.pfx", "password_2"));
}

SetDefaultKeyLifetimeSetDefaultKeyLifetime

Чтобы настроить систему для использования ключа времени существования 14 дней вместо значения по умолчанию 90 дней, используйте SetDefaultKeyLifetime:To configure the system to use a key lifetime of 14 days instead of the default 90 days, use SetDefaultKeyLifetime:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .SetDefaultKeyLifetime(TimeSpan.FromDays(14));
}

SetApplicationNameSetApplicationName

По умолчанию система защиты данных изолирует приложений друг от друга в зависимости от их содержимого корневого пути, даже если они совместно используют тот же репозиторий физического ключа.By default, the Data Protection system isolates apps from one another based on their content root paths, even if they're sharing the same physical key repository. Это предотвращает основные сведения о других защищенных полезных данных приложения.This prevents the apps from understanding each other's protected payloads.

Совместное использование защищенных полезных данных между приложениями:To share protected payloads among apps:

  • Настройка SetApplicationName в каждом приложении, с тем же значением.Configure SetApplicationName in each app with the same value.
  • Используют ту же версию API защиты данных стека между этими приложениями.Use the same version of the Data Protection API stack across the apps. Выполните либо из следующих в файлах проектов приложений:Perform either of the following in the apps' project files:
public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .SetApplicationName("shared app name");
}

DisableAutomaticKeyGenerationDisableAutomaticKeyGeneration

Возможно, сценарий, где вы не хотите приложению автоматически менять ключи, (создание новых ключей), так как они подходят истечения срока действия.You may have a scenario where you don't want an app to automatically roll keys (create new keys) as they approach expiration. Примером этого может быть приложения, в связи первичного и вторичного, где только основное приложение отвечает за управление ключами задач и дополнительный приложения просто доступное только для чтения представление набора ключей.One example of this might be apps set up in a primary/secondary relationship, where only the primary app is responsible for key management concerns and secondary apps simply have a read-only view of the key ring. Вторичный приложения можно настроить необходимо рассматривать набора ключей только для чтения, настройки системы с DisableAutomaticKeyGeneration:The secondary apps can be configured to treat the key ring as read-only by configuring the system with DisableAutomaticKeyGeneration:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .DisableAutomaticKeyGeneration();
}

Изоляция на уровне приложенияPer-application isolation

Когда система защиты данных предоставляется узлом ASP.NET Core, она автоматически изолирует приложений друг от друга, даже если эти приложения выполняются под одной учетной записи рабочего процесса и при использовании же материала главного ключа.When the Data Protection system is provided by an ASP.NET Core host, it automatically isolates apps from one another, even if those apps are running under the same worker process account and are using the same master keying material. Это отчасти напоминает модификатора IsolateApps из System.Web <machineKey> элемент.This is somewhat similar to the IsolateApps modifier from System.Web's <machineKey> element.

Механизм изоляции работает путем оценки каждого приложения на локальном компьютере как уникальный клиент, таким образом IDataProtector административного доступа для любого приложения автоматически включает в себя идентификатор приложения в качестве дискриминатора.The isolation mechanism works by considering each app on the local machine as a unique tenant, thus the IDataProtector rooted for any given app automatically includes the app ID as a discriminator. Уникальный идентификатор приложения — это физический путь приложения:The app's unique ID is the app's physical path:

  • Для приложений, размещенных в IIS уникальный идентификатор — это физический путь приложения IIS.For apps hosted in IIS, the unique ID is the IIS physical path of the app. Если приложение развертывается в среде веб-фермы, это значение стабильна, при условии, что в средах службы IIS настраиваются сходным образом на всех компьютерах веб-фермы.If an app is deployed in a web farm environment, this value is stable assuming that the IIS environments are configured similarly across all machines in the web farm.
  • Для резидентных приложений, запущенных в сервер Kestrel, уникальный идентификатор — это физический путь к приложению на диске.For self-hosted apps running on the Kestrel server, the unique ID is the physical path to the app on disk.

Уникальный идентификатор позволяет избежать простоев в случае сброса—как отдельные приложения и самой виртуальной машине.The unique identifier is designed to survive resets—both of the individual app and of the machine itself.

Этот механизм изоляции предполагается, что приложения не являются вредоносными.This isolation mechanism assumes that the apps are not malicious. Вредоносные приложения всегда может повлиять на любое другое приложение, под одной учетной записи рабочего процесса.A malicious app can always impact any other app running under the same worker process account. В общей среде размещения, когда приложения являются взаимно без доверия поставщика услуг размещения принять меры для обеспечения изоляции на уровне операционной системы между приложениями, включая Отделение приложений основного ключа хранилища.In a shared hosting environment where apps are mutually untrusted, the hosting provider should take steps to ensure OS-level isolation between apps, including separating the apps' underlying key repositories.

Если система защиты данных не предоставляется для узла ASP.NET Core (например, в том случае, если необходимо создать его с помощью DataProtectionProvider конкретный тип) изоляция приложений отключена по умолчанию.If the Data Protection system isn't provided by an ASP.NET Core host (for example, if you instantiate it via the DataProtectionProvider concrete type) app isolation is disabled by default. При отключении изоляции приложений, все приложения, с тем же материала ключа, могут использовать полезные данные до тех пор, пока они предоставляют соответствующие целей.When app isolation is disabled, all apps backed by the same keying material can share payloads as long as they provide the appropriate purposes. Чтобы обеспечить изоляцию приложения в этой среде, вызовите SetApplicationName метод конфигурации объекта и введите уникальное имя для каждого приложения.To provide app isolation in this environment, call the SetApplicationName method on the configuration object and provide a unique name for each app.

Изменение алгоритмов с UseCryptographicAlgorithmsChanging algorithms with UseCryptographicAlgorithms

В стеке защиты данных можно изменить алгоритм по умолчанию, используемые вновь созданные ключи.The Data Protection stack allows you to change the default algorithm used by newly-generated keys. Самый простой способ сделать это является вызов UseCryptographicAlgorithms из обратного вызова конфигурации:The simplest way to do this is to call UseCryptographicAlgorithms from the configuration callback:

services.AddDataProtection()
    .UseCryptographicAlgorithms(
        new AuthenticatedEncryptorConfiguration()
    {
        EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
        ValidationAlgorithm = ValidationAlgorithm.HMACSHA256
    });
services.AddDataProtection()
    .UseCryptographicAlgorithms(
        new AuthenticatedEncryptionSettings()
    {
        EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
        ValidationAlgorithm = ValidationAlgorithm.HMACSHA256
    });

По умолчанию EncryptionAlgorithm AES-256-CBC, а значение по умолчанию ValidationAlgorithm — HMACSHA256.The default EncryptionAlgorithm is AES-256-CBC, and the default ValidationAlgorithm is HMACSHA256. Политика по умолчанию можно задать с системным администратором через политики на уровне компьютера, но явный вызов UseCryptographicAlgorithms переопределяет политику по умолчанию.The default policy can be set by a system administrator via a machine-wide policy, but an explicit call to UseCryptographicAlgorithms overrides the default policy.

Вызов UseCryptographicAlgorithms можно указать нужный алгоритм из предопределенного списка встроенных.Calling UseCryptographicAlgorithms allows you to specify the desired algorithm from a predefined built-in list. Не нужно беспокоиться о реализации этого алгоритма.You don't need to worry about the implementation of the algorithm. В сценарии выше система защиты данных пытается использовать реализацию CNG алгоритма AES, если под управлением Windows.In the scenario above, the Data Protection system attempts to use the CNG implementation of AES if running on Windows. В противном случае она возвращается к управляемой System.Security.Cryptography.Aes класса.Otherwise, it falls back to the managed System.Security.Cryptography.Aes class.

Можно вручную указать реализацию через вызов UseCustomCryptographicAlgorithms.You can manually specify an implementation via a call to UseCustomCryptographicAlgorithms.

Совет

Изменение алгоритмов не влияет на существующие ключи в связку ключей.Changing algorithms doesn't affect existing keys in the key ring. Он влияет только на вновь созданные ключи.It only affects newly-generated keys.

Указание пользовательских управляемых алгоритмовSpecifying custom managed algorithms

Чтобы указать пользовательские управляемые алгоритмы, создайте ManagedAuthenticatedEncryptorConfiguration экземпляр, который указывает типы реализации:To specify custom managed algorithms, create a ManagedAuthenticatedEncryptorConfiguration instance that points to the implementation types:

serviceCollection.AddDataProtection()
    .UseCustomCryptographicAlgorithms(
        new ManagedAuthenticatedEncryptorConfiguration()
    {
        // A type that subclasses SymmetricAlgorithm
        EncryptionAlgorithmType = typeof(Aes),

        // Specified in bits
        EncryptionAlgorithmKeySize = 256,

        // A type that subclasses KeyedHashAlgorithm
        ValidationAlgorithmType = typeof(HMACSHA256)
    });

Чтобы указать пользовательские управляемые алгоритмы, создайте ManagedAuthenticatedEncryptionSettings экземпляр, который указывает типы реализации:To specify custom managed algorithms, create a ManagedAuthenticatedEncryptionSettings instance that points to the implementation types:

serviceCollection.AddDataProtection()
    .UseCustomCryptographicAlgorithms(
        new ManagedAuthenticatedEncryptionSettings()
    {
        // A type that subclasses SymmetricAlgorithm
        EncryptionAlgorithmType = typeof(Aes),

        // Specified in bits
        EncryptionAlgorithmKeySize = 256,

        // A type that subclasses KeyedHashAlgorithm
        ValidationAlgorithmType = typeof(HMACSHA256)
    });

Обычно *тип свойства должен указывать на конкретный, допускающий создание экземпляров (через открытый конструктор без параметров) реализации SymmetricAlgorithm и KeyedHashAlgorithm, хотя Специальные случаи системы некоторые значения, такие как typeof(Aes) для удобства.Generally the *Type properties must point to concrete, instantiable (via a public parameterless ctor) implementations of SymmetricAlgorithm and KeyedHashAlgorithm, though the system special-cases some values like typeof(Aes) for convenience.

Примечание

SymmetricAlgorithm должен иметь длину ключа 128 бит ≥ и размер блока в ≥ 64 бита, и он должен поддерживать шифрование CBC режим заполнения PKCS #7.The SymmetricAlgorithm must have a key length of ≥ 128 bits and a block size of ≥ 64 bits, and it must support CBC-mode encryption with PKCS #7 padding. KeyedHashAlgorithm должен иметь размер хэш-кода > = 128 бит, и он должен поддерживать ключи равна длине дайджест хэш-алгоритма и длины.The KeyedHashAlgorithm must have a digest size of >= 128 bits, and it must support keys of length equal to the hash algorithm's digest length. KeyedHashAlgorithm не строго обязательно должны быть HMAC.The KeyedHashAlgorithm isn't strictly required to be HMAC.

Указание пользовательские алгоритмы Windows CNGSpecifying custom Windows CNG algorithms

Чтобы задать пользовательский алгоритм Windows CNG с помощью шифрования в режиме CBC с проверкой HMAC, создайте CngCbcAuthenticatedEncryptorConfiguration экземпляр, содержащий данные алгоритма:To specify a custom Windows CNG algorithm using CBC-mode encryption with HMAC validation, create a CngCbcAuthenticatedEncryptorConfiguration instance that contains the algorithmic information:

services.AddDataProtection()
    .UseCustomCryptographicAlgorithms(
        new CngCbcAuthenticatedEncryptorConfiguration()
    {
        // Passed to BCryptOpenAlgorithmProvider
        EncryptionAlgorithm = "AES",
        EncryptionAlgorithmProvider = null,

        // Specified in bits
        EncryptionAlgorithmKeySize = 256,

        // Passed to BCryptOpenAlgorithmProvider
        HashAlgorithm = "SHA256",
        HashAlgorithmProvider = null
    });

Чтобы задать пользовательский алгоритм Windows CNG с помощью шифрования в режиме CBC с проверкой HMAC, создайте CngCbcAuthenticatedEncryptionSettings экземпляр, содержащий данные алгоритма:To specify a custom Windows CNG algorithm using CBC-mode encryption with HMAC validation, create a CngCbcAuthenticatedEncryptionSettings instance that contains the algorithmic information:

services.AddDataProtection()
    .UseCustomCryptographicAlgorithms(
        new CngCbcAuthenticatedEncryptionSettings()
    {
        // Passed to BCryptOpenAlgorithmProvider
        EncryptionAlgorithm = "AES",
        EncryptionAlgorithmProvider = null,

        // Specified in bits
        EncryptionAlgorithmKeySize = 256,

        // Passed to BCryptOpenAlgorithmProvider
        HashAlgorithm = "SHA256",
        HashAlgorithmProvider = null
    });

Примечание

Алгоритм симметричного блочного шифрования должен иметь длину ключа > = 128 бит, размер блока > = 64 бита, и он должен поддерживать шифрование CBC режим заполнения PKCS #7.The symmetric block cipher algorithm must have a key length of >= 128 bits, a block size of >= 64 bits, and it must support CBC-mode encryption with PKCS #7 padding. Хэш-алгоритм, должен иметь размер хэш-кода из > 128 бит и должен поддерживать, открытого в BCRYPT_ALG_ОБРАБАТЫВАТЬ_HMAC_флаг ФЛАГ.The hash algorithm must have a digest size of >= 128 bits and must support being opened with the BCRYPT_ALG_HANDLE_HMAC_FLAG flag. *Поставщика свойства можно задать значение null, чтобы использовать поставщика по умолчанию для указанного алгоритма.The *Provider properties can be set to null to use the default provider for the specified algorithm. См. в разделе BCryptOpenAlgorithmProvider Дополнительные сведения см.See the BCryptOpenAlgorithmProvider documentation for more information.

Чтобы задать пользовательский алгоритм Windows CNG с помощью счетчиков Galois режим шифрования с помощью проверки, создайте CngGcmAuthenticatedEncryptorConfiguration экземпляр, содержащий данные алгоритма:To specify a custom Windows CNG algorithm using Galois/Counter Mode encryption with validation, create a CngGcmAuthenticatedEncryptorConfiguration instance that contains the algorithmic information:

services.AddDataProtection()
    .UseCustomCryptographicAlgorithms(
        new CngGcmAuthenticatedEncryptorConfiguration()
    {
        // Passed to BCryptOpenAlgorithmProvider
        EncryptionAlgorithm = "AES",
        EncryptionAlgorithmProvider = null,

        // Specified in bits
        EncryptionAlgorithmKeySize = 256
    });

Чтобы задать пользовательский алгоритм Windows CNG с помощью счетчиков Galois режим шифрования с помощью проверки, создайте CngGcmAuthenticatedEncryptionSettings экземпляр, содержащий данные алгоритма:To specify a custom Windows CNG algorithm using Galois/Counter Mode encryption with validation, create a CngGcmAuthenticatedEncryptionSettings instance that contains the algorithmic information:

services.AddDataProtection()
    .UseCustomCryptographicAlgorithms(
        new CngGcmAuthenticatedEncryptionSettings()
    {
        // Passed to BCryptOpenAlgorithmProvider
        EncryptionAlgorithm = "AES",
        EncryptionAlgorithmProvider = null,

        // Specified in bits
        EncryptionAlgorithmKeySize = 256
    });

Примечание

Алгоритм симметричного блочного шифрования должен иметь длину ключа > = 128 бит, размер блока в точности 128 бит, и он должен поддерживать шифрование GCM.The symmetric block cipher algorithm must have a key length of >= 128 bits, a block size of exactly 128 bits, and it must support GCM encryption. Можно задать EncryptionAlgorithmProvider свойство значение null, чтобы использовать поставщика по умолчанию для указанного алгоритма.You can set the EncryptionAlgorithmProvider property to null to use the default provider for the specified algorithm. См. в разделе BCryptOpenAlgorithmProvider Дополнительные сведения см.See the BCryptOpenAlgorithmProvider documentation for more information.

Указание другие пользовательские алгоритмыSpecifying other custom algorithms

Хотя не представлен как первоклассную API, система защиты данных достаточно расширяемым для того, чтобы обеспечить возможность указания практически любой тип алгоритма.Though not exposed as a first-class API, the Data Protection system is extensible enough to allow specifying almost any kind of algorithm. Например можно сохранить все ключи, содержащиеся в модуле оборудования безопасности (HSM) и предоставить пользовательскую реализацию основные процедуры шифрования и расшифровки.For example, it's possible to keep all keys contained within a Hardware Security Module (HSM) and to provide a custom implementation of the core encryption and decryption routines. См. в разделе IAuthenticatedEncryptor в основы расширяемости шифрования Дополнительные сведения.See IAuthenticatedEncryptor in Core cryptography extensibility for more information.

Сохранение ключей при размещении в контейнере DockerPersisting keys when hosting in a Docker container

При размещении в Docker контейнера, ключи следует хранить в одном:When hosting in a Docker container, keys should be maintained in either:

  • Папка, — это том Docker, который сохраняется вне пределов продолжительности контейнера, например общего тома или узла подключенного тома.A folder that's a Docker volume that persists beyond the container's lifetime, such as a shared volume or a host-mounted volume.
  • Внешнего поставщика, таких как Azure Key Vault или Redis.An external provider, such as Azure Key Vault or Redis.

Дополнительные ресурсыAdditional resources