두 개의 인증 자격 증명 세트를 사용하는 리소스의 비밀 순환 자동화
Azure 서비스를 인증하는 가장 좋은 방법은 관리 ID를 사용하는 것이지만, 이 방법을 사용할 수 없는 시나리오도 있습니다. 이러한 경우 액세스 키 또는 암호가 사용됩니다. 액세스 키와 암호는 자주 순환해야 합니다.
이 자습서에서는 두 개의 인증 자격 증명 세트를 사용하는 데이터베이스 및 서비스의 비밀을 정기적으로 자동 순환하는 방법을 보여줍니다. 특히 이 자습서에서는 Azure Key Vault에 비밀로 저장된 Azure Storage 계정 키를 순환하는 방법을 보여줍니다. Azure Event Grid 알림에 의해 트리거되는 함수를 사용합니다.
참고 항목
스토리지 계정 서비스의 경우 Microsoft Entra ID를 사용하여 요청에 권한을 부여하는 것이 좋습니다. 자세한 내용은 Azure Active Directory를 사용하여 Blob에 대한 액세스 권한 부여를 참조하세요. 액세스 키가 포함된 스토리지 계정 연결 문자열이 필요한 서비스가 있습니다. 이러한 시나리오의 경우 이 솔루션을 사용하는 것이 좋습니다.
이 자습서에서 설명하는 순환 솔루션은 다음과 같습니다.
이 솔루션에서 Azure Key Vault는 스토리지 계정 개별 액세스 키를 후속 버전에서 기본 키와 보조 키 사이에서 교대로 반복되는 동일한 비밀 버전으로 저장합니다. 한 액세스 키가 최신 버전의 비밀에 저장되면 대체 키가 다시 생성되어 Key Vault에 최신 버전의 비밀로 추가됩니다. 이 솔루션은 다시 생성된 최신 키로 새로 고치는 애플리케이션 전체 순환 주기를 제공합니다.
- 비밀 만료 30일 전에 Key Vault는 만료 임박 이벤트를 Event Grid에 게시합니다.
- Event Grid는 이벤트 구독을 확인하고 HTTP POST를 사용하여 이벤트를 구독하는 함수 앱 엔드포인트를 호출합니다.
- 함수 앱은 (최신 키가 아닌) 대체 키를 식별하고 스토리지 계정을 호출하여 대체 키를 다시 생성합니다.
- 함수 앱은 다시 생성된 새 키를 Azure Key Vault에 새 버전의 비밀로 추가합니다.
필수 구성 요소
- Azure 구독 체험 계정 만들기
- Azure Cloud Shell. 이 자습서에서는 PowerShell 환경에서 포털 Cloud Shell을 사용합니다.
- Azure Key Vault.
- Azure 스토리지 계정 2개
참고 항목
공유 스토리지 계정 키를 순환하면 해당 키에 따라 생성된 계정 수준 SAS(공유 액세스 서명)가 철회됩니다. 스토리지 계정 키 순환 후 애플리케이션 중단을 방지하려면 계정 수준 SAS 토큰을 다시 생성해야 합니다.
기존 키 자격 증명 모음 및 기존 스토리지 계정이 없는 경우 이 배포 링크를 사용하면 됩니다.
리소스 그룹에서 새로 만들기를 선택합니다. 그룹 이름을 vault rotation으로 지정한 다음, 확인을 선택합니다.
검토 + 만들기를 선택합니다.
만들기를 선택합니다.
이제 키 자격 증명 모음과 스토리지 계정 2개가 있습니다. Azure CLI 또는 Azure PowerShell에서 다음 명령을 실행하여 이 설정을 확인할 수 있습니다.
az resource list -o table -g vaultrotation
다음 출력과 비슷한 결과가 표시됩니다.
Name ResourceGroup Location Type Status
----------------------- -------------------- ---------- --------------------------------- --------
vaultrotation-kv vaultrotation westus Microsoft.KeyVault/vaults
vaultrotationstorage vaultrotation westus Microsoft.Storage/storageAccounts
vaultrotationstorage2 vaultrotation westus Microsoft.Storage/storageAccounts
키 순환 함수 만들기 및 배포
다음으로, 시스템 관리 ID와 기타 필수 구성 요소를 사용하여 함수 앱을 만듭니다. 그리고 스토리지 계정 키의 순환 함수를 배포합니다.
함수 앱 순환 함수에는 다음과 같은 구성 요소 및 구성이 필요합니다.
- Azure App Service 계획
- 함수 앱 트리거를 관리하는 스토리지 계정
- Key Vault의 비밀에 액세스하는 액세스 정책
- 스토리지 계정 액세스 키에 액세스할 수 있도록 함수 앱에 할당된 스토리지 계정 키 운영자 서비스 역할
- 이벤트 트리거와 HTTP 트리거를 사용하는 키 순환 함수(주문형 순환)
- SecretNearExpiry 이벤트에 대한 Event Grid 이벤트 구독
Azure 템플릿 배포 링크를 선택합니다.
리소스 그룹 목록에서 vaultrotation을 선택합니다.
스토리지 계정 RG 상자에 스토리지 계정이 있는 리소스 그룹의 이름을 입력합니다. 키 순환 함수를 배포할 리소스 그룹과 동일한 리소스 그룹에 스토리지 계정이 이미 있는 경우 기본값 [resourceGroup().name]을 유지합니다.
스토리지 계정 이름 상자에 순환할 액세스 키가 포함된 스토리지 계정의 이름을 입력합니다. 필수 구성 요소에서 만든 스토리지 계정을 사용하는 경우 기본값 [concat(resourceGroup().name, 'storage')]를 유지합니다.
Key Vault RG 상자에 키 자격 증명 모음이 있는 리소스 그룹의 이름을 입력합니다. 키 순환 함수를 배포할 리소스 그룹과 동일한 리소스 그룹에 키 자격 증명 모음이 이미 있는 경우 기본값 [resourceGroup().name]을 유지합니다.
Key Vault 이름 상자에 키 자격 증명 모음의 이름을 입력합니다. 필수 구성 요소에서 만든 키 자격 증명 모음을 사용하는 경우 기본값 [concat(resourceGroup().name, '-kv')]를 유지합니다.
App Service 계획 유형 상자에서 호스팅 계획을 선택합니다. 프리미엄 요금제는 키 자격 증명 모음이 방화벽 뒤에 있는 경우에만 필요합니다.
함수 앱 이름 상자에 함수 앱의 이름을 입력합니다.
비밀 이름 상자에 액세스 키를 저장할 비밀의 이름을 입력합니다.
리포지토리 URL 상자에 함수 코드의 GitHub 위치를 입력합니다. 이 자습서에서는 https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git를 사용할 수 있습니다.
검토 + 만들기를 선택합니다.
만들기를 선택합니다.
위의 단계를 마치면 스토리지 계정, 서버 팜, 함수 앱 및 Application Insights가 생깁니다. 배포가 완료되면 다음 페이지가 표시됩니다.
참고 항목
오류가 발생하는 경우 재배포를 선택하여 구성 요소 배포를 완료할 수 있습니다.
순환 함수의 배포 템플릿과 코드는 Azure 샘플에서 찾을 수 있습니다.
Key Vault 비밀에 스토리지 계정 액세스 키 추가
먼저 사용자 주체에게 비밀 관리 권한을 부여하도록 액세스 정책을 설정합니다.
az keyvault set-policy --upn <email-address-of-user> --name vaultrotation-kv --secret-permissions set delete get list
이제 스토리지 계정 액세스 키를 값으로 사용하여 새 비밀을 만들 수 있습니다. 또한 순환 함수가 스토리지 계정에서 키를 다시 생성하려면 스토리지 계정 리소스 ID, 비밀 유효 기간, 비밀에 추가할 키 ID가 필요합니다.
스토리지 계정 리소스 ID를 확인합니다. 이 값은 id
속성에서 찾을 수 있습니다.
az storage account show -n vaultrotationstorage
key 값을 가져올 수 있도록 다음과 같이 스토리지 계정 액세스 키를 나열합니다.
az storage account keys list -n vaultrotationstorage
60일의 유효 기간, 스토리지 계정 리소스 ID를 사용하여 키 자격 증명 모음에 비밀을 추가하고, 데모 목적으로 회전을 즉시 트리거하기 위해 만료 날짜를 내일로 설정합니다. key1Value
및 storageAccountResourceId
에 대해 검색된 값을 사용하여 다음 명령을 실행합니다.
tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey --vault-name vaultrotation-kv --value <key1Value> --tags "CredentialId=key1" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate
이 비밀은 몇 분 내에 SecretNearExpiry
이벤트를 트리거합니다. 이 이벤트는 만료가 60일로 설정된 비밀을 순환하는 함수를 트리거합니다. 이 구성에서 'SecretNearExpiry' 이벤트는 30일(만료 30일 전)마다 트리거되고, 순환 함수는 key1과 key2 사이에서 교대로 순환됩니다.
스토리지 계정 키와 Key Vault 비밀을 검색하고 비교하여 액세스 키가 다시 생성되었는지 확인할 수 있습니다.
다음 명령을 사용하여 비밀 정보를 가져옵니다.
az keyvault secret show --vault-name vaultrotation-kv --name storageKey
keyName
을 대체하도록 CredentialId
가 업데이트되고 value
가 다시 생성됩니다.
다음과 같이 액세스 키를 검색하여 값을 비교합니다.
az storage account keys list -n vaultrotationstorage
키의 value
는 키 자격 증명 모음의 비밀과 동일합니다.
여러 스토리지 계정에 기존 회전 함수 사용
동일한 함수 앱을 다시 사용하여 여러 스토리지 계정의 키를 순환할 수 있습니다.
순환하려는 기존 함수에 스토리지 계정 키를 추가하려면 다음이 필요합니다.
- 스토리지 계정 액세스 키에 액세스할 수 있도록 함수 앱에 할당된 스토리지 계정 키 운영자 서비스 역할
- SecretNearExpiry 이벤트에 대한 Event Grid 이벤트 구독
Azure 템플릿 배포 링크를 선택합니다.
리소스 그룹 목록에서 vaultrotation을 선택합니다.
스토리지 계정 RG 상자에 스토리지 계정이 있는 리소스 그룹의 이름을 입력합니다. 키 순환 함수를 배포할 리소스 그룹과 동일한 리소스 그룹에 스토리지 계정이 이미 있는 경우 기본값 [resourceGroup().name]을 유지합니다.
스토리지 계정 이름 상자에 순환할 액세스 키가 포함된 스토리지 계정의 이름을 입력합니다.
Key Vault RG 상자에 키 자격 증명 모음이 있는 리소스 그룹의 이름을 입력합니다. 키 순환 함수를 배포할 리소스 그룹과 동일한 리소스 그룹에 키 자격 증명 모음이 이미 있는 경우 기본값 [resourceGroup().name]을 유지합니다.
Key Vault 이름 상자에 키 자격 증명 모음의 이름을 입력합니다.
함수 앱 이름 상자에 함수 앱의 이름을 입력합니다.
비밀 이름 상자에 액세스 키를 저장할 비밀의 이름을 입력합니다.
검토 + 만들기를 선택합니다.
만들기를 선택합니다.
Key Vault 비밀에 스토리지 계정 액세스 키 추가
스토리지 계정 리소스 ID를 확인합니다. 이 값은 id
속성에서 찾을 수 있습니다.
az storage account show -n vaultrotationstorage2
key2 값을 가져올 수 있도록 다음과 같이 스토리지 계정 액세스 키를 나열합니다.
az storage account keys list -n vaultrotationstorage2
60일의 유효 기간, 스토리지 계정 리소스 ID를 사용하여 키 자격 증명 모음에 비밀을 추가하고, 데모 목적으로 회전을 즉시 트리거하기 위해 만료 날짜를 내일로 설정합니다. key2Value
및 storageAccountResourceId
에 대해 검색된 값을 사용하여 다음 명령을 실행합니다.
tomorrowDate=$(date -u -d "+1 day" +"%Y-%m-%dT%H:%M:%SZ")
az keyvault secret set --name storageKey2 --vault-name vaultrotation-kv --value <key2Value> --tags "CredentialId=key2" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate
다음 명령을 사용하여 비밀 정보를 가져옵니다.
az keyvault secret show --vault-name vaultrotation-kv --name storageKey2
keyName
을 대체하도록 CredentialId
가 업데이트되고 value
가 다시 생성됩니다.
다음과 같이 액세스 키를 검색하여 값을 비교합니다.
az storage account keys list -n vaultrotationstorage
키의 value
는 키 자격 증명 모음의 비밀과 동일합니다.
비밀에 대한 회전 사용 안 함
해당 비밀에 대한 Event Grid 구독을 삭제하면 비밀 회전을 비활성화할 수 있습니다. Azure PowerShell Remove-AzEventGridSubscription cmdlet 또는 Azure CLI az event grid event--subscription delete 명령을 사용합니다.
두 자격 증명 세트에 대한 Key Vault 회전 함수
두 가지 자격 증명 세트와 바로 사용할 수 있는 몇 가지 함수에 대한 회전 함수 템플릿:
참고 항목
해당 회전 함수는 Microsoft가 아닌 커뮤니티 구성원이 만듭니다. Community 함수는 Microsoft 지원 프로그램 또는 서비스에서 지원되지 않으며 어떠한 종류의 보증도 없이 있는 그대로 제공됩니다.