최신글

ArgoCD private repo 연동: Github App이 PAT보다 안전한 이유

반응형

이 글은 PAT 대신 Github App으로 연동하는 방법과, 왜 Github App이 PAT보다 덜 위험한지 그 원리를 정리합니다. 원리를 알면 “Github App을 쓰면 안전하다”는 말을 그대로 믿지 않고, 무엇이 안전해지고 무엇이 여전히 위험한지 직접 판단할 수 있습니다.

ArgoCD에서 private github repo를 연동하려면 보통 Github PAT(Personal Access Token)를 씁니다. 그런데 PAT는 한 번 발급하면 만료가 없는 영구 자격증명이라, 유출되면 그대로 보안사고로 이어집니다. 영구자격증명이 아닌 임시자격증명을 사용하는 Github APP을 ArgoCD에도 사용할 수 있습니다.

 

Github App은 무엇으로 repo에 접근하는가

PAT는 github user에 묶인 영구 토큰입니다. 토큰 하나로 그 user가 가진 모든 권한에 접근할 수 있고, 만료 시점을 따로 지정하지 않으면 계속 살아 있습니다.

 

Github App은 접근 방식이 다릅니다. App은 private key를 가지고 있고, github repo에 직접 접근할 때는 이 private key로 만든 임시 access token을 씁니다. 흐름은 다음과 같습니다.

  1. Github App이 private key로 JWT(JSON Web Token)에 서명합니다. JWT에는 App ID와 발급 시각이 담깁니다.
  2. 이 JWT를 github에 보내 installation access token을 받습니다.
  3. 이 installation access token으로 repo에 접근합니다.

 

Github App이 PAT보다 안전한가

먼저 분명히 할 점은, Github App도 완전히 안전하지 않습니다. App이 임시 토큰을 받기 위해 쓰는 private key가 유출되면, 공격자가 그 key로 JWT를 만들어 똑같이 임시 토큰을 받을 수 있습니다. 결국 보호해야 할 자격증명이 PAT에서 private key로 바뀌었을 뿐입니다.

 

그래도 Github App이 PAT보다 덜 위험한 이유는 세 가지라고 생각합니다.
- 권한 범위가 다릅니다. PAT는 github user의 권한을 따라가지만, Github App은 App 자체에 부여한 권한만 가집니다. 아래 설정처럼 Contents를 Read only로 묶으면, key가 유출돼도 공격자가 할 수 있는 일이 읽기로 제한됩니다.
- revoke가 가능합니다. installation access token은 만료 전이라도 철회할 수 있고, App 자체를 정지시키면 이후 토큰 발급을 막을 수 있습니다.
- IP 접근 제한을 걸 수 있습니다. private key를 쓸 수 있는 server IP를 제한하면, key가 유출돼도 허용된 IP가 아니면 토큰을 받지 못합니다.

 

ArgoCD Github App 설정 과정

ArgoCD에서 Github App으로 repo를 연동하려면 두 가지가 필요합니다.
1. Github App 생성
2. Github App의 private key

 

1. Github App 생성

Github App은 개인 계정 profile 또는 Github Org에서 생성할 수 있습니다. 이 글은 소개가 목적이라 개인 계정 profile을 예제로 썼습니다.

  1. github profile 방문: https://github.com/settings/profile
  2. 왼쪽 메뉴에서 Developer settings 클릭
  3. Github Apps 생성

 

Homepage URL과 Callback URL에는 ArgoCD 주소를 입력합니다.

 

permission에서 Contents를 Read only로 설정합니다. ArgoCD는 repo의 manifest를 읽기만 하면 되므로, 쓰기 권한을 주지 않습니다. 앞서 설명한 대로, 권한을 좁히는 것이 Github App을 PAT보다 안전하게 만드는 첫 번째 요소입니다.

 

2. private key 생성과 IP 접근 제한

ArgoCD가 Github App을 쓰려면 private key 등록이 필요합니다. 이 private key는 App이 github에 임시 access token을 요청할 때 JWT에 서명하는 데 쓰입니다.

 

private key는 Github App 화면의 Generate a private key 기능으로 만듭니다. private key가 유출되면 PAT와 마찬가지로 보안사고가 나므로, ArgoCD server만 private key를 쓸 수 있도록 server IP를 제한합니다.

 

3. Github repo에 Github App 연동

App을 만들었으면 접근할 repo를 선택해 설치(install)합니다. 이 글은 개인 계정 profile을 예제로 썼습니다.

  1. github profile 방문: https://github.com/settings/profile
  2. 왼쪽 메뉴에서 Applications 클릭
  3. 생성한 Github App의 Configure 버튼 클릭

 

4. Review request 버튼 클릭

 

5. 연동할 github repo 선택

 

4. ArgoCD에서 Github App으로 repo 등록

ArgoCD UI에서 등록하거나 kubernetes secret으로 등록할 수 있습니다. 아래는 secret으로 등록하는 예시입니다. PAT 대신 githubAppPrivateKey를 넣는 점이 핵심이며, ArgoCD는 이 key로 앞서 설명한 JWT 서명과 임시 토큰 발급을 내부에서 처리합니다.

apiVersion: v1
kind: Secret
metadata:
  name: github-app-repo-creds
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repo-creds
    app.kubernetes.io/name: github-app-repo-creds
    app.kubernetes.io/part-of: pull-request-generator-demo
type: Opaque
stringData:
  type: git
  url: https://github.com//.git
  githubAppID: "<GITHUB_APP_ID>"                          # App 화면 상단의 App ID
  githubAppInstallationID: "<GITHUB_APP_INSTALLATION_ID>" # repo에 install할 때 부여되는 ID
  githubAppPrivateKey: |
    -----BEGIN PRIVATE KEY-----
    <GITHUB_APP_PRIVATE_KEY>
    -----END PRIVATE KEY-----

 

참고자료

반응형