다음을 통해 공유


ASP.NET Core에서 데이터 보호 키 관리 및 수명

작성자: Rick Anderson

키 관리

앱은 운영 환경을 검색하고 키 구성을 자체적으로 처리하려고 합니다.

  1. 앱이 Azure 앱 호스트되는 경우 키는 %HOME%\ASP.NET\DataProtection-Keys 폴더에 유지됩니다. 이 폴더는 네트워크 스토리지에서 지원하고, 앱을 호스트하는 모든 머신에서 동기화됩니다.

    • 키는 .에서 rest보호되지 않습니다.
    • DataProtection-Keys 폴더는 단일 배포 슬롯에 앱의 모든 인스턴스에 대한 키 링을 제공합니다.
    • 준비 및 프로덕션과 같은 별도의 배포 슬롯은 키 링을 공유하지 않습니다. 스테이징을 프로덕션으로 교환하거나 A/B 테스트를 사용하는 등의 배포 슬롯 간에 교환하는 경우 데이터 보호를 사용하는 모든 앱은 이전 슬롯 내의 키 링을 사용하여 저장된 데이터의 암호를 해독할 수 없습니다. 이로 인해 사용자는 데이터 보호를 사용하여 쿠키를 보호하므로 표준 ASP.NET Core cookie 인증을 사용하는 앱에서 로그아웃됩니다. 슬롯 독립적 키 링을 원하는 경우 Azure Blob Storage, Azure Key Vault, SQL 저장소 또는 Redis 캐시와 같은 외부 키 링 공급자를 사용합니다.
  2. 사용자 프로필을 사용할 수 있는 경우 키는 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys 폴더에 유지됩니다. 운영 체제가 Windows인 경우 키는 DPAPI를 사용하여 암호화됩니다 rest .

    앱 풀의 setProfileEnvironment 특성도 사용하도록 설정해야 합니다. setProfileEnvironment 의 기본값은 true입니다. Windows OS와 같은 일부 시나리오에서는 setProfileEnvironmentfalse로 설정됩니다. 키가 예상대로 사용자 프로필 디렉터리에 저장되지 않는 경우 다음을 수행합니다.

    1. %windir%/system32/inetsrv/config 폴더로 이동합니다.
    2. applicationHost.config 파일을 엽니다.
    3. <system.applicationHost><applicationPools><applicationPoolDefaults><processModel> 요소를 찾습니다.
    4. setProfileEnvironment 특성이 존재하지 않는지 확인합니다. 존재하지 않을 경우 기본값이 true로 설정됩니다. 또는 특성 값을 명시적으로 true로 설정합니다.
  3. 앱이 IIS에서 호스트되는 경우 키는 작업자 프로세스 계정에만 ACLed인 특수 레지스트리 키로 HKLM 레지스트리에 유지됩니다. 키는 DPAPI를 사용하여 암호화됩니다 rest .

  4. 이러한 조건 중 일치하는 조건이 없으면 키가 현재 프로세스 외부에서 유지되지 않습니다. 프로세스가 종료되면 생성된 모든 키가 손실됩니다.

개발자는 항상 모든 권한을 가지며 키가 저장되는 방법과 위치를 재정의할 수 있습니다. 위의 처음 세 가지 옵션은 과거 ASP.NET <장치 키> 자동 생성 루틴이 작동하는 방법과 대부분의 앱에서 유사한, 적합한 기본값을 제공합니다. 최종 대체 옵션은 개발자가 키 지속성을 원하는 경우 구성을 미리 지정해야 하는 유일한 시나리오이지만 이 대체는 드문 경우에만 발생합니다.

Docker 컨테이너에서 호스트하는 경우 키는 Docker 볼륨(컨테이너 수명을 초과하여 유지되는 공유 볼륨 또는 호스트 탑재 볼륨)인 폴더 또는 외부 공급자(예: Azure Key Vault 또는 Redis)에 유지되어야 합니다. 외부 공급자는 앱이 공유 네트워크 볼륨에 액세스할 수 없는 경우 웹 팜 시나리오에서도 유용합니다(자세한 내용은 PersistKeysToFileSystem 참조).

Warning

개발자가 위에 설명된 규칙을 재정의하고 특정 키 리포지토리에서 데이터 보호 시스템을 가리키는 경우 키 rest 의 자동 암호화가 비활성화됩니다. At-protectionrest은 구성을 통해 다시 사용하도록 설정할 수 있습니다.

키 수명

키의 수명은 기본적으로 90일입니다. 키가 만료되면 앱은 자동으로 새 키를 생성하고 새 키를 활성 키로 설정합니다. 사용 중지된 키가 시스템에 남아 있는 한 앱은 해당 키로 보호되는 모든 데이터의 암호를 해독할 수 있습니다. 자세한 내용은 키 관리를 참조하세요.

기본 알고리즘

사용되는 기본 페이로드 보호 알고리즘은 기밀성을 위한 AES-256-CBC 및 신뢰성을 위한 HMACSHA256입니다. 90일마다 변경되는 512비트 마스터 키는 페이로드별로 이러한 알고리즘에 사용되는 두 개의 하위 키를 파생하는 데 사용됩니다. 자세한 내용은 하위 키 파생을 참조하세요.

키 삭제

키를 삭제하면 보호된 데이터에 영구적으로 액세스할 수 없습니다. 이러한 위험을 완화하려면 키를 삭제하지 않는 것이 좋습니다. 키의 누적은 일반적으로 크기가 작기 때문에 최소한의 영향을 미칩니다. 매우 오래 실행되는 서비스와 같은 예외적인 경우 키를 삭제할 수 있습니다. 키만 삭제합니다.

  • 이는 오래되었습니다(더 이상 사용되지 않음).
  • 스토리지를 절약하는 대가로 데이터 손실의 위험을 허용할 수 있는 경우

데이터 보호 키를 삭제하지 않는 것이 좋습니다.

using Microsoft.AspNetCore.DataProtection.KeyManagement;

var services = new ServiceCollection();
services.AddDataProtection();

var serviceProvider = services.BuildServiceProvider();

var keyManager = serviceProvider.GetService<IKeyManager>();

if (keyManager is IDeletableKeyManager deletableKeyManager)
{
    var utcNow = DateTimeOffset.UtcNow;
    var yearAgo = utcNow.AddYears(-1);

    if (!deletableKeyManager.DeleteKeys(key => key.ExpirationDate < yearAgo))
    {
        Console.WriteLine("Failed to delete keys.");
    }
    else
    {
        Console.WriteLine("Old keys deleted successfully.");
    }
}
else
{
    Console.WriteLine("Key manager does not support deletion.");
}

추가 리소스

키 관리

앱은 운영 환경을 검색하고 키 구성을 자체적으로 처리하려고 합니다.

  1. 앱이 Azure 앱 호스트되는 경우 키는 %HOME%\ASP.NET\DataProtection-Keys 폴더에 유지됩니다. 이 폴더는 네트워크 스토리지에서 지원하고, 앱을 호스트하는 모든 머신에서 동기화됩니다.

    • 키는 .에서 rest보호되지 않습니다.
    • DataProtection-Keys 폴더는 단일 배포 슬롯에 앱의 모든 인스턴스에 대한 키 링을 제공합니다.
    • 준비 및 프로덕션과 같은 별도의 배포 슬롯은 키 링을 공유하지 않습니다. 스테이징을 프로덕션으로 교환하거나 A/B 테스트를 사용하는 등의 배포 슬롯 간에 교환하는 경우 데이터 보호를 사용하는 모든 앱은 이전 슬롯 내의 키 링을 사용하여 저장된 데이터의 암호를 해독할 수 없습니다. 이로 인해 사용자는 데이터 보호를 사용하여 쿠키를 보호하므로 표준 ASP.NET Core cookie 인증을 사용하는 앱에서 로그아웃됩니다. 슬롯 독립적 키 링을 원하는 경우 Azure Blob Storage, Azure Key Vault, SQL 저장소 또는 Redis 캐시와 같은 외부 키 링 공급자를 사용합니다.
  2. 사용자 프로필을 사용할 수 있는 경우 키는 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys 폴더에 유지됩니다. 운영 체제가 Windows인 경우 키는 DPAPI를 사용하여 암호화됩니다 rest .

    앱 풀의 setProfileEnvironment 특성도 사용하도록 설정해야 합니다. setProfileEnvironment 의 기본값은 true입니다. Windows OS와 같은 일부 시나리오에서는 setProfileEnvironmentfalse로 설정됩니다. 키가 예상대로 사용자 프로필 디렉터리에 저장되지 않는 경우 다음을 수행합니다.

    1. %windir%/system32/inetsrv/config 폴더로 이동합니다.
    2. applicationHost.config 파일을 엽니다.
    3. <system.applicationHost><applicationPools><applicationPoolDefaults><processModel> 요소를 찾습니다.
    4. setProfileEnvironment 특성이 존재하지 않는지 확인합니다. 존재하지 않을 경우 기본값이 true로 설정됩니다. 또는 특성 값을 명시적으로 true로 설정합니다.
  3. 앱이 IIS에서 호스트되는 경우 키는 작업자 프로세스 계정에만 ACLed인 특수 레지스트리 키로 HKLM 레지스트리에 유지됩니다. 키는 DPAPI를 사용하여 암호화됩니다 rest .

  4. 이러한 조건 중 일치하는 조건이 없으면 키가 현재 프로세스 외부에서 유지되지 않습니다. 프로세스가 종료되면 생성된 모든 키가 손실됩니다.

개발자는 항상 모든 권한을 가지며 키가 저장되는 방법과 위치를 재정의할 수 있습니다. 위의 처음 세 가지 옵션은 과거 ASP.NET <장치 키> 자동 생성 루틴이 작동하는 방법과 대부분의 앱에서 유사한, 적합한 기본값을 제공합니다. 최종 대체 옵션은 개발자가 키 지속성을 원하는 경우 구성을 미리 지정해야 하는 유일한 시나리오이지만 이 대체는 드문 경우에만 발생합니다.

Docker 컨테이너에서 호스트하는 경우 키는 Docker 볼륨(컨테이너 수명을 초과하여 유지되는 공유 볼륨 또는 호스트 탑재 볼륨)인 폴더 또는 외부 공급자(예: Azure Key Vault 또는 Redis)에 유지되어야 합니다. 외부 공급자는 앱이 공유 네트워크 볼륨에 액세스할 수 없는 경우 웹 팜 시나리오에서도 유용합니다(자세한 내용은 PersistKeysToFileSystem 참조).

Warning

개발자가 위에 설명된 규칙을 재정의하고 특정 키 리포지토리에서 데이터 보호 시스템을 가리키는 경우 키 rest 의 자동 암호화가 비활성화됩니다. At-protectionrest은 구성을 통해 다시 사용하도록 설정할 수 있습니다.

키 수명

키의 수명은 기본적으로 90일입니다. 키가 만료되면 앱은 자동으로 새 키를 생성하고 새 키를 활성 키로 설정합니다. 사용 중지된 키가 시스템에 남아 있는 한 앱은 해당 키로 보호되는 모든 데이터의 암호를 해독할 수 있습니다. 자세한 내용은 키 관리를 참조하세요.

기본 알고리즘

사용되는 기본 페이로드 보호 알고리즘은 기밀성을 위한 AES-256-CBC 및 신뢰성을 위한 HMACSHA256입니다. 90일마다 변경되는 512비트 마스터 키는 페이로드별로 이러한 알고리즘에 사용되는 두 개의 하위 키를 파생하는 데 사용됩니다. 자세한 내용은 하위 키 파생을 참조하세요.

추가 리소스