🔥

saml with gke

2025/02/25に公開

dev.xxxx.com 환경에서 GKE, IAP, Cloud Armor, Load Balancing과 함께 SAML 인증을 구성하는 방법을 설명해드리겠습니다.

먼저 기존 코드에 SAML 관련 설정을 추가하겠습니다:

gke.tf
// ... existing code ...

# Workload Identity Pool 생성
resource "google_iam_workload_identity_pool" "saml_pool" {
  workload_identity_pool_id = "dev-saml-pool"
  display_name             = "Dev SAML Pool"
  description             = "Identity pool for dev environment SAML federation"
}

# SAML Provider 설정
resource "google_iam_workload_identity_pool_provider" "saml" {
  workload_identity_pool_id          = google_iam_workload_identity_pool.saml_pool.workload_identity_pool_id
  workload_identity_pool_provider_id = "dev-saml-provider"
  display_name                       = "Dev SAML Provider"
  
  saml {
    idp_metadata_xml = file("path/to/metadata.xml")
  }

  attribute_mapping = {
    "google.subject"       = "assertion.sub"
    "attribute.user_email" = "assertion.email"
    "attribute.groups"     = "assertion.groups"
  }
}

# IAP Brand에 SAML 설정 추가
resource "google_iap_brand" "default" {
  support_email     = "support@xxxx.com"
  application_title = "XXXX Dev Application"

  # SAML 설정 추가
  identity_provider = {
    idp_id          = google_iam_workload_identity_pool_provider.saml.name
    sign_response   = true
    use_metadata    = true
  }
}

# IAP OAuth Client 설정 업데이트
resource "google_iap_client" "default" {
  display_name = "IAP SAML Client"
  brand        = google_iap_brand.default.name
}

# Cloud Armor 정책 업데이트
resource "google_compute_security_policy" "policy" {
  // ... existing rules ...

  # SAML 인증된 사용자만 허용
  rule {
    action   = "allow"
    priority = "1500"
    match {
      expr {
        expression = "has(request.headers['x-goog-iap-jwt-assertion']) && request.headers['x-goog-iap-jwt-assertion'].contains('dev.xxxx.com')"
      }
    }
  }
}

그리고 SAML 설정을 위한 새로운 파일을 생성합니다:

saml.tf
# SAML 설정을 위한 Service Account
resource "google_service_account" "saml_sa" {
  account_id   = "dev-saml-service-account"
  display_name = "Dev SAML Service Account"
}

# SAML 인증서를 저장할 Storage Bucket
resource "google_storage_bucket" "saml_cert" {
  name     = "dev-saml-cert-${var.project_id}"
  location = "asia-northeast3"
  uniform_bucket_level_access = true
}

# SAML 메타데이터 저장
resource "google_storage_bucket_object" "saml_metadata" {
  name   = "saml-metadata.xml"
  bucket = google_storage_bucket.saml_cert.name
  source = "path/to/metadata.xml"  # IdP에서 제공받은 메타데이터 파일
}

# IAM 정책 바인딩
resource "google_project_iam_binding" "saml_viewer" {
  project = var.project_id
  role    = "roles/browser"
  members = [
    "serviceAccount:${google_service_account.saml_sa.email}",
  ]
}

주요 변경사항 설명:

  1. SAML 인증 흐름:

    • 사용자가 dev.xxxx.com 접속
    • IAP에서 SAML IdP로 리디렉션
    • SAML 인증 후 GKE 서비스 접근
  2. 보안 설정:

    • Cloud Armor에서 SAML 인증된 요청만 허용
    • IAP를 통한 접근 제어
    • Workload Identity를 통한 서비스 계정 관리
  3. 구성 필요사항:

    • IdP에서 제공하는 SAML 메타데이터 파일 필요
    • support@xxxx.com 이메일 주소 확인
    • 실제 도메인(dev.xxxx.com) DNS 설정 확인
  4. 추가 설정 필요사항:

    • IdP 측에서의 설정 (SP 메타데이터 등록)
    • SAML 어설션 매핑 확인
    • SSL 인증서 발급 확인

이 설정으로 dev.xxxx.com에 대한 접근은:

  1. SAML 인증 필요
  2. IAP를 통한 접근 제어
  3. Cloud Armor를 통한 보안 강화
  4. GKE 클러스터와의 안전한 통합이 가능합니다.

Discussion