使用Active Directory对Kubernetes仪表板用户进行身份验证
Kubernetes仪表板是基于Web的用户界面,允许用户轻松地与kubernetes集群进行交互。
它允许用户对应用程序以及群集进行管理,监视和故障排除。
在本教程中,我们已经研究了如何部署仪表板。
在本教程中,我们将探讨kubernetes仪表板与Active Directory的集成,以简化用户和密码管理。
Kubernetes支持两类用户:服务帐户:这是kubernetes支持的默认方法。
一个使用服务帐户令牌访问仪表板。
普通用户:群集中配置的任何其他身份验证方法。
为此,我们将使用一个名为Dex的项目。
Dex是由CoreOS完成的OpenID Connect提供程序。
它负责Kubernetes令牌和Active Directory用户之间的转换。
设置要求:
网络上需要Active Directory服务器的IP。
在我的情况下,该IP为172.16.16.16我们还将需要一个正常工作的Kubernetes集群。
该群集的节点应该能够与Active Directory IP通信。
看一下如何使用kubeadm或者rke创建一个kubernetes集群(如果还没有的话)。
我们还需要一个支持通配DNS输入的域名。
我将使用通配符DNS" * .kubernetes.mydomain.com"将外部流量路由到我的Kubernetes集群。
步骤1:在Kubernetes集群上部署Dex
我们首先需要创建一个名称空间,为dex创建一个服务帐户。
然后,在部署dex服务帐户之前,我们将为其配置RBAC规则。
这是为了确保应用程序具有适当的权限。
创建一个dex-namespace.yaml文件。
$vim dex-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: auth-system
2.为Dex创建名称空间。
$kubectl apply -f dex-namespace.yaml
3.创建一个dex-rbac.yaml文件。
$vim dex-rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: dex namespace: auth-system -- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: name: dex namespace: auth-system rules: - apiGroups: ["dex.coreos.com"] resources: ["*"] verbs: ["*"] - apiGroups: ["apiextensions.k8s.io"] resources: ["customresourcedefinitions"] verbs: ["create"] -- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: dex namespace: auth-system roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: dex subjects: - kind: ServiceAccount name: dex namespace: auth-system
4.创建Dex的权限。
$kubectl apply -f dex-rbac.yaml
5.创建一个dex-configmap.yaml文件。
确保相应地修改颁发者URL,重定向URI,客户端密码和Active Directory配置。
$vim dex-configmap.yaml kind: ConfigMap apiVersion: v1 metadata: name: dex namespace: auth-system data: config.yaml: | issuer: https://auth.kubernetes.mydomain.com/ web: http: 0.0.0.0:5556 frontend: theme: custom telemetry: http: 0.0.0.0:5558 staticClients: - id: oidc-auth-client redirectURIs: - https://kubectl.kubernetes.mydomain.com/callback - http://dashtest.kubernetes.mydomain.com/oauth2/callback name: oidc-auth-client secret: secret connectors: - type: ldap id: ldap name: LDAP config: host: 172.16.16.16:389 insecureNoSSL: true insecureSkipVerify: true bindDN: ldapadmin bindPW: 'KJZOBwS9DtB' userSearch: baseDN: OU=theitroad departments,DC=theitroad ,DC=net username: sAMAccountName idAttr: sn nameAttr: givenName emailAttr: mail groupSearch: baseDN: CN=groups,OU=theitroad,DC=theitroad,DC=net userMatchers: - userAttr: sAMAccountName groupAttr: memberOf nameAttr: givenName oauth2: skipApprovalScreen: true storage: type: kubernetes config: inCluster: true
6.配置敏捷。
$kubectl apply -f dex-configmap.yaml
7.创建dex-deployment.yaml文件。
$vim dex-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: dex name: dex namespace: auth-system spec: replicas: 1 selector: matchLabels: app: dex strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1 type: RollingUpdate template: metadata: labels: app: dex revision: "1" spec: containers: - command: - /usr/local/bin/dex - serve - /etc/dex/cfg/config.yaml image: quay.io/dexidp/dex:v2.17.0 imagePullPolicy: IfNotPresent name: dex ports: - containerPort: 5556 name: http protocol: TCP resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /etc/dex/cfg name: config - mountPath: /web/themes/custom/ name: theme dnsPolicy: ClusterFirst serviceAccountName: dex restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 volumes: - configMap: defaultMode: 420 items: - key: config.yaml path: config.yaml name: dex name: config - name: theme emptyDir: {}
8.部署敏捷。
$kubectl apply -f dex-deployment.yaml
9.创建一个dex-service.yaml文件。
$vim dex-service.yaml apiVersion: v1 kind: Service metadata: name: dex namespace: auth-system spec: selector: app: dex ports: - name: dex port: 5556 protocol: TCP targetPort: 5556
10.为Dex部署创建服务。
$kubectl apply -f dex-service.yaml
11.创建一个dex-ingress秘密。
确保群集的证书数据在指定的位置,或者更改此路径以指向它。
如果群集中安装了证书管理器,则可以跳过此步骤。
$kubectl create secret tls dex --key /data/Certs/kubernetes.mydomain.com.key --cert /data/Certs/kubernetes.mydomain.com.crt -n auth-system
12.创建一个dex-ingress.yaml文件。
相应地更改主机参数和证书颁发者名称。
$vim dex-ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: dex namespace: auth-system annotations: kubernetes.io/tls-acme: "true" ingress.kubernetes.io/force-ssl-redirect: "true" spec: tls: - secretName: dex hosts: - auth.kubernetesuat.mydomain.com rules: - host: auth.kubernetes.mydomain.com http: paths: - backend: serviceName: dex servicePort: 5556
13.为Dex服务创建入口。
$kubectl apply -f dex-ingress.yaml
等待几分钟,直到证书管理员为Dex生成证书。
我们可以通过浏览到以下网址检查Dex是否已正确部署:https://auth.kubernetesuat.mydomain.com/.well-known/openid-configuration
步骤2:将Kubernetes API配置为以OpenID Connect提供程序的身份访问Dex
接下来,我们将研究如何为RKE和Kubeadm集群配置API服务器。
要启用OIDC插件,我们需要在API服务器上配置几个标志,如下所示:A。
RKE群集1.
SSH到rke节点。
$ssh Hyman@theitroad
2.编辑Kubernetes API配置。
添加OIDC参数并相应地修改发行者URL。
$sudo vim ~/Rancher/cluster.yml kube-api: service_cluster_ip_range: 10.43.0.0/16 # Expose a different port range for NodePort services service_node_port_range: 30000-32767 extra_args: # Enable audit log to stdout audit-log-path: "-" # Increase number of delete workers delete-collection-workers: 3 # Set the level of log output to debug-level v: 4 #ADD THE FOLLOWING LINES oidc-issuer-url: https://auth.kubernetes.mydomain.com/ oidc-client-id: oidc-auth-client oidc-ca-file: /data/Certs/kubernetes.mydomain.com.crt oidc-username-claim: email oidc-groups-claim: groups extra_binds: - /data/Certs:/data/Certs ##ENSURE THE WILDCARD CERTIFICATES ARE PRESENT IN THIS FILE PATH IN ALL MASTER NODES
3.一旦运行RKE UP,Kubernetes API将自行重启。
$rke up
B.KUBEADM集群1.
SSH到节点。
$ssh Hyman@theitroad
2.编辑Kubernetes API配置。
添加OIDC参数并相应地修改发行者URL。
$sudo vim /etc/kubernetes/manifests/kube-apiserver.yaml ... command: - /hyperkube - apiserver - --advertise-address=10.10.40.30 #ADD THE FOLLOWING LINES: ... - --oidc-issuer-url=https://auth.kubernetes.mydomain.com/ - --oidc-client-id=oidc-auth-client ##ENSURE THE WILDCARD CERTIFICATES ARE PRESENT IN THIS FILE PATH IN ALL MASTER NODES: - --oidc-ca-file=/etc/ssl/kubernetes/kubernetes.mydomain.com.crt - --oidc-username-claim=email - --oidc-groups-claim=groups ...
- Kubernetes API将自行重启。
步骤3:部署Oauth2代理并配置kubernetes仪表板入口
1.为Oauth2代理生成一个机密。
python -c 'import os,base64; print base64.urlsafe_b64encode(os.urandom(16))'
2.复制生成的密码,并在下一步中将其用于OAUTH2_PROXY_COOKIE_SECRET值。
创建一个oauth2-proxy-deployment.yaml文件。
相应地修改OIDC客户端密码,OIDC颁发者URL和Oauth2代理cookie密码。
$vim oauth2-proxy-deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: k8s-app: oauth2-proxy name: oauth2-proxy namespace: auth-system spec: replicas: 1 selector: matchLabels: k8s-app: oauth2-proxy template: metadata: labels: k8s-app: oauth2-proxy spec: containers: - args: - --cookie-secure=false - --provider=oidc - --client-id=oidc-auth-client - --client-secret=** **** ***** - --oidc-issuer-url=https://auth.kubernetes.mydomain.com/ - --http-address=0.0.0.0:8080 - --upstream=file:///dev/null - --email-domain=* - --set-authorization-header=true env: # docker run -ti --rm python:3-alpine python -c 'import secrets,base64; print(base64.b64encode(base64.b64encode(secrets.token_bytes(16))));' - name: OAUTH2_PROXY_COOKIE_SECRET value: ** **** ***** image: sguyennet/oauth2-proxy:header-2.2 imagePullPolicy: Always name: oauth2-proxy ports: - containerPort: 8080 protocol: TCP
4.部署Oauth2代理。
$kubectl apply -f oauth2-proxy-deployment.yaml
5.创建一个oauth2-proxy-service.yaml文件。
$vim oauth2-proxy-service.yaml apiVersion: v1 kind: Service metadata: labels: k8s-app: oauth2-proxy name: oauth2-proxy namespace: auth-system spec: ports: - name: http port: 8080 protocol: TCP targetPort: 8080 selector: k8s-app: oauth2-proxy
6.为Oauth2代理部署创建服务。
$kubectl apply -f oauth2-proxy-service.yaml
7.创建一个dashboard-ingress.yaml文件。
相应地修改仪表板URL和主机参数。
$vim dashboard-ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: kubernetes-dashboard namespace: kube-system annotations: nginx.ingress.kubernetes.io/auth-url: "https://dashboard.kubernetes.mydomain.com/oauth2/auth" nginx.ingress.kubernetes.io/auth-signin: "https://dashboard.kubernetes.mydomain.com/oauth2/start?rd=https://$host$request_uri$is_args$args" nginx.ingress.kubernetes.io/secure-backends: "true" nginx.ingress.kubernetes.io/configuration-snippet: | auth_request_set $token $upstream_http_authorization; proxy_set_header Authorization $token; spec: rules: - host: dashboard.kubernetes.mydomain.com http: paths: - backend: serviceName: kubernetes-dashboard servicePort: 443 path: /
8.为仪表板服务创建入口。
$kubectl apply -f dashboard-ingress.yaml
9.创建一个kubernetes-dashboard-external-tls入口密码。
确保群集的证书数据在指定的位置,或者更改此路径以指向它。
如果使用证书管理器,请跳过此步骤。
$kubectl create secret tls kubernetes-dashboard-external-tls --key /data/Certs/kubernetes.mydomain.com.key --cert /data/Certs/kubernetes.mydomain.com.crt -n auth-system
10.创建一个oauth2-proxy-ingress.yaml文件。
相应地修改证书管理器颁发者和主机参数。
$vim oauth2-proxy-ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/tls-acme: "true" ingress.kubernetes.io/force-ssl-redirect: "true" name: oauth-proxy namespace: auth-system spec: rules: - host: dashboard.kubernetes.mydomain.com http: paths: - backend: serviceName: oauth2-proxy servicePort: 8080 path: /oauth2 tls: - hosts: - dashboard.kubernetes.mydomain.com secretName: kubernetes-dashboard-external-tls
10.为Oauth2代理服务创建入口。
$kubectl apply -f oauth2-proxy-ingress.yaml
11.创建角色绑定。
$kubectl create rolebinding <username>-rolebinding-<namespace> --clusterrole=admin --user=<username> -n <namespace> e.g kubectl create rolebinding mkemei-rolebinding-default --clusterrole=admin Hyman@theitroad -n default //Note that usernames are case sensitive and we need to confirm the correct format before applying the rolebinding.
12.等待几分钟,然后浏览至https://dashboard.kubernetes.mydomain.com.13.
用Active Directory用户登录。
如下所示:Hyman @ theitroad应该能够查看和修改默认名称空间。