해당 스터디는 90DaysOfDevOps
https://github.com/MichaelCade/90DaysOfDevOps
를 기반으로 진행한 내용입니다.
Day 74 - Workload Identity Federation with Azure DevOps and Terraform
해당 프레젠테이션은 Azure 클라우드 환경에서 보안의 핵심 트렌드로 자리 잡은 '워크로드 아이덴티티 페더레이션(Workload Identity Federation)'에 대해 다룬다.
기존의 서비스 연결 방식이 가진 보안 취약점을 해결하고, 이 복잡한 설정 과정을 테라폼으로 자동화하는 방법, 그리고 실제 적용 시 주의해야 할 트러블슈팅 사례까지 상세히 정리한다.
시작에 앞서, 워크로드 아이덴티티 페더레이션(Workload Identity Federation)과 페더레이션 자격 증명(Federated Credentials)이 무엇인지, 왜 필요한지 정리해보겠다.
기존에 Azure DevOps 파이프라인이 Azure 리소스에 접근하려면 서비스 주체를 만들고 Secret이라고 불리는 비밀번호를 발급받아야 했다.
방식: 아이디(App ID) + 비밀번호(Secret)를 Azure DevOps에 저장해두고 로그인하는 방식.
문제점:
비밀번호는 유효기간이 있어 주기적으로 갱신해야 한다(관리 부담).
비밀번호가 유출되면 누구나 해당 권한을 사용할 수 있다(보안 위험).
해당 방식은 비밀번호를 주고받는 것이 아니라 Azure DevOps을 신뢰하는 것이다.
이를 기술적으로 OIDC(OpenID Connect) 프로토콜을 사용해 구현한다.

개념: Azure AD(Entra ID)에게 "나는 Azure DevOps라는 곳에서 발행한 토큰을 믿겠다"라고 설정하는 것. 이를 'Federation(연합) 관계를 맺는다'고 한다.
작동 원리:
Azure DevOps 파이프라인이 실행되면 Azure DevOps가 "이건 내가 보증하는 파이프라인이야"라는 토큰을 발행한다.
이 토큰을 Azure AD에 건넨다.
Azure AD는 미리 설정된 페더레이션 자격 증명 정보(발급자, 대상 등)와 토큰을 대조한다
정보가 일치하면 비밀번호 없이도 접속을 허용한다.
장점: Secret이 아예 존재하지 않으므로, 유출될 키가 없고, 만료일 관리도 필요 없다. (Passwordless)
자동화 코드를 이해하기 위해서는 Azure AD와 Azure DevOps가 어떻게 OIDC(OpenID Connect)를 통해 인증하는지 그 흐름을 알아야 한다.
Azure AD (Entra ID):
Azure 리소스에 대한 접근 권한(IAM)을 관리하는 Identity Provider
Azure AD에서 앱 등록(Service Principal)을 생성해야 Azure 리소스에 접근할 수 있는 주체가 생긴다.
Azure DevOps:
Trust Relationship (신뢰 관계)
기존에는 Secret을 주고받았음.
WIF (Workload Identity Federation) 방식에서는 "Azure DevOps의 특정 리포지토리/브랜치에서 발생한 토큰은 유효하다"라는 규칙인 Federated Credential을 Azure AD에 등록
Tech Community 가이드에 따른 수동 설정은 두 플랫폼을 오가는 컨텍스트 스위칭이 발생한다.
[Azure Portal] 앱 등록을 생성하여 Client ID, Tenant ID 확보.
[Azure DevOps] 서비스 연결 생성 메뉴 진입 -> 'Workload Identity Federation (Manual)' 선택.
[Azure DevOps] 화면에 생성된 Issuer URL과 Subject Identifier(주체 식별자) 문자열을 복사.
[Azure Portal] 앱 등록 > 인증서 및 암호 > '페더레이션 자격 증명' 탭으로 이동하여 복사한 값 붙여넣기
[Azure DevOps] 다시 돌아와서 연결 저장 및 검증
프레젠테이션에서는 Terraform의 Provider들을 조합하여 이 상호 의존적인 설정을 한 번에 처리한다.
핵심은 azuread 프로바이더로 Azure 측 설정을 하고, 생성된 정보를 azuredevops 프로바이더로 넘겨주는 것이다.
Azure 리소스에 접근할 수 있는 논리적인 자격 증명 주체를 생성하는 단계이다.
App Registration 생성:
Federated Credentials 설정:
Secret을 생성하는 대신 azuread_application_federated_identity_credential 리소스를 사용
repo:<조직>/<프로젝트>:ref:refs/heads/main과 같이 Azure DevOps가 발행할 토큰의 대상을 명시하여 Azure AD에 등록
즉, "이 경로에서 오는 요청은 인증해라"라는 정책을 심는 과정
Azure AD에 등록된 정보를 바탕으로, Azure DevOps 파이프라인이 사용할 연결 객체를 만든다.
Service Connection 생성:
azuredevops_serviceendpoint_azurerm 리소스를 생성한다.
앞서 생성한 App Registration의 Application ID(Client ID)와 Tenant ID를 주입
service_endpoint_authentication_scheme 속성을 WorkloadIdentityFederation으로 설정하여, Secret 기반 인증이 아님을 명시
권한 부여:
azuredevops_resource_authorization 리소스를 통해 권한을 열어준다.인증은 2-3, 2-4에서 해결되었으나, 실제 리소스를 조작할 수 있는 권한은 별도로 부여해야 한다.
구독 범위 권한:
Contributor: Terraform이 리소스 그룹, 네트워크 등을 생성/삭제하기 위한 필수 권한
User Access Administrator: Terraform이 배포 과정에서 또 다른 IAM 할당을 수행해야 할 경우 필요
스토리지 계정(Storage Account):
Storage Blob Data Contributor
Terraform은 인프라의 현재 상태를 tfstate 파일로 관리하며, 해당 파일은 Azure Storage Blob에 저장된다.
단순 Contributor 권한은 Control Plane 권한이므로, 실제 데이터인 Blob 파일을 읽고 쓰기 위해서는 Data Plane 권한인 이 역할이 반드시 필요하다.
해당 방법을 통해 보안이 강화된(WIF 기반) 서비스 연결이 준비되었다.
이를 사용하여 실제 인프라(예: VM, VNet 등)를 배포하는 파이프라인을 구성할 때 지켜야 할 4가지 필수 조건이 있다.
RBAC 권한 확인:
상태 파일 접근 권한:
테라폼 태스크 버전 업데이트:
환경 변수 설정 (가장 중요):
테라폼이 시크릿 키를 찾지 않고 OIDC 토큰을 사용하도록 환경 변수를 명시해야 한다.
ARM_USE_OIDC = true 또는 AZURE_RM_USE_AZURE_AD = true
WIF 도입의 의의: 기존 Secret 기반 인증의 보안 취약점과 관리 부담을 해소하기 위해 OIDC 기반의 Workload Identity Federation을 도입하여 암호 없는 인증 체계를 구축한다.
자동화의 효율성: Azure AD(신분증 발급)와 Azure DevOps(신분증 사용) 간의 복잡한 수동 연결 과정을 Terraform으로 일원화하여 설정 오류를 줄이고 배포 속도를 높인다.
권한 분리의 중요성: 인증 설정 후에도 실제 인프라 제어(Contributor)와 상태 파일 관리(Storage Blob Data Contributor)를 위한 권한을 명확히 구분하여 할당해야 한다.
실전 적용 포인트: 실제 파이프라인 적용 시에는 Terraform Task v4 이상 사용과 OIDC 환경 변수 활성화(ARM_USE_OIDC = true)가 필수적이다.