---
title: "Dex ile Argo CD LDAP Entegrasyonu - 1 Adımda Argo CD Kurulumu - Detaylı RBAC Configuration"
description: "Bu yazımda Argo CD'nin k8s cluster'a 1 adımda kurulumundan, Dex ile beraber ldap entegrasyonundan ve yetkilendirmeden bahsettim."
image: "https://sezer.in/wp-content/uploads/2023/04/argocd-dex.webp"
url: "https://sezer.in/argo-cd-dex-ldap-entegrasyonu/"
date: "2023-04-18T14:11:33+03:00"
updated: "2023-04-18T17:01:12+03:00"
author: "Sezer Şanlıkan"
lang: "tr"
source: "https://sezer.in/argo-cd-dex-ldap-entegrasyonu/"
---

# Dex ile Argo CD LDAP Entegrasyonu - 1 Adımda Argo CD Kurulumu - Detaylı RBAC Configuration

## 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](https://argoproj.github.io/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](https://dexidp.io/docs/getting-started/), 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 Kurulumu](https://sezer.in/argo-cd-kurulumu/)ndan 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](https://sezer.in/wp-content/uploads/2023/04/image-4-1024x269.png)

## 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)

![](https://sezer.in/wp-content/uploads/2023/04/image-5-1024x732.png)

## 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.

![](https://sezer.in/wp-content/uploads/2023/04/image-6-1024x732.png)

## 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](https://argo-cd.readthedocs.io/en/stable/operator-manual/rbac/) 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.

![](https://sezer.in/wp-content/uploads/2023/04/image-7-1024x732.png)

### 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`, ve `action/<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
```
