Azure Key Vault를 GitHub Actions 워크플로에 통합

Azure Key Vault를 GitHub Actions 워크플로에 통합하여 중요한 자격 증명을 한 곳에서 안전하게 관리합니다. 이 방법을 사용하면 중요한 데이터에 실수로 노출되거나 무단으로 액세스할 위험이 줄어듭니다.

이 GitHub Actions 샘플 워크플로에서는 OIDC(OpenID Connect) 인증을 사용하여 Azure Key Vault에서 비밀을 안전하게 검색하는 방법을 보여 줍니다.

필수 조건

  • Microsoft Entra 애플리케이션 또는 사용자 할당 관리 ID에서 페더레이션 ID 자격 증명을 구성합니다. OpenID Connect를 통해 GitHub Actions에서 Azure에 인증하는 방법을 알아봅니다. 페더레이션 자격 증명을 설정할 때 GitHub에 다음 비밀을 저장합니다.
    • AZURE_CLIENT_ID: Azure 서비스 주체의 클라이언트 ID입니다.
    • AZURE_TENANT_ID: Azure AD 테넌트 ID입니다.
    • AZURE_SUBSCRIPTION_ID: Azure 구독 ID입니다.
    • KEYVAULT_NAME: Key Vault 이름입니다.
  • 권한 부여: 서비스 주체가 Key Vault에 대한 적절한 액세스 권한을 가지고 있는지 확인합니다(예: "Key Vault 비밀 사용자" 역할).
  • <SECRET_NAME>을(를) Key Vault 비밀 이름으로 바꾸십시오.

GitHub Actions 워크플로 샘플

워크플로에서 수행하는 작업:

  • 메인 브랜치에 푸시될 때 트리거
  • OIDC 인증을 사용하여 Azure에 연결(GitHub에 저장된 암호 없음)
  • Azure Key Vault에서 비밀을 검색합니다.
  • 비밀 값 ::add-mask:: 이 로그에 표시되지 않도록 마스킹
  • 후속 단계에 대한 환경 변수로 비밀을 사용할 수 있도록 설정
name: Access Azure Key Vault and pass secret to workflow

on:
  push:
    branches:
      - main

permissions:
  id-token: write
  contents: read

jobs:
  get-secret:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Azure Login
        uses: azure/login@v1
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

      - name: Retrieve secret from Key Vault
        id: keyvault
        uses: azure/CLI@v1
        with:
          inlineScript: |
            SECRET_VALUE=$(az keyvault secret show --name <SECRET_NAME> --vault-name ${{ secrets.KEYVAULT_NAME }} --query value -o tsv)
            echo "::add-mask::$SECRET_VALUE"
            echo "SECRET_VALUE=$SECRET_VALUE" >> $GITHUB_ENV
      - name: Use retrieved secret
        run: echo "The secret is successfully retrieved!"

      - name: Use SECRET_VALUE in deployment
        run: |
          ./deploy.sh
        env:
          SECRET_VALUE: ${{ env.SECRET_VALUE }}

추가 리소스