前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用keycloak实现k8s用户权限的统一管理

使用keycloak实现k8s用户权限的统一管理

作者头像
有点技术
发布2020-08-17 16:09:07
3.5K0
发布2020-08-17 16:09:07
举报
文章被收录于专栏:有点技术有点技术

keycloak 介绍

keycloak 现代应用程序和服务的开源身份和访问管理

以最小的麻烦为应用程序和安全服务添加身份验证。无需处理存储用户或认证用户。开箱即用。您甚至可以获得高级功能,例如用户联合,身份代理和社交登录。

以docker方式运行keycloak

和k8s交互要求必须启用https,我们使用docker启动没有配置证书,需要启动PROXY_ADDRESS_FORWARDING,然后通过NGINX配置证书,从而与apiserver交互

代码语言:javascript
复制
docker run -p 8080:8080 -e PROXY_ADDRESS_FORWARDING=true  -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin quay.io/keycloak/keycloak:11.0.0

如果不开启PROXY_ADDRESS_FORWARDING,需要给keycloak配置证书,对于官方的docker镜像,需要将名为tls.crt和tls.key的文件挂载到/etc/x509/https,同时给api-server添加 --oidc-ca-file=path/ca.pem

配置nginx代理keycloak

代码语言:javascript
复制
     server {
        listen       443 ssl;
        ssl_certificate      /tmp/rocdu-certs/fullchain.crt;
        ssl_certificate_key  /tmp/rocdu-certs/private.pem;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        location / {
           proxy_set_header   X-Real-IP $remote_addr;
           proxy_set_header   Host      $http_host;
           proxy_set_header X-Forwarded-Proto  $scheme;
           proxy_pass http://127.0.0.1:8080;
        }
    }

配置keycloak

•创建新的client

•创建mapper

•配置用户属性

配置k8s启动oidc认证

使用kubeadm安装k8s集群,kubeadmconfig配置如下

代码语言:javascript
复制
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token # token所属组
  token: abcdef.0123456789abcdef # 设置token
  ttl: 24h0m0s #token过期时间
  usages: # 签名信息
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.11.26 # 监听地址
  bindPort: 6443 #监听端口
nodeRegistration:
  criSocket: /var/run/dockershim.sock # cri socket
  name: 192.168.11.26 # 注册的名称
  taints: # 污点
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
  certSANs: # 证书san
    - 127.0.0.1
    - 192.168.11.26
    - kubernetes
    - kubernetes.default
    - kubernetes.default.svc
    - kubernetes.default.svc.cluster
    - kubernetes.default.svc.cluster.local
  extraArgs:
    oidc-issuer-url: "https://keycloak.rocdu.top/auth/realms/master"
    oidc-client-id: "kubernetes"
    oidc-username-claim: "preferred_username"
    oidc-username-prefix: "-"
    oidc-groups-claim: "groups"
apiVersion: kubeadm.k8s.io/v1beta2
kubernetesVersion: v1.18.0
certificatesDir: /etc/kubernetes/pki # 证书目录
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers # 设置使用阿里云镜像
kind: ClusterConfiguration
networking:
  dnsDomain: cluster.local
  serviceSubnet: 200.0.0.1/16 #svc cidr
  podSubnet: 10.201.0.0/16 # pod cidr
controlPlaneEndpoint: "192.168.11.26" # apiserver 负载均衡 IP 单点克不设置
scheduler: {}

配置kubeconfig及clusterrole

应用以下配置将cluster-admin角色赋予admin group

代码语言:javascript
复制
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: admin-group
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: Group
  name: admin
  apiGroup: rbac.authorization.k8s.io

设置oidc用户

代码语言:javascript
复制
kubectl config set-credentials aaa --auth-provider=oidc \
--auth-provider-arg=idp-issuer-url=https://keycloak.rocdu.top/auth/realms/master \
--auth-provider-arg=client-id=kubernetes \
--auth-provider-arg=client-secret=89aeaf34-d5c1-4e16-b025-42d58a957201 \
# 切换为OIDC用户
kubectl config set-context --current --user=oidc

如果未开启PROXY_ADDRESS_FORWARDING 需要添加--auth-provider-arg=idp-certificate-authority=path/ca.pem 参数

对应的secret可以在对应clients的credentials中查到

通过kubelogin实现k8s oidc认证

代码语言:javascript
复制
brew install int128/kubelogin/kubeloginkubelogin

执行上述命令后,kubelogin将打开浏览器,输入用户名密码认证成功后将显示以下信息,表明认证完成

此时查看kubeconfig发现oidc用户的refresh-token及id-token已经被配置

如果不使用kubelogin等工具也可以直接通过curl获取token信息

代码语言:javascript
复制
curl -k 'https://keycloak.rocdu.top/auth/realms/master/protocol/openid-connect/token' -d "client_id=kubernetes" -d "client_secret=89aeaf34-d5c1-4e16-b025-42d58a957201" -d "response_type=code token" -d "grant_type=password" -d "username=admin" -d "password=admin" -d "scope=openid"

验证

此时执行kubectl get deploy可以看到能够正常列出信息,我们新创建一个test用于并设置groups属性为test,并赋予test组system:node角色

代码语言:javascript
复制
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: test-group
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:node
subjects:
- kind: Group
  name: test
  apiGroup: rbac.authorization.k8s.io

此时get deploy可以看到如下信息

代码语言:javascript
复制
Error from server (Forbidden): deployments.apps is forbidden: User "test" cannot list resource "deployments" in API group "apps" in the namespace "default"

可以看到我们已经可以通过keycloak实现k8s用户的统一认证及角色划分。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有点技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • keycloak 介绍
  • 以docker方式运行keycloak
  • 配置nginx代理keycloak
  • 配置keycloak
  • 配置k8s启动oidc认证
  • 配置kubeconfig及clusterrole
  • 通过kubelogin实现k8s oidc认证
  • 验证
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档