다음을 통해 공유


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 함수를 사용하여 보안 매개 변수를 제공할 수 있습니다.

existingscope 키워드를 함께 사용하여 다른 리소스 그룹에 정의된 키 자격 증명 모음을 참조할 수도 있습니다. 다음 예에서 Bicep 파일은 Networking이라는 리소스 그룹에 배포됩니다. 모듈 매개 변수 mySecret의 값은 Secrets 리소스 그룹에 있는 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에서 비밀 변수를 사용하여 보안 데이터를 저장합니다.