kubernetes如何使用自有的用户系统
K8s 支持基于第三方的webhook token 的认证方式,有了这套机制可以可以让k8s使用公司现有的用户管理系统无需维护多套。
要支持webhook token 认证需要对api server 进行一下配置
-
--authentication-token-webhook-config-file
描述如何调用远程认证服务器的配置文件 -
--authentication-token-webhook-cache-ttl
认证的缓存时间,默认2分钟。
配置文件使用Kubeconfig 文件格式
# api 版本
apiVersion: v1
# api 类型
kind: Config
# 远程服务器信息
clusters:
- name: name-of-remote-authn-service
cluster:
certificate-authority: /path/to/ca.pem # 验证远程服务的CA
server: https://authn.example.com/authenticate # 远程服务器地址
# users 指代 API 服务的 Webhook 配置
users:
- name: name-of-api-server
user:
client-certificate: /path/to/cert.pem # Webhook 插件要使用的证书
client-key: /path/to/key.pem # 与证书匹配的密钥
# kubeconfig 文件需要一个上下文(Context),此上下文用于本 API 服务器
current-context: webhook
contexts:
- context:
cluster: name-of-remote-authn-service
user: name-of-api-server
name: webhook
当用户调用 api server 服务使用token 时,身份认证webhook 会用POST请求发送一个JSON 序列化的对象到远程服务器。该对象是 authentication.k8s.io/v1beta1
的 Token Review
对象,其中包含了Token 信息。
POST 请求的Body 如下:
{
"apiVersion": "authentication.k8s.io/v1beta1",
"kind": "TokenReview",
"spec": {
"token": "<持有者令牌>"
}
}
拿到了k8s 发送的请求 我们必须填充该请求的status 字段,标记该登录请求是否成功。如果成功 需要返回以下内容
{
"apiVersion": "authentication.k8s.io/v1beta1",
"kind": "TokenReview",
"status": {
"authenticated": true,
"user": {
"username": "vic@example.com",
"uid": "42",
"groups": [
"developers",
"qa"
],
"extra": {
"extrafield1": [
"extravalue1",
"extravalue2"
]
}
}
}
}
若不成功 则将authenticated
置成false。
认证服务器
根据以上信息,我们就可以实现我们的认证服务器了。下面代码是一个基于github验证token的认证方式,根据上文:
STEP 1: 解析请求的body,并获取到token
STEP 2: 将获取的token 发送到github 进行认证
STEP 3: 将github返回的用户信息组装成 TokenReview 的status 并返回
package main
import (
"context"
"encoding/json"
"github.com/google/go-github/github"
"golang.org/x/oauth2"
authentication "k8s.io/api/authentication/v1"
"log"
"net/http"
)
func authenticate(w http.ResponseWriter,r *http.Request) {
// 1. 解析请求体中的body,获取token
decoder := json.NewDecoder(r.Body