파이프라인에서 프라이빗 키 자격 증명 모음에 액세스
Azure Key Vault는 원활한 보안을 통해 키, 비밀 및 인증서와 같은 자격 증명을 관리하기 위한 보안 솔루션을 제공합니다. Azure Pipelines를 사용하면 키 자격 증명 모음에 액세스하고 사용하는 프로세스를 간소화하여 자격 증명을 쉽게 저장하고 검색할 수 있습니다.
특정 시나리오에서 조직은 중요한 애플리케이션에 대한 최고 수준의 보안을 보장하기 위해 키 자격 증명 모음에 대한 액세스를 지정된 Azure 가상 네트워크로만 제한하여 보안 우선 순위를 지정합니다.
이 자습서에서는 다음을 수행하는 방법을 배우게 됩니다.
- 서비스 주체 만들기
- 서비스 연결 만들기
- 인바운드 액세스 지점 구성
- 파이프라인에서 프라이빗 Azure Key Vault 쿼리
필수 조건
Azure 구독 아직 없는 경우 무료 Azure 계정을 만듭니다.
Azure Key Vault. 아직 새 Azure Key Vault 를 만들지 않은 경우 만듭니다.
프라이빗 키 자격 증명 모음에 액세스
Azure Pipelines를 사용하면 개발자가 Azure Key Vault를 변수 그룹에 연결하고 선택적 자격 증명 모음 비밀을 해당 그룹에 매핑할 수 있습니다. 변수 그룹으로 사용되는 키 자격 증명 모음에 액세스할 수 있습니다.
변수 그룹 구성 시간 동안 Azure DevOps에서.
자체 호스팅 에이전트에서 파이프라인 작업 런타임 동안.
서비스 주체 만들기
먼저 새 서비스 주체를 만들어 Azure 리소스에 액세스할 수 있습니다. 다음으로, Azure DevOps에서 새 ARM 서비스 연결을 만든 다음, Azure DevOps에서 서비스 연결을 확인하고 저장하기 전에 Azure에서 서비스 주체에 대한 페더레이션 자격 증명을 설정해야 합니다.
Azure Portal로 이동합니다.
메뉴 모음에서 Cloud Shell을 열고 Bash를 선택합니다.
다음 명령을 실행하여 새 서비스 주체를 만듭니다.
az ad sp create-for-rbac --name YOUR_SERVICE_PRINCIPAL_NAME
다음 단계에서 서비스 연결을 만드는 데 사용하므로 출력을 복사해야 합니다.
서비스 연결 만들기
Azure DevOps 조직에 로그인한 다음 프로젝트로 이동합니다.
프로젝트 설정>서비스 연결>새 서비스 연결을 선택합니다.
Azure Resource Manager를 선택한 다음, 다음을 선택합니다.
ID 형식의 경우 드롭다운 메뉴에서 앱 등록(자동)을 선택합니다.
자격 증명의 경우 기본 권장 값인 워크로드 ID 페더레이션을 그대로 둡니다.
범위 수준의 경우 **구독을 선택한 다음 드롭다운 메뉴에서 구독을 선택합니다.
지정된 리소스 그룹에 대한 액세스만 제한하려면 리소스 그룹을 선택합니다.
서비스 연결의 이름을 입력한 다음 모든 파이프라인에서 이 서비스 연결을 사용할 수 있도록 모든 파이프라인에 대한 액세스 권한 부여 확인란을 선택합니다.
완료되면 저장을 선택합니다.
페더레이션 자격 증명 만들기
Azure Portal로 이동하여 검색 창에 서비스 주체의 ClientID를 입력한 다음 애플리케이션을 선택합니다.
관리에서 인증서 및 비밀>페더레이션 자격 증명을 선택합니다.
자격 증명 추가를 선택한 다음 페더레이션 자격 증명 시나리오에 대해 다른 발급자를 선택합니다.
발급자의 경우 자리 표시자를 조직 GUID로 바꾸는 다음 URL을 붙여넣습니다. 조직 설정>으로 이동하여 조직 ID를 찾을 수 있습니다. Microsoft Entra> 디렉터리에 연결된 Azure DevOps 조직의 목록을 다운로드합니다.
https://vstoken.dev.azure.com/<ORGANIZATION_ID>
주체 식별자의 경우 자리 표시자를 조직 이름, 프로젝트 이름 및 서비스 연결 이름으로 바꾸는 다음 URL을 붙여넣습니다.
sc://ORGANIZATION_NAME/PROJECT_NAME/SERVICE_CONNECTION_NAME
페더레이션 자격 증명의 이름을 입력한 다음, 완료되면 추가를 선택합니다.
서비스 연결 만들기
Azure DevOps 조직에 로그인한 다음 프로젝트로 이동합니다.
프로젝트 설정>서비스 연결>새 서비스 연결을 선택합니다.
Azure Resource Manager, >다음을 선택한 다음 서비스 주체(수동)다음을> 선택합니다.
범위 수준에 대한 Azure Cloud for Environment 및 구독을 선택한 다음, 구독 ID와 구독 이름을 입력합니다.
서비스 주체 정보를 입력한 다음 확인을 선택합니다.
확인에 성공하면 서비스 연결의 이름을 지정하고 설명을 추가한 다음 모든 파이프라인에 대한 액세스 권한 부여 확인란을 선택합니다. 확인을 선택하고 완료되면 저장 합니다.
팁
서비스 주체 연결을 확인할 수 없는 경우 서비스 주체 에게 구독에 대한 읽기 권한자 액세스 권한을 부여합니다.
서비스 연결 만들기
Azure DevOps 컬렉션에 로그인한 다음 프로젝트로 이동합니다.
프로젝트 설정>서비스 연결>새 서비스 연결을 선택합니다.
Azure Resource Manager를 선택하고, 서비스 연결 이름을 지정한 다음, 범위 수준에 대한 Azure Cloud for Environment 및 구독을 선택합니다.
구독 ID 및 구독 이름을 입력합니다.
서비스 주체 정보를 입력한 다음 연결 확인을 선택합니다.
모든 파이프라인에서 이 연결 사용 허용 확인란을 선택한 다음, 완료되면 확인을 선택합니다.
팁
서비스 주체 연결을 확인할 수 없는 경우 서비스 주체 에게 구독에 대한 읽기 권한자 액세스 권한을 부여합니다.
Azure Devops에서 프라이빗 키 자격 증명 모음 액세스
이 섹션에서는 Azure DevOps에서 프라이빗 키 자격 증명 모음에 액세스하는 두 가지 방법을 살펴봅니다. 먼저 변수 그룹을 사용하여 키 자격 증명 모음의 비밀을 연결하고 매핑한 다음, 고정 IP 범위를 허용하여 인바운드 액세스를 설정합니다. Azure Pipelines는 변수 그룹에서 Azure Key Vault를 쿼리할 때 게시된 Azure DevOps 공용 IP를 사용하기 때문에 인바운드 액세스를 설정합니다. 따라서 Azure Key Vault 방화벽에 인바운드 연결을 추가하여 Azure Key Vault에 성공적으로 연결할 수 있습니다.
두 번째 방법은 Microsoft 호스팅 에이전트 IP 주소를 키 자격 증명 모음의 방화벽 허용 목록에 동적으로 추가하고, 키 자격 증명 모음을 쿼리하고, 완료 후 IP를 제거하는 방법을 보여 줍니다. 이 두 번째 방법은 데모용이며 Azure Pipelines에서 권장되는 접근 방식은 아닙니다.
1 - 변수 그룹을 사용하여 키 자격 증명 모음 비밀 매핑
Azure DevOps 조직에 로그인한 다음 프로젝트로 이동합니다.
파이프라인 라이브러리를>선택한 다음+ 변수 그룹을 선택합니다.
변수 그룹의 이름을 지정한 다음 토글 단추를 선택하여 Azure Key Vault의 비밀을 변수 단추로 사용하도록 설정합니다.
이전에 만든 서비스 연결을 선택하고 키 자격 증명 모음을 선택한 다음 권한 부여를 선택합니다.
변수 아래에서 추가를 선택하여 비밀을 추가한 다음, 완료되면 저장을 선택합니다.
참고 항목
서비스 연결에 가져오기 및 목록 권한이 있고 서비스 주체에 프라이빗 키 자격 증명 모음의 Key Vault 비밀 사용자 역할이 할당되어 있는지 확인합니다.
1.1 서비스 연결 권한 설정
Azure Key Vault로 이동한 다음, 액세스 정책을 선택합니다.
만들기를 선택하고 비밀 권한 아래에서 가져오기 및 목록 권한을 추가한 다음 다음을 선택합니다.
검색 창에 서비스 연결을 추가하고 선택한 다음 다음을 선택합니다.
다음을 한 번 더 선택하고 설정을 검토한 다음, 완료되면 검토 + 만들기를 선택합니다.
1.2 서비스 주체 권한 설정
Azure Key Vault로 이동한 다음, 액세스 제어(IAM)를 선택합니다.
역할 할당> 추가>를 선택한 다음, 역할 탭을 선택합니다.
Key Vault 비밀 사용자 역할을 선택한 다음, 다음을 선택합니다.
멤버 선택 선택> 서비스 주체 >추가 선택
완료되면 검토 + 할당을 선택합니다.
Azure DevOps 조직에 로그인한 다음 프로젝트로 이동합니다.
파이프라인 라이브러리를>선택한 다음+ 변수 그룹을 선택합니다.
변수 그룹의 이름을 지정한 다음 토글 단추를 선택하여 Azure Key Vault의 비밀을 변수 단추로 사용하도록 설정합니다.
드롭다운 메뉴에서 이전에 만든 Azure 서비스 연결을 선택한 다음 키 자격 증명 모음을 선택합니다.
오류 메시지가 발생하는 경우: 지정된 Azure 서비스 연결에는 위에 표시된 것처럼 선택한 키 자격 증명 모음에 대한 "가져오기, 나열" 비밀 관리 권한이 있어야 합니다. Azure Portal에서 키 자격 증명 모음으로 이동하고, 액세스 제어(IAM)>역할 할당>키 자격 증명 모음 비밀 사용자>다음을 추가한 다음, 서비스 주체를 추가한 다음, 완료되면 검토 + 할당을 선택합니다.
비밀을 추가한 다음 완료되면 저장을 선택합니다.
2 - Azure DevOps에서 인바운드 액세스 구성
Azure DevOps에서 키 자격 증명 모음에 대한 액세스를 사용하도록 설정하려면 특정 고정 IP 범위에서 액세스 권한을 부여해야 합니다. 이러한 범위는 Azure DevOps 조직의 지리적 위치에 따라 결정됩니다.
Azure DevOps 조직에 로그인합니다.
조직 설정을 선택합니다.
개요로 이동하여 페이지 아래쪽에 나열된 지리적 위치를 찾을 수 있습니다.
고정 IP 범위에서의 액세스를 허용하도록 키 자격 증명 모음을 구성합니다.
3 - 변수 그룹을 사용하여 프라이빗 키 자격 증명 모음 쿼리
이 예제에서는 이전에 설정하고 서비스 주체로 권한이 부여된 변수 그룹을 사용하여 연결된 변수 그룹을 사용하여 프라이빗 Azure Key Vault에서 비밀을 쿼리하고 복사합니다. Azure Pipelines는 변수 그룹에서 Azure Key Vault를 쿼리할 때 게시된 공용 IP를 사용하므로 제대로 작동하도록 인바운드 액세스를 구성했는지 확인합니다.
variables:
- group: mySecret-VG
steps:
- task: CmdLine@2
inputs:
script: 'echo $(mySecret) > secret.txt'
- task: CopyFiles@2
inputs:
Contents: secret.txt
targetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
대체 방법 - 동적으로 Microsoft 호스팅 에이전트 IP 허용
이 두 번째 방법에서는 파이프라인의 시작 부분에서 Microsoft 호스팅 에이전트의 IP를 쿼리하는 것으로 시작합니다. 그런 다음 키 자격 증명 모음 허용 목록에 추가하고, 나머지 작업을 진행하고, 마지막으로 키 자격 증명 모음의 방화벽 허용 목록에서 IP를 제거합니다.
참고 항목
이 방법은 데모용이며 Azure Pipelines에서 권장되는 접근 방식은 아닙니다.
- task: AzurePowerShell@5
displayName: 'Allow agent IP'
inputs:
azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
azurePowerShellVersion: LatestVersion
ScriptType: InlineScript
Inline: |
$ip = (Invoke-WebRequest -uri "http://ifconfig.me/ip").Content
Add-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -ResourceGroupName "YOUR_RESOURCE_GROUP_NAME" -IpAddressRange $ip
echo "##vso[task.setvariable variable=agentIP]ip"
- task: AzureKeyVault@2
inputs:
azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
KeyVaultName: 'YOUR_KEY_VAULT_NAME'
SecretsFilter: '*'
RunAsPreJob: false
- task: AzurePowerShell@5
displayName: 'Remove agent IP'
inputs:
azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
azurePowerShellVersion: LatestVersion
ScriptType: InlineScript
Inline: |
$ipRange = $env:agentIP + "/32"
Remove-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -IpAddressRange $ipRange
condition: succeededOrFailed()
Important
파이프라인에서 키 자격 증명 모음에 액세스하는 데 사용하는 서비스 주체가 키 자격 증명 모음의 IAM(액세스 제어) 내에서 Key Vault 기여자 역할을 보유하는지 확인합니다.
자체 호스팅 에이전트에서 프라이빗 키 자격 증명 모음에 액세스
Azure Pipelines 에이전트에서 프라이빗 키 자격 증명 모음에 액세스할 수 있도록 하려면 자체 호스팅 에이전트(Windows, Linux, Mac) 또는 Scale Set 에이전트를 사용해야 합니다. 이는 다른 일반 컴퓨팅 서비스와 마찬가지로 Microsoft Hosted 에이전트가 키 자격 증명 모음의 신뢰할 수 있는 서비스 목록에 포함되지 않기 때문입니다.
프라이빗 키 자격 증명 모음과의 연결을 설정하려면 키 자격 증명 모음에 대한 프라이빗 엔드포인트를 구성하여 가시선 연결을 제공해야 합니다. 이 엔드포인트는 라우팅 가능해야 하며 자체 호스팅 파이프라인 에이전트에서 해당 프라이빗 DNS 이름을 확인할 수 있어야 합니다.
1 - 자체 호스팅 에이전트에서 인바운드 액세스 구성
제공된 지침에 따라 가상 네트워크를 만듭니다.
Azure Portal에서 페이지 맨 위에 있는 검색 창을 사용하여 Azure Key Vault를 찾습니다.
검색 결과에서 키 자격 증명 모음을 찾은 후 선택한 다음 설정>네트워킹으로 이동합니다.
프라이빗 엔드포인트 연결을 선택한 다음 만들기를 선택하여 새 프라이빗 엔드포인트를 만듭니다.
이전에 만든 가상 네트워크를 호스트하는 리소스 그룹을 선택합니다. 인스턴스의 이름 및 네트워크 인터페이스 이름을 제공하고 이전에 만든 가상 네트워크와 동일한 지역을 선택해야 합니다. 완료한 경우 다음을 선택합니다.
연결 메서드에 대한 내 디렉터리의 Azure 리소스에 연결을 선택한 다음, 리소스 종류에 대한 드롭다운 메뉴에서 Microsoft.KeyVault/vaults를 선택합니다. 드롭다운 메뉴에서 리소스를 선택합니다. 대상 하위 리소스는 자격 증명 모음 값으로 자동 채워집니다. 완료한 경우 다음을 선택합니다.
Virtual Network 탭에서 이전에 만든 가상 네트워크 및 서브넷을 선택하고 나머지 필드를 기본값으로 둡니다. 완료한 경우 다음을 선택합니다.
DNS 및 태그 탭을 계속 진행하여 기본 설정을 적용합니다. 검토 + 만들기 탭에서 완료되면 만들기를 선택합니다.
리소스가 배포되면 키 자격 증명 모음 >설정>네트워킹>프라이빗 엔드포인트 연결로 이동하면 프라이빗 엔드포인트가 연결 상태가 승인된 상태로 나열되어야 합니다. 다른 디렉터리의 Azure 리소스에 연결하는 경우 리소스 소유자가 연결 요청을 승인할 때까지 기다려야 합니다.
2 - 가상 네트워크 허용
Azure Portal로 이동한 다음, Azure Key Vault를 찾습니다.
설정>네트워킹을 선택하고 방화벽 및 가상 네트워크 탭 아래에 있는지 확인합니다.
가상 네트워크>추가를 선택하여 기존 가상 네트워크 추가를 선택합니다.
드롭다운 메뉴에서 구독을 선택한 다음, 이전에 만든 가상 네트워크를 선택한 다음 서브넷을 선택합니다.
완료되면 추가를 선택한 다음 페이지 아래쪽으로 스크롤하고 적용을 선택하여 변경 내용을 저장합니다.
3 - 자체 호스팅 에이전트에서 프라이빗 키 자격 증명 모음 쿼리
다음 예제에서는 가상 네트워크의 VM에 설정된 에이전트를 사용하여 변수 그룹을 통해 프라이빗 키 자격 증명 모음을 쿼리합니다.
pool: Self-hosted-pool
variables:
group: mySecret-VG
steps:
- task: CmdLine@2
inputs:
script: 'echo $(mySecret) > secret.txt'
- task: CopyFiles@2
inputs:
Contents: secret.txt
targetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
프라이빗 키 자격 증명 모음에 대한 Azure DevOps 인바운드 액세스 권한을 부여하지 않으려는 경우 AzureKeyVault 작업을 사용하여 키 자격 증명 모음을 쿼리할 수 있습니다. 그러나 키 자격 증명 모음 방화벽 설정에서 에이전트를 호스팅하는 가상 네트워크를 허용해야 합니다.
pool: Self-hosted-pool
steps:
- task: AzureKeyVault@2
inputs:
azureSubscription: '$(SERVICE_CONNECTION_NAME)'
keyVaultName: $(KEY_VAULT_NAME)
SecretsFilter: '*'
- task: CmdLine@2
inputs:
script: 'echo $(mySecret) > secret.txt'
- task: CopyFiles@2
inputs:
Contents: secret.txt
targetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
문제 해결
다음 오류가 발생하는 경우 이 섹션의 단계에 따라 문제를 해결하고 해결합니다.
Public network access is disabled and request is not from a trusted service nor via an approved private link.
이는 공용 액세스가 사용하지 않도록 설정되었으며 프라이빗 엔드포인트 연결이나 방화벽 예외가 설정되지 않음을 나타냅니다. [#configure-inbound-access-from-a-self-hosted-agent] 의 단계에 따라 Azure DevOps 에서 인바운드 액세스를 구성하여 프라이빗 키 자격 증명 모음에 대한 액세스를 설정합니다.
Request was not allowed by NSP rules and the client address is not authorized and caller was ignored because bypass is set to None Client address: <x.x.x.x>
이 오류 메시지는 키 자격 증명 모음의 공용 액세스가 비활성화되었고 신뢰할 수 있는 Microsoft 서비스 이 방화벽 옵션을 무시하도록 허용 옵션이 선택 취소되었지만 클라이언트 IP 주소가 키 자격 증명 모음 방화벽에 추가되지 않았음을 나타냅니다. Azure Portal에서 키 자격 증명 모음으로 이동한 다음 네트워킹을 설정>하여 방화벽의 허용 목록에 클라이언트 IP를 추가합니다.
Error: Client address is not authorized and caller is not a trusted service.
키 자격 증명 모음 허용 목록에 지리의 IPV4 범위를 추가해야 합니다. 자세한 내용은 Azure DevOps에서 인바운드 액세스 구성을 참조하세요. 또는 Microsoft 호스팅 에이전트 IP가 런타임 중에 키 자격 증명 모음의 방화벽에 클라이언트 IP를 추가하는 방법을 알아보도록 동적으로 허용할 수 있습니다.