服务账户是机器身份访问云资源和调用API的凭证载体,其权限失控已经成为企业云安全事故的首要成因。据CyberArk《Identity Security Landscape Report》数据显示:68%的企业在过去一年经历过与机器身份相关的安全事件,其中42%归因于服务账户权限过宽或长期未回收。服务账户权限管理不是IAM配置文档里的一条规范条文,而是决定云上资产能否守住底线的关键工程环节。
服务账户是应用程序、容器、CI/CD流水线等非人类实体调用云API时使用的身份凭证,与人类账号的身份验证逻辑完全不同。人类账号依赖用户名密码加多因素认证,服务账户则通过密钥、短期令牌或托管身份完成认证,无法通过人工干预完成二次验证。服务账户一旦泄露,攻击者可以直接以该身份调用云API,绕过所有面向人类用户的安全控制。
梳理服务账户和人类账号的差异,可以用以下几组对比维度:
这些差异导致服务账户成为攻击者眼中的高价值目标。服务账户的权限设置往往只关注功能能否跑通,忽略最小权限原则的落地,一个只读权限的存储桶服务账户被篡改成写权限后,数据的完整性和保密性都会遭到破坏。
服务账户生命周期管理由五个环节构成:申请审批、认证配置、权限授予、使用审计、回收注销,任何一个环节缺失都会留下安全隐患。多数企业将精力集中在权限授予环节,忽略了回收注销,导致大量僵尸服务账户长期持有高权限。
实测数据可以说明问题的普遍性:据Conjur《Machine Identity Management Report》对300家企业云环境的调查显示,平均每个企业拥有约5700个服务账户,其中33%的账户在过去6个月内未被使用却依然保持有效权限。这些僵尸服务账户在云环境里就是潜伏的攻击跳板。
服务账户权限授予必须遵循先审批后授予、先最小后扩展的原则。在云平台中,创建服务账户时首先要明确其业务用途,比如读取某存储桶内数据、触发某函数执行、写日志到指定日志组。权限策略需按资源维度拆分,禁止使用通配符资源如arn:aws:s3:::example-bucket/*这类星号授权。
下面给出一个最小权限策略的配置示例,以授权服务账户仅能读取指定存储桶为场景:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::assets-bucket/config/*"
}
]
}这个策略仅允许读取assets-bucket下config路径的对象,不包含列举桶、删除对象或写入权限。与直接授予s3:*或AdministratorAccess相比,这种按路径限定的策略缩小了攻击面。配置完成后还应通过IAM策略模拟器验证实际生效的权限范围,防止策略叠加导致的隐式放行。
密钥轮换是控制服务账户风险的核心手段,长期不轮换的密钥等同于永久有效的后门。云服务商提供的托管密钥服务应作为首选,它能实现自动轮换和短期令牌签发。自建密钥管理系统时,密钥的存储位置决定泄露风险的高低。
常见的密钥保管方式风险各有不同,以下表格整理了不同存储方式的安全特性和建议适用场景:
| 存储方式 | 泄露风险 | 轮换支持 | 适用场景 |
|---|---|---|---|
| 云托管密钥服务(Secrets Manager等) | 低 | 自动 | 所有云原生应用 |
| 环境变量明文 | 高 | 手动 | 仅限临时调试,禁止生产 |
| 配置文件明文 | 极高 | 手动 | 任何场景都不建议 |
| KMS加密后存储 | 中 | 手动 | 离线任务或本地服务 |
服务账户密钥的轮换周期应当与云平台API调用频率相匹配。长期运行的流水线服务账户建议每90天轮换一次,高频调用的生产服务可结合短期令牌机制将有效时间压缩到15分钟以内。发布在公开仓库中的任何代码都要经过密钥扫描工具检测,防止硬编码密钥流入外部。
服务账户审计的核心目标是识别权限过宽和从未使用的账户,审计频率至少每季度一次。审计过程需要结合云平台访问日志和权限列表,逐一核对每个服务账户是否存在实际调用记录,并将未使用的账户标记为待回收状态。
权限收敛的标准动作包括:移除附加在服务账户上的管理策略、删除超过90天未使用的长期密钥、将服务账户关联角色切换为更细粒度的自定义策略。这些操作执行前需要在测试环境验证功能是否正常,避免因权限不足导致线上服务中断。
服务账户的权限收效与人类账号的权限收效存在一处关键区别:人类账号离职后权限即时失效,而服务账户归属于应用系统,即使应用已经下线,如果云资源没被清理,服务账户依然存活。因此,设置服务账户时就要绑定负责人标签和用途标签,审计时通过标签追溯归属方,确定服务是否仍在运行。
服务账户和API密钥都承载机器身份认证,但二者的适用边界不同。服务账户适合云资源访问和跨服务调用,API密钥更适合外部系统对接和第三方服务认证。将两者混用会造成权限模型混乱,攻击者可以从一个API密钥获取多个服务账户权限的直接通道。
正确的取舍标准是依据调用方所处网络边界来判断:同云账号下的服务间调用优先使用服务账户,跨账号或跨企业的API对接使用独立API密钥并在网关层限制调用来源IP。项目中同时存在服务账户和API密钥时,需要通过名称前缀明确区分,例如svc-代表服务账户,api-代表API密钥,这样在日志审计时就能快速定位身份的认证方式。
一次服务账户密钥被提交到公开GitHub仓库的事故,完整展示了失控后的连锁反应。攻击者在仓库提交记录中检索到密钥后,用该密钥调用了云平台API,枚举出服务账户绑定的所有存储桶权限,随后批量下载了桶内的业务数据。从密钥泄露到数据落地,整个过程不到40分钟。
该案例中的三个关键错误具有普遍性:服务账户绑定了s3:*通配权限、密钥从未设置轮换策略、对应的存储桶没有开启访问日志记录。如果该服务账户遵循了最小权限策略,攻击者只能读取特定前缀下的对象,且无法通过列举操作发现其他桶的存在;如果密钥有短期有效期,攻击者拿到的令牌在下载数据前就已过期。
应急响应的首要动作是立即吊销密钥,而不是删除服务账户本身。吊销后保留审计记录,通过云平台的访问日志回溯攻击者的所有API调用行为,确定数据泄露范围。完成溯源后重建服务账户,使用新密钥并绑定与业务完全匹配的权限策略,同时排查GitHub历史记录确认是否存在其他密钥。
服务账户治理最终要落到可执行的基线要求上,以下三项基线可以作为云环境安全策略的最低门槛。第一,所有服务账户必须使用云托管密钥服务存储凭据,禁止明文密钥出现在配置文件和代码仓库。第二,服务账户权限策略必须按资源前缀限定,严禁使用覆盖全资源的通配符授权。第三,每季度执行服务账户清理,未使用超过90天的账户立即禁用并在30天后删除。
云环境中服务账户数量会随微服务架构的推广持续增长,靠人工维护权限清单不可持续。将服务账户的申请、审批、发放、审计流程接入基础设施即代码流水线,通过代码评审管控权限变更,才能让安全控制跟上应用迭代的速度。服务账户本身不是风险,松散的权限管理和缺失的生命周期机制才是云上资产失守的根因。
评论
加载中...