kubernetes如何使用自有的用户系统

本文介绍了如何在Kubernetes中使用自有的用户系统,通过webhook token认证方式与公司的现有用户管理系统集成。详细步骤包括配置API server、实现认证服务器以及验证过程。通过这个方法,可以避免维护多套用户管理系统。
摘要由CSDN通过智能技术生成

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/v1beta1Token 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值