Chúng tôi gắn chặt ủy quyền LDAP vào Kubernetes

Chúng tôi gắn chặt ủy quyền LDAP vào Kubernetes

Hướng dẫn nhỏ về cách sử dụng Keycloak để kết nối Kubernetes với máy chủ LDAP của bạn và thiết lập nhập người dùng và nhóm. Điều này sẽ cho phép bạn thiết lập RBAC cho người dùng của mình và sử dụng proxy xác thực để bảo vệ Bảng điều khiển Kubernetes cũng như các ứng dụng khác không biết cách tự ủy quyền.

Cài đặt Keycloak

Giả sử bạn đã có máy chủ LDAP. Nó có thể là Active Directory, FreeIPA, OpenLDAP hoặc bất cứ thứ gì. Nếu bạn không có máy chủ LDAP thì về nguyên tắc bạn có thể tạo người dùng trực tiếp trong giao diện Keycloak hoặc sử dụng các nhà cung cấp oidc công khai (Google, Github, Gitlab), kết quả sẽ gần như giống nhau.

Trước hết, hãy cài đặt chính Keycloak, quá trình cài đặt có thể được thực hiện riêng biệt hoặc trực tiếp đến cụm Kubernetes, theo quy định, nếu bạn có nhiều cụm Kubernetes thì việc cài đặt riêng sẽ dễ dàng hơn. Mặt khác, bạn luôn có thể sử dụng sơ đồ chỉ huy chính thức và cài đặt nó trực tiếp vào cụm của bạn.

Để lưu trữ dữ liệu Keycloak, bạn sẽ cần một cơ sở dữ liệu. Mặc định là h2 (tất cả dữ liệu được lưu trữ cục bộ), nhưng cũng có thể sử dụng postgres, mysql hoặc mariadb.
Nếu bạn vẫn quyết định cài đặt Keycloak riêng biệt, bạn có thể tìm thêm hướng dẫn chi tiết trong tài liệu chính thức.

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

Trước hết, hãy tạo ra một vương quốc mới. Vương quốc là không gian của ứng dụng của chúng tôi. Mỗi ứng dụng có thể có lĩnh vực riêng với người dùng và cài đặt ủy quyền khác nhau. Vương quốc chính được chính Keycloak sử dụng và sử dụng nó cho bất kỳ mục đích nào khác là sai.

Nhấp vào đây Thêm lĩnh vực

Tùy chọn
Giá trị

Họ tên
kubernetes

Tên hiển thị
Kubernetes

Tên hiển thị HTML
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >

Kubernetes theo mặc định sẽ kiểm tra xem email của người dùng có được xác nhận hay không. Vì chúng tôi đang sử dụng máy chủ LDAP của riêng mình nên việc kiểm tra này hầu như sẽ luôn trả về false. Hãy tắt tính năng thể hiện cài đặt này trong Kubernetes:

phạm vi khách hàng -> E-mail -> Người lập bản đồ -> email đã kích hoạt (Xóa bỏ)

Bây giờ hãy thành lập liên đoàn, để làm được điều này, chúng ta đi đến:

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

Dưới đây là thiết lập ví dụ cho FreeIPA:

Tùy chọn
Giá trị

Tên hiển thị bảng điều khiển
freeipa.example.org

Nhà cung cấp
Red Hat Directory Server

Thuộc tính LDAP UUID
ipauniqueid

URL kết nối
ldaps://freeipa.example.org

Tên người dùng
cn=users,cn=accounts,dc=example,dc=org

Ràng buộc DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org

Ràng buộc thông tin xác thực
<password>

Cho phép xác thực Kerberos:
on

Vương quốc Kerberos:
EXAMPLE.ORG

Hiệu trưởng máy chủ:
HTTP/[email protected]

tab chính:
/etc/krb5.keytab

Người dùng keycloak-svc phải được tạo trước trên máy chủ LDAP của chúng tôi.

Trong trường hợp Active Directory, chỉ cần chọn Nhà cung cấp: Active Directory và các cài đặt cần thiết sẽ được tự động chèn vào biểu mẫu.

Nhấp vào đây Lưu

Bây giờ chúng ta hãy tiếp tục:

Liên kết người dùng -> freeipa.example.org -> Người lập bản đồ -> Tên

Tùy chọn
Giá trị

Thuộc tính Ldap
givenName

Bây giờ kích hoạt ánh xạ nhóm:

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

Tùy chọn
Giá trị

Họ tên
groups

Loại bản đồ
group-ldap-mapper

Nhóm LDAP DN
cn=groups,cn=accounts,dc=example,dc=org

Chiến lược truy xuất nhóm người dùng
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

Việc này hoàn tất quá trình thiết lập liên kết, hãy chuyển sang thiết lập ứng dụng khách.

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

Hãy tạo một ứng dụng khách mới (một ứng dụng sẽ nhận người dùng từ Keycloak). Đi nào:

Khách hàng -> Tạo

Tùy chọn
Giá trị

ID khách hàng
kubernetes

Loại truy cập
confidenrial

URL gốc
http://kubernetes.example.org/

URI chuyển hướng hợp lệ
http://kubernetes.example.org/*

URL quản trị
http://kubernetes.example.org/

Chúng tôi cũng sẽ tạo phạm vi cho các nhóm:

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

Tùy chọn
Giá trị

Template
No template

Họ tên
groups

Đường dẫn nhóm đầy đủ
false

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

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

Tùy chọn
Giá trị

Họ tên
groups

Loại người lập bản đồ
Group membership

Tên yêu cầu mã thông báo
groups

Bây giờ chúng ta cần kích hoạt ánh xạ nhóm trong phạm vi khách hàng của mình:

Khách hàng -> Kubernetes -> Phạm vi khách hàng -> Phạm vi khách hàng 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

Bây giờ hãy thiết lập xác thực cho ứng dụng của chúng tôi, hãy đi tới:

Khách hàng -> Kubernetes

Tùy chọn
Giá trị

Đã bật ủy quyền
ON

Hãy đẩy tiết kiệm và việc này hoàn tất quá trình thiết lập máy khách, bây giờ ở trên tab

Khách hàng -> Kubernetes -> Credentials

bạn có thể làm được Bí mật mà chúng ta sẽ sử dụng sau này.

Định cấu hình Kubernetes

Việc thiết lập Kubernetes để ủy quyền OIDC khá đơn giản và không quá phức tạp. Tất cả những gì bạn cần làm là đặt chứng chỉ CA của máy chủ OIDC của bạn vào /etc/kubernetes/pki/oidc-ca.pem và thêm các tùy chọn cần thiết cho kube-apiserver.
Để thực hiện việc này, hãy cập nhật /etc/kubernetes/manifests/kube-apiserver.yaml trên tất cả các bậc thầy của bạn:

...
spec:
  containers:
  - command:
    - kube-apiserver
...
    - --oidc-ca-file=/etc/kubernetes/pki/oidc-ca.pem
    - --oidc-client-id=kubernetes
    - --oidc-groups-claim=groups
    - --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
    - --oidc-username-claim=email
...

Và cũng cập nhật cấu hình kubeadm trong cụm để không bị mất các cài đặt này trong quá trình cập nhật:

kubectl edit -n kube-system configmaps kubeadm-config

...
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        oidc-ca-file: /etc/kubernetes/pki/oidc-ca.pem
        oidc-client-id: kubernetes
        oidc-groups-claim: groups
        oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
        oidc-username-claim: email
...

Điều này hoàn thành việc thiết lập Kubernetes. Bạn có thể lặp lại các bước này trên tất cả các cụm Kubernetes của mình.

Ủy quyền ban đầu

Sau các bước này, bạn sẽ có cụm Kubernetes được định cấu hình ủy quyền OIDC. Điểm duy nhất là người dùng của bạn chưa cấu hình máy khách cũng như kubeconfig của riêng họ. Để giải quyết vấn đề này, bạn cần định cấu hình tự động cấp kubeconfig cho người dùng sau khi ủy quyền thành công.

Để thực hiện việc này, bạn có thể sử dụng các ứng dụng web đặc biệt cho phép bạn xác thực người dùng và sau đó tải xuống kubeconfig đã hoàn thành. Một trong những tiện lợi nhất là Kuberos, nó cho phép bạn mô tả tất cả các cụm Kubernetes trong một cấu hình và dễ dàng chuyển đổi giữa chúng.

Để định cấu hình Kuberos, việc mô tả mẫu cho kubeconfig và chạy nó với các tham số sau là đủ:

kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template

Để biết thêm chi tiết xem Sử dụng trên Github.

Nó cũng có thể sử dụng kubelogin nếu bạn muốn ủy quyền trực tiếp trên máy tính của người dùng. Trong trường hợp này, người dùng sẽ mở trình duyệt có biểu mẫu ủy quyền trên localhost.

Bạn có thể kiểm tra kubeconfig kết quả trên trang web jwt.io. Chỉ cần sao chép giá trị users[].user.auth-provider.config.id-token từ kubeconfig của bạn đến một biểu mẫu trên trang web và nhận bản ghi ngay lập tức.

thiết lập RBAC

Khi định cấu hình RBAC, bạn có thể tham khảo cả tên người dùng (trường name trong mã thông báo jwt) và cho một nhóm người dùng (trường groups bằng mã thông báo jwt). Dưới đây là ví dụ về thiết lập quyền cho một nhóm kubernetes-default-namespace-admins:

kubernetes-default-namespace-admins.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: default-admins
  namespace: default
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-default-namespace-admins
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: default-admins
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: kubernetes-default-namespace-admins

Các ví dụ khác về RBAC có thể được tìm thấy trong tài liệu Kubernetes chính thức

Đặt auth-proxy

Có một dự án tuyệt vời người gác cổng, cho phép bạn bảo mật bất kỳ ứng dụng nào bằng cách cho phép người dùng xác thực với máy chủ OIDC. Tôi sẽ chỉ cho bạn cách bạn có thể thiết lập nó bằng Bảng điều khiển Kubernetes làm ví dụ:

bảng điều khiển-proxy.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kubernetes-dashboard-proxy
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: kubernetes-dashboard-proxy
    spec:
      containers:
      - args:
        - --listen=0.0.0.0:80
        - --discovery-url=https://keycloak.example.org/auth/realms/kubernetes
        - --client-id=kubernetes
        - --client-secret=<your-client-secret-here>
        - --redirection-url=https://kubernetes-dashboard.example.org
        - --enable-refresh-tokens=true
        - --encryption-key=ooTh6Chei1eefooyovai5ohwienuquoh
        - --upstream-url=https://kubernetes-dashboard.kube-system
        - --resources=uri=/*
        image: keycloak/keycloak-gatekeeper
        name: kubernetes-dashboard-proxy
        ports:
        - containerPort: 80
          livenessProbe:
            httpGet:
              path: /oauth/health
              port: 80
            initialDelaySeconds: 3
            timeoutSeconds: 2
          readinessProbe:
            httpGet:
              path: /oauth/health
              port: 80
            initialDelaySeconds: 3
            timeoutSeconds: 2
---
apiVersion: v1
kind: Service
metadata:
  name: kubernetes-dashboard-proxy
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: kubernetes-dashboard-proxy
  type: ClusterIP

Nguồn: www.habr.com

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