Chúng tôi buộc chặt ủy quyền ActiveDirectory cho Kubernetes bằng Keycloak

Bài báo này đã được viết để mở rộng trên hiện có, nhưng nói về các tính năng của gói với Microsoft ActiveDirectory và cũng bổ sung cho nó.

Trong bài viết này tôi sẽ cho bạn biết cách cài đặt và cấu hình:

  • Móc khóa là một dự án mã nguồn mở. Cung cấp một điểm vào duy nhất cho các ứng dụng. Hoạt động với nhiều giao thức, bao gồm LDAP và OpenID mà chúng tôi quan tâm.
  • người gác cổng keycloak - ứng dụng proxy ngược cho phép bạn tích hợp ủy quyền thông qua Keycloak.
  • Ngỏ đi - một ứng dụng tạo cấu hình cho kubectl mà bạn có thể đăng nhập và kết nối với API Kubernetes thông qua OpenID.

Cách quyền hoạt động trong Kubernetes.

Chúng tôi có thể quản lý quyền của người dùng / nhóm bằng cách sử dụng RBAC, một loạt bài viết đã được tạo về vấn đề này, tôi sẽ không nói chi tiết về vấn đề này. Vấn đề là bạn có thể sử dụng RBAC để hạn chế quyền của người dùng, nhưng Kubernetes không biết gì về người dùng. Hóa ra là chúng ta cần một cơ chế phân phối người dùng trong Kubernetes. Để làm điều này, chúng tôi sẽ thêm một nhà cung cấp vào Kuberntes OpenID, nhà cung cấp này sẽ nói rằng một người dùng như vậy thực sự tồn tại và chính Kubernetes sẽ cấp cho anh ta các quyền.

Đào tạo

  • Bạn sẽ cần một cụm Kubernetes hoặc minikube
  • active Directory
  • Tên miền:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Chứng chỉ cho tên miền hoặc chứng chỉ tự ký

Tôi sẽ không đi sâu vào cách tạo chứng chỉ tự ký, bạn cần tạo 2 chứng chỉ, đây là chứng chỉ gốc (Cơ quan cấp chứng chỉ) và ứng dụng ký tự đại diện cho miền *.example.org

Sau khi bạn nhận / cấp chứng chỉ, ứng dụng khách phải được thêm vào Kubernetes, vì điều này, chúng tôi tạo một bí mật cho nó:

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

Tiếp theo, chúng tôi sẽ sử dụng nó cho bộ điều khiển Ingress của chúng tôi.

Cài đặt Keycloak

Tôi quyết định rằng cách dễ nhất là sử dụng các giải pháp làm sẵn cho việc này, cụ thể là biểu đồ hướng dẫn.

Cài đặt kho lưu trữ và cập nhật nó:

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

Tạo tệp keycloak.yml với nội dung sau:

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

thiết lập liên kết

Tiếp theo, vào giao diện web keycloak.example.org

Bấm vào ở góc bên trái Thêm lĩnh vực

Key
Giá trị

Họ tên
Kubernetes

Tên hiển thị
Kubernetes

Vô hiệu hóa xác minh email người dùng:
Phạm vi máy khách —> Email —> Người lập bản đồ —> Email đã xác minh (Xóa)

Chúng tôi đã thiết lập liên kết để nhập người dùng từ ActiveDirectory, tôi sẽ để lại ảnh chụp màn hình bên dưới, tôi nghĩ nó sẽ rõ ràng hơn.

Liên kết người dùng —> Thêm nhà cung cấp… —> ldap

thiết lập liên kếtChúng tôi buộc chặt ủy quyền ActiveDirectory cho Kubernetes bằng Keycloak
Chúng tôi buộc chặt ủy quyền ActiveDirectory cho Kubernetes bằng Keycloak

Nếu tất cả đều ổn, thì sau khi nhấn nút Đồng bộ hóa tất cả người dùng bạn sẽ thấy một thông báo về việc nhập thành công người dùng.

Tiếp theo, chúng ta cần lập bản đồ các nhóm của mình

Liên kết người dùng -> ldap_localhost -> Người lập bản đồ -> Tạo

Tạo bản đồChúng tôi buộc chặt ủy quyền ActiveDirectory cho Kubernetes bằng Keycloak

thiết lập máy khách

Cần phải tạo một ứng dụng khách, về Keycloak, đây là một ứng dụng sẽ được anh ta ủy quyền. Tôi sẽ đánh dấu những điểm quan trọng trong ảnh chụp màn hình bằng màu đỏ.

Khách hàng -> Tạo

thiết lập máy kháchChúng tôi buộc chặt ủy quyền ActiveDirectory cho Kubernetes bằng Keycloak

Hãy tạo scoupe cho các nhóm:

Phạm vi khách hàng -> Tạo

Tạo phạm viChúng tôi buộc chặt ủy quyền ActiveDirectory cho Kubernetes bằng Keycloak

Và thiết lập một người lập bản đồ cho họ:

Phạm vi khách hàng -> nhóm -> Người lập bản đồ -> Tạo

người lập bản đồChúng tôi buộc chặt ủy quyền ActiveDirectory cho Kubernetes bằng Keycloak

Thêm ánh xạ của các nhóm của chúng tôi vào Phạm vi máy khách mặc định:

Máy khách -> kubernetes -> Phạm vi máy khách -> Phạm vi máy khách mặc định
lựa chọn các nhóm в Phạm vi khách hàng có sẵn, nhấn Thêm lựa chọn

Chúng tôi nhận được bí mật (và ghi nó vào chuỗi) mà chúng tôi sẽ sử dụng để ủy quyền trong Keycloak:

Khách hàng -> kubernetes -> Thông tin xác thực -> Bí mật
Điều này hoàn tất quá trình thiết lập, nhưng tôi đã gặp lỗi khi sau khi ủy quyền thành công, tôi nhận được lỗi 403. Báo cáo lỗi.

Sửa chữa:

Phạm vi máy khách -> vai trò -> Người lập bản đồ -> Tạo

Người vẽ bản đồChúng tôi buộc chặt ủy quyền ActiveDirectory cho Kubernetes bằng Keycloak

mã kịch bản

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

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

Định cấu hình Kubernetes

Chúng tôi cần chỉ định vị trí chứng chỉ gốc của chúng tôi từ trang web và vị trí của nhà cung cấp OIDC.
Để thực hiện việc này, hãy chỉnh sửa tệp /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
...

Cập nhật cấu hình kubeadm trong cụm:

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

Đặt auth-proxy

Bạn có thể sử dụng keycloak gatekeeper để bảo vệ ứng dụng web của mình. Ngoài thực tế là proxy ngược này sẽ ủy quyền cho người dùng trước khi hiển thị trang, nó cũng sẽ chuyển thông tin về bạn đến ứng dụng cuối trong tiêu đề. Do đó, nếu ứng dụng của bạn hỗ trợ OpenID, thì người dùng sẽ được ủy quyền ngay lập tức. Xem xét ví dụ về Kubernetes Dashboard

Cài đặt Bảng điều khiển Kubernetes


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

value_dashboard.yaml

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

Đặt quyền truy cập:

Hãy tạo một ClusterRoleBinding sẽ cấp quyền quản trị viên cụm (quản trị viên cụm ClusterRole tiêu chuẩn) cho người dùng trong nhóm 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

Cài đặt keycloak gatekeeper:


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

giá trị_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"

Sau đó, khi bạn cố gắng đi đến kubernetes-dashboard.example.org, chúng tôi sẽ được chuyển hướng đến Keycloak và trong trường hợp ủy quyền thành công, chúng tôi sẽ truy cập Trang tổng quan đã đăng nhập.

lắp đặt lối đi

Để thuận tiện, bạn có thể thêm một gangway sẽ tạo tệp cấu hình cho kubectl, với sự trợ giúp của nó, chúng tôi sẽ truy cập Kubernetes dưới quyền người dùng của mình.


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

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

Hình như thế này. Cho phép bạn tải xuống tệp cấu hình ngay lập tức và tạo tệp đó bằng một bộ lệnh:

Chúng tôi buộc chặt ủy quyền ActiveDirectory cho Kubernetes bằng Keycloak

Nguồn: www.habr.com

Thêm một lời nhận xét