GCP ServiceAccount AWS IAM Role Workload Identity Federation

최근 CDC(Change Data Capture)와 관련하여 Origin DB에서 BigQuery로의 작업을 진행했습니다.

여기에 몇가지 걸렷던 것은 보안 요구 사항으로 RBAC으로 인증/권한 획득을 해야한다는 조건이었는데요.

이를 위해 다음과 같이 진행하게 되었습니다.

Google Cloud / GKE 작업


## 1. GKE내 Service Account 생성
kubectl create serviceaccount srv-dev-sa --namespace srv


## 2. Google Cloud 내 Service Account 생성
gcloud iam service-accounts create srv-dev-sa --project srv-dev


## 3. GCP SA와 GKE SA에 대한 Binding 진행
gcloud iam service-accounts add-iam-policy-binding \
srv-dev-sa@srv-dev.iam.gserviceaccount.com \
    --role roles/iam.workloadIdentityUser \
    --member "serviceAccount:srv-dev.svc.id.goog[srv/srv-dev-sa]" \
    --project srv-dev
    

## 4. IAM 계정에 필요 권한 부여하기
gcloud projects add-iam-policy-binding srv-dev \
    --member "serviceAccount:srv-dev-sa@srv-dev.iam.gserviceaccount.com" \
    --role "Service Account OpenID Connect Identity Token Creator"

gcloud projects add-iam-policy-binding srv-dev \
    --member "serviceAccount:srv-dev-sa@srv-dev.iam.gserviceaccount.com" \
    --role "Service Account Token Creator"


## 5. GKE SA에 관련 정보 추가하기
kubectl annotate serviceaccount srv-dev-sa \
    --namespace srv \
    iam.gke.io/gcp-service-account=srv-dev-sa@srv-dev.iam.gserviceaccount.com
    

## 6. AWS IAM에 등록할 oauth2ClientId 확인하기
gcloud iam service-accounts describe srv-dev-sa@oydp-srv-dev.iam.gserviceaccount.com

description: srv-dev 프로젝트의 cdc용 서비스 계정입니다.
displayName: srv-dev-sa
email: srv-dev-sa@srv-dev.iam.gserviceaccount.com
etag: ************
name: projects/srv-dev/serviceAccounts/srv-dev-sa@srv-dev.iam.gserviceaccount.com
oauth2ClientId: '*********************'
projectId: srv-dev
uniqueId: '*********************'

AWS IAM 작업 (아래는 연동을 위한 기본 정보입니다. Role은 필요한 권한만 부여하도록 작업)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {"Federated": "accounts.google.com"},
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "accounts.google.com:aud": "*********************"
                }
            }
        }
    ]
}

이렇게 작업하게 되면, GKE에서 동작하는 어플리케이션이 AWS내 리소스에 접근할수 있도록 할수 있습니다. 동시에 AccessKey를 사용하지 않기 때문에 보안적인부분에서도 도움이 될수 있습니다.

참고링크