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

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)

image 5

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.

image 6

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.

image 7

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;

syncoverride, ve action/<group/kind/action-name> sadece application kaynağı için kullanılır.

Resources: clustersprojectsapplicationsapplicationsetsrepositoriescertificatesaccountsgpgkeyslogsexec

Actions: getcreateupdatedeletesyncoverride,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