매개 변수 보안
암호와 API 키 같은 중요한 값을 배포에 전달해야 하는 경우가 있습니다. 하지만 이러한 값이 보호되도록 보장해야 합니다. 배포를 생성하는 사람이 비밀 값을 알면 안 되는 상황도 있습니다. 사용자가 배포를 만들 때 매개 변수 값을 입력하지만 비밀 값이 로깅되지 않게 해야 하는 경우도 있습니다. 이 단원에서는 매개 변수를 보호하는 방법에 대해 알아봅니다.
팁
가장 좋은 방법은 자격 증명을 사용하지 않는 것입니다. Azure 리소스용 관리형 ID를 사용하면 솔루션 구성 요소가 자격 증명 없이도 서로 안전하게 통신할 수 있습니다. 관리형 ID는 모든 리소스에서 사용할 수 있는 것은 아니지만 가능한 경우에는 반드시 사용하는 편이 좋습니다. 가능하지 않은 경우에는 여기서 설명하는 방법을 사용하면 됩니다.
참고
이 단원의 명령은 개념을 설명하기 위해 표시된 것입니다. 명령을 아직 실행하지 마세요. 여기에서 학습하는 내용을 곧 연습할 예정입니다.
보안 매개 변수 정의
@secure
데코레이터를 비밀 값이 포함될 수 있는 문자열과 개체 매개 변수에 적용할 수 있습니다. 매개 변수를 @secure
로 적용하면 Azure는 매개 변수 값을 배포 로그에서 사용할 수 없게 합니다. 또한 Azure CLI 또는 Azure PowerShell을 사용하여 배포를 대화형으로 만들고, 배포 시 값을 입력해야 하는 경우 터미널에서 화면에 텍스트를 표시하지 않습니다.
HR 애플리케이션 마이그레이션의 일환으로 Azure SQL 논리 서버 및 데이터베이스를 배포해야 합니다. 관리자 로그인 및 암호를 사용하여 논리 서버를 프로비전합니다. 이러한 값은 중요하기 때문에 보호해야 합니다. 다음은 SQL 서버의 관리자 세부 정보에 두 개의 문자열 매개 변수를 만드는 선언 예입니다.
@secure()
param sqlServerAdministratorLogin string
@secure()
param sqlServerAdministratorPassword string
두 매개 변수 모두 기본값이 지정되지 않았습니다. 사용자 이름, 암호 및 기타 비밀은 기본값을 지정하지 않는 것이 좋습니다. 그렇지 않으면 사용자가 템플릿을 배포하고 값을 재정의해야 한다는 것을 모를 경우, 자신이 선택한 값 대신 기본값을 받게 되어 보안이 약해지기 때문입니다.
팁
중요한 데이터는 출력을 만들면 안 됩니다. 배포 기록에 액세스할 수 있는 사람은 누구나 출력 값에 액세스할 수 있습니다. 비밀을 처리하는 데 적합하지 않습니다.
비밀에 매개 변수 파일 사용 금지
앞 단원에서 살펴본 것처럼 매개 변수 파일은 매개 변수 값 집합을 지정하는 좋은 방법입니다. 배포하는 각 환경의 매개 변수 파일을 만들게 되는 경우가 많습니다. 일반적으로 매개 변수 파일을 사용하여 비밀 값을 지정하면 안 됩니다. 매개 변수 파일은 주로 Git 같은 중앙 집중식 제어 시스템에 저장됩니다. 나중에 많은 사람이 이에 액세스할 수 있습니다. 버전 제어 시스템은 이 종류의 정보를 저장하도록 설계되지 않았으므로 중요한 데이터를 저장하지 마세요.
Azure Key Vault와 통합
Azure Key Vault는 비밀에 액세스하고 저장하도록 설계된 서비스입니다. Key Vault 비밀을 참조하는 매개 변수 파일을 사용하여 Bicep 템플릿을 Key Vault와 통합할 수 있습니다.
매개 변수 파일에서 키 자격 증명 모음 및 비밀을 참조하여 이 기능을 사용할 수 있습니다. 비밀이 아닌 식별자만 참조하기 때문에 해당 값이 노출되지 않습니다. 템플릿을 배포하면 Azure Resource Manager가 키 자격 증명 모음에 액세스하여 데이터를 검색합니다.
팁
다른 리소스 그룹이나 배포하려는 구독에 있는 키 자격 증명 모음의 비밀을 참조할 수 있습니다.
다음은 Key Vault 참조를 사용하여 사용할 SQL 논리 서버 관리자 로그인 및 암호를 조회하는 매개 변수 파일입니다.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"sqlServerAdministratorLogin": {
"reference": {
"keyVault": {
"id": "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets"
},
"secretName": "sqlAdminLogin"
}
},
"sqlServerAdministratorPassword": {
"reference": {
"keyVault": {
"id": "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets"
},
"secretName": "sqlAdminLoginPassword"
}
}
}
}
각 매개 변수에 value
를 지정하는 대신 이 파일은 reference
개체가 있으며, 키 자격 증명 모음과 비밀 정보가 들어 있습니다.
중요
Resource Manager가 템플릿 배포 시 키 자격 증명 모음의 데이터에 액세스할 수 있도록 키 자격 증명 모음을 구성해야 합니다. 또한 템플릿을 배포하는 사용자는 키 자격 증명 모음에 액세스할 수 있는 권한이 있어야 합니다. 다음 단원에서는 이 작업을 수행하는 방법을 알아봅니다.
Key Vault를 모듈과 함께 사용
모듈을 사용하면 리소스 집합을 캡슐화하는 재사용 가능한 Bicep 파일을 만들 수 있습니다. 모듈을 사용하여 솔루션의 일부를 배포하는 것이 일반적입니다. 모듈에는 비밀 값을 허용하는 매개 변수가 있을 수 있으며, Bicep의 Key Vault 통합을 사용하여 이러한 값을 안전하게 제공할 수 있습니다. 다음은 모듈을 배포하고, Key Vault에서 직접 가져와 ApiKey
비밀 매개 변수 값을 제공하는 Bicep 예입니다.
resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' existing = {
name: keyVaultName
}
module applicationModule 'application.bicep' = {
name: 'application-module'
params: {
apiKey: keyVault.getSecret('ApiKey')
}
}
이 Bicep 파일에서 Key Vault 리소스는 existing
키워드를 사용하여 참조됩니다. 이 키워드는 Key Vault가 이미 있음을 Bicep에 알리는 것이며, 이 코드는 해당 자격 증명 모음에 대한 참조입니다. Bicep은 해당 참조를 다시 배포하지 않습니다. 또한 코드는 모듈의 코드는 apiKey
매개 변수에 대한 값에 getSecret()
함수를 사용합니다. 보안 모듈 매개 변수에만 사용할 수 있는 특수 Bicep 함수입니다. 내부적으로 Bicep은 이 식을 앞에서 배운 것과 동일한 종류의 Key Vault 참조로 변환합니다.