带你读《云原生应用开发 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

}

相关文章
|
1月前
|
缓存 Java API
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
|
1月前
|
Kubernetes Cloud Native 开发工具
带你读《云原生应用开发:Operator原理与实践》精品文章合集
带你读《云原生应用开发:Operator原理与实践》精品文章合集
|
2月前
|
人工智能 缓存 Kubernetes
.NET 9 首个预览版发布:瞄准云原生和智能应用开发
.NET 9 首个预览版发布:瞄准云原生和智能应用开发
|
29天前
|
Cloud Native 安全 持续交付
构建未来:云原生架构的演进与实践
【2月更文挑战第30天】 随着数字化转型的深入,企业对于信息技术的需求日益复杂化和动态化。传统的IT架构已难以满足快速迭代、灵活扩展及成本效率的双重要求。云原生技术作为解决这一矛盾的关键途径,通过容器化、微服务、持续集成/持续部署(CI/CD)等手段,实现了应用的快速开发、部署及运维。本文将探讨云原生架构的最新发展,分析其如何助力企业构建更加灵活、高效的业务系统,并结合实际案例,展示云原生转型过程中的最佳实践和面临的挑战。
|
6天前
|
Kubernetes 监控 Cloud Native
构建高效云原生应用:基于Kubernetes的微服务治理实践
【4月更文挑战第13天】 在当今数字化转型的浪潮中,企业纷纷将目光投向了云原生技术以支持其业务敏捷性和可扩展性。本文深入探讨了利用Kubernetes作为容器编排平台,实现微服务架构的有效治理,旨在为开发者和运维团队提供一套优化策略,以确保云原生应用的高性能和稳定性。通过分析微服务设计原则、Kubernetes的核心组件以及实际案例,本文揭示了在多变的业务需求下,如何确保系统的高可用性、弹性和安全性。
11 4
|
21天前
|
Java fastjson 数据安全/隐私保护
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
38 0
|
29天前
|
运维 Cloud Native 持续交付
云原生技术的未来展望:如何塑造下一代应用开发
【2月更文挑战第30天】 随着云计算的不断发展,云原生技术已经成为推动现代应用开发的重要力量。本文将深入探讨云原生技术的核心概念,分析其在提高开发效率、降低运维成本以及支持复杂业务场景中的作用。同时,文章还将预测云原生技术的发展趋势,并讨论如何在不断变化的技术环境中保持应用的敏捷性和可靠性。
|
1月前
|
消息中间件 存储 Cloud Native
【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程
【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程
|
2月前
|
Prometheus 监控 Kubernetes
青团社:亿级灵活用工平台的云原生架构实践
青团社:亿级灵活用工平台的云原生架构实践
262339 5
|
1月前
|
人工智能 监控 Cloud Native
iLogtail 2.0 来了;通义灵码下载量破百万丨阿里云云原生 2 月产品月报
iLogtail 2.0 来了;通义灵码下载量破百万丨阿里云云原生 2 月产品月报

热门文章

最新文章