使用keycloak实现k8s用户权限的统一管理
keycloak 介绍
keycloak 现代应用程序和服务的开源身份和访问管理
以最小的麻烦为应用程序和安全服务添加身份验证。无需处理存储用户或认证用户。开箱即用。您甚至可以获得高级功能,例如用户联合,身份代理和社交登录。
以docker方式运行keycloak
和k8s交互要求必须启用https,我们使用docker启动没有配置证书,需要启动PROXY_ADDRESS_FORWARDING,然后通过NGINX配置证书,从而与apiserver交互
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
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配置如下
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
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用户
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认证
brew install int128/kubelogin/kubeloginkubelogin
执行上述命令后,kubelogin将打开浏览器,输入用户名密码认证成功后将显示以下信息,表明认证完成
此时查看kubeconfig发现oidc用户的refresh-token及id-token已经被配置
如果不使用kubelogin等工具也可以直接通过curl获取token信息
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角色
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可以看到如下信息
Error from server (Forbidden): deployments.apps is forbidden: User "test" cannot list resource "deployments" in API group "apps" in the namespace "default"
可以看到我们已经可以通过keycloak实现k8s用户的统一认证及角色划分。
- Tomcat 日志分割.
- crontab导致的频繁发送邮件的问题(r5笔记第20天)
- 再学习之Spring(依赖注入).
- 使用序列的问题ORA-02287(r5笔记第19天)
- Java多线程详解2
- Java多线程详解3
- SpringMVC处理multipart请求.
- 一条简单的sql语句运行15天的原因分析(r5笔记第17天)
- 巧用flashback database实现灵活的数据回滚(r5笔记第16天)
- Spring Cache For Redis.
- css重写checkbox样式
- 通过shell脚本同时监控多个数据库负载(r5笔记第14天)
- Java 定时器 Timer 的使用.
- 通过shell脚本来统计段大小(r5笔记第14天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaScript初识
- 聊聊dubbo-go的DubboInvoker
- 如何在云开发Cloudbase中使用MySQL数据库
- Kubernetes笔记之基本概念
- 腾讯云语音识别之一句话识别
- 创建线程都有哪些方式?— Callable篇
- UiAutomator源码学习(3)-- UiObject
- RTSP协议视频流媒体播放器EasyPlayer-RTSP-OCX接口文档API接口函数定义
- Python逐行写入
- C++ this 指针
- C++ push方法与push_back方法
- 别人变强靠天赋,而我,靠思维导图
- Spring Boot 五种热部署方式
- 二叉树最小深度
- 一日一技:限定Python函数只能被特定函数调用