<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>oidc on </title>
    <link>/tags/oidc/</link>
    <description>Recent content in oidc on </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Sat, 14 Nov 2026 14:30:00 +0800</lastBuildDate><atom:link href="/tags/oidc/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>用 OIDC 替换 Jenkins 流水线里的 AWS access key</title>
      <link>/posts/jenkins-oidc-aws-credentials/</link>
      <pubDate>Sat, 14 Nov 2026 14:30:00 +0800</pubDate>
      
      <guid>/posts/jenkins-oidc-aws-credentials/</guid>
      <description>背景 这台 Jenkins（2.580.2）是非生产环境的构建机，控制器在办公网里，出公网只走办公室的出口地址，AWS 那边访问不到它。上面几十个流水线推镜像到 ECR 时，都绑定凭据库里同一把长期 access key。这把 key 背后的 IAM 用户有 ECR、ECS、S3、Lambda 的全权限，还是两个 EKS 集群的管理员，所以任何一个作业，以及任何能改动某个作业的人，都能用上这些权限。key 轮换过，但只要还是长期 key，它从构建日志、备份、workspace 或者控制器上共享的 ~/.docker/config.json 里漏出去一次，就又是长期有效的。
这次的目标是让 Jenkins 里不再存 AWS key：每次构建拿一份只属于这个作业的角色、最长 1 小时的临时凭据。动手前定了几条约束，后面的做法基本都是从这里推出来的：
没切换的作业行为一点不变。同一个 Jenkinsfile 往往同时服务 qa、staging 和生产分支，生产分支要等搬离这台 Jenkins 之后再处理，在那之前继续用原来的 key。 AWS 访问不到 Jenkins，签发方（issuer）的公开文件要放在别处。 一个作业一个作业地切，每切一个都能单独验证和回退。 第一批只处理只用 AWS 登录 ECR 和推镜像的 QA、STG 作业，最后切了 59 个。还用到 ECS、EKS 的作业以及生产构建另外处理，不在这篇里。
一次构建怎么换到临时凭据 Jenkins 这边用 oidc-provider 插件（这里装的是 234.vca_b_26b_f4b_dda_）。它提供一种凭据类型「OpenID Connect id token as file」：流水线绑定这个凭据时，插件用自己保管的私钥现签一个 JWT，写进一个临时文件。AWS CLI 读到 AWS_ROLE_ARN 和 AWS_WEB_IDENTITY_TOKEN_FILE 这两个环境变量，就会自己调 sts:AssumeRoleWithWebIdentity，整个过程不需要任何 key。</description>
    </item>
    
  </channel>
</rss>
