Bicep을 사용하여 비밀 관리
배포 시 Azure 환경 전체에 안전하게 저장 및 전파되는 비밀이 필요한 경우가 많습니다. Bicep 및 Azure는 배포에서 비밀을 관리할 수 있도록 하는 많은 기능을 제공합니다.
가능한 한 비밀을 방지합니다.
많은 상황에서 비밀을 완전히 사용하지 않도록 할 수 있습니다. 많은 Azure 리소스를 사용하면 자격 증명을 처리하거나 관리할 필요 없이 관리 ID 를 인증하고 Azure 내의 다른 리소스에 액세스할 수 있는 권한을 부여받을 수 있습니다. 또한 일부 Azure 서비스는 자동으로 HTTPS 인증서를 생성하여 인증서 및 프라이빗 키를 처리하지 못하도록 할 수 있습니다. 가능한 경우 관리 ID 및 서비스 관리 인증서를 사용합니다.
보안 매개 변수 사용
Bicep 배포에 비밀을 매개 변수로 제공해야 하는 경우 @secure()
데코레이터를 사용합니다. 매개 변수를 안전한 것으로 표시하면 Azure Resource Manager는 값을 로깅하거나 Azure Portal, Azure CLI 또는 Azure PowerShell에 표시하지 않습니다.
비밀에 대한 출력 피하기
보안 데이터를 위해 Bicep 출력을 사용하지 마세요. 출력은 배포 기록에 기록되며 배포에 대한 액세스 권한이 있는 사람은 누구나 배포 출력의 값을 볼 수 있습니다.
Bicep 배포 내에서 비밀을 생성하고 호출자 또는 다른 리소스에서 사용할 수 있도록 해야 하는 경우 다음 방법 중 하나를 고려합니다.
동적으로 비밀 찾기
경우에 따라 한 리소스의 비밀에 액세스하여 다른 리소스를 구성해야 합니다. 예를 들어 다른 배포에서 스토리지 계정을 만들었으며 기본 키에 액세스하여 Azure Functions 앱을 구성해야 할 수 있습니다. 키워드를 existing
사용하여 미리 만든 스토리지 계정에 대한 강력한 형식의 참조를 가져온 다음 스토리지 계정의 listKeys()
메서드를 사용하여 기본 키로 연결 문자열 만들 수 있습니다.
다음 예제는 더 큰 예제의 일부입니다. 배포할 수 있는 Bicep 파일은 전체 파일을 참조하세요.
param location string = resourceGroup().location
param storageAccountName string
param functionAppName string = 'fn-${uniqueString(resourceGroup().id)}'
var appServicePlanName = 'MyPlan'
var applicationInsightsName = 'MyApplicationInsights'
resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' existing = {
name: storageAccountName
}
var storageAccountConnectionString = 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${listKeys(storageAccount.id, storageAccount.apiVersion).keys[0].value}'
resource functionApp 'Microsoft.Web/sites@2023-12-01' = {
name: functionAppName
location: location
kind: 'functionapp'
properties: {
httpsOnly: true
serverFarmId: appServicePlan.id
siteConfig: {
appSettings: [
{
name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
value: applicationInsights.properties.InstrumentationKey
}
{
name: 'AzureWebJobsStorage'
value: storageAccountConnectionString
}
{
name: 'FUNCTIONS_EXTENSION_VERSION'
value: '~3'
}
{
name: 'FUNCTIONS_WORKER_RUNTIME'
value: 'dotnet'
}
{
name: 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING'
value: storageAccountConnectionString
}
]
}
}
}
resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
name: appServicePlanName
location: location
sku: {
name: 'Y1'
tier: 'Dynamic'
}
}
resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
name: applicationInsightsName
location: location
kind: 'web'
properties: {
Application_Type: 'web'
publicNetworkAccessForIngestion: 'Enabled'
publicNetworkAccessForQuery: 'Enabled'
}
}
이 방법을 사용하면 Bicep 파일로 또는 외부로 비밀을 전달하지 않도록 방지하고 키 자격 증명 모음에 비밀을 저장하는 데 도움이 될 수 있습니다.
Key Vault 사용
Azure Key Vault는 보안 데이터를 저장하고 관리하도록 설계되었습니다. 키 자격 증명 모음을 사용하여 보호하고 공유해야 하는 비밀, 인증서, 키 및 기타 데이터를 관리합니다.
Bicep을 사용하여 자격 증명 모음 및 비밀을 만들고 관리할 수 있습니다. 유형이 Microsoft.KeyVault/vaults
인 리소스를 만들어 자격 증명 모음을 정의합니다.
자격 증명 모음을 만들 때 데이터에 액세스할 수 있는 사람과 대상을 결정해야 합니다. Bicep 파일 내에서 자격 증명 모음의 비밀을 읽으려면 enabledForTemplateDeployment
속성을 true
로 설정합니다.
키 자격 증명 모음에 비밀 추가
비밀은 하위 리소스이며 Microsoft.KeyVault/vaults/secrets
유형을 사용하여 만들 수 있습니다. 다음 예제에서는 자격 증명 모음 및 비밀을 만드는 방법을 보여 줍니다.
다음 예제는 더 큰 예제의 일부입니다. 배포할 수 있는 Bicep 파일은 전체 파일을 참조하세요.
param location string = resourceGroup().location
param keyVaultName string = 'mykv${uniqueString(resourceGroup().id)}'
resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' = {
name: keyVaultName
location: location
properties: {
enabledForTemplateDeployment: true
tenantId: tenant().tenantId
accessPolicies: [
]
sku: {
name: 'standard'
family: 'A'
}
}
}
resource keyVaultSecret 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
parent: keyVault
name: 'MySecretName'
properties: {
value: 'MyVerySecretValue'
}
}
팁
자동화된 배포 파이프라인을 사용할 때 배포에 대한 키 자격 증명 모음 비밀을 부트스트랩하는 방법을 결정하는 것이 어려울 수 있습니다. 예를 들어 외부 API와 통신할 때 사용할 API 키가 제공된 경우 배포에 사용하려면 먼저 보안 비밀을 자격 증명 모음에 추가해야 합니다.
타사에서 제공하는 비밀로 작업하는 경우 모든 후속 용도에 대해 참조하기 전에 자격 증명 모음에 수동으로 추가해야 할 수 있습니다.
모듈과 함께 키 자격 증명 모음 사용
Bicep 모듈을 사용할 때 getSecret
함수를 사용하여 보안 매개 변수를 제공할 수 있습니다.
existing
및 scope
키워드를 함께 사용하여 다른 리소스 그룹에 정의된 키 자격 증명 모음을 참조할 수도 있습니다. 다음 예에서 Bicep 파일은 Networking이라는 리소스 그룹에 배포됩니다. 모듈의 매개 변수 mySecret 값은 비밀 리소스 그룹에 있는 contosonetworkingsecrets라는 키 자격 증명 모음에 정의됩니다.
resource networkingSecretsKeyVault 'Microsoft.KeyVault/vaults@2023-07-01' existing = {
scope: resourceGroup('Secrets')
name: 'contosonetworkingsecrets'
}
module exampleModule 'module.bicep' = {
name: 'exampleModule'
params: {
mySecret: networkingSecretsKeyVault.getSecret('mySecret')
}
}
.bicepparam 파일에서 키 자격 증명 모음 사용
.bicepparam
파일 형식을 사용할 때, getSecret
함수를 사용하여 매개 변수를 사용할 때 비밀 값을 제공할 수 있습니다.
구독 ID, 리소스 그룹 이름 및 키 자격 증명 모음 이름을 제공하여 키 자격 증명 모음을 참조합니다. 비밀 이름을 제공하여 비밀의 값을 가져올 수 있습니다. 필요에 따라 비밀 버전을 제공할 수 있습니다. 최신 버전이 사용되지 않는 경우 사용됩니다.
using './main.bicep'
param secureUserName = az.getSecret('<subscriptionId>', '<resourceGroupName>', '<keyVaultName>', '<secretName>', '<secretVersion>')
param securePassword = az.getSecret('<subscriptionId>', '<resourceGroupName>', '<keyVaultName>', '<secretName>')
파이프라인에서 비밀 작업
다음 모범 사례는 파이프라인을 사용하여 Azure 리소스를 배포할 때 신중하게 비밀을 처리하는 데 도움이 될 수 있습니다.
- 코드 리포지토리에 비밀을 저장하지 마세요. 예를 들어 매개 변수 파일이나 파이프라인 정의 YAML 파일에 비밀을 추가하지 마세요.
- GitHub Actions에서 암호화된 비밀을 사용하여 보안 데이터를 저장합니다. 비밀 검사을 사용하여 실수로 비밀을 커밋했는지 검색합니다.
- Azure Pipelines에서 비밀 변수를 사용하여 보안 데이터를 저장합니다.
관련 참고 자료
- 리소스 설명서:
- Azure 기능:
- Bicep 기능:
- 빠른 시작 템플릿:
- Azure Pipelines:
- GitHub Actions: