Vercel News

Death to long-lived static credentials

8.5内容质量

TL;DR · AI 摘要

Vercel推动用OIDC替代长期静态凭证,通过短期令牌和自动凭证轮换提升安全性,减少密钥泄露风险。

核心要点

  • 长期静态凭证泄露后可能持续数月,需手动轮换密钥
  • OIDC令牌有效期可设为1小时,泄露后24小时内失效
  • Vercel已要求Marketplace服务商2024年起必须支持OIDC

结构提纲

按章节快速跳转。

  1. 揭示长期静态凭证已成为现代应用安全的主要威胁

  2. 分析API密钥泄露的多条路径及持续性风险

  3. ›OIDC解决方案

    通过短期令牌和自动凭证发放消除手动轮换需求

  4. ·Vercel实践

    强制Marketplace服务商采用OIDC并提供工具支持

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • 替代长期静态凭证的OIDC方案
    • 安全威胁
      • 密钥泄露路径
      • 持续性风险
    • 解决方案
      • 短期令牌机制
      • 自动凭证发放
    • Vercel实践
      • Marketplace要求
      • 工具支持

金句 / Highlights

值得收藏与分享的关键句。

#OIDC#安全#Vercel#API安全
打开原文

摆脱长期有效的静态凭证 - Vercel

十五年前,TLS仅用于保护应用程序中最敏感的部分。随后Google、Let's Encrypt、EFF等组织推动了"全站HTTPS"的倡议,使加密成为每个请求的默认标准。没有加密的话,浏览器和服务器之间的任何人都可以读取和篡改流量。

OAuth、OIDC、DBSC等相关标准已为安全认证提供了基础模块,但标准本身并不能让安全方法成为行业惯例。HTTPS需要易于使用的工具和持续的推广,才能成为预期的行业规范。如今机器间的认证仍类似于2010年的HTTPS,部分厂商和企业正在引领变革,但许多SaaS厂商和基础设施提供商仍将长期有效的静态凭证作为默认方案。

在Vercel,我们希望让快速且安全成为全网的默认标准,这包括我们自身服务以及Marketplace中的集成方案。我们开发了OIDC UI,这是一个基于shadcn/ui的注册系统,为供应商提供信任策略表单和令牌验证代码。我们正在扩展Vercel全平台的OIDC支持,并为Marketplace供应商制定新的认证要求。

复制链接到标题 长期有效的静态凭证存在安全隐患

长期有效的静态凭证是指API密钥和数据库密码等秘密信息,应用程序通常会反复使用这些凭证且往往没有过期时间。随着代理系统承担更多重要任务,我们通过这些可能赋予远超任务需求权限的凭证,向其开放系统、工具和数据访问权限。

这些凭证可能泄露到代码仓库或聊天记录中,可能在服务或依赖项被入侵时被盗取,也可能在提示注入攻击下被代理系统主动暴露。无论通过何种方式泄露,攻击者都可以利用这些凭证直到其过期或被撤销。近期行业内的凭证窃取和供应链攻击事件表明,当恶意代码能够读取生产环境中的凭证时,静态存储加密已不足以保障安全。

轮换已暴露的凭证需要跨系统的协调,耗时且容易出错,可能导致生产环境中断。在Vercel,我们曾出于谨慎态度,为多个关键系统投入数千小时工程时间进行密钥轮换,我们永远不希望再次经历这样的过程。

复制链接到标题 更好的解决方案已经存在

通过OIDC,您的应用可以在不存储长期有效提供商密钥的情况下进行认证。受信任的签发方会提供一个签名的短期令牌来标识应用,接收服务在决定授予何种访问权限前会先验证该令牌。

被盗令牌在过期后立即失效,即使泄露未被发现,也能限制其使用时长。您的应用可以编程式获取新的凭证,无需在使用它的系统间分发和手动轮换持久化提供商密钥。

我们一直在 Vercel 上优先使用 OIDC,使应用程序能够访问 Blob、AI Gateway 和 Sandbox,而无需为这些服务存储长期有效的密钥。自 2024 年以来,我们的 OIDC 联邦功能已全面上线,允许在 Vercel 上运行的应用程序在配置的项目和环境信任策略下,将 Vercel 颁发的身份令牌兑换为临时的 AWS、Google Cloud 和 Azure 凭据。但为了使开发者停止管理长期密钥,这种支持必须扩展到应用程序依赖的所有服务。

复制链接到标题 网络的其他部分并未跟进

我们对超过 1,000 家 SaaS 供应商进行了调查,发现只有 8.4% 的供应商支持安全的认证方法。

但让供应商支持安全认证只是问题的一部分。即使某个服务提供了安全的认证方式,开发者通常仍会选择静态密钥,因为使用起来可能更简单。我们观察到阻碍更广泛采用的三大主要障碍:

  • 工具和设置使安全认证比使用静态密钥更复杂。
  • 在请求路径上获取或兑换令牌带来的额外延迟。
  • 供应商缺乏推动其提供和优先考虑安全认证的激励措施。

我们的目标是在 Vercel 上使安全认证成为默认选项,同时利用我们的 Marketplace 帮助更多供应商支持这一功能。

复制链接到标题 我们对更安全网络的承诺

我们有责任在我们运行的服务、开发者使用的工具以及与合作伙伴构建的集成中,使这一变革切实可行。

复制链接到标题 让安全认证更易于使用

使用安全令牌必须比粘贴密钥更简单,否则开发者将继续粘贴密钥。在 Vercel 上,代码通过函数调用获取 OIDC 令牌,自定义受众指定预期接收该令牌的服务。

通过 Vercel Connect,应用程序和代理可以使用其部署身份在运行时请求提供者令牌,而无需在环境变量中存储长期有效的提供者密钥。一旦连接器配置并链接到项目且用户的账户已连接,代码即可请求该用户支持的提供者范围的令牌。

app/api/agent/route.ts

code
1
import
{
getToken
}
from
'@vercel/connect'
;
2
3
const
token
=
await
getToken
(
'oauth/linear'
,
{
4
subject
:
{
type
:
'user'
,
id
:
'user_123'
}
,
5
scopes
:
[
'read'
]
,
6
}
)
;

通过 Vercel Connect 为用户请求 Linear 访问权限

我们还在 Vercel API 和 CLI 中扩展 OIDC 支持,以消除部署工作流中使用长期 Vercel 令牌的需求。

复制链接到标题 为 API 提供商提供的 OIDC UI

OIDC UI 是一个基于 shadcn/ui 的组件注册表,包含信任策略配置器和服务器端令牌验证器。它包含针对 Vercel、GitHub、GitLab、Google、Bitbucket、AWS、Azure 和自定义 OIDC 发行方的提供商表单。提供商可以让客户为特定 Vercel 项目的生产环境配置信任,然后无需从头构建配置界面和验证代码,即可根据该策略验证传入的令牌。

为您的服务生成信任策略表单和令牌验证代码。

复制链接到标题 减少安全认证的性能成本

静态密钥通过环境变量在函数运行时已可用,因此读取它无需网络请求。获取令牌或将其兑换为提供商凭证可能会增加网络延迟,因此减少这些调用是使安全认证实用化的关键部分。

Vercel Functions 在请求头中接收平台颁发的令牌,SDK 可以在不进行额外获取的情况下读取该令牌。平台会重复使用未过期的令牌,而 Vercel Connect 则在进程内缓存提供商令牌,并在接近过期时刷新。自定义受众和提供商兑换需要网络调用。

例如,应用程序可以使用 Azure SDK 通过临时凭证而非数据库密钥访问 Cosmos DB。当 Azure 配置为信任 Vercel 项目及其默认令牌受众时,回调会将 Vercel OIDC 令牌传递给 ClientAssertionCredential,后者将其兑换为 CosmosClient 使用的 Azure 访问令牌。

lib/cosmos.ts

code
1
import
{
getVercelOidcToken
}
from
'@vercel/oidc'
;
2
import
{
ClientAssertionCredential
}
from
'@azure/identity'
;
3
import
{
CosmosClient
}
from
'@azure/cosmos'
;
4
5
const
credentialsProvider
=
new
ClientAssertionCredential
(
6
process
.
env
.
AZURE_TENANT_ID
!
,
7
process
.
env
.
AZURE_CLIENT_ID
!
,
8
(
)
=>
getVercelOidcToken
(
)
,
9
)
;
10
11
const
cosmosClient
=
new
CosmosClient
(
{
12
endpoint
:
process
.
env
.
COSMOS_DB_ENDPOINT
!
,
13
aadCredentials
:
credentialsProvider
,
14
}
)
;

将 Vercel OIDC 令牌兑换为 Azure Cosmos DB 访问权限

复制链接到标题 给提供商提供支持安全认证的激励

Vercel 市场为第三方数据库、内容管理系统、可观测性工具等提供接入。我们的目标是让所有这些供应商都支持短期、基于身份的认证,无论他们是否直接接受 OIDC 令牌或将其兑换为临时凭证。我们正在努力实现当开发者连接服务时,集成会自动配置这种认证,无需额外的设置步骤。

HTTPS 的普及并非仅因易用性。Chrome 在普通 HTTP 上标注了“不安全”,并设定了截止日期。现在我们也在设定自己的期限。到 2026 年 11 月 30 日,不支持从 Vercel 到其服务的 OIDC 认证且使用长期密钥进行认证的供应商,其列表将出现类似的“不安全”提示。到 2027 年 1 月,不提供安全认证的供应商将被下架。我们将 Vercel API 和我们自己的原生集成同样置于这一标准之下。

复制链接到标题 从静态到动态

十五年前,加密每个请求似乎过于繁琐。如今,锁形标志如此常见,以至于我们只会在它缺失时注意到。服务间的安全认证应变得和它一样常规,让开发者能够连接所需系统而无需存储另一个长期密钥。从静态到动态的转变一直是 Vercel 的使命。它始于页面,现在扩展到了凭证。

复制链接到标题 附加资源

  • OIDC 联邦涵盖部署如何获取短期身份令牌,包含 AWS、GCP、Azure 和您自己的 API 的指南。
  • 自定义 OIDC 令牌受众将每个令牌限定到预期接收它的单一服务。
  • Vercel Connect 在运行时请求短期、限定范围的提供商令牌,因此代码和代理从不存储凭证。
  • Vercel Connect 指南逐步讲解如何构建此类代理,从 Slack 机器人到 GitHub 代理。

贡献者

Kevin Corbett