Мо иҷозати ActiveDirectory-ро ба Kubernetes бо истифода аз Keycloak мустаҳкам мекунем

Ин мақола барои васеъ кардани он навишта шудааст мавҷуд аст, балки дар бораи хусусиятҳои баста бо Microsoft ActiveDirectory сӯҳбат мекунад ва инчунин онро пурра мекунад.

Дар ин мақола ман ба шумо мегӯям, ки чӣ тавр насб ва танзим кунед:

  • клавиатура лоиҳаи кушодаасос мебошад. Ки як нуқтаи вурудро барои барномаҳо таъмин мекунад. Бо бисёр протоколҳо кор мекунад, аз ҷумла LDAP ва OpenID, ки мо ба онҳо таваҷҷӯҳ дорем.
  • дарвозабони калид - замимаи прокси баръакс, ки ба шумо имкон медиҳад авторизатсияро тавассути Keycloak ворид кунед.
  • гузаргоҳ - барномае, ки конфигуратсияро барои kubectl тавлид мекунад, ки шумо метавонед тавассути OpenID ворид шавед ва ба API Kubernetes пайваст шавед.

Чӣ гуна иҷозатҳо дар Кубернетес кор мекунанд.

Мо метавонем ҳуқуқҳои корбар/гурӯҳро бо истифода аз RBAC идора кунем, дар ин бора як қатор мақолаҳо аллакай офарида шудаанд, ман дар ин бора муфассал таваққуф намекунам. Мушкилот дар он аст, ки шумо метавонед RBAC-ро барои маҳдуд кардани ҳуқуқҳои корбар истифода баред, аммо Kubernetes дар бораи корбарон чизе намедонад. Маълум мешавад, ки ба мо механизми интиқоли корбар дар Kubernetes лозим аст. Барои ин, мо ба Kuberntes OpenID провайдер илова мекунем, ки мегӯяд, ки чунин корбар воқеан вуҷуд дорад ва худи Кубернетес ба ӯ ҳуқуқ медиҳад.

Омодагӣ

  • Ба шумо кластери Kubernetes ё minikube лозим аст
  • Рӯйхати фаъол
  • Доменҳо:
    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

Минбаъд, мо онро барои контролери Ingress-и худ истифода хоҳем кард.

Насби клавиатура

Ман қарор додам, ки роҳи осонтарини истифодаи ҳалли омода барои ин аст, яъне диаграммаҳои чарх.

Анборро насб кунед ва онро навсозӣ кунед:

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

Дар кунҷи чап клик кунед Майдон илова кунед

калид
арзиши

ном
кубернетҳо

Бозтоби ном
Кубернитель

Тафтиши почтаи электронии корбарро хомӯш кунед:
Доираи муштарӣ —> Почтаи электронӣ —> Харитасозон —> Почтаи электронӣ тасдиқ карда шудааст (Нест кардан)

Мо федератсияро барои ворид кардани корбарон аз 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 истифода хоҳем кард:

Мизоҷон —> kubernetes —> Маълумотнома —> Сирри
Ин танзимро ба анҷом мерасонад, аммо ман хато кардам, вақте ки пас аз иҷозати бомуваффақият ман хатогии 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 дар кластер:

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

Танзими аут-прокси

Шумо метавонед дарвозабони keycloak -ро барои муҳофизати барномаи веби худ истифода баред. Илова бар он, ки ин прокси баръакс ба корбар пеш аз нишон додани саҳифа иҷозат медиҳад, он инчунин маълумотро дар бораи шумо ба барномаи ниҳоӣ дар сарлавҳаҳо интиқол медиҳад. Ҳамин тариқ, агар барномаи шумо 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 эҷод кунем, ки барои корбарони гурӯҳи DataOPS ҳуқуқи маъмури кластерро (ClusterRole кластер-администратори стандартӣ) медиҳад.


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

gatekeeper keycloak насб кунед:


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

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 мустаҳкам мекунем

Манбаъ: will.com

Илова Эзоҳ