RBAC 功能可以限制對 Argo CD 資源的存取。Argo CD 本身設計沒有使用者管理系統,只有一個內建的 admin 超級使用者。另外 RBAC 需要搭配 SSO 或是地端使用者設定,這樣才能使得使用者綁定到 RBAC 角色。可以定義 RBAC 配置的兩個主要組件:
當使用這被 Argo CD 通過身分驗證時將被賦予 policy.default 中指定的角色。對於匿名存取即無須被驗證,對於是否可匿名存取可針對參數 users.anonymous.enabled 進行設定。當然 policy.default 絕對不是最佳實踐,而是要而外設計角色並附加於 policy.default 上。
Argo CD 有兩個預先定義的角色
role:readonly 對所有資源的存取權限是唯讀role:admin- 不受限制存取所有資源而 RBAC 配置允許定義角色(role)、群組(group)和 Policy。
group 允許將經過身份驗證的使用者或群組指派給內部角色結構:
g, <user/group>, <role>
<user/group> 被指派角色的實體。可以是本機的使用這或是 SSO 進行身分驗證的使用者。
<role> 實體被指派的內部角色。
結構:
p, <role/user/group>, <resource>, <action>, <object>, <effect>
<role/user/group> 指派權限至某個實體<resource> 要操作的資源類型<action> 對資源執行的操作<object> 表示資源的標識符,格式依資源類型而定<effect> 決定是否允許或拒絕對目標物件的存取,值為 allow 或 deny
下表總結了所有可能的資源以及對每個資源有效的操作。
| Resource Action | get | create | update | delete | sync | action | override | invoke |
|---|---|---|---|---|---|---|---|---|
| applications | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| applicationsets | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| clusters | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| projects | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| repositories | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| accounts | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| certificates | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| gpgkeys | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| logs | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| exec | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| extensions | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
先以官方的範例來看
p, example-user, applications, delete/*/Pod/*, default/prod-app, allow
p, example-user, applications, update/*, default/prod-app, allow
p, example-user, applications, delete, default/prod-app, deny
p, example-user, applications, delete/*/Pod/*, default/prod-app, allow
p, my-local-user, applications, sync, my-project/*, allow
g, my-local-user, role:admin
<action> 欄位可以是 <action>/<group>/<kind>/<ns>/<name> 的設計。
前面的實驗有建置過下面的資源,接下來會基於此資源進行相關的 RBAC 設定。
# /developer/team-a/project/project.yaml
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: team-a-project
namespace: argo
# Finalizer that ensures that project is not deleted until it is not referenced by any application
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
description: Project for team-a
sourceRepos:
- https://github.com/CCH0124/K8s-with-quarkus.git
destinations:
- namespace: team-a
name: stage-cluster
- namespace: team-a
name: k3d-dev-cluster
clusterResourceWhitelist:
- group: ''
kind: Namespace
namespaceResourceWhitelist:
- group: 'apps'
kind: Deployment
- group: 'apps'
kind: ReplicaSet
- group: '*'
kind: ServiceAccount
- group: '*'
kind: Service
- group: '*'
kind: Pod
- group: 'batch'
kind: Job
permitOnlyProjectScopedClusters: false
以下也許是地端使用者整合的場景
對於建置的帳號,該帳號可能有兩種類型的權限
apiKey 允許產生用於存取 API 的令牌login 允許從 UI 登入建立使用者帳號格式為 accounts.<username>: <capabilities>。
現在假設有 dev、pm 和 op 三種角色,每個角色都有自己對應的權限。
視為開發者,對於 team-a-project 下的 Application 資源可以進行任何操作,對於 AppProject、repositories 和 clusters 只有讀的權限,而 applicationsets 將被拒絕任何操作。
視為專案管理者,對任何訊應當都為讀取權限,像是 applications、projects 和 repositories。而 clusters 和 applicationsets 將被拒絕任何操作。
視為維運者,其權限相比 dev 或 pm 來的大因此權限基本上都放行像是 exec 和 accounts 等資源。
Argo CD 使用 Helm Chart 佈署,因此可以如下進行 User 和 RBAC 設定部分。
configs:
cm:
...
exec.enabled: true
admin.enabled: true
exec.shells: "bash,sh"
accounts.devuser: login
accounts.pmuser: login
accounts.opsuser: login
accounts.devuser1: login
accounts.devuser1.enabled: "false"
rbac:
create: true
policy.default: role:readonly
policy.csv: |
p, role:dev, applications, *, team-a-project/*, allow
p, role:dev, projects, get, team-a-project, allow
p, role:dev, repositories, get, *, allow
p, role:dev, clusters, get, *, allow
g, devuser, role:dev
p, role:pm, applications, get, */*, allow
p, role:pm, projects, get, *, allow
p, role:pm, repositories, get, *, allow
p, role:pm, clusters, get, *, allow
g, pmuser, role:pm
p, role:op, applications, *, */*, allow
p, role:op, projects, *, *, allow
p, role:op, repositories, *, *, allow
p, role:op, clusters, *, *, allow
p, role:op, accounts, *, *, allow
p, role:op, certificates, *, *, allow
p, role:op, gpgkeys, *, *, allow
p, role:op, exec, create, */*, allow
g, opsuser, role:op
比較特別的配置是 exec.enabled 預設是關閉,其用於可以針對 Pod 資源進行遠端連線操作。這邊將設定為 true 且只有 opuser 能夠操做。
基本上在 configs.cm 下透過 accounts.<username>: <capabilities> 格式設定使用者帳號後 Argo CD 會建置帳號,如下透過 argocd account list 可以列出當前有的使用者帳號。
$ argocd account list
NAME ENABLED CAPABILITIES
admin true login
devuser true login
devuser1 false login
opsuser true login
pmuser true login
這些建置的帳號預設沒有密碼,也無法正常登入因此藉由以下指令格式給予密碼。
argocd account update-password --account <new-username> --new-password <new-password>
如果是令牌,可以使用以下格式
argocd account generate-token --account <username>
devuser1 是無法被登入可以想像是離開專案的開發者,因此其登入帳號被進行控管。
accounts.devuser1: login
accounts.devuser1.enabled: "false"
從平台進行登入時理當會看到此訊息 Account devuser1 is disabled。
使用 CLI 方式使用 devuser 登入
argocd login argo.cch.com:8443 --grpc-web-root-path argocd --username devuser
對於 devuser1 其權限如下
p, role:dev, applications, *, team-a-project/*, allow
p, role:dev, projects, get, team-a-project, allow
p, role:dev, repositories, get, *, allow
p, role:dev, clusters, get, *, allow
g, devuser, role:dev
對於 team-a-project AppProject 資源下的 Application 資源都可以進行操作但被限制於 team-a-project 下;但對於 projects、repositories、clusters 都只能獲取,不能夠新增或更新。這邊對於應用程式佈署我們限制於 team-a-project 同時只有 dev/stage 叢集能佈署,只要是其它叢集都會被拒絕。而 exec 此功能也是被拒絕,因此在平台上是無法進行遠端操作。
使用 devuser 嘗試對 opuser 管理的 sre-project 資源下進行 sync 操作,會出現 PermissionDenied 訊息。
$ argocd app sync argo/sre-app
FATA[0000] rpc error: code = PermissionDenied desc = permission denied: applications, sync, sre-project/sre-app, sub: devuser, iat: 2024-08-11T04:49:48Z
同理對 repositories 進行新增時也會有權限問題。
$ argocd repo add --name app https://github.com/CCH0124/K8s-with-quarkus.git --type git --project default
FATA[0000] rpc error: code = PermissionDenied desc = permission denied: repositories, create, default/https://github.com/CCH0124/K8s-with-quarkus.git, sub: devuser, iat: 2024-08-11T04:49:48Z
但對 team-a-project 下的 simple-app Application 資源執行 sync 是放行,在權限設計上是允許。
$ argocd app sync argo/simple-app
當然最快驗證可以使用 can-i 方式類似於 Kubernetes kubectl auth can-i。
$ argocd account can-i sync applications 'team-a-project/*'
yes
$ argocd account can-i sync applications 'sre-project/*'
no
$ argocd account can-i delete applications 'sre-project/*'
no
$ argocd account can-i delete clusters '*'
no
$ argocd account can-i get clusters '*'
yes
$ argocd account can-i get exec 'team-a-project/*'
no
$ argocd account can-i create exec 'sre-project/*'
no
$ argocd account can-i create exec 'team-a-project/*'
no
pmuser 部分讀者可以嘗試驗證看看,對於 pmuser 可以讀取資源,但基本沒權限建立像是 AppProject、repositories、clusters 等資源。
接著針對 opsuser 進行驗證。
登出 devuser 並使用 opsuser 登入。
argocd logout argo.cch.com:8443 --grpc-web-root-path argocd
argocd login argo.cch.com:8443 --grpc-web-root-path argocd --username opsuser
對於 opsuser 可以對 account 資源進行變更密碼等操作;exec 可以對資源進行遠端,剩下資源也可以進行刪除、建立或更新等操作。
$ argocd account can-i sync applications 'team-a-project/*'
yes
$ argocd account can-i sync applications 'sre-project/*'
yes
$ argocd account can-i delete applications 'team-a-project/*'
yes
$ argocd account can-i create clusters '*'
yes
$ argocd account update-password --account pmuser --new-password a1234567890
*** Enter password of currently logged in user (opsuser):
Password updated
$ argocd account can-i create exec 'team-a-project/*'
yes
$ argocd account can-i create exec 'sre-project/*'
yes
Argo CD 可以讓登入功能串接第三方 SSO 平台或是對於簡單團隊可以使用地端簡易配置 RBAC 方式進行使用者管理。對於本篇分享是對於地端配置進行簡易的設計,並理解 Argo CD 平台 RBAC 的結構以及可以如何進行細粒度上的資源控管。對於第三方 SSO 平台整合會相較於地端管理方式前期配置較複雜,這部分可以參考官方使用者管理。
Argo CD 本身也可以針對登入失敗的政策進行配置像是,這些設定都是正向且是有好的配置
最後可以從本篇文章知道如何使用 can-i 對 RBAC 進行驗證。