带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.3 Kube-APIServer 介绍(三)

简介: 带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.3 Kube-APIServer 介绍

(1)      ServiceAccountToken

ServiceAccount认证是自动开启的认证方式,它使用签过名的BearerToken去验证请求,这个认证模块包括两个可配置项。

① --service-account-key-file:包含签名 TokenPEM 格式的密钥文件,如果不指定这个参数,将使用 APIServerTLS私钥。

② --service-account-lookup:如果被设置为 True,API 请求中删除的 Token被收回。

ServiceAccountAPIServer自动创建,Pod在运行时通过 Admission Controller关联 ServiceAccount。BearerToen挂载到Pod的特定目录上,并允许集群内的进程与APIServer通信。可以使用PodSpecServiceAccountName字段将账户与Pod进行关联。

ServiceAccount中包含一个 Secret,示例见代码清单 2-67。

apiVersion:v1

kind:ServiceAccountmetadata:

name:defaultnamespace:defaultresourceVersion:"361"

secrets:

-name:default-token-h29t7

# Secret中包含了APIServer公开的 CA证书和⼀个JWT格式的 TokenapiVersion: v1

data:

ca.crt: < 证书内容 >namespace:ZGVmYXVsdA==token: <JWTToken>

kind:Secretmetadata:

name:default-token-h29t7namespace:default

type:kubernetes.io/service-account-token

 

(2)       OpenIDConnectTokens

OpenIDConnect是一套基于 OAuth2协议的认证规范,由提供商实现,比如 AzureActiveDirectory、SalesforceGoogle。这个认证模块的使用流程:用户先从认证服务器上获取一个 IDToken,这个 Token是一个JWT格式的 Token,用户收到这个 Token访问 APIServer。

这个认证模块使用从OAuth2中获取的id_token进行认证,认证的过程如图2-10所示。

 

 image.png


2—10ODC认证流程

 

登录到用户身份认证服务提供商。

② 用户身份认证服务提供商返回 access_token、id_tokenrefresh_token。 

③ 用户使用 Kubectl工具时通过 --token参数指定 id_token或将它写入 kubeconfig中。

Kubectlid_token 作为认证信息放在请求头中调用 APIServer。

APIServer将通过指定的证书检查 JWT 中的签名的正确性。

⑥ 检查 id_token 是不是已经过期了。

⑦ 确保用户请求的资源有操作权限。

一旦鉴权通过APIServer将返回一个响应给Kubectl

Kubectl 工具箱用户提供反馈。

用来对用户身份进行认证的所有数据都在id_token中,在上述整个流程中 Kubernetes不需要与身份认证服务交互。在一个都是无状态请求的模型中,这种工作方式为身份认证提供了一种更容易处理大规模请求的解决方案。

要使用 OIDC(OpenIDConnect)认证模块,需要在 APIServer中配置如下参数。

① --oidc-issuer-url:认证服务提供商的地址,允许 APIServer发现公开的签名密钥服务的 URL只接受 https://URL。此值通常设置为服务的发现URL,不含路径。

② --oidc-client-id:发放 TokenClientID。

③ --oidc-username-claim:使用 JWT中的哪个字段作为用户名,默认的是 sub。

④ --oidc-username-prefix:为了防止不同认证系统的用户冲突, 给用户名添加一个前缀,如果使用的用户名不是 email,那么用户名将是 <IssuerURL>#<UsernameClaim>。如果设置为“-,将不会使用前缀。

⑤ --oidc-groups-claim:使用 JWT 中的哪个字段作为用户的组名。

⑥      --oidc-groups-prefix:组名的前缀,所有的组都将以此值为前缀,以避免与其他身份认证策略发生冲突。

⑦ --oidc-required-claim:键值对描述 IDToken 中的必要声明,如果设置了这个值,则验证声明是否存在于 IDToken 中且具有匹配值,重复设置可以指定多个声明。

⑧ --oidc-ca-file:签署身份认证提供商的 CA证书的路径,默认的是主机的根 CA书的路径。

OIDC 认证实现见代码清单2-68

func(v*IDTokenVerifier)Verify(ctxcontext.Context,rawIDTokenstring)

(*IDToken,error){

jws,err:=jose.ParseSigned(rawIDToken)


iferr!=nil{

returnnil,fmt.Errorf("oidc:malformedjwt:%v",err)

}

 

//解析 JWTPayload部分,JWT分为三段,以逗号作为分隔符,第⼆段是 Payload部分,JSON格式,使⽤ base64进⾏编码

payload,err:=parseJWT(rawIDToken)iferr!=nil{

returnnil,fmt.Errorf("oidc:malformedjwt:%v",err) 

err)

}

vartokenidToken

iferr:=json.Unmarshal(payload,&token);err!=nil{

returnnil,fmt.Errorf("oidc:failedtounmarshalclaims:%v",


}

distributedClaims:=make(map[string]claimSource)forcn,src:=rangetoken.ClaimNames{

ifsrc==""{

returnnil,fmt.Errorf("oidc:failedtoobtainsourcefrom

claimname")

}

s,ok:=token.ClaimSources[src]if!ok{

returnnil,fmt.Errorf("oidc:sourcedoesnotexist")

}

distributedClaims[cn]=s

}

 

t:=&IDToken{

Issuer:              token.Issuer,

Subject:             token.Subject,

Audience:             []string(token.Audience),

Expiry:              time.Time(token.Expiry),

IssuedAt:             time.Time(token.IssuedAt),

Nonce:            token.Nonce,AccessTokenHash:                token.AtHash,claims:                payload,distributedClaims:         distributedClaims,

} 

......

//检查Token是否过期

if!v.config.SkipExpiryCheck{

now:=time.Now

ifv.config.Now!=nil{now=v.config.Now

}

nowTime:=now()

 

ift.Expiry.Before(nowTime){

returnnil,fmt.Errorf("oidc:tokenisexpired(TokenExpiry:%v)",t.Expiry)

}

 

iftoken.NotBefore!=nil{

nbfTime:=time.Time(*token.NotBefore)leeway:=1*time.Minute

 

ifnowTime.Add(leeway).Before(nbfTime){

returnnil,fmt.Errorf("oidc:currenttime%vbeforethenbf(notbefore)time:%v",nowTime,nbfTime)

}

}

}

 

switchlen(jws.Signatures){case0:

returnnil,fmt.Errorf("oidc:idtokennotsigned")case1:

default:

returnnil,fmt.Errorf("oidc:multiplesignaturesonidtokennotsupported")

} 

sig:=jws.Signatures[0]

supportedSigAlgs:=v.config.SupportedSigningAlgs

iflen(supportedSigAlgs)==0{supportedSigAlgs=[]string{RS256}

} 

.......

t.sigAlgorithm=sig.Header.Algorithm

//校验签名是否正确

gotPayload,err:=v.keySet.VerifySignature(ctx,rawIDToken)iferr!=nil{

returnnil,fmt.Errorf("failedtoverifysignature:%v",err)

}


if!bytes.Equal(gotPayload,payload){

returnnil,errors.New("oidc:internalerror,payloadparseddidnotmatchpreviouspayload")

} 

returnt,nil

}

相关文章
|
6月前
|
运维 监控 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
国诚投顾携手阿里云,依托Serverless架构实现技术全面升级,构建高弹性、智能化技术底座,提升业务稳定性与运行效率。通过云原生API网关、微服务治理与智能监控,实现流量精细化管理与系统可观测性增强,打造安全、敏捷的智能投顾平台,助力行业数字化变革。
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
|
8月前
|
Kubernetes Cloud Native 安全
云原生机密计算新范式 PeerPods技术方案在阿里云上的落地和实践
PeerPods 技术价值已在阿里云实际场景中深度落地。
|
6月前
|
运维 监控 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
通过与阿里云深度合作,国诚投顾完成了从传统 ECS 架构向云原生 Serverless 架构的全面转型。新的技术架构不仅解决了原有系统在稳定性、弹性、运维效率等方面的痛点,还在成本控制、API 治理、可观测性、DevOps 自动化等方面实现了全方位升级。
|
8月前
|
Kubernetes Cloud Native 安全
云原生机密计算新范式 PeerPods 技术方案在阿里云上的落地和实践
PeerPods 技术价值已在阿里云实际场景中深度落地。
|
4月前
|
人工智能 Cloud Native 算法
拔俗云原生 AI 临床大数据平台:赋能医学科研的开发者实践
AI临床大数据科研平台依托阿里云、腾讯云,打通医疗数据孤岛,提供从数据治理到模型落地的全链路支持。通过联邦学习、弹性算力与安全合规技术,实现跨机构协作与高效训练,助力开发者提升科研效率,推动医学AI创新落地。(238字)
310 7
|
10月前
|
运维 Cloud Native 测试技术
极氪汽车云原生架构落地实践
随着极氪数字业务的飞速发展,背后的 IT 技术也在不断更新迭代。极氪极为重视客户对服务的体验,并将系统稳定性、业务功能的迭代效率、问题的快速定位和解决视为构建核心竞争力的基石。
|
6月前
|
弹性计算 运维 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生Serverless实践
简介: 通过与阿里云深度合作,国诚投顾完成了从传统 ECS 架构向云原生 Serverless 架构的全面转型。新的技术架构不仅解决了原有系统在稳定性、弹性、运维效率等方面的痛点,还在成本控制、API 治理、可观测性、DevOps 自动化等方面实现了全方位升级。
178 1
|
5月前
|
存储 弹性计算 Cloud Native
云原生数据库的演进与应用实践
随着企业业务扩展,传统数据库难以应对高并发与弹性需求。云原生数据库应运而生,具备计算存储分离、弹性伸缩、高可用等核心特性,广泛应用于电商、金融、物联网等场景。阿里云PolarDB、Lindorm等产品已形成完善生态,助力企业高效处理数据。未来,AI驱动、Serverless与多云兼容将推动其进一步发展。
271 8
|
7月前
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
379 1
云原生信息提取系统:容器化流程与CI/CD集成实践

热门文章

最新文章