ASP.NET Core에서 데이터 보호 키 관리 및 수명
작성자: Rick Anderson
키 관리
앱은 운영 환경을 검색하고 키 구성을 자체적으로 처리하려고 합니다.
앱이 Azure 앱 호스트되는 경우 키는 %HOME%\ASP.NET\DataProtection-Keys 폴더에 유지됩니다. 이 폴더는 네트워크 스토리지에서 지원하고, 앱을 호스트하는 모든 머신에서 동기화됩니다.
- 키는 .에서 rest보호되지 않습니다.
- DataProtection-Keys 폴더는 단일 배포 슬롯에 앱의 모든 인스턴스에 대한 키 링을 제공합니다.
- 준비 및 프로덕션과 같은 별도의 배포 슬롯은 키 링을 공유하지 않습니다. 스테이징을 프로덕션으로 교환하거나 A/B 테스트를 사용하는 등의 배포 슬롯 간에 교환하는 경우 데이터 보호를 사용하는 모든 앱은 이전 슬롯 내의 키 링을 사용하여 저장된 데이터의 암호를 해독할 수 없습니다. 이로 인해 사용자는 데이터 보호를 사용하여 쿠키를 보호하므로 표준 ASP.NET Core cookie 인증을 사용하는 앱에서 로그아웃됩니다. 슬롯 독립적 키 링을 원하는 경우 Azure Blob Storage, Azure Key Vault, SQL 저장소 또는 Redis 캐시와 같은 외부 키 링 공급자를 사용합니다.
사용자 프로필을 사용할 수 있는 경우 키는 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys 폴더에 유지됩니다. 운영 체제가 Windows인 경우 키는 DPAPI를 사용하여 암호화됩니다 rest .
앱 풀의 setProfileEnvironment 특성도 사용하도록 설정해야 합니다.
setProfileEnvironment
의 기본값은true
입니다. Windows OS와 같은 일부 시나리오에서는setProfileEnvironment
가false
로 설정됩니다. 키가 예상대로 사용자 프로필 디렉터리에 저장되지 않는 경우 다음을 수행합니다.- %windir%/system32/inetsrv/config 폴더로 이동합니다.
- applicationHost.config 파일을 엽니다.
<system.applicationHost><applicationPools><applicationPoolDefaults><processModel>
요소를 찾습니다.setProfileEnvironment
특성이 존재하지 않는지 확인합니다. 존재하지 않을 경우 기본값이true
로 설정됩니다. 또는 특성 값을 명시적으로true
로 설정합니다.
앱이 IIS에서 호스트되는 경우 키는 작업자 프로세스 계정에만 ACLed인 특수 레지스트리 키로 HKLM 레지스트리에 유지됩니다. 키는 DPAPI를 사용하여 암호화됩니다 rest .
이러한 조건 중 일치하는 조건이 없으면 키가 현재 프로세스 외부에서 유지되지 않습니다. 프로세스가 종료되면 생성된 모든 키가 손실됩니다.
개발자는 항상 모든 권한을 가지며 키가 저장되는 방법과 위치를 재정의할 수 있습니다. 위의 처음 세 가지 옵션은 과거 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.");
}
추가 리소스
키 관리
앱은 운영 환경을 검색하고 키 구성을 자체적으로 처리하려고 합니다.
앱이 Azure 앱 호스트되는 경우 키는 %HOME%\ASP.NET\DataProtection-Keys 폴더에 유지됩니다. 이 폴더는 네트워크 스토리지에서 지원하고, 앱을 호스트하는 모든 머신에서 동기화됩니다.
- 키는 .에서 rest보호되지 않습니다.
- DataProtection-Keys 폴더는 단일 배포 슬롯에 앱의 모든 인스턴스에 대한 키 링을 제공합니다.
- 준비 및 프로덕션과 같은 별도의 배포 슬롯은 키 링을 공유하지 않습니다. 스테이징을 프로덕션으로 교환하거나 A/B 테스트를 사용하는 등의 배포 슬롯 간에 교환하는 경우 데이터 보호를 사용하는 모든 앱은 이전 슬롯 내의 키 링을 사용하여 저장된 데이터의 암호를 해독할 수 없습니다. 이로 인해 사용자는 데이터 보호를 사용하여 쿠키를 보호하므로 표준 ASP.NET Core cookie 인증을 사용하는 앱에서 로그아웃됩니다. 슬롯 독립적 키 링을 원하는 경우 Azure Blob Storage, Azure Key Vault, SQL 저장소 또는 Redis 캐시와 같은 외부 키 링 공급자를 사용합니다.
사용자 프로필을 사용할 수 있는 경우 키는 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys 폴더에 유지됩니다. 운영 체제가 Windows인 경우 키는 DPAPI를 사용하여 암호화됩니다 rest .
앱 풀의 setProfileEnvironment 특성도 사용하도록 설정해야 합니다.
setProfileEnvironment
의 기본값은true
입니다. Windows OS와 같은 일부 시나리오에서는setProfileEnvironment
가false
로 설정됩니다. 키가 예상대로 사용자 프로필 디렉터리에 저장되지 않는 경우 다음을 수행합니다.- %windir%/system32/inetsrv/config 폴더로 이동합니다.
- applicationHost.config 파일을 엽니다.
<system.applicationHost><applicationPools><applicationPoolDefaults><processModel>
요소를 찾습니다.setProfileEnvironment
특성이 존재하지 않는지 확인합니다. 존재하지 않을 경우 기본값이true
로 설정됩니다. 또는 특성 값을 명시적으로true
로 설정합니다.
앱이 IIS에서 호스트되는 경우 키는 작업자 프로세스 계정에만 ACLed인 특수 레지스트리 키로 HKLM 레지스트리에 유지됩니다. 키는 DPAPI를 사용하여 암호화됩니다 rest .
이러한 조건 중 일치하는 조건이 없으면 키가 현재 프로세스 외부에서 유지되지 않습니다. 프로세스가 종료되면 생성된 모든 키가 손실됩니다.
개발자는 항상 모든 권한을 가지며 키가 저장되는 방법과 위치를 재정의할 수 있습니다. 위의 처음 세 가지 옵션은 과거 ASP.NET <장치 키> 자동 생성 루틴이 작동하는 방법과 대부분의 앱에서 유사한, 적합한 기본값을 제공합니다. 최종 대체 옵션은 개발자가 키 지속성을 원하는 경우 구성을 미리 지정해야 하는 유일한 시나리오이지만 이 대체는 드문 경우에만 발생합니다.
Docker 컨테이너에서 호스트하는 경우 키는 Docker 볼륨(컨테이너 수명을 초과하여 유지되는 공유 볼륨 또는 호스트 탑재 볼륨)인 폴더 또는 외부 공급자(예: Azure Key Vault 또는 Redis)에 유지되어야 합니다. 외부 공급자는 앱이 공유 네트워크 볼륨에 액세스할 수 없는 경우 웹 팜 시나리오에서도 유용합니다(자세한 내용은 PersistKeysToFileSystem 참조).
Warning
개발자가 위에 설명된 규칙을 재정의하고 특정 키 리포지토리에서 데이터 보호 시스템을 가리키는 경우 키 rest 의 자동 암호화가 비활성화됩니다. At-protectionrest은 구성을 통해 다시 사용하도록 설정할 수 있습니다.
키 수명
키의 수명은 기본적으로 90일입니다. 키가 만료되면 앱은 자동으로 새 키를 생성하고 새 키를 활성 키로 설정합니다. 사용 중지된 키가 시스템에 남아 있는 한 앱은 해당 키로 보호되는 모든 데이터의 암호를 해독할 수 있습니다. 자세한 내용은 키 관리를 참조하세요.
기본 알고리즘
사용되는 기본 페이로드 보호 알고리즘은 기밀성을 위한 AES-256-CBC 및 신뢰성을 위한 HMACSHA256입니다. 90일마다 변경되는 512비트 마스터 키는 페이로드별로 이러한 알고리즘에 사용되는 두 개의 하위 키를 파생하는 데 사용됩니다. 자세한 내용은 하위 키 파생을 참조하세요.
추가 리소스
ASP.NET Core