ASP.NET Core에서 데이터 보호를 구성합니다.Configuring Data Protection in ASP.NET Core

작성자: Rick AndersonBy Rick Anderson

데이터 보호 시스템 초기화 될 때 적용 기본 설정 운영 환경에 따라 합니다.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, perhaps because their app is spread across multiple machines or for compliance reasons. 이러한 시나리오에 대 한 데이터 보호 시스템 풍부한 구성 API를 제공합니다.For these scenarios, the Data Protection system offers a rich configuration API.

확장 메서드가 없는 AddDataProtection 반환 하는 IDataProtectionBuilder합니다.There's an extension method AddDataProtection that returns an IDataProtectionBuilder. IDataProtectionBuilder확장 메서드를 함께 결합할 수 데이터 보호를 구성 하려면 옵션을 표시 합니다.IDataProtectionBuilder exposes extension methods that you can chain together to configure Data Protection options.

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");
}

참조 휴지 키 암호화 추가 예제 및 기본 제공 키 암호화 메커니즘에 대 한 토론에 대 한 합니다.See Key Encryption At Rest for more examples and discussion on the built-in key encryption mechanisms.

SetDefaultKeyLifetimeSetDefaultKeyLifetime

90 일 동안 14 일의 키 수명 기본값 대신 사용 하도록 시스템을 구성 하려면 사용 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, even if they're sharing the same physical key repository. 이렇게 하면 앱을에서 다른 사용자의 보호 된 페이로드 이해지 않습니다.This prevents the apps from understanding each other's protected payloads. 두 앱 간에 보호 된 페이로드를 공유 하려면 사용 하 여 SetApplicationName 각 앱에 대 한 값:To share protected payloads between two apps, use SetApplicationName with the same value for each app:

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 판별자로 응용 프로그램 ID를 자동으로 포함 하는 지정 된 모든 앱에 대 한 루트입니다.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. 응용 프로그램의 고유 ID 두 위치 중 하나에서 나옵니다.The app's unique ID comes from one of two places:

  1. 응용 프로그램을 IIS에서 호스트 하는 경우 고유 식별자는 응용 프로그램의 구성 경로입니다.If the app is hosted in IIS, the unique identifier is the app's configuration path. 응용 프로그램을 웹 팜 환경에 배포 하는 경우이 값은 웹 팜의 모든 컴퓨터에 IIS 환경 비슷하게 구성 이라고 가정할 안정적인 여야 합니다.If an app is deployed in a web farm environment, this value should be stable assuming that the IIS environments are configured similarly across all machines in the web farm.

  2. 응용 프로그램을 IIS에서 호스트 되지 않습니다. 하는 경우 고유 식별자는 앱의 실제 경로입니다.If the app isn't hosted in IIS, the unique identifier is the physical path of the app.

고유 식별자 다시 설정 후에 유지 하도록 되어 — 개별 응용 프로그램 및 컴퓨터 자체입니다.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.

UseCryptographicAlgorithms와 알고리즘을 변경합니다.Changing 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
    });

기본 EncryptionAlgorithm CBC AES 256-, 이며 기본 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. 위의 시나리오에서 데이터 보호 시스템에는 Windows에서 실행 되는 경우 AES의 CNG 구현을 사용 하 여 시도 합니다.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)
    });

일반적으로 *형식 속성 콘크리트를 가리켜야 합니다. (공용 매개 변수가 없는 생성자)를 통해 인스턴스화할 수 있는 구현 SymmetricAlgorithmKeyedHashAlgorithm경우에 시스템 특수 한 경우와 같은 일부 값 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 비트 고 PKCS #7 안쪽 여백 사용 하 여 CBC 모드 암호화를 지원 해야 합니다.The SymmetricAlgorithm 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. 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. ≥ 128 비트의 키 길이 및 ≥ 64 비트의 블록 크기는 SymmetricAlgorithm 있어야 하 고 PKCS #7 안쪽 여백 사용 하 여 CBC 모드 암호화를 지원 해야 합니다.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 is not strictly required to be HMAC.

사용자 지정 Windows CNG 알고리즘 지정Specifying custom Windows CNG algorithms

CBC 모드 암호화를 사용 하 여 HMAC 유효성 검사와 함께 사용자 지정 Windows CNG 알고리즘을 지정 하려면 만듭니다는 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
    });

참고

블록 대칭 암호화 알고리즘의 키 길이 있어야 합니다. > = 128 비트의 블록 크기 > 64 비트 고 PKCS #7 안쪽 여백 사용 하 여 CBC 모드 암호화를 지원 해야 합니다.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.

유효성 검사와 Galois/카운터 모드 암호화를 사용 하 여 사용자 지정 Windows CNG 알고리즘을 지정 하려면 만듭니다는 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
    });

참고

블록 대칭 암호화 알고리즘의 키 길이 있어야 합니다. > = 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.

Docker 컨테이너에서 호스팅하는 경우에 영구적 키Persisting 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 키 자격 증명 모음 또는 Redis합니다.An external provider, such as Azure Key Vault or Redis.

참고 항목See also