Bài báo này đã được viết để mở rộng trê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
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ết
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 đồ
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ách
Hãy tạo scoupe cho các nhóm:
Phạm vi khách hàng -> Tạo
Tạo phạm vi
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 đồ
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.
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 đồ
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
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:
Nguồn: www.habr.com