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
Để 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
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à
Để đị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
Nó cũng có thể sử dụng
Bạn có thể kiểm tra kubeconfig kết quả trên trang web 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 auth-proxy
Có một dự án tuyệt vời
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