准备工作:账号、权限与网络策略

说实话,很多人把密钥托管到KMS的第一步就搞错了。他们直接拿主账号的AccessKey去调接口,或者在代码里写死了密钥ID。嗯,这些都是我在项目里见过的事故现场。

准备工作做得好,后面能省掉80%的排障时间。今天我们就聊聊账号怎么规划、权限怎么切分、网络策略怎么配。这三件事做好了,你的密钥托管才算真正有了基础。

准备工作:账号 · 权限 · 网络策略 账号体系 权限配置 网络策略 主账号 vs 子账号 最小权限原则 KMS实例权限 密钥使用权限 VPC网段规划 公网访问控制 跨账号/跨VPC授权 VPC Peering / PrivateLink 密钥安全托管就绪

账号体系怎么搭?

我个人的习惯是:永远不要用主账号干活。主账号的权限太大了,一旦泄漏,整个云账号就完蛋。我在某金融客户那里就见过,主账号AccessKey被开发人员写到配置文件里,结果被扫出来了,幸好发现得早。

你应该创建一个专用的子账号,只用来管KMS。这个子账号不要关联到其他云产品,就盯着密钥生命周期那一亩三分地。

账号规划建议

  • KMS管理员账号:负责创建密钥、配置轮换、管理别名
  • 密钥使用者账号:只能调用加密、解密、生成数据密钥等API
  • 审计账号:只读,用来拉操作日志和密钥元数据

你想想看,这三个账号的权限等级是完全不同的。管理员账号一年可能只用几次,使用者账号天天跑在生产流水线上,审计账号则是被安全团队监控着的。千万别图省事用一套账号走天下。

权限配置的三个层次

权限这块,说白了就一句话:谁,在什么样的网络环境里,可以对这个密钥做什么操作。我习惯把权限切成三层来看:

权限层次 典型策略 我踩过的坑
账号级权限 IAM策略控制谁可以访问KMS服务 曾经给了一个开发人员KMS FullAccess…他删了一个生产密钥
实例级权限 谁可以管理KMS实例本身(配置、扩缩容) 忘了限制实例删除权限,运维手滑差点把测试实例删了
密钥级权限 谁可以使用/管理某个具体的密钥 跨账号授权时没配key policy,加密请求一直报AccessDenied

注意:我曾经历过一个事故——开发人员在测试环境用了一个「放任」的IAM策略,结果不小心调用 DeleteKey 把密钥删了,导致所有用这个密钥加密的备份数据全部不可读取。所以,非必要不给Delete权限,这是铁的纪律。

权限配置的标准步骤

我个人推荐按这个顺序来配:

  1. 先创建好子账号,并分配最小需要的IAM策略
  2. 在KMS实例上配置实例级别的访问控制
  3. 在目标密钥上配置Key Policy,允许哪些主体做什么操作
  4. 如果涉及跨账号,在资源策略中明确授权
{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Resource": "arn:acs:kms:cn-hangzhou:123456:key/your-key-id",
      "Condition": {
        "IpAddress": {
          "acs:SourceIp": ["10.0.0.0/8", "172.16.0.0/12"]
        }
      }
    }
  ]
}

上面这个策略,只允许来自内网网段的请求对特定密钥做加密、解密和生成数据密钥。既不会让密钥被误删,也不会被公网扫到。

网络策略:你的第一道防线

不管权限配得多精细,如果网络是敞开的,那一切都白搭。我见过不少团队,KMS实例直接绑定公网IP,然后靠着密码和AccessKey做防护。你想想看,只要密钥泄露一次,攻击者就能从全世界任何地方调用你的KMS。

实用建议:在VPC里给KMS实例分配内网IP,并通过 VPC Endpoint 或者 PrivateLink 提供服务。这样所有KMS流量都跑在阿里云的内网里,不会经过公网。

网络策略配置清单

配置项 推荐做法 不推荐的做法
VPC网段 使用RFC1918私网地址(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) 混用公网地址段
安全组/ACL 只允许需要的应用服务器访问;拒绝所有入方向公网流量 开放0.0.0.0/0
跨账号访问 使用VPC Peering + PrivateLink 直接暴露公网Endpoint
公网紧急通道 将KMS实例放在NAT网关或SLB后面,并严格限制源IP 直连公网IP

举个例子。我在一个异地容灾项目中,需要让杭州和上海机房的服务器都能访问同一个KMS实例。我们的做法是创建两个VPC,之间用VPC Peering打通,然后KMS实例只暴露内网IP。两边的服务器通过内网路由表就能找到KMS,全程不走公网。

核心原则:让应用服务器朝着KMS走「内网、最短路径、最小延迟」,同时让攻击者面对的是「黑洞」。
网络策略就是你的第一道物理防线,比IAM策略更底层。

跨账号授权怎么办?

这个场景在大型企业里特别常见。比如说,安全团队在一个账号里统一管理密钥,业务团队在另一个账号里跑应用。业务方需要调用安全团队托管的KMS来做加密解密。

我记得有个案例,两个团队跨账号调用KMS时报了AccessDenied。排查了半天,发现是他们在配置Key Policy时,把授权主体的ARN写成了用户ID,而不是角色ARN。这其实是个很细节的错误——跨账号授权时,主体必须写成RAM角色的ARN,不是用户的登录名。

总的来看,准备工作并不复杂,但每一条都有血的教训在背后。把账号切分开,权限一刀刀剁细,网络收进内网——这三件事做完,你的密钥托管才算站在了安全的地基上。