ASP.NET Core에서 개발의 앱 암호의 안전한 저장소Safe storage of app secrets in development in ASP.NET Core

작성자: Rick Anderson, 김 Roth, 및 Scott AddieBy Rick Anderson, Daniel Roth, and Scott Addie

예제 코드 살펴보기 및 다운로드(다운로드 방법)View or download sample code (how to download)

이 문서에 저장 하 고 ASP.NET Core 응용 프로그램을 개발 하는 동안 중요 한 데이터를 검색 하는 기술을 설명 합니다.This document explains techniques for storing and retrieving sensitive data during the development of an ASP.NET Core app. 소스 코드에서 암호 또는 기타 중요 한 데이터를 저장 해서는 안 하 고 개발에서 생산 암호를 사용 하거나 모드를 테스트 하지 않아야 합니다.You should never store passwords or other sensitive data in source code, and you shouldn't use production secrets in development or test mode. 저장 하 고 Azure 테스트 및 프로덕션 비밀 정보를 보호할 수는 Azure 키 자격 증명 모음 구성 공급자합니다.You can store and protect Azure test and production secrets with the Azure Key Vault configuration provider.

환경 변수Environment variables

응용 프로그램 보안 코드 또는 로컬 구성 파일의 저장소를 방지 하기 위해 환경 변수를 사용 합니다.Environment variables are used to avoid storage of app secrets in code or in local configuration files. 환경 변수는 모든 이전에 지정 된 구성 소스에 대 한 구성 값을 재정의 합니다.Environment variables override configuration values for all previously specified configuration sources.

호출 하 여 환경 변수 값을 읽는 구성 AddEnvironmentVariablesStartup 생성자:Configure the reading of environment variable values by calling AddEnvironmentVariables in the Startup constructor:

[!code-csharp][!code-csharp]

ASP.NET Core 웹 응용 프로그램 고려 개별 사용자 계정 보안을 사용 합니다.Consider an ASP.NET Core web app in which Individual User Accounts security is enabled. 프로젝트의 기본 데이터베이스 연결 문자열을 포함 되어 appsettings.json 키와 파일 DefaultConnection합니다.A default database connection string is included in the project's appsettings.json file with the key DefaultConnection. 기본 연결 문자열은 localdb 사용자 모드에서 실행 되 고 암호가 필요 하지 않습니다.The default connection string is for LocalDB, which runs in user mode and doesn't require a password. 응용 프로그램 배포 시는 DefaultConnection 환경 변수 값과 키 값을 재정의할 수 있습니다.During app deployment, the DefaultConnection key value can be overridden with an environment variable's value. 환경 변수는 중요 한 자격 증명으로 완전 한 연결 문자열을 저장할 수 있습니다.The environment variable may store the complete connection string with sensitive credentials.

경고

환경 변수는 일반적으로 암호화 되지 않은 일반 텍스트에 저장 됩니다.Environment variables are generally stored in plain, unencrypted text. 컴퓨터 또는 프로세스가 손상 되 면 환경 변수는 신뢰할 수 없는 당사자가 액세스할 수 있습니다.If the machine or process is compromised, environment variables can be accessed by untrusted parties. 사용자의 비밀으로 공개 되지 않도록 추가 조치가 필요할 수 있습니다.Additional measures to prevent disclosure of user secrets may be required.

암호 관리자Secret Manager

암호 관리자 도구는 ASP.NET Core 프로젝트를 개발 하는 동안 중요 한 데이터를 저장합니다.The Secret Manager tool stores sensitive data during the development of an ASP.NET Core project. 이 컨텍스트에서 중요 한 데이터 조각이 응용 프로그램 암호입니다.In this context, a piece of sensitive data is an app secret. 앱 암호는 프로젝트 트리에서 별도 위치에 저장 됩니다.App secrets are stored in a separate location from the project tree. 앱 암호는 특정 프로젝트와 관련 된 또는 여러 프로젝트 간에 공유 됩니다.The app secrets are associated with a specific project or shared across several projects. 앱 암호는 소스 제어에 체크 인 되지 않습니다.The app secrets aren't checked into source control.

경고

암호 관리자 도구 저장 된 암호를 암호화 하지 않습니다 하 고 신뢰할 수 있는 저장소로 처리 하지 않아야 합니다.The Secret Manager tool doesn't encrypt the stored secrets and shouldn't be treated as a trusted store. 개발 용도로입니다.It's for development purposes only. 키와 값은 사용자 프로필 디렉터리에는 JSON 구성 파일에 저장 됩니다.The keys and values are stored in a JSON configuration file in the user profile directory.

암호 관리자 도구 작동 방식How the Secret Manager tool works

암호 관리자 도구 값을 저장 하는 위치와 방법을 같은 구현 세부 정보를 추상화 합니다.The Secret Manager tool abstracts away the implementation details, such as where and how the values are stored. 이러한 구현 정보를 알 필요 없이 도구를 사용할 수 있습니다.You can use the tool without knowing these implementation details. 값은 로컬 컴퓨터에서 시스템으로 보호 된 사용자 프로필 폴더에는 JSON 구성 파일에 저장 됩니다.The values are stored in a JSON configuration file in a system-protected user profile folder on the local machine:

파일 시스템 경로:File system path:

%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json

앞의 파일 경로, 대체 <user_secrets_id>UserSecretsId 에 지정 된 값의 .csproj 파일입니다.In the preceding file paths, replace <user_secrets_id> with the UserSecretsId value specified in the .csproj file.

위치 또는 보안 관리자 도구와 함께 저장 되는 데이터의 형식에 의존 하는 코드를 작성 하지 마십시오.Don't write code that depends on the location or format of data saved with the Secret Manager tool. 이러한 구현 정보를 변경할 수 있습니다.These implementation details may change. 예를 들어 비밀 값 암호화 되지 않습니다 되지만 나중에 있습니다.For example, the secret values aren't encrypted, but could be in the future.

암호 관리자 도구를 설치 합니다.Install the Secret Manager tool

암호 관리자 도구는.NET Core SDK 2.1.300부터.NET Core CLI 함께 제공 됩니다.The Secret Manager tool is bundled with the .NET Core CLI as of .NET Core SDK 2.1.300. 2.1.300 이전 버전을.NET Core SDK, 도구를 설치 해야만 됩니다.For .NET Core SDK versions before 2.1.300, tool installation is necessary.

실행 dotnet --version 명령 셸을 설치 된.NET Core SDK 버전 번호를 확인 합니다.Run dotnet --version from a command shell to see the installed .NET Core SDK version number.

사용 중인.NET Core SDK 도구를 포함 하는 경우 경고가 표시 됩니다.A warning is displayed if the .NET Core SDK being used includes the tool:

The tool 'Microsoft.Extensions.SecretManager.Tools' is now included in the .NET Core SDK. Information on resolving this warning is available at (https://aka.ms/dotnetclitools-in-box).

설치는 Microsoft.Extensions.SecretManager.Tools ASP.NET Core 프로젝트에 NuGet 패키지 합니다.Install the Microsoft.Extensions.SecretManager.Tools NuGet package in your ASP.NET Core project. 예를 들어:For example:

[!code-xml][!code-xml]

도구 설치를 확인 하는 명령 셸에서 다음 명령을 실행 합니다.Execute the following command in a command shell to validate the tool installation:

dotnet user-secrets -h

암호 관리자 도구 사용법 예제, 옵션 및 명령 도움말을 표시합니다.The Secret Manager tool displays sample usage, options, and command help:

Usage: dotnet user-secrets [options] [command]

Options:
-?|-h|--help                        Show help information
--version                           Show version information
-v|--verbose                        Show verbose output
-p|--project <PROJECT>              Path to project. Defaults to searching the current directory.
-c|--configuration <CONFIGURATION>  The project configuration to use. Defaults to 'Debug'.
--id                                The user secret ID to use.

Commands:
clear   Deletes all the application secrets
list    Lists all the application secrets
remove  Removes the specified user secret
set     Sets the user secret to the specified value

Use "dotnet user-secrets [command] --help" for more information about a command.

참고

와 같은 디렉터리에 있어야는 .csproj 파일에 정의 된 도구를 실행 하는 .csproj 파일의 DotNetCliToolReference 요소입니다.You must be in the same directory as the .csproj file to run tools defined in the .csproj file's DotNetCliToolReference elements.

암호를 설정 합니다.Set a secret

암호 관리자 도구는 사용자 프로필에 저장 된 프로젝트 관련 구성 설정에서 작동 합니다.The Secret Manager tool operates on project-specific configuration settings stored in your user profile. 사용자 암호를 사용 하려면 정의 UserSecretsId 요소 내에서 한 PropertyGroup.csproj 파일입니다.To use user secrets, define a UserSecretsId element within a PropertyGroup of the .csproj file. UserSecretsId 은 선택적 요소 이지만 프로젝트에 고유 합니다.The value of UserSecretsId is arbitrary, but is unique to the project. 에 대 한 GUID를 일반적으로 생성 하는 개발자는 UserSecretsId합니다.Developers typically generate a GUID for the UserSecretsId.

[!code-xml][!code-xml]

[!code-xml][!code-xml]

Visual Studio에서 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 선택 관리 사용자의 비밀 상황에 맞는 메뉴입니다.In Visual Studio, right-click the project in Solution Explorer, and select Manage User Secrets from the context menu. 이 제스처 추가 UserSecretsId 에 GUID로 채워진 요소는 .csproj 파일입니다.This gesture adds a UserSecretsId element, populated with a GUID, to the .csproj file. Visual Studio가 열릴는 secrets.json 파일 텍스트 편집기에서.Visual Studio opens a secrets.json file in the text editor. 내용을 대체 secrets.json 저장할 키-값 쌍을 포함 합니다.Replace the contents of secrets.json with the key-value pairs to be stored. 예를 들면 json { "Movies": { "ServiceApKey": "12345", "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true" } } 같은 형식입니다.For example: json { "Movies": { "ServiceApKey": "12345", "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true" } }

키와 해당 값으로 구성 된 앱 암호를 정의 합니다.Define an app secret consisting of a key and its value. 암호는 해당 프로젝트와 관련 UserSecretsId 값입니다.The secret is associated with the project's UserSecretsId value. 예를 들어 있는 디렉터리에서 다음 명령을 실행는 .csproj 파일이 있습니다.For example, run the following command from the directory in which the .csproj file exists:

dotnet user-secrets set "Movies:ServiceApiKey" "12345"

앞의 예제에서 콜론 나타냅니다 Movies 은 개체 리터럴을 ServiceApiKey 속성입니다.In the preceding example, the colon denotes that Movies is an object literal with a ServiceApiKey property.

암호 관리자 도구는 너무 다른 디렉터리에서 사용할 수 있습니다.The Secret Manager tool can be used from other directories too. 사용 하 여는 --project 옵션을 파일 시스템 경로 제공 하는 .csproj 파일이 있습니다.Use the --project option to supply the file system path at which the .csproj file exists. 예를 들어:For example:

dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"

여러 암호를 설정 합니다.Set multiple secrets

JSON에 파이프 하 여 보안의 일괄 처리를 설정할 수 있습니다는 set 명령입니다.A batch of secrets can be set by piping JSON to the set command. 다음 예제에서는 input.json 파일의 내용으로 파이프 되는 set 명령입니다.In the following example, the input.json file's contents are piped to the set command.

명령 셸을 열고 다음 명령을 실행 합니다.Open a command shell, and execute the following command:

type .\input.json | dotnet user-secrets set

암호에 액세스Access a secret

ASP.NET Core 구성 API 보안 관리자 암호에 대 한 액세스를 제공 합니다.The ASP.NET Core Configuration API provides access to Secret Manager secrets. 설치는 Microsoft.Extensions.Configuration.UserSecrets NuGet 패키지 합니다.Install the Microsoft.Extensions.Configuration.UserSecrets NuGet package.

사용자 암호 구성 소스를 호출 하 여 추가 AddUserSecretsStartup 생성자:Add the user secrets configuration source with a call to AddUserSecrets in the Startup constructor:

[!code-csharp][!code-csharp]

ASP.NET Core 구성 API 보안 관리자 암호에 대 한 액세스를 제공 합니다.The ASP.NET Core Configuration API provides access to Secret Manager secrets. 프로젝트가.NET Framework를 대상으로 하는 경우 설치는 Microsoft.Extensions.Configuration.UserSecrets NuGet 패키지 합니다.If your project targets the .NET Framework, install the Microsoft.Extensions.Configuration.UserSecrets NuGet package.

ASP.NET Core 2.0 이상에서는 사용자 보안 구성 소스 자동으로 추가 됩니다 개발 모드에서 프로젝트를 호출할 때 CreateDefaultBuilder 미리 구성 된 기본값을 사용 하 여 호스트의 새 인스턴스를 초기화 합니다.In ASP.NET Core 2.0 or later, the user secrets configuration source is automatically added in development mode when the project calls CreateDefaultBuilder to initialize a new instance of the host with preconfigured defaults. CreateDefaultBuilder 호출 AddUserSecrets 때는 EnvironmentName개발:CreateDefaultBuilder calls AddUserSecrets when the EnvironmentName is Development:

[!code-csharp][!code-csharp]

CreateDefaultBuilder 없는 사용자 암호 구성 소스를 호출 하 여 추가 호스트 생성 하는 동안 호출 AddUserSecretsStartup 생성자:When CreateDefaultBuilder isn't called during host construction, add the user secrets configuration source with a call to AddUserSecrets in the Startup constructor:

[!code-csharp][!code-csharp]

사용자 암호를 통해 검색할 수 있습니다는 Configuration API:User secrets can be retrieved via the Configuration API:

[!code-csharp][!code-csharp]

[!code-csharp][!code-csharp]

암호와 문자열 대체String replacement with secrets

암호를 일반 텍스트로 저장 안전 하지 않습니다.Storing passwords in plain text is insecure. 데이터베이스 연결 문자열에 저장 하는 예를 들어 appsettings.json 지정된 된 사용자에 대 한 암호를 포함 될 수 있습니다.For example, a database connection string stored in appsettings.json may include a password for the specified user:

{
  "ConnectionStrings": {
    "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;Password=pass123;MultipleActiveResultSets=true"
  }
}

암호로 암호를 저장 하는 보다 안전한 방법이입니다.A more secure approach is to store the password as a secret. 예를 들어:For example:

dotnet user-secrets set "DbPassword" "pass123"

제거는 Password 키-값 쌍의 연결 문자열에서 appsettings.json합니다.Remove the Password key-value pair from the connection string in appsettings.json. 예를 들어:For example:

{
  "ConnectionStrings": {
    "Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;MultipleActiveResultSets=true"
  }
}

암호의 값에 설정할 수는 SqlConnectionStringBuilder 개체의 암호 연결 문자열을 완료 하는 속성:The secret's value can be set on a SqlConnectionStringBuilder object's Password property to complete the connection string:

[!code-csharp][!code-csharp]

[!code-csharp][!code-csharp]

암호 나열List the secrets

응용 프로그램의 가정 secrets.json 다음 두 가지 암호를 포함 하는 파일:Assume the app's secrets.json file contains the following two secrets:

{
  "Movies": {
    "ServiceApKey": "12345",
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

디렉터리에서 다음 명령을 실행는 .csproj 파일이 있습니다.Run the following command from the directory in which the .csproj file exists:

dotnet user-secrets list

다음과 같은 출력이 표시 됩니다.The following output appears:

Movies:ServiceApiKey = 12345
Movies:ConnectionString = Server=(localdb)\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true

키 이름에 콜론 앞의 예제에서 내에서 개체 계층 구조를 나타냅니다 secrets.json합니다.In the preceding example, a colon in the key names denotes the object hierarchy within secrets.json.

단일 암호를 제거 합니다.Remove a single secret

응용 프로그램의 가정 secrets.json 다음 두 가지 암호를 포함 하는 파일:Assume the app's secrets.json file contains the following two secrets:

{
  "Movies": {
    "ServiceApKey": "12345",
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

디렉터리에서 다음 명령을 실행는 .csproj 파일이 있습니다.Run the following command from the directory in which the .csproj file exists:

dotnet user-secrets remove "Movies:ConnectionString"

응용 프로그램의 secrets.json 와 연결 된 키-값 쌍을 제거 하려면 파일을 수정한는 MoviesConnectionString 키:The app's secrets.json file was modified to remove the key-value pair associated with the MoviesConnectionString key:

{
  "Movies": {
    "ServiceApiKey": "12345"
  }
}

실행 dotnet user-secrets list 다음 메시지가 표시 됩니다.Running dotnet user-secrets list displays the following message:

Movies:ServiceApiKey = 12345

모든 암호를 제거 합니다.Remove all secrets

응용 프로그램의 가정 secrets.json 다음 두 가지 암호를 포함 하는 파일:Assume the app's secrets.json file contains the following two secrets:

{
  "Movies": {
    "ServiceApKey": "12345",
    "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

디렉터리에서 다음 명령을 실행는 .csproj 파일이 있습니다.Run the following command from the directory in which the .csproj file exists:

dotnet user-secrets clear

삭제 된 응용 프로그램에 대 한 모든 사용자 암호는 secrets.json 파일:All user secrets for the app have been deleted from the secrets.json file:

{}

실행 dotnet user-secrets list 다음 메시지가 표시 됩니다.Running dotnet user-secrets list displays the following message:

No secrets configured for this application.

추가 자료Additional resources