팀 동료님이 사내 채팅에 argocd 권한 테스트에 대한 내용을 공유해주셨습니다. 공유한 글을 보다가 궁금한 점이 있어 몇 가지 테스트를 진행했습니다.
1. 테스트 목록
- readonly권한에서 argocd application sync가 되는지?
- 거부(deny)권한 우선순위
2. 테스트 환경구축
테스트를 진행하기 위해 쿠버네티스와 argocd, argocd application이 필요합니다. 저는 쿠버네티스를 kind cluster로 사용했고 argocd는 kustomize로 했고 argocd버전은 v2.6.2입니다. argocd application은 argocd 공식 예제를 사용했습니다.
테스트 환경 구축과정은 이 글 마지막 부록 챕터를 참고해주세요. 테스트 환경에는 테스트에 필요한 계정과 권한을 생성했습니다.
3. 선수지식
argocd 계정의 권한은 policy.csv파일로 관리합니다. policy.csv는 argocd-rbac-cm configmap에서 관리합니다.
argocd를 설치하면 role:readonly, role:admin 권한이 빌트인(builtin)되어 있습니다.
4. 첫번째 테스트: readonly권한
첫 번째 시나리오는 readonly권한을 갖는 계정이 argocd application을 sync할 수 있는지 확인했습니다. 테스트 환경에서는 tom계정이 readonly권한을 가지고 있습니다.
readonly권한은 argocd빌트인 권한이어서 github에서 어떻게 권한이 설정되어 있는지 확인할 수 있습니다. application get권한은 있지만 application sync권한은 없습니다.
실제로 안되는지 테스트해보겠습니다. 웹대시보드에서 readonly권한을 갖는 tom으로 로그인합니다. 비밀번호는 password1234입니다.
a-helm-guestbook application을 sync해보세요.
sync를 실패합니다. 이유는 tom 계정은 readonly권한이기 때문입니다. readonly권한은 application sync 허용설정이 안되어 있습니다.
5. 두번째 테스트: 거부권한 우선순위
두번째 시나리오는 권한거부(deny) 우선순위 테스트입니다.
팀내 권한거부 설정이 필요했던 이유는 readonly권한의 특성때문입니다. readonly권한은 모든 argocd application에 접근할 수 있습니다. 그래서 다른 팀의 application도 볼 수 있습니다. 테스트 환경에서 tom계정은 readonly권한이기 때문에 모든 application을 조회할 수 있습니다.
각 팀마다 권한을 제한해야 했기 때문에 default policy인 readonly를 제거하기로 했습니다.
권한거부로 권한을 제한하는 방법은 2가지입니다. 2가지 중 1가지를 택하여 권한설정해야 합니다.
① 화이트리스트: 필요한 권한만 허용설정
② 블랙리스트: 필요하지 않는 권한만 거부설정
argocd rbac문서에서 블랙리스트 설명은 없고 화이트리스트 설명만 있습니다. 아래 예제는 화이트리스트 권한설정 예제입니다.
문서에서 블랙리스트 설명이 없으므로 직접 테스트를 진행했습니다. group-a와 group-b 권한이 블랙리스트 방법으로 설정되어 있습니다. 차이점은 group-a는 허용권한이 최상단에 설정되어 있지만, group-b는 거부권한만 설정되어 있습니다.
권한을 설정한 후 직접 테스트해보니 group-a권한은 의도한 대로 잘 설정이 되었습니다.
하지만 group-b는 의도한대로 적용되지 않고 모든 권한이 제거되었습니다. 즉, group-b권한은 올바르게 설정되지 않았습니다.
6. 테스트 결과
두개 시나리오를 테스트한 결과 argocd 권한 설정에 대한 유의미한 결과를 얻었습니다.
① readonly권한은 argocd application sync를 할 수 없다.
② 권한거부 설정을 하기 위해 허용권한 설정이 앞에 있어야 한다. 단독으로 거부권한만 설정되어 있으면 올바르게 적용되지 않다는 것을 발견했습니다. argocd 문서에 동작원리 설명이 없어서, 정확한 동작을 이해하기 위해서 소스코드 분석을 해야 될 것 같습니다.
7. 부록 테스트 환경 자동화스크립트
7.1 자동화 스크립트 github repo
테스트 환경 자동화 스크립트는 github에 공개되어 있습니다.
- github repo 주소: https://github.com/sungwook-practice/argocd-rbac-test
7.2 구조
자동화 스크립트는 makefile을 사용했습니다.
7.3 스크립트 실행
make up명령어는 argocd를 설치하고 argocd application을 생성합니다. 만약, 쿠버네티스가 없다면 make install-kindcluster명령어로 kind cluster를 생성할 수 있습니다.
# kind명령어와 docker가 설치되어 있어야 합니다.
# (옵션) kind cluster 생성. 쿠버네티스가 설치되어 있으면 생략해도 됩니다.
make install-kindcluster
# argocd 설치, argocd application 생성
# 설치한 argocd는 30950, 30951포트를 nodeport로 사용합니다.
make up
7.4 argocd 웹 대시보드 접속
argocd 웹대시보드는 nodeport(30951포트)로 접속할 수 있습니다.
https://127.0.0.1:30951
admin 계정 비밀번호는 쿠버네티스 secret에 저장되어 있습니다.
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
7.5 계정 비밀번호 설정
자동화 스크립트는 alice, bob, tom계정을 생성합니다. 세 계정은 비밀번호가 설정이 안되어 있어 수동으로 비밀번호를 설정합니다. 아래 스크립트는 세 계정 비밀번호를 password1234로 변경합니다.
ADMIN_PASSWORD=$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)
NEW_PASSWORD=password1234
argocd login 127.0.0.1:30951 --insecure --username admin --password $ADMIN_PASSWORD
argocd account update-password --account alice --current-password $ADMIN_PASSWORD --new-password $NEW_PASSWORD
argocd account update-password --account bob --current-password $ADMIN_PASSWORD --new-password $NEW_PASSWORD
argocd account update-password --account tom --current-password $ADMIN_PASSWORD --new-password $NEW_PASSWORD
7.6 권한 목록
자동화 스크립트는 group-a, group-b이름을 갖는 argocd권한을 생성합니다. 그리고 argocd 계정과 권한을 매핑시킵니다. alice는 group-a권한을 갖고 bob은 group-b권한을 갖습니다. 권한이 설정 안된 tom계정은 default policy로 설정된 readonly권한을 갖습니다.
'전공영역 공부 기록' 카테고리의 다른 글
쿠버네티스 pod running과 ready 차이 (0) | 2023.08.13 |
---|---|
Dockerfile ENTRYPOINT에 arg를 사용가능한지 테스트 (0) | 2023.08.08 |
NLB를 장애상황 퀴즈 (1) | 2023.08.06 |
DNS 이해 (1) | 2023.07.21 |
쿠버네티스 kubectl 유틸리티 도구 (0) | 2023.07.08 |