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의 중앙 집중식 인증 기능을 통해 여러 관리형 클러스터에 안전하게 인증할 수 있습니다.

목표는 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 내에서 인증 자격 증명을 쉽게 관리할 수 있습니다.

이 예에서 입력 구성 필드에는 다음이 포함됩니다.
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 요청 : 플레이북은 관리형 클러스터에 대한 액세스를 요청합니다.
- HUB 인증 : Ansible Automation Platform은 구성된 ServiceAccount를 사용하여 Red Hat Advanced Cluster Management 허브를 인증합니다.
- 토큰 생성 : Red Hat Advanced Cluster Management는 대상 클러스터에 ManagedServiceAccount를 생성하고 토큰을 생성합니다.
- 클러스터 프록시 : Ansible Automation Platform은 생성된 토큰을 사용하여 클러스터 프록시를 통해 관리되는 클러스터에 액세스합니다.
- 보안 통신 : 모든 통신은 허브 클러스터를 통해 라우팅됩니다.
- 정리 : 작업이 완료되고 토큰이 취소되면 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 플레이북 요약
기억해야 할 핵심 사항은 다음과 같습니다.
- Vault 통합 :
vars_files암호화된 Vault를 자격 증명과 함께 포함하는 데 사용 - 클러스터 로그인 : 저장된 자격 증명을 사용하여 Red Hat Advanced Cluster Management 허브로 인증합니다.
- 동적 토큰 생성 : 각 대상 클러스터에 대한 ManagedServiceAccount 생성
- 토큰 검색 : 각 클러스터에 대해 생성된 토큰 추출
- 클러스터 작업 : 클러스터별 토큰을 사용하여 작업을 수행합니다.
- 정리 : 사용 후 항상 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를 통합하면 엄격한 보안 제어와 감사 추적을 유지하면서 여러 클러스터를 관리하고 운영할 수 있는 강력한 자동화 플랫폼이 생성됩니다.