
随着团队规模扩大和无服务器工作负载的增长,安全管理变得与代码管理同等重要。DigitalOcean 的目标是在您的每个发展阶段都提供支持。我们持续迭代安全架构,正是实现这一目标的方式之一。
过去,DigitalOcean Functions(云函数) 在同一个 namespace(命名空间)内采用共享凭证模型,凭证在Functions的「设置」标签页中进行配置。

图:同一命名空间的所有用户共享相同的凭证
这种模式虽然上手简单,但对不断壮大的团队来说存在挑战:当团队成员离职或转岗时,共享凭证仍然有效。为了确保命名空间安全,管理员必须手动撤销并重新生成密钥,这会干扰其他所有使用该共享密钥的开发者和生产工作负载。
今天,DigitalOcean 宣布了一个重大升级:用户专属命名空间访问密钥(user-specific namespace access keys)。
这一更新将访问控制从命名空间级别下沉到用户身份级别,确保权限授予给具体用户,而不再依赖共享密钥。
用户专属访问密钥如何增强安全性
向用户专属密钥的转变解决了团队的几个关键场景:
-
自动化访问管理:当团队成员从 DigitalOcean 团队中移除时,平台会自动撤销其专属访问密钥。无需手动轮换密钥,也不会对剩余团队成员造成任何干扰。
-
每个命名空间支持多个密钥:用户可以为同一命名空间创建多个访问密钥,便于手动轮换和管理不同环境的密钥。
-
简化责任追溯:由于操作现在与独特的用户专属密钥关联,您可以更好地了解资源管理情况并进行审计。
-
支持过期时间:为了进一步缩小攻击面,访问密钥可以「选择性地」设置过期时间(TTL)。过期后,该密钥将无法通过任何操作的认证。
教程:通过 API 管理 Functions 访问密钥
DigitalOcean Functions API 已更新,支持以编程方式管理访问密钥。您现在可以直接通过 API 创建、列出、更新和删除访问密钥,从而实现无服务器命名空间的更好自动化和安全管理。
以下是与新端点交互的指南。本教程使用 Bash 脚本完成。
前置条件
- 需要您的 Functions 命名空间 ID(在 API 路径中显示为
fn-xxxxxxx)。 - 必须拥有有效的 DigitalOcean API Token(令牌)
($DIGITALOCEAN_TOKEN),并具有function:admin权限。
1. 创建命名空间访问密钥
要生成新的访问密钥,向密钥端点发送 POST 请求。
重要提示:访问密钥的密钥部分仅在创建后立即返回一次。您必须复制并安全存储,之后将无法再次获取。
请求:
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
-d '{"name": "my-function-access-key", "expiration": "12h"}' \
"https://api.digitalocean.com/v2/functions/namespaces/fn-xxxxxxx/keys"
响应要点:
- 返回完整的密钥详情,包括
secret。 - 包含
created_at和expires_at等元数据。
2. 列出访问密钥
要查看特定命名空间的所有现有密钥,使用 GET 端点。这有助于审计当前的访问凭证。
请求:
curl -X GET \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
"https://api.digitalocean.com/v2/functions/namespaces/fn-xxxxxxx/keys"
响应要点:
- 返回
access_keys对象列表。 - 包含找到的密钥总数
count。
3. 更新访问密钥
如果需要重命名密钥(例如,为了轮换用途但暂时不删除),可以向特定密钥 ID 发送 PUT 请求。
请求:
curl -X PUT \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
-d '{"name": "updated-key-name"}' \
"https://api.digitalocean.com/v2/functions/namespaces/fn-xxxxxxx/keys/dof_v1_yyyyyyyy"
响应要点:
- 返回更新后的访问密钥对象,包含新的
name。 - 不会返回密钥。
4. 删除访问密钥
要撤销访问权限,可以使用 DELETE 方法永久删除密钥。
请求:
curl -X DELETE \
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
"https://api.digitalocean.com/v2/functions/namespaces/fn-xxxxxxx/keys/dof_v1_yyyyyyyy"
响应要点:
- 成功删除将返回
204 No Content状态码。
教程:通过 doctl 管理访问密钥
您可以通过云控制面板或命令行管理这些访问密钥。下面,我们将介绍使用 doctl(DigitalOcean command line interfece) 的workflow。
前置条件
要跟随本教程并迁移到新密钥系统,您需要:
- 已安装 doctl:确保已安装并配置最新版本的 DigitalOcean CLI
(doctl)。 - 权限:必须具有
function:admin权限才能创建或管理命名空间访问密钥。
1. 创建新访问密钥
您可以为每个命名空间创建多个访问密钥,将本地开发、CI/CD 流水线和生产应用的凭证分开。
要在当前连接的命名空间中创建密钥,使用以下命令:
doctl serverless key create --name my-dev-key --expiration 7d
输出将显示您的新密钥。
ID Name Secret
dof_v1_a1b2c3d4e5f67890 my-dev-key /1x2y3z4a5b6c7d8e9f0g1h2i3j4k5l6m
注意:新访问密钥遵循特定格式,前缀为 dof_v1_。
2. 连接您的唯一身份
生成密钥后,需要使用这个新身份将 doctl 连接到您的命名空间。这取代了无需显式密钥即可连接的已弃用方法。
运行以下命令将 CLI 链接到您的命名空间:
doctl serverless connect <your-namespace> --access-key "<access-key-id>:<secret-key>"
连接后,您的个人凭证将安全存储在本地配置中。所有后续命令(如 deploy、invoke 和 list)将自动使用您的唯一密钥进行认证。
3. 删除访问密钥
如果密钥不再需要(例如,需要轮换 CI/CD 令牌),可以将其删除。这将撤销其访问权限,而不会影响您的其他密钥或团队成员。
doctl serverless key delete <access-key-id>
注意:此操作是永久性的,将立即阻止使用该凭证进行认证。
用户专属访问密钥的迁移和过渡时间表
我们目前处于双支持阶段。这意味着:
-
宽限期:在有限时间内,旧版共享凭证和新版用户专属密钥将并行工作。您可以在DigitalOcean英文文档中找到有关迁移截止日期的更多信息。
-
需要采取行动:为确保持续访问,每个用户最终必须迁移到自己的个人访问密钥。如果通过 doctl 交互,需要重新运行 doctl serverless connect 命令。此外,如果您在系统中的任何地方硬编码了旧密钥/令牌,需要将它们替换为您或团队中任何其他用户账户下创建的访问密钥。
-
无需修改代码:这是平台级别的认证更新。您无需修改实际的函数代码。
我们建议管理员/所有者立即开始为团队中的所有用户跟踪此过渡,以防止旧方法停用后出现访问问题。
DigitalOcean Functions 更安全的未来
向用户专属访问密钥的转变是 DigitalOcean Functions 安全性和可管理性的重要进步。通过将访问权限与个人身份关联,我们实现了自动访问撤销、更好的可审计性,以及更安全的无服务器应用环境。



