İçerik
Argo CD Nedir? Dex Nedir? Neden Dex Kullanıyoruz?
Argo CD, bir CI/CD (Sürekli Entegrasyon / Sürekli Dağıtım) aracıdır ve Kubernetes ortamında uygulamaların dağıtımını yönetmek için kullanılır. Dex ise, bir kimlik doğrulama ve yetkilendirme sağlayıcısıdır ve OpenID Connect protokolünü kullanarak kullanıcıları doğrular ve tokenları yönetir.
Argo CD Dex entegrasyonu, kullanıcıların Argo CD‘ye erişimi için kimlik doğrulama yapmalarını sağlar. Bu entegrasyon, Argo CD’ye kimlik doğrulaması yapmak için LDAP, GitHub, Google, Okta ve diğer SSO sağlayıcıları gibi farklı kaynaklarla çalışabilir. Dex, bu entegrasyonun anahtar bileşenidir ve Argo CD kullanıcıları için güvenli bir kimlik doğrulama yöntemi sağlar. Ben bu yazımda Argo CD’nin Kubernetes Cluster’a Kurulumundan ve Dex için LDAP konfigürasyonuna değineceğim. Son aşamada ise gruplara özel yetkilendirmeleri olan RBAC tarafına bakacağız.
Argo CD Kurulumu
Argo CD kurulumunu YAML Manifest ile yapalım
Mevcut bir k8s Cluster’a sahip olduğunu düşünerek anlatım yapacağım.
Öncelikle bir namespace oluşturalım.
kubectl create ns argocd
Daha sonra argo manifestlerini argocd namespace’imizde ayağa kaldıralım.
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Podları aşağıdaki komutla kontrol edebiliriz.
kubectl get pods -n argocd
Çıktı aşağıdaki gibi olacaktır.
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 5m
argocd-applicationset-controller-6ccb885cc-8fmwz 1/1 Running 0 5m
argocd-dex-server-547dfc6dc9-k8dc7 1/1 Running 0 5m
argocd-notifications-controller-77bffb68cc-t56mk 1/1 Running 0 5m
argocd-redis-76dff756d7-t9m8x 1/1 Running 0 5m
argocd-repo-server-69c577765c-jgzxv 1/1 Running 0 5m
argocd-server-5c67dbfcbb-sv8r5 1/1 Running 0 5m
Argo CD’yi Ingress ile yayına açalım
Uygulamamızı Ingress ile dışarı açmak için aşağıdaki yaml dosyasını “argocd-ingress.yaml” olarak kaydedin.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-server-http
namespace: argocd
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
rules:
- host: argocd.sezer.test
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
name: http
Daha sonra Ingress’i ayağa kaldıralım.
kubectl apply -f argo-ingress.yaml
Uygulamamıza Ingress üzerinde verdiğimiz hostname ile erişebiliriz. (DNS kaydı için hosts dosyanıza eklemek yapabilirsiniz)
Argo CD SSO Login LDAP Ayarları
Aşağıdaki manifest dosyasını kendinize göre yapılandırdıktan sonra “patch-dex.yaml” olarak kaydedin.
apiVersion: v1
data:
admin.enabled: "false"
application.instanceLabelKey: argocd.argoproj.io/instance
exec.enabled: "false"
server.rbac.log.enforce.enable: "false"
url: https://argocd.sezer.test
dex.config: |-
logger:
level: debug
connectors:
- type: ldap
name: LDAP
id: ldap
config:
host: "10.0.0.2:389"
insecureNoSSL: true
insecureSkipVerify: true
bindDN: "$dex.ldap.bindDN"
bindPW: "$dex.ldap.bindPW"
usernamePrompt: Username
userSearch:
baseDN: "DC=SEZER,DC=local"
filter: ""
username: sAMAccountName
idAttr: distinguishedName
emailAttr: mail
nameAttr: displayName
groupSearch:
baseDN: "DC=SEZER,DC=local"
filter: ""
userAttr: distinguishedName
groupAttr: member
nameAttr: name
Oluşturduğumuz YAML dosyasını argocd-cm ‘ye patch edelim.
kubectl -n argocd patch configmaps argocd-cm --patch "$(cat patch-dex.yaml)"
Ardından YAML dosyamızdaki bindDN ve bindPW kısımlarını secret olarak ekleyelim.
kubectl -n argocd patch secrets argocd-secret --patch "{\"data\":{\"dex.ldap.bindPW\":\"$(echo PASSWORD | base64)\"}}"
kubectl -n argocd patch secrets argocd-secret --patch "{\"data\":{\"dex.ldap.bindDN\":\"$(echo SEZER\\argo.management | base64)\"}}"
Bu işlemleri tamamladıktan sonra argo-server ve argo-dex podlarını silip deployment’ın tekrar oluşturmasını bekleyeceğiz.
kubectl get pods -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 5m
argocd-applicationset-controller-6ccb885cc-8fmwz 1/1 Running 0 5m
argocd-dex-server-547dfc6dc9-k8dc7 1/1 Running 0 5m
argocd-notifications-controller-77bffb68cc-t56mk 1/1 Running 0 5m
argocd-redis-76dff756d7-t9m8x 1/1 Running 0 5m
argocd-repo-server-69c577765c-jgzxv 1/1 Running 0 5m
argocd-server-5c67dbfcbb-sv8r5 1/1 Running 0 5m
kubectl delete pods argocd-dex-server-547dfc6dc9-k8dc7 argocd-server-5c67dbfcbb-sv8r5 -n argocd
pod "argocd-dex-server-547dfc6dc9-k8dc7" deleted
pod "argocd-server-5c67dbfcbb-sv8r5" deleted
Podlar tekrar running duruma geçtikten sonra tekrardan Argo üzerinden arayüze girebiliriz.
LDAP için RBAC Konfigürasyonu
Başarılı bir şekilde LDAP entegrasyonunu yaptıktan sonra, kullanıcı veya grup bazlı yetkilendirmeleri yapmak için RBAC konfigürasyonu yapmamız gerekiyor. Bununla alakalı resmi dokümantasyona bu bağlantıdan ulaşabilirsiniz.
Aşağıdaki configmap YAML dosyasını “argocd-cm.yaml” olarak kaydedin.
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
namespace: argocd
data:
policy.default: role:none
scopes: '[groups, email]'
policy.csv: |
p, role:none, *, *, */*, deny
g, SEZER, role:readonly
Ardından YAML dosyasını ayağa kaldırın.
kubectl apply -f argocd-cm.yaml
Yukarıda “g, SEZER, role:readonly” kısmında SEZER grubuna sadece okuma yetkisi tanımladık. Diğer tüm roller için her şeyi deny yaptık.
Giriş yaptıktan sonra örneğin bir uygulama oluşturmak istediğimde başarılı bir şekilde sağ altta yetkimin olmadığı uyarısını görebiliyorum.
RBAC İzin Yapısı
Uygulamaya özel izinler hariç tüm durumlarda aşağıdaki yapı kullanılabilir.
p, <role/user/group>, <resource>, <action>, <object>
AppProject özelinde izinlerde aşağıdaki yapı kullanılabilir
Applications, applicationsets, logs, and exec
Actions ve resource için kullanılabilecek parametreler aşağıdaki gibidir;
sync
,override
, veaction/<group/kind/action-name>
sadece application kaynağı için kullanılır.
Resources: clusters
, projects
, applications
, applicationsets
, repositories
, certificates
, accounts
, gpgkeys
, logs
, exec
Actions: get
, create
, update
, delete
, sync
, override
,action/<group/kind/action-name>
Uygulama belirtecekseniz aşağıdaki yapıda kullanmanız gerekir.
<project-name>/<application-name>
Örnekler
Örnek – 1
Şimdi biraz daha örnek yaparak RBAC konusunu pekiştirelim.
Örneğin TEST adında bir role oluşturalım ve bu rol sadece SEZER projesindeki uygulamaları görebilsin ve bu rolü ldap üzerindeki TESTGRUP adlı gruba uygulayalım.
p, role:none, *, *, */*, deny p, role:TEST, applications, get, SEZER/*, allow g, TESTGRUP, role:TEST
Yukarıdaki örnekten yola çıkarak kendi rollerinizi oluşturabilir ve bu rolleri ldap üzerindeki gruplara atayabilirsiniz.
Örnek – 2
p, role:org-admin, applications, *, */*, allow p, role:org-admin, clusters, get, *, allow p, role:org-admin, repositories, get, *, allow p, role:org-admin, repositories, create, *, allow p, role:org-admin, repositories, update, *, allow p, role:org-admin, repositories, delete, *, allow p, role:org-admin, logs, get, *, allow p, role:org-admin, exec, create, */*, allow g, your-github-org:your-team, role:org-admin
Örnek – 3
p, role:staging-db-admins, applications, create, staging-db-admins/*, allow p, role:staging-db-admins, applications, delete, staging-db-admins/*, allow p, role:staging-db-admins, applications, get, staging-db-admins/*, allow p, role:staging-db-admins, applications, override, staging-db-admins/*, allow p, role:staging-db-admins, applications, sync, staging-db-admins/*, allow p, role:staging-db-admins, applications, update, staging-db-admins/*, allow p, role:staging-db-admins, logs, get, staging-db-admins/*, allow p, role:staging-db-admins, exec, create, staging-db-admins/*, allow p, role:staging-db-admins, projects, get, staging-db-admins, allow g, db-admins, role:staging-db-admins