如何用Common Expression Language限制权限至特定工作流并允许所有分支?
关于GHA OIDC身份联合池权限配置的问题
问题描述
我正在创建工作流身份联合池提供方,希望指定所用服务账号的权限,使其仅能被特定工作流文件调用。官方GHA OIDC示例中的配置为:
"job_workflow_ref": "octo-org/octo-automation/.github/workflows/oidc.yml@refs/heads/main",
但我希望允许该工作流文件的所有分支调用,请问能否通过Common Expression Language(CEL)实现?我写的以下写法是否可行?
attribute_condition = "(assertion.repository=='MyOrg/MyRepo' && assertion.job_workflow_ref=='MyOrg/MyRepo/.github/workflows/myworkflow.yaml*')"
回答
你给出的写法不可行,因为CEL中的==是精确字符串匹配,不会将*识别为通配符,这样的条件无法匹配到任何分支的工作流。
要实现允许特定工作流文件的所有分支调用,有两种更合适的CEL写法:
方法1:使用startsWith函数
利用job_workflow_ref的格式(仓库路径/.github/workflows/文件名@分支引用),判断字符串开头是否包含工作流文件名加@:
attribute_condition = "(assertion.repository=='MyOrg/MyRepo' && startsWith(assertion.job_workflow_ref, 'MyOrg/MyRepo/.github/workflows/myworkflow.yaml@'))"
方法2:使用正则匹配(matches函数)
通过正则表达式匹配任意分支后缀:
attribute_condition = "(assertion.repository=='MyOrg/MyRepo' && assertion.job_workflow_ref.matches('MyOrg/MyRepo/.github/workflows/myworkflow.yaml@.*'))"
这里的.*表示匹配@之后的任意字符,覆盖所有分支、标签等引用类型。
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

