안녕하세요! Kubernetes 환경에서 GitOps를 운영하다 보면 반드시 마주하게 되는 숙제가 있습니다. 바로 "누가, 어떤 프로젝트에, 어디까지 접근할 수 있는가?"에 대한 제어입니다.
오늘은 Argo CD의 권한 제어 엔진인 argocd-rbac-cm의 구조를 파헤치고, 보안의 정점이라 할 수 있는 AppProject 기반의 CI 전용 토큰 발급 방법까지 상세히 알아보겠습니다. 🛠️

1. 🏗️ Argo CD RBAC의 심장: argocd-rbac-cm 개요
Argo CD는 기본적으로 Role-Based Access Control (RBAC) 모델을 따릅니다. 이 설정을 담당하는 ConfigMap이 바로 argocd-rbac-cm입니다.
📋 주요 구성 요소
- Policy: p, <subject>, <resource>, <action>, <object>, <effect>
- Scopes: 어떤 그룹 정보를 기반으로 권한을 줄지 결정합니다 (예: GitHub Org, Keycloak Group).
- Default Role: 권한이 명시되지 않은 사용자에게 부여할 기본 권한입니다 (일반적으로 role:readonly 권한을 권장합니다).
💻 argocd-rbac-cm 기본 설정 예시
YAML
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
namespace: argocd
data:
# 1. 기본 권한 설정: 아무런 권한이 없는 사용자는 읽기만 가능하게 설정 🧐
policy.default: role:readonly
# 2. 커스텀 정책 정의 📜
# 형식: p, <role/user/group>, <resource>, <action>, <object>, <allow/deny>
policy.csv: |
# 'dev-team' 역할은 'default' 프로젝트 내의 모든 앱에 대해 'sync'와 'get' 권한을 가짐
p, role:dev-team, applications, get, default/*, allow
p, role:dev-team, applications, sync, default/*, allow
# 특정 그룹(OIDC 연동 시)을 역할에 매핑
g, "my-github-org:eng-team", role:dev-team
# 3. CSV 데이터 소스 설정 (기본값)
scopes: '[groups]'
2. 🎯 특정 프로젝트를 위한 역할: AppProject Role
모든 사용자에게 전체 클러스터 권한을 줄 수는 없습니다. Argo CD는 AppProject라는 단위를 통해 논리적인 격리를 제공합니다.
🔍 AppProject Role의 장점
- 멀티 테넌시: A팀은 A 프로젝트만, B팀은 B 프로젝트만 관리하도록 강제합니다.
- 세밀한 제어: 프로젝트 내부에서 '애플리케이션 생성'은 가능하지만 '프로젝트 수정'은 불가능하게 설정할 수 있습니다.
3. 🔑 CI 파이프라인을 위한 Scoped Token 발급 방법
가장 중요한 질문입니다. "Jenkins나 GitHub Actions 같은 CI 도구가 어떻게 특정 프로젝트에만 접근할 수 있는 토큰을 안전하게 얻을 수 있을까요?" 💡
글로벌 관리자 토큰(admin)을 사용하는 것은 매우 위험합니다. 대신 AppProject 내부의 Role을 생성하고 그 Role에 종속된 토큰을 발급받아야 합니다.
Step 1: AppProject 내부에 Role 정의하기
먼저 AppProject 리소스를 수정하여 CI를 위한 전용 역할을 만듭니다.
YAML
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: ecommerce-project
namespace: argocd
spec:
description: "이커머스 서비스 전용 프로젝트"
# ... 기존 설정 생략 ...
roles:
# 1. 'ci-bot'이라는 이름의 역할을 정의합니다. 🤖
- name: ci-bot
description: "CI 파이프라인용 전용 토큰 역할"
policies:
# 이 역할은 이 프로젝트 내부의 애플리케이션에 대해서만 업데이트/동기화 가능
- p, proj:ecommerce-project:ci-bot, applications, get, ecommerce-project/*, allow
- p, proj:ecommerce-project:ci-bot, applications, sync, ecommerce-project/*, allow
- p, proj:ecommerce-project:ci-bot, applications, update, ecommerce-project/*, allow
Step 2: Argo CD CLI를 사용하여 토큰 발급 받기
Role을 생성했다면, 이제 이 Role에 귀속되는 JWT 토큰을 생성해야 합니다. 이 작업은 Argo CD CLI를 통해 수행하는 것이 가장 간편합니다.
Bash
# 1. 특정 프로젝트의 Role에 토큰 생성 요청
# --expires-in: 토큰 만료 시간 설정 (예: 1년 = 8760h)
argocd proj role generate-token ecommerce-project ci-bot --expires-in 8760h
⚠️ 주의: 출력되는 토큰값은 단 한 번만 보여지므로 반드시 안전한 곳(Vault, GitHub Secrets 등)에 저장해야 합니다!
Step 3: CI 환경에서 토큰 활용하기
이제 발급받은 토큰을 CI 도구의 환경 변수(예: ARGOCD_TOKEN)로 등록하고 다음과 같이 사용합니다.
Bash
# 별도의 로그인 과정 없이 토큰만으로 명령 수행 가능! 🚀
argocd app sync my-app --server argocd.example.com --auth-token $ARGOCD_TOKEN
4. 💡 운영 팁: 더 안전한 RBAC을 위한 체크리스트
- 최소 권한의 원칙 (Principle of Least Privilege): policy.default를 절대 role:admin으로 설정하지 마세요. role:readonly 혹은 빈 값으로 두는 것이 안전합니다.
- 그룹 기반 관리: 개별 사용자에게 p 정책을 부여하기보다, OIDC(Okta, Dex, GitHub) 그룹을 g 설정을 통해 Role에 매핑하세요. 관리 효율이 급상승합니다.
- AppProject 토큰 관리: CI용 토큰은 주기적으로 갱신(Rotation)하고, 더 이상 사용하지 않는 토큰은 argocd proj role delete-token 명령으로 즉시 폐기하세요.
📝 요약 테이블
| 구분 | 글로벌 RBAC (argocd-rbac-cm) | 프로젝트 RBAC (AppProject) |
|---|---|---|
| 관리 범위 | 전체 시스템 권한 (Admin, Readonly 등) | 특정 프로젝트 내 리소스 권한 |
| 주요 대상 | 운영팀, 전체 개발자 그룹 | 특정 서비스 개발팀, CI 봇 |
| 토큰 발급 | 로컬 계정(Local User) 기반 | 프로젝트 역할(Project Role) 기반 |
| 추천 용도 | 시스템 전반의 접근 제어 | CI/CD 파이프라인 연동 (Scoped) |
💡 마치며
Argo CD의 보안은 argocd-rbac-cm을 통한 거시적 제어와 AppProject를 통한 미시적 제어의 조화에서 시작됩니다. 특히 오늘 살펴본 CI 전용 Scoped Token은 클러스터 보안 위협을 최소화하면서도 자동화 효율을 높이는 최고의 방법입니다.
여러분의 GitOps 환경에도 지금 바로 적용해 보세요! 궁금한 점이 있다면 댓글로 남겨주세요. 😊
'클라우드 > Argo' 카테고리의 다른 글
| ⚓ Argo CD 마스터 가이드: Hook Phase의 종류와 완벽 활용법 (0) | 2026.01.02 |
|---|---|
| 🏗️ Argo CD 아키텍처 완벽 해부: GitOps의 심장부를 들여다보다 (0) | 2026.01.02 |
| 🏗️ Argo CD 아키텍처 깊이 파헤치기: 주요 CR과 관계도 완벽 가이드 (0) | 2026.01.02 |
| ☸️ Helm Values 완벽 가이드: 설정 방법부터 Argo CD InitContainer 비법까지 (0) | 2026.01.02 |
| 🚀 Argo CD 마스터 가이드: argocd-cm 핵심 속성 완벽 정복하기 (0) | 2026.01.02 |