로컬에서 실행되는 도커 컨테이너에서 Azure Keyvault에 액세스하는 방법은 무엇입니까?
ASP가 포함된 도커 이미지가 있습니다.Azure Key 볼트를 사용하여 연결 문자열과 같은 항목에 액세스하는 NET Core 앱입니다.이미지를 로컬로 실행하면 다음 오류가 발생합니다.
Unhandled Exception: Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/[guid]. Exception Message: Tried the following 3 methods to get an access token, but none of them worked.
Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/[guid]. Exception Message: Tried to get token using Managed Service Identity. Unable to connect to the Managed Service Identity (MSI) endpoint. Please check that you are running on an Azure resource that has MSI setup.
Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/[guid]. Exception Message: Tried to get token using Visual Studio. Access token could not be acquired. Environment variable LOCALAPPDATA not set.
Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/[guid]. Exception Message: Tried to get token using Azure CLI. Access token could not be acquired. /bin/bash: az: No such file or directory
제가 알기로는 먼저 액세스 토큰을 관리 서비스 ID로 가져오려고 합니다.그것은 Azure 클라우드에서 실행되지 않기 때문에 이것을 할 수 없고 비주얼 스튜디오 연결 서비스를 통해 그것을 얻으려고 합니다.이것은 도커 이미지에 없을 것이기 때문에 Azure CLI를 사용하려고 하지만 도커 이미지에 설치되어 있지 않습니다.
그래서 저는 도커 이미지에 Azure CLI를 설치해야 합니다.도커 파일의 기본 이미지가 다음과 같다면, 이 작업은 어떻게 수행됩니까?FROM microsoft/dotnet:2.1-aspnetcore-runtime
?
이 기본 이미지는 Alpine OS 이미지인데 Alpine과 함께 Azure CLI를 설치해야 합니까?
Azure CLI가 설치되어 있다고 가정하면 도커 파일 소스 코드에 자격 증명을 저장하거나 일반 텍스트를 통해 컨테이너에 전달하지 않고 키 볼트에 액세스할 수 있는 방법이 있습니까?
더 일반적으로, 여기서 가장 좋은 접근법은 무엇입니까?
현재 제 솔루션은 액세스 토큰과 함께 환경 변수를 사용하는 것입니다.
키를 가져와 환경 변수에 저장합니다(AZ 로그인을 수행하고 올바른 구독을 설정한 후).
$Env:ACCESS_TOKEN=(az account get-access-token --resource=https://vault.azure.net | ConvertFrom-Json).accessToken
Visual Studio에서 해당 환경 변수를 추가합니다.
코드를 다음으로 변경:
config.AddEnvironmentVariables();
KeyVaultClient keyVaultClient;
var accessToken = Environment.GetEnvironmentVariable("ACCESS_TOKEN");
if (accessToken != null)
{
keyVaultClient = new KeyVaultClient(
async (string a, string r, string s) => accessToken);
}
else
{
var azureServiceTokenProvider = new AzureServiceTokenProvider();
keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
}
config.AddAzureKeyVault(
$"https://{builtConfig["KeyVaultName"]}.vault.azure.net/",
keyVaultClient,
new DefaultKeyVaultSecretManager());
솔루션(실운영용이 아님)
문제에 대한 가능한 해결책은 SP(서비스 주체)를 생성하고 RBAC 또는 IAM을 통해 이 서비스 주체에게 키 볼트에 대한 액세스 권한을 부여하는 것입니다.SP 생성에 대한 Microsoft 설명서
SP의 인증 정보를 다음과 같이 사용client-id
그리고.client-secret
그런 다음 볼트에 로그인하여 암호를 검색할 수 있습니다.
걱정
- 이 접근 방식을 사용하면 코드에 비밀(키 볼트를 사용하는 정확한 이유)을 입력할 수 있습니다.로컬 도커 이미지는 개발 전용인 것 같습니다.따라서 기존의 비밀 없는 인증 체계 중 하나가 사용되는 별도의 운영용 Kevault를 사용하면서 개발용 Kevault(SP를 사용하여 액세스)를 생성하는 것이 좋습니다.
- 키 볼트가 azure 클라우드 외부에서 액세스할 수 있는지 확인해야 합니다(portal.azure.com 의 액세스 정책 참조).
E를 단순화하고 자동화하기 위한 시도입니다. 스탈의 대답은, 제가 생각해 낸 것입니다.
:
.gitignore
파일의 맨 아래에 다음 행을 추가합니다.appsettings.local.json
솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고
Properties
의 시대에Build Events
탭, 색을 .Pre-build event command line
텍스트 상자를 선택하고 다음 코드를 추가합니다.cd /d "$(ProjectDir)" if exist "appsettings.local.json" del "appsettings.local.json" if "$(ConfigurationName)" == "Debug" ( az account get-access-token --resource=https://vault.azure.net > appsettings.local.json )
의 신의에서.
launchSettings.json
하여) 값을 합니다.{ "profiles": { // ... "Docker": { "commandName": "Docker", "environmentVariables": { "DOTNET_ENVIRONMENT": "Development", "AZURE_TENANT_ID": "<YOUR-AZURE-TENANT-ID-HERE>" } } } }
의 신의에서.
Program.cs
"CreateHostBuilder"를 합니다.ConfigureAppConfiguration
이에 따라 차단합니다. 예를 들어 다음과 같습니다.Host.CreateDefaultBuilder(args).ConfigureAppConfiguration ( (ctx, cfg) => { if (ctx.HostingEnvironment.IsDevelopment()) { cfg.AddJsonFile("appsettings.local.json", true); } var builtConfig = cfg.Build(); var keyVault = builtConfig["KeyVault"]; if (!string.IsNullOrWhiteSpace(keyVault)) { var accessToken = builtConfig["accessToken"]; cfg.AddAzureKeyVault ( $"https://{keyVault}.vault.azure.net/", new KeyVaultClient ( string.IsNullOrWhiteSpace(accessToken) ? new KeyVaultClient.AuthenticationCallback ( new AzureServiceTokenProvider().KeyVaultTokenCallback ) : (x, y, z) => Task.FromResult(accessToken) ), new DefaultKeyVaultSecretManager() ); } } )
그래도 작동하지 않으면 다음 사항을 확인합니다.az login
수행되었으며 다음과 같은 작업을 수행했습니다.az account get-access-token --resource=https://vault.azure.net
사용자에게 올바르게 작동합니다.
이 문제를 제기한 후 시간이 좀 걸리더라도 운영 환경에 적합한 다른 옵션은 x509 인증서를 사용하는 것입니다.
Microsoft에서는 이 방법을 설명하는 이 문서를 제공합니다.자체 서명된 인증서 또는 다른 유효한 SSL 인증서를 사용할 수 있습니다.그것은 당신의 필요에 따라 다릅니다.
이는 도커 컨테이너가 루트 사용자로 실행되고 있고 키 볼트에 등록된 사용자가 다른 사용자이기 때문입니다(yourusername@yourcmpany.com )
언급URL : https://stackoverflow.com/questions/55247997/how-to-access-azure-keyvault-from-docker-container-running-locally
'code' 카테고리의 다른 글
1999년 10월 12일의 의미는 무엇입니까? (0) | 2023.05.08 |
---|---|
왜 MongoDB가 SQL DB보다 훨씬 빠른지에 대한 구체적이고 구체적인 이유가 있습니까? (0) | 2023.05.08 |
단위 테스트와 함께 애플리케이션 통찰력을 사용하시겠습니까? (0) | 2023.05.08 |
텍스트 상자를 부동값으로 바인딩합니다.도트/콤마를 입력할 수 없습니다. (0) | 2023.05.08 |
SQL 테이블의 레코드를 복사하면서 새 행의 고유 ID를 스왑 아웃하려면 어떻게 해야 합니까? (0) | 2023.05.08 |