본문 바로가기
DevOps

Argo CD에서 GitHub Apps로 보안 강화하기

by Rainbound-IT 2025. 10. 29.
반응형

GitOps 인증 토큰 관리의 새로운 표준: GitHub App 기반 접근 방식

 

목차

     


    🧩 들어가며

    Argo CD는 GitOps 패턴의 핵심이라 할 수 있는 툴로,

    Git 리포지토리의 선언형 설정(Helm, Kustomize 등)을 Kubernetes 클러스터에 자동 동기화합니다.

    하지만 많은 팀이 여전히 Argo CD에서 Personal Access Token (PAT) 을 사용하고 있습니다.

    이 방식은 다음과 같은 문제가 있습니다.

    • 🔓 토큰이 사람 계정 기반으로 발급되어, 만료 및 유출 리스크 존재
    • 🧑‍💻 조직원이 퇴사하거나 계정이 비활성화되면, 배포가 중단
    • 🔁 토큰 수동 갱신 필요 → 자동화 불가능

    이 문제를 해결하는 방법이 바로 GitHub Apps 기반 인증입니다.

    Argo CD는 2.4 버전부터 GitHub App Integration 을 네이티브로 지원합니다.


    🔐 GitHub App 인증의 개념

    GitHub App은 단순한 API Key가 아니라 머신 아이덴티티(Machine Identity) 로 동작합니다.

    핵심 특징

    항목  GitHub App  Personal Access Token
    인증 주체 App(머신 계정) 사용자 계정
    권한 설정 리포지토리 단위 세분화 사용자 전체 권한
    토큰 수명 단기(1시간) + 자동 재발급 장기(수동 갱신)
    철회 방법 설치 단위로 즉시 철회 사용자 계정 전체 영향
    보안성 ✅ 높음 ⚠️ 낮음

    즉, Argo CD가 GitHub App을 이용해 리포지토리에 접근하면

    토큰 갱신, 만료, 퇴사, 보안 사고 등으로부터 완전히 독립적으로 운영할 수 있습니다.


    ⚙️ 구성 시나리오 개요

    Argo CD가 GitHub 리포지토리와 통신할 때 다음 흐름으로 동작합니다.

    Argo CD → GitHub App Private Key 로 JWT 생성
            → GitHub API 호출 → Installation Token 발급
            → 해당 토큰으로 git clone
            → 1시간마다 자동 재발급
    

    즉, Argo CD 서버가 GitHub App의 short-lived 토큰을 자동으로 갱신하면서

    지속적으로 Git 리포를 pull 받아 동기화하는 구조입니다.


    🧱 Step 1. GitHub App 생성

    1️⃣ GitHub → Settings → Developer settings → GitHub Apps → New GitHub App

    2️⃣ 다음 항목을 설정합니다.

     

    항목 설정 예시
    GitHub App name argocd-gitops-bot
    Homepage URL https://argocd.acme.io
    Repository permissions Contents: Read-only
    Webhook 선택 사항 (ArgoCD는 불필요)

    3️⃣ 생성 후 다음 세 가지 값을 확보합니다.

    • App ID
    • Installation ID
    • Private Key (PEM)

    4️⃣ GitHub App을 Argo CD가 접근할 리포지토리 또는 조직 단위로 Install 합니다.


    🔑 Step 2. Kubernetes Secret 생성

    Argo CD가 사용할 인증 정보를 Secret으로 저장합니다.

    kubectl create secret generic github-app-creds \\
      -n argocd \\
      --from-literal=appID=123456 \\
      --from-literal=installationID=9876543 \\
      --from-file=privateKey=github-app.pem
    

    💡 privateKey 파일은 GitHub App 생성 시 다운로드한 .pem 파일입니다.


    🧩 Step 3. Argo CD에 GitHub App 등록

    argocd-cm ConfigMap을 수정하여 리포지토리를 추가합니다.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: argocd-cm
      namespace: argocd
    data:
      repositories: |
        - url: <https://github.com/acme/infra-configs.git>
          type: git
          githubAppID: 123456
          githubAppInstallationID: 9876543
          githubAppPrivateKeySecret:
            name: github-app-creds
            key: privateKey
    

    이후 argocd-server와 repo-server가 자동으로 App 인증을 통해 Git 리포를 clone 합니다.


    🧰 Step 4. Helm 또는 Terraform으로 자동화

    Helm values.yaml 예시

    configs:
      secret:
        github-app-creds:
          githubAppID: "123456"
          githubAppInstallationID: "9876543"
          githubAppPrivateKey: |
            -----BEGIN RSA PRIVATE KEY-----
            ...
            -----END RSA PRIVATE KEY-----
    

    Terraform 예시

    resource "helm_release" "argocd" {
      name       = "argocd"
      repository = "<https://argoproj.github.io/argo-helm>"
      chart      = "argo-cd"
      namespace  = "argocd"
    
      set {
        name  = "configs.cm.repositories"
        value = <https://github.com/acme/infra-configs.git>
      type: git
      githubAppID: 123456
      githubAppInstallationID: 9876543
      githubAppPrivateKeySecret:
        name: github-app-creds
        key: privateKey
    EOT
      }
    }
    

    🔄 Step 5. 동작 검증

    Argo CD UI 혹은 CLI에서 해당 리포를 연결합니다.

    argocd repo list
    

    정상이라면 Connection Status: Successful 로 표시됩니다.

    만약 401 Unauthorized가 뜬다면, Installation ID 또는 Private Key 불일치일 가능성이 높습니다.


    🚀 동작 방식 요약

     

    단계  설명
    1 Argo CD가 Private Key로 JWT 생성
    2 JWT로 GitHub API에 요청 → Installation Token 발급
    3 해당 토큰으로 Git clone
    4 1시간 후 자동 재발급
    별도 관리 불필요 — ArgoCD가 주기적으로 처리

    🧭 실제 운영 아키텍처 예시

    argocd/
    ├── apps/
    │   ├── dev.yaml
    │   ├── prod.yaml
    │   └── staging.yaml
    └── infra/
        ├── network/
        ├── eks/
        └── monitoring/
    
    • infra-configs 리포지토리를 GitHub App으로 인증
    • Argo CD는 App of Apps 패턴으로 환경별 Application 관리
    • 배포 자동화 시 GitHub Actions + ArgoCD Refresh API 로 완전한 GitOps 파이프라인 구현

    ⚠️ Troubleshooting

     

    문제 원인   해결 방법
    401 Unauthorized Installation ID 또는 PEM 키 불일치 App 재설정 후 Secret 갱신
    리포 일부만 접근됨 설치 범위 제한 GitHub App 설치 범위 전체 리포로 변경
    토큰 만료 오류 ArgoCD 2.3 이하 버전 사용 2.4 이상으로 업그레이드
    argocd-repo-server에서 인증 실패 Secret 마운트 누락 Secret을 argocd 네임스페이스에 배포했는지 확인

    🔒 보안 베스트 프랙티스

    1. Least Privilege 원칙 준수
    2. → Contents: Read-only 로 충분합니다.
    3. App별 역할 분리
    4. → argocd-apps-bot, ci-pipeline-bot 처럼 기능 단위 분리
    5. Private Key 관리→ Vault 또는 SSM Parameter Store 연동 추천
    6. → GitHub Secrets 또는 AWS Secrets Manager에 보관
    7. App 설치 범위 제한
    8. → 필요한 리포만 선택 설치로 영향 최소화
    9. Audit Trail 확보
    10. → GitHub App은 [bot] 계정으로 활동하므로 로그 추적이 용이합니다.

    ✅ 마무리

    GitOps 환경에서 보안과 자동화를 모두 만족시키는 가장 좋은 방법은

    Argo CD + GitHub App 인증 조합입니다.

    이 방식은 다음과 같은 이점을 제공합니다.

    • 🔐 보안 강화 – 토큰 만료·유출 걱정 없음
    • 🔁 자동화 완전화 – 수동 갱신 필요 없음
    • 🧾 감사 대응 – 봇 단위 활동 추적 가능
    • ⚙️ CI/CD 연계 용이 – GitHub Actions와 자연스러운 연동

    GitOps는 “Git에 모든 것을 위임하는 철학”입니다.

    GitHub App 인증은 그 철학을 안전하게 현실화하는 열쇠입니다.

     

    반응형

    댓글