S'S ALGORITHM

GCP 的 Workload identity federation 功能


一,项目中遇到的课题

通过Github的Actions功能,项目中我希望能自动上传merge好的main分支的内容,到GCP的对应bucket中,实现代码deploy的自动化。为了不使用服务账号SA也能安全操作GCP中的资源,使用到了这个Workload identity服务。但一知半解让我很难受,所以进行了查找和总结,我觉得我还是没有完全理解所有的细节,但是从整体来说我有了一个理解。

二,workload identity 的工作流程和设置内容

我们在使用一个application去访问GCP云环境的时候,一般来说需要用到service account(SA),通过SA的密钥,进入GCP进行workload作业。但是你无法保证这个密钥的安全性,它们在外部的应用手中,没有使用期限,更没有安全保证。而Workload identity federation则提供了解决方案。

假设有如下parts:外部应用有identity provider,同时有需要执行的workloads。云内部则是SA和需要通过SA执行操作的resource服务。如何把这两者联系起来。

设置之前的流程:

设置流程: (GUI界面)

(code例子)

gcloud iam service-accounts add-iam-policy-binding service-account-email \
    --role roles/iam.workloadIdentityUser \
    --member 'principal://iam.googleapis.com/projects/project-number/locations \
                /global/workloadIdentityPools/pool-id/subject/subject'

通过以上操作,这时候设置后的workload认证流程就变成了:在Workload通过credentials,去到GCP的security token service要求token的时候,security token service就会去workload identity pool中验证请求者的身份是否合规。

使用WI的优势?

是的,您可以像原来那样,使用 STS 发行的访问令牌代替服务账号进行操作。Workload Identity 的主要作用是提供了一种更安全、更可管理的方式来将外部身份与服务账号关联起来。下面是使用 Workload Identity 相对于直接使用 STS 发行的访问令牌的一些优势和区别:

  1. 安全性:Workload Identity 提供了一种更加安全的认证机制。通过与外部身份提供者(IdP)进行集成,工作负载可以利用现有的身份验证机制,如 OpenID Connect(OIDC),进行身份验证。这样可以避免在代码中硬编码密钥或凭据,降低了密钥管理的风险。

  2. 可管理性:使用 Workload Identity 可以更好地管理服务账号的访问权限。通过为工作负载配置适当的 Workload Identity Pool 和 Provider,可以精确控制哪些工作负载可以代表哪些服务账号执行操作,以及可以执行哪些操作。

  3. 审计追踪:Workload Identity 可以提供更好的审计追踪功能。通过将外部身份与服务账号关联起来,可以更容易地跟踪和记录谁在何时执行了哪些操作,从而提高了审计的可追溯性和透明度。

总的来说,虽然可以直接使用 STS 发行的访问令牌代替服务账号进行操作,但是使用 Workload Identity 可以提供更安全、更可管理的身份验证和授权机制,使您的应用程序更加健壮和可靠。

我将文章发给我的上司看了,总结出了结论就是STS是一种认证,WorkloadIdentity是一种认可。双重保证。

关于设置,可以通过上述的命令也可以通过GUI画面进行设置,设置时候的详细到具体内容的东西不再概述。

只举出要点:

google.subject = assertion.sub 
attritube.repository = assertion.repository
assertion.repository == 'xxx/myrepo'

三,补充知识

1,OIDC

OIDC(OpenID Connect)是一种身份验证协议,它建立在 OAuth 2.0 协议之上,提供了身份验证(Authentication)和用户信息(UserInfo)获取的功能。OIDC 旨在通过在客户端和认证服务器之间建立信任关系来实现用户身份验证。

在上面的验证流程中,OIDC 的作用体现在身份验证阶段,其中 Workload 与身份提供商进行交互以验证用户的身份,并获取与用户相关的凭据。OIDC 提供了一种标准化的身份验证流程,使得 Workload 能够安全地从自己的应用程序中验证用户,并且能够与其他身份提供商进行集成,如 GCP 的安全令牌服务。通过 OIDC,Workload 能够在身份验证成功后获取访问 GCP 资源所需的访问令牌,从而实现对资源的授权访问。

2,IdP

IdP 指的是身份提供者(Identity Provider),是指能够验证用户身份并颁发身份令牌(如 ID Token)或认证凭据(这里用到了)的服务。在身份验证过程中,用户向身份提供者提供凭据(例如用户名和密码、多因素认证信息等),身份提供者验证这些凭据的有效性,并确定用户的身份是否可信。如果验证成功,身份提供者会向用户颁发一个身份令牌,其中包含有关用户身份的信息,供其他服务进行使用。

身份提供者可以是多种形式的身份验证服务,包括但不限于:

身份提供者在身份验证过程中扮演着核心的角色,负责验证用户身份并颁发相应的凭据,以便用户可以安全地访问各种服务和资源。

STS 指的是安全令牌服务(Security Token Service),是一种用于颁发临时安全凭证的服务。在身份验证和授权过程中,STS 可以颁发临时访问令牌(如上面说的云服务的的临时安全凭证token)给客户端,以便客户端可以安全地访问受保护的资源。

STS 的主要功能包括:

STS 通常作为身份提供者和资源提供者之间的中间层,用于协调身份验证和访问控制流程。在云计算云服务提供商中,STS 被广泛应用于安全认证和访问控制方面,为客户端提供安全、可靠的身份验证和访问控制服务。

CEL 指 “Common Expression Language”(通用表达式语言),它是一种用于在不同系统之间共享逻辑表达式的标准化语言。它可以用于描述各种计算逻辑,例如筛选、转换、计算等。 CEL 是由 Google 开发的,主要用于在其产品中执行安全的表达式评估,如 Google Cloud IAM(身份和访问管理)中的条件语句和策略评估。

在 Google Cloud 中,CEL 通常用于编写策略和条件表达式,以便对资源进行访问控制、审计和转换。它允许用户定义灵活的逻辑条件,以便根据特定的规则和要求对资源进行管理和操作。 CEL 支持丰富的语法和功能,包括基本数学运算、逻辑运算、字符串操作、列表和映射处理等。

recap

其他的更多详细设置参见公式书,以及各个IdP提供商的说明,解决问题的方法总是很多,但是如果只知道详细过程不知道总体原理,每次都不理解每次都是一次性的操作是没法很好的解决问题的。学会阅读公式书也是一个重要的技能。所以很多地方不再赘述,在问题中找到解决问题的办法才是终极答案,没有任何人可以告诉你所有的答案。

我对于认证方面的东西理解还是很碎片,但是通过不断输入和收集,将碎片的理解拼好的感觉很不错。当然系统的学习也很重要。