Ansible Automation Platform을 사용한 멀티클러스터 인증

Red Hat Blog를 보다가 관심 가는 글이 보여서 AI번역+약간 교정해 보았습니다.
출처: https://developers.redhat.com/articles/2025/09/08/multicluster-authentication-ansible-automation-platform

이 문서에서는 Red Hat Ansible Automation Platform과 Red Hat Advanced Cluster Management 간의 멀티클러스터 인증을 구현하는 단계별 가이드를 제공합니다. 그림 1에 나와 있는 이러한 통합을 통해 Ansible Automation Platform은 Red Hat Advanced Cluster Management의 중앙 집중식 인증 기능을 통해 여러 관리형 클러스터에 안전하게 인증할 수 있습니다.

멀티 클러스터 인증을 위한 Ansible Automation Platform과 Red Hat Advanced Cluster Management 간의 통합 개요입니다.
그림 1: 통합 개요

목표는 Red Hat Advanced Cluster Management의 ManagedServiceAccount 및 ClusterProxy 기능을 활용하여 여러 클러스터에서 안전하고 토큰 기반의 인증을 구현함으로써 Ansible Automation Platform에서 자격 증명 확산을 없애는 것입니다.

가치 제안

이 통합은 자격 증명 확산으로 인한 중요한 보안 및 운영 문제를 해결합니다. Ansible Automation Platform에서 관리되는 각 클러스터에 대해 별도의 자격 증명을 관리하는 대신, 이 솔루션은 다음과 같은 기능을 제공합니다.

  • 중앙 집중식 인증 : 모든 인증 흐름은 Red Hat Advanced Cluster Management 허브 클러스터를 통해 진행됩니다.
  • 네트워크 보안 : 관리되는 클러스터에 대한 API 액세스는 클러스터 프록시를 통해 라우팅됩니다.
  • 동적 토큰 관리 : ManagedServiceAccount는 장기 자격 증명을 저장하지 않고도 주문형 토큰을 제공합니다.
  • 공격 표면 감소 : Ansible Automation Platform에 클러스터 자격 증명을 저장할 필요성이 사라짐

필수 조건

다음 구성 요소를 설치하고 구성해야 합니다.

  • Red Hat Advanced Cluster Management 2.9 이상
  • Red Hat Ansible Automation Platform
  • ManagedServiceAccount 및 Cluster Proxy 기능 활성화(Red Hat Advanced Cluster Management 2.9부터 기본값)

구성 요소 확인

Red Hat Advanced Cluster Management 2.13에서는 ManagedServiceAccount 및 Cluster Proxy 기능이 모두 기본적으로 활성화되어 있습니다. 해당 기능을 확인하려면 다음 단계를 따르세요.

oc get multiclusterengine multiclusterengine -o yaml

spec.overrides.components 섹션에서 다음 구성 요소를 찾으세요.

  • managedserviceaccount 활성화되어야 합니다
  • cluster-proxy-addon 활성화되어야 합니다

클러스터 프록시 URL 가져오기

Ansible Automation Platform이 인증에 사용할 클러스터 프록시 URL을 가져옵니다.

oc get route -n multicluster-engine cluster-proxy-addon-user
NAME                       HOST/PORT       
cluster-proxy-addon-user   cluster-proxy-user.apps.ocp4.example.com     cluster-proxy-addon-user   user-port

멀티클러스터 인증을 위한 허브 ServiceAccount 생성

Ansible Automation Platform이 ManagedServiceAccounts를 생성하고 인증 토큰을 검색하는 데 사용할 수 있는 클러스터 허브에 ServiceAccount를 생성합니다.

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: aap-integration-serviceaccount-role
rules:
  - verbs:
      - get
      - list
      - watch
    apiGroups:
      - ''
    resources:
      - secrets
  - verbs:
      - get
      - list
      - watch
      - create
      - update
      - patch
      - delete
    apiGroups:
      - authentication.open-cluster-management.io
      - work.open-cluster-management.io
      - addon.open-cluster-management.io
    resources:
      - managedserviceaccounts
      - manifestworks
      - managedclusteraddons
      - managedserviceaccounts/finalizers
      - manifestworks/finalizers
      - managedclusteraddons/finalizers
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: aap-integration-serviceaccount-rb
subjects:
  - kind: ServiceAccount
    name: aap-integration-serviceaccount
    namespace: aap
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: aap-integration-serviceaccount-role
---
kind: ServiceAccount
apiVersion: v1
metadata:
  name: aap-integration-serviceaccount
  namespace: aap

인증 토큰 생성

OpenShift 4.11 이상의 경우 인증 토큰을 수동으로 생성하세요.

oc create token aap-integration-serviceaccount -n aap

장기 토큰(1년)의 경우:

oc create token aap-integration-serviceaccount -n aap --duration=8760h

스니펫 복사

인증 자격 증명 구성

Red Hat Advanced Cluster Management를 통해 인증하기 위해 Ansible Automation Platform의 인증 자격 증명을 저장합니다. 이 예시에서는 Ansible Vault를 사용하지만, Ansible Automation Platform 자격 증명이나 필요한 값에 대한 액세스를 제공하는 다른 방법을 사용할 수도 있습니다.

Ansible Vault 사용하기

인증 자격 증명을 Ansible vault 저장소에 안전하게 저장하세요. 먼저, 다음과 같은 디렉터리를 만드세요.

$ mkdir vault

디렉토리에 인증 자격 증명이 포함된 vault.yaml 파일을 만듭니다.

$ cat vault/vault.yaml
hub_url: https://cluster-proxy-user.apps.ocp4.example.com  
token_acm: yJhbGciOiJSUzI1NXXXXXXXXXXXXXXXXXXXX

ansible-vault 명령을 사용하여 파일을 암호화합니다.

$ ansible-vault encrypt vault/vault.yaml

사용자 정의 자격 증명 유형 사용

Ansible Automation Platform에서 사용자 지정 자격 증명 유형을 생성하여 Red Hat Advanced Cluster Management 인증 자격 증명을 안전하게 저장하고 관리하세요. 이 접근 방식은 적절한 검증 및 도움말 텍스트를 통해 다중 클러스터 인증 자격 증명을 처리하는 체계적인 방법을 제공합니다.

사용자 정의 자격 증명 유형 인터페이스를 사용하면 클러스터 프록시 URL과 허브 토큰에 대한 특정 필드를 정의하여 Ansible Automation Platform 내에서 인증 자격 증명을 쉽게 관리할 수 있습니다.

Red Hat Advanced Cluster Management 인증을 위한 Ansible Automation Platform의 사용자 정의 자격 증명 유형 구성
그림 2: Red Hat Advanced Cluster Management 인증을 위한 Ansible Automation Platform의 사용자 정의 자격 증명 유형 구성.

이 예에서 입력 구성 필드에는 다음이 포함됩니다.

fields:
  - id: cluster_proxy_url
    type: string
    label: Cluster Proxy HUB URL
    help_text: >-
      Insert the cluster-proxy-addon-user route "oc get route -n
      multicluster-engine cluster-proxy-addon-user"
  - id: hub_token
    type: string
    label: Cluster HUB Token
    help_text: Insert Authentication Token generated by ServiceAccount
    secret: true
required:
  - cluster_proxy_url
  - hub_token

인젝터 구성:

extra_vars:
  hub_url: '{{ cluster_proxy_url }}'
  token_acm: '{{ hub_token }}'

인증 흐름

멀티클러스터 인증 프로세스는 모든 관리형 클러스터에서 적절한 인증 및 권한 부여를 보장하는 안전한 단계별 흐름을 따릅니다. 그림 3은 Ansible Automation Platform이 RHACM과 상호 작용하여 자격 증명 확산을 방지하는 중앙 집중식 인증 메커니즘을 통해 관리형 클러스터에 안전하게 액세스하는 방식을 보여줍니다.

보안 토큰 기반 인증을 통해 Ansible Automation Platform, Red Hat Advanced Cluster Management 허브 및 관리되는 클러스터 간의 상호 작용을 보여주는 멀티클러스터 인증 흐름
그림 3: 멀티클러스터 인증 흐름.

상세히:

  1. Ansible Automation Platform 요청 : 플레이북은 관리형 클러스터에 대한 액세스를 요청합니다.
  2. HUB 인증 : Ansible Automation Platform은 구성된 ServiceAccount를 사용하여 Red Hat Advanced Cluster Management 허브를 인증합니다.
  3. 토큰 생성 : Red Hat Advanced Cluster Management는 대상 클러스터에 ManagedServiceAccount를 생성하고 토큰을 생성합니다.
  4. 클러스터 프록시 : Ansible Automation Platform은 생성된 토큰을 사용하여 클러스터 프록시를 통해 관리되는 클러스터에 액세스합니다.
  5. 보안 통신 : 모든 통신은 허브 클러스터를 통해 라우팅됩니다.
  6. 정리 : 작업이 완료되고 토큰이 취소되면 ManagedServiceAccount가 삭제됩니다.

Ansible Automation Platform 플레이북에서 멀티클러스터 인증 사용

다음은 Ansible Automation Platform 플레이북에서 멀티클러스터 인증을 사용하는 방법의 예입니다.

---
- name: Multi-Cluster Operations with RHACM Authentication
  hosts: localhost
  vars_files:
    - ../vault/vault.yaml  # Contains hub_url and token_acm
  vars:
    target_clusters: ["cluster1", "cluster2", "cluster3"] # Name of ManagedCluster
  tasks:
    - block:
        - name: Create ManagedClusterAddOn
          kubernetes.core.k8s:
            definition: |
              apiVersion: addon.open-cluster-management.io/v1alpha1
              kind: ManagedClusterAddOn
              metadata:
                name: managed-serviceaccount
                namespace: "{{ item }}"
              spec:
                installNamespace: open-cluster-management-agent-addon
            host: "{{ hub_url }}/local-cluster"
            api_key: "{{ token_acm }}"
            validate_certs: false
          with_items: "{{ target_clusters }}"
        - name: Create ManagedServiceAccount
          kubernetes.core.k8s:
            definition: |
              apiVersion: authentication.open-cluster-management.io/v1beta1
              kind: ManagedServiceAccount
              metadata:
                name: aap-integration-serviceaccount
                namespace: "{{ item }}"
              spec:
                rotation:
                  enabled: true
                  validity: 8640h0m0s
            host: "{{ hub_url }}/local-cluster"
            api_key: "{{ token_acm }}"
            validate_certs: false      
          with_items: "{{ target_clusters }}"
        - name: Get UID of ManagedServiceAccount
          kubernetes.core.k8s_info:
            api_version: authentication.open-cluster-management.io/v1beta1
            kind: ManagedServiceAccount
            namespace: "{{ item }}"
            name: aap-integration-serviceaccount
            host: "{{ hub_url }}/local-cluster"
            api_key: "{{ token_acm }}"
            validate_certs: false
          with_items: "{{ target_clusters }}"            
          register: msa_info
        - name: Create ManifestWork
          kubernetes.core.k8s:
            definition: |
              apiVersion: work.open-cluster-management.io/v1
              kind: ManifestWork
              metadata:
                name: aap-integration-serviceaccount
                namespace: "{{ item }}"
              spec:
                workload:
                  manifests: 
                    - apiVersion: rbac.authorization.k8s.io/v1
                      kind: ClusterRoleBinding
                      metadata:
                        name: cluster-admin-app
                      roleRef:
                        apiGroup: rbac.authorization.k8s.io
                        kind: ClusterRole
                        name: cluster-admin
                      subjects:
                        - kind: ServiceAccount
                          name: aap-integration-serviceaccount
                          namespace: open-cluster-management-agent-addon
            host: "{{ hub_url }}/local-cluster"
            api_key: "{{ token_acm }}"
            validate_certs: false
          with_items: "{{ target_clusters }}"
        - name: Check if token is created
          kubernetes.core.k8s_info:
            kind: Secret
            name: aap-integration-serviceaccount
            namespace: "{{ item }}"
            host: "{{ hub_url }}/local-cluster"
            api_key: "{{ token_acm }}"
            validate_certs: false
          with_items: "{{ target_clusters }}"
          register: secret_info
          until: secret_info is not failed
          retries: 10
          delay: 15
        - name: Create empty array
          set_fact:
            clusters_tokens: []
        - name: Fetch secret aap-integration-serviceaccount
          kubernetes.core.k8s_info:
            api_version: v1
            kind: Secret
            namespace: "{{ item }}"
            name: "aap-integration-serviceaccount"
            api_key: "{{ token_acm }}"
            host: "{{ hub_url }}/local-cluster"
            validate_certs: false
          register: secret_result
          with_items: "{{ target_clusters }}"
        - name: Extract and decode token
          set_fact:
            clusters_tokens: "{{ clusters_tokens + [clusters] }}"
          vars:
            clusters:
              cluster_name: "{{ item }}"
              token: "{{ secret_result.results[0].resources[0].data.token | b64decode }}"
          with_items: "{{ target_clusters }}"
        # Include your specific tasks here
        - name: Your custom operations
          include_tasks: "tasks/your-custom-task.yaml"
          vars:
            cluster_name: "{{ item }}"
          loop: "{{ target_clusters }}"
      always:
        - name: Delete ManagedServiceAccount
          kubernetes.core.k8s:
            state: absent
            definition: |
              apiVersion: authentication.open-cluster-management.io/v1beta1
              kind: ManagedServiceAccount
              metadata:
                name: aap-integration-serviceaccount
                namespace: "{{ item }}"
            host: "{{ hub_url }}/local-cluster"
            api_key: "{{ token_acm }}"
            validate_certs: false      
          with_items: "{{ target_clusters }}"

이 예제에 대한 중요 참고 사항:

  • host: "{{ hub_url }}/{{ cluster_name }}" 특정 관리 클러스터에 액세스하는 데 사용
  • api_key: "{{ clusters_tokens | selectattr('cluster_name', '==', cluster_name) | map(attribute='token') | first }}" 클러스터에 대한 올바른 토큰을 얻는 데 사용
  • 생성된 토큰을 사용하여 관리되는 클러스터에서 직접 작업을 수행합니다.

다음은 멀티클러스터 인증을 사용하여 관리되는 클러스터에서 실행할 수 있는 작업의 예입니다.

---
- name: Get jobs completed in "Failed" status {{ cluster_name }}
  kubernetes.core.k8s_info:
    api_version: batch/v1
    kind: Job
    namespace: "{{ namespace }}"
    host: "{{ hub_url }}/{{ cluster_name }}"
    api_key: "{{ clusters_tokens | selectattr('cluster_name', '==', cluster_name) | map(attribute='token') | first }}"
    validate_certs: false      
  register: failed_jobs
- name: debug jobs Failed {{ cluster_name }}
  debug:
    msg: "{{ item.metadata.name }}"
  with_items: "{{ failed_jobs.resources }}"
  when: item.status.conditions | selectattr('type', 'equalto', 'Failed') | selectattr('status', 'equalto', 'True')

Ansible Automation Platform 플레이북 요약

기억해야 할 핵심 사항은 다음과 같습니다.

  1. Vault 통합 : vars_files암호화된 Vault를 자격 증명과 함께 포함하는 데 사용
  2. 클러스터 로그인 : 저장된 자격 증명을 사용하여 Red Hat Advanced Cluster Management 허브로 인증합니다.
  3. 동적 토큰 생성 : 각 대상 클러스터에 대한 ManagedServiceAccount 생성
  4. 토큰 검색 : 각 클러스터에 대해 생성된 토큰 추출
  5. 클러스터 작업 : 클러스터별 토큰을 사용하여 작업을 수행합니다.
  6. 정리 : 사용 후 항상 ManagedServiceAccount 리소스를 정리하세요.

워크플로 통합

자동화 컨트롤러를 사용하면 볼트 자격 증명을 참조하는 작업 템플릿을 만들고, 여러 클러스터에 대해 플레이북을 실행하고, Red Hat Advanced Cluster Management 통합을 통해 자동으로 인증을 처리할 수 있습니다.

멀티클러스터 인증 문제 해결

멀티클러스터 인증을 설정하는 동안 프로세스의 일부를 테스트하고 진단해야 할 수 있습니다. 다음은 확인해야 할 몇 가지 일반적인 구성 요소입니다.

  • ManagedServiceAccount 및 클러스터 프록시가 활성화되어 있는지 확인하세요.
  • 토큰 유효성 및 권한 확인
  • 클러스터 프록시 URL에 액세스할 수 있는지 확인하세요.
  • 인증 오류가 있는지 Ansible Automation Platform 및 Red Hat Advanced Cluster Management 로그를 검토합니다.

보안 모범 사례

클러스터를 안전하게 유지하세요. 구성을 적용하기 전에 다음 사항을 확인하세요.

  • 가능하면 단기 토큰을 사용하세요
  • 정기적으로 인증 토큰을 순환합니다.
  • 인증 로그 모니터링
  • ServiceAccount 권한에 대해 최소 권한 원칙을 따르세요.

결론

이 멀티클러스터 인증 설정은 여러 쿠버네티스 클러스터에서 인증을 관리할 수 있는 강력하고 확장 가능한 솔루션을 제공합니다. Red Hat Advanced Cluster Management의 ManagedServiceAccount 및 ClusterProxy 기능을 활용하면 다음과 같은 이점을 얻을 수 있습니다.

  • Red Hat Advanced Cluster Management 허브를 통해 인증을 중앙화하여 자격 증명 확산을 제거하세요.
  • 장기 자격 증명 대신 동적이고 단기적인 토큰을 사용하여 보안을 강화하세요 .
  • 단일 제어 지점에서 인증을 관리하여 운영을 간소화합니다.
  • 추가 자격 증명 관리가 필요 없이 새 클러스터가 추가됨에 따라 효율적으로 확장 가능
  • Ansible Automation Platform에서 클러스터 자격 증명을 저장할 필요성을 없애 공격 표면을 줄입니다.

Ansible Automation Platform과 Red Hat Advanced Cluster Management를 통합하면 엄격한 보안 제어와 감사 추적을 유지하면서 여러 클러스터를 관리하고 운영할 수 있는 강력한 자동화 플랫폼이 생성됩니다.

참고문헌

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

You May Also Like
Read More

4가지 필수 네트워크 자동화 사용 사례

Red Hat Blog를 보다가 관심 가는 글이 보여서 AI번역+약간 교정해 보았습니다.출처: https://developers.redhat.com/articles/2025/06/23/4-essential-network-automation-use-cases-everyone 기업들이 다양한 공급업체의 구성 요소를 관리하고,…