מיר פאַסטן ActiveDirectory דערלויבעניש צו Kubernetes ניצן Keycloak

דער אַרטיקל איז געווען געשריבן צו יקספּאַנד אויף די שוין יגזיסטינג, אָבער רעדט וועגן די פֿעיִקייטן פון דעם פּעקל מיט Microsoft ActiveDirectory, און אויך קאַמפּלאַמאַנץ עס.

אין דעם אַרטיקל איך וועט זאָגן איר ווי צו ינסטאַלירן און קאַנפיגיער:

  • שליסלקלאָק איז אַן אָפֿן מקור פּרויעקט. וואָס גיט אַ איין פונט פון פּאָזיציע פֿאַר אַפּלאַקיישאַנז. אַרבעט מיט פילע פּראָטאָקאָלס, אַרייַנגערעכנט LDAP און OpenID וואָס מיר זענען אינטערעסירט אין.
  • שליסלקלאָקק טויער היטער - פאַרקערט פּראַקסי אַפּלאַקיישאַן אַז אַלאַוז איר צו ויסשטימען דערלויבעניש דורך Keycloak.
  • גאַנגווייַ - אַ אַפּלאַקיישאַן וואָס דזשענערייץ אַ קאַנפיגיעריישאַן פֿאַר kubectl מיט וואָס איר קענען קלאָץ אין און פאַרבינדן צו די Kubernetes API דורך OpenID.

ווי פּערמישאַנז אַרבעט אין Kubernetes.

מיר קענען פירן באַניצער / גרופּע רעכט ניצן RBAC, אַ בינטל פון אַרטיקלען האָבן שוין באשאפן וועגן דעם, איך וועל נישט וווינען אויף דעם אין דעטאַל. דער פּראָבלעם איז אַז איר קענען נוצן RBAC צו באַגרענעצן באַניצער רעכט, אָבער Kubernetes ווייסט גאָרנישט וועגן ניצערס. עס טורנס אויס אַז מיר דאַרפֿן אַ באַניצער עקספּרעס מעקאַניזאַם אין Kubernetes. צו טאָן דאָס, מיר וועלן לייגן אַ שפּייַזער צו Kuberntes OpenID, וואָס וועט זאָגן אַז אַזאַ אַ באַניצער טאַקע יגזיסץ, און Kubernetes זיך וועט געבן אים די רעכט.

טראַינינג

  • איר וועט דאַרפֿן אַ קובערנעטעס קנויל אָדער מיניקובע
  • אַקטיוו Directory
  • דאָומיינז:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • סערטיפיקאַט פֿאַר דאָומיינז אָדער זיך-געחתמעט באַווייַזן

איך וועל נישט וווינען אויף ווי צו שאַפֿן אַ זיך-געחתמעט באַווייַזן, איר דאַרפֿן צו שאַפֿן 2 סערטיפיקאַץ, דאָס איז דער וואָרצל (סערטיפיקאַט אויטאָריטעט) און ווילדקאַרד קליענט פֿאַר די *.example.org פעלד

נאָך איר באַקומען / אַרויסגעבן סערטיפיקאַץ, דער קליענט מוזן זיין מוסיף צו Kubernetes, פֿאַר דעם מיר מאַכן אַ סוד פֿאַר אים:

kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem

דערנאָך, מיר וועלן נוצן עס פֿאַר אונדזער ינגרעסס קאָנטראָללער.

Keycloak ינסטאַלירונג

איך באַשלאָסן אַז די יזיאַסט וועג איז צו נוצן פאַרטיק סאַלושאַנז פֿאַר דעם, ניימלי העלם טשאַרץ.

ינסטאַלירן די ריפּאַזאַטאָרי און דערהייַנטיקן עס:

helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update

שאַפֿן אַ keycloak.yml טעקע מיט די פאלגענדע אינהאַלט:

keycloak.yml

keycloak:
  # Имя администратора
  username: "test_admin"
  # Пароль администратор  
  password: "admin"
  # Эти флаги нужны что бы позволить загружать в Keycloak скрипты прямо через web морду. Это нам 
  понадобиться что бы починить один баг, о котором ниже.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled" 
  # Включаем ingress, указываем имя хоста и сертификат который мы предварительно сохранили в secrets
  ingress:
    enabled: true 
    path: /
    annotations:
      kubernetes.io/ingress.class: nginx
      ingress.kubernetes.io/affinity: cookie
    hosts:
      - keycloak.example.org
    tls:
    - hosts:
        - keycloak.example.org
      secretName: tls-keycloak
  # Keycloak для своей работы требует базу данных, в тестовых целях я разворачиваю Postgresql прямо в Kuberntes, в продакшене так лучше не делать!
  persistence:
    deployPostgres: true
    dbVendor: postgres

postgresql:
  postgresUser: keycloak
  postgresPassword: ""
  postgresDatabase: keycloak
  persistence:
    enabled: true

סעטאַפּ פון פעדעריישאַן

ווייַטער, גיין צו די וועב צובינד keycloak.example.org

דריקט אין די לינקס ווינקל לייג מעלוכע

שליסל
ווערט

נאָמען
kubernetes

אַרויסווייַזן נאָמען
Kubernetes

דיסייבאַל באַניצער E- בריוו וועראַפאַקיישאַן:
קליענט סקאָפּעס -> E- בריוו -> מאַפּפּערס -> Email וועריפיעד (ויסמעקן)

מיר שטעלן זיך פעדעריישאַן צו אַרייַנפיר יוזערז פֿון ActiveDirectory, איך וועל לאָזן סקרעענשאָץ אונטן, איך טראַכטן עס וועט זיין קלירער.

באַניצער פעדעריישאַן —> צוגעבן שפּייַזער... —> ldap

סעטאַפּ פון פעדעריישאַןמיר פאַסטן ActiveDirectory דערלויבעניש צו Kubernetes ניצן Keycloak
מיר פאַסטן ActiveDirectory דערלויבעניש צו Kubernetes ניצן Keycloak

אויב אַלץ איז גוט, נאָך דרינגלעך די קנעפּל סינגקראַנייז אַלע ניצערס איר וועט זען אַ אָנזאָג וועגן די מצליח אַרייַנפיר פון יוזערז.

ווייַטער מיר דאַרפֿן צו מאַפּע אונדזער גרופּעס

באַניצער פעדעריישאַן --> ldap_localhost --> מאַפּפּערס --> שאַפֿן

שאַפֿן אַ מאַפּפּערמיר פאַסטן ActiveDirectory דערלויבעניש צו Kubernetes ניצן Keycloak

קליענט סעטאַפּ

עס איז נייטיק צו שאַפֿן אַ קליענט, אין טערמינען פון Keycloak, דאָס איז אַ אַפּלאַקיישאַן וואָס וועט זיין אָטערייזד פון אים. איך וועל הויכפּונקט די וויכטיק פונקטן אין די סקרעענשאָט אין רויט.

קלייאַנץ -> שאַפֿן

קליענט סעטאַפּמיר פאַסטן ActiveDirectory דערלויבעניש צו Kubernetes ניצן Keycloak

לאָמיר מאַכן אַ סקופּ פֿאַר גרופּעס:

קליענט סקאָפּעס -> שאַפֿן

שאַפֿן פאַרנעםמיר פאַסטן ActiveDirectory דערלויבעניש צו Kubernetes ניצן Keycloak

און שטעלן אַ מאַפּפּער פֿאַר זיי:

קליענט סקאָפּעס -> גרופּעס -> מאַפּפּערס -> שאַפֿן

מאַפּפּערמיר פאַסטן ActiveDirectory דערלויבעניש צו Kubernetes ניצן Keycloak

לייג די מאַפּינג פון אונדזער גרופּעס צו די דיפאָלט קליענט סקאָפּעס:

קלייאַנץ -> kubernetes -> קליענט סקאָפּעס -> דיפאָלט קליענט סקאָפּעס
קלייַבן גרופּעס в בנימצא קליענט סקאָפּעס, דריקן לייג אויסגעקליבן

מיר באַקומען דעם סוד (און שרייַבן עס צו די פאָדעם) וואָס מיר וועלן נוצן פֿאַר דערלויבעניש אין Keycloak:

קלייאַנץ -> קובערנעטעס -> קראַדענטשאַלז -> סוד
דאָס קאַמפּליץ די סעטאַפּ, אָבער איך געהאט אַ טעות ווען, נאָך געראָטן דערלויבעניש, איך באקומען אַ טעות 403. זשוק באַריכט.

פאַרריכטן:

קליענט סקאָפּעס -> ראָלעס -> מאַפּפּערס -> שאַפֿן

מאַפּעמיר פאַסטן ActiveDirectory דערלויבעניש צו Kubernetes ניצן Keycloak

שריפט קאָד

// add current client-id to token audience
token.addAudience(token.getIssuedFor());

// return token issuer as dummy result assigned to iss again
token.getIssuer();

קאַנפיגיערינג Kubernetes

מיר דאַרפֿן צו ספּעציפיצירן ווו אונדזער וואָרצל באַווייַזן פון דעם פּלאַץ ליגט, און ווו די OIDC שפּייַזער איז ליגן.
צו טאָן דאָס, רעדאַגירן די טעקע /etc/kubernetes/manifests/kube-apiserver.yaml

kube-apiserver.yaml


...
spec:
  containers:
  - command:
    - kube-apiserver
...
    - --oidc-ca-file=/var/lib/minikube/certs/My_Root.crt
    - --oidc-client-id=kubernetes
    - --oidc-groups-claim=groups
    - --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
    - --oidc-username-claim=email
...

דערהייַנטיקן kubeadm config אין דעם קנויל:

kubeadmconfig

kubectl edit -n kube-system configmaps kubeadm-config


...
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        oidc-ca-file: /var/lib/minikube/certs/My_Root.crt
        oidc-client-id: kubernetes
        oidc-groups-claim: groups
        oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
        oidc-username-claim: email
...

באַשטעטיקן אַוט-פּראָקסי

איר קענען נוצן קייקלאָקק טויער היטער צו באַשיצן אייער וועב אַפּלאַקיישאַן. אין אַדישאַן צו דעם פאַקט אַז דער פאַרקערט פּראַקסי וועט אָטערייז דער באַניצער איידער ווייזן דעם בלאַט, עס וועט אויך פאָרן אינפֿאָרמאַציע וועגן איר צו די סוף אַפּלאַקיישאַן אין די כעדערז. אזוי, אויב דיין אַפּלאַקיישאַן שטיצט OpenID, דער באַניצער איז גלייך אָטערייזד. באַטראַכטן די ביישפּיל פון Kubernetes דאַשבאָרד

ינסטאָלינג Kubernetes דאַשבאָרד


helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml

values_dashboard.yaml

enableInsecureLogin: true
service:
  externalPort: 80
rbac:
  clusterAdminRole: true
  create: true
serviceAccount:
  create: true
  name: 'dashboard-test'

באַשטעטיקן אַקסעס רעכט:

לאָמיר שאַפֿן אַ ClusterRoleBinding וואָס וועט געבן קנויל אַדמין רעכט (נאָרמאַל ClusterRole cluster-admin) פֿאַר יוזערז אין די DataOPS גרופּע.


kubectl apply -f rbac.yaml

rbac.yaml


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dataops_group
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: DataOPS

ינסטאַלירן קייקלאָקק טויער:


helm repo add gabibbo97 https://gabibbo97.github.io/charts/
helm repo update
helm install gabibbo97/keycloak-gatekeeper --version 2.1.0 --name keycloak-gatekeeper -f values_proxy.yaml

וואַלועס_פּראָקסי.יאַמל



# Включаем ingress
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
  path: /
  hosts:
    - kubernetes-dashboard.example.org
  tls:
   - secretName: tls-keycloak
     hosts:
       - kubernetes-dashboard.example.org

# Говорим где мы будем авторизовываться у OIDC провайдера
discoveryURL: "https://keycloak.example.org/auth/realms/kubernetes"
# Имя клиента которого мы создали в Keycloak
ClientID: "kubernetes"
# Secret который я просил записать
ClientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Куда перенаправить в случае успешной авторизации. Формат <SCHEMA>://<SERVICE_NAME>.><NAMESAPCE>.<CLUSTER_NAME>
upstreamURL: "http://dashboard-kubernetes-dashboard.default.svc.cluster.local"
# Пропускаем проверку сертификата, если у нас самоподписанный
skipOpenidProviderTlsVerify: true
# Настройка прав доступа, пускаем на все path если мы в группе DataOPS
rules:
  - "uri=/*|groups=DataOPS"

נאָך וואָס, ווען איר פּרובירן צו גיין צו kubernetes-dashboard.example.org, מיר וועלן זיין רידערעקטיד צו Keycloak און אין פאַל פון געראָטן דערלויבעניש מיר באַקומען צו די דאַשבאָרד שוין לאָגד אין.

גאַנגווייַ ינסטאַלירונג

פֿאַר קאַנוויניאַנס, איר קענען לייגן אַ גאַנגווייַ וואָס וועט דזשענערייט אַ קאָנפיג טעקע פֿאַר kubectl, מיט די הילף פון וואָס מיר באַקומען אין Kubernetes אונטער אונדזער באַניצער.


helm install --name gangway stable/gangway -f values_gangway.yaml

values_gangway.yaml


gangway:
  # Произвольное имя кластера
  clusterName: "my-k8s"
  # Где у нас OIDC провайдер
  authorizeURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/auth"
  tokenURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/token"
  audience: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/userinfo"
  # Теоритически сюда можно добавить groups которые мы замапили
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Имя клиента
  clientID: "kubernetes"
  # Секрет
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Если оставить дефолтное значние, то за имя пользователя будет братья <b>Frist name</b> <b>Second name</b>, а при "sub" его логин
  usernameClaim: "sub"
  # Доменное имя или IP адресс API сервера
  apiServerURL: "https://192.168.99.111:8443"

# Включаем Ingress
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-buffer-size: "64k"
  path: /
  hosts:
  - gangway.example.org
  tls:
  - secretName: tls-keycloak
    hosts:
      - gangway.example.org

# Если используем самоподписанный сертификат, то его(открытый корневой сертификат) надо указать.
trustedCACert: |-
 -----BEGIN CERTIFICATE-----
 MIIDVzCCAj+gAwIBAgIBATANBgkqhkiG9w0BAQsFADA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwHhcNMjAwMjE0MDkxODAwWhcNMzAwMjE0MDkxODAwWjA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyP749PqqIRwNSqaK6qr0Zsi03G4PTCUlgaYTPZuMrwUVPK8xX2dWWs9MPRMOdXpgr8aSTZnVfmelIlVz4D7o2vK5rfmAe9GPcK0WbwKwXyhFU0flS9sU/g46ogHFrk03SZxQAeJhMLfEmAJm8LF5HghtGDs3t4uwGsB95o+lqPLiBvxRB8ZS3jSpYpvPgXAuZWKdZUQ3UUZf0X3hGLp7uIcIwJ7i4MduOGaQEO4cePeEJy9aDAO6qV78YmHbyh9kaW+1DL/Sgq8NmTgHGV6UOnAPKHTnMKXl6KkyUz8uLBGIdVhPxrlzG1EzXresJbJenSZ+FZqm3oLqZbw54Yp5hAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHISTOU/6BQqqnOZj+1xJfxpjiG0MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAj7HC8ObibwOLT4ZYmISJZwub9lcE0AZ5cWkPW39j/syhdbbqjK/6jy2D3WUEbR+s1Vson5Ov7JhN5In2yfZ/ByDvBnoj7CP8Q/ZMjTJgwN7j0rgmEb3CTZvnDPAz8Ijw3FP0cjxfoZ1Z0V2F44Ry7gtLJWr06+MztXVyto3aIz1/XbMQnXYlzc3c3B5yUQIy44Ce5aLRVsAjmXNqVRmDJ2QPNLicvrhnUJsO0zFWI+zZ2hc4Ge1RotCrjfOc9hQY63jZJ17myCZ6QCD7yzMzAob4vrgmkD4q7tpGrhPY/gDcE+lUNhC7DO3l0oPy2wsnT2TEn87eyWmDiTFG9zWDew==
 -----END CERTIFICATE-----

קוקט ווי דאָס. אַלאַוז איר צו מיד אראפקאפיע די קאָנפיג טעקע און דזשענערייט עס מיט אַ גאַנג פון קאַמאַנדז:

מיר פאַסטן ActiveDirectory דערלויבעניש צו Kubernetes ניצן Keycloak

מקור: www.habr.com

לייגן אַ באַמערקונג