解释“IAM 条件角色”基于请求时间限制访问的实现方式。

解读

面试官问的是“IAM 条件角色”在时间维度上的访问控制落地细节,而不是泛泛地解释 IAM 本身。国内政企、金融客户上云时,普遍要求“夜间封网”“运维窗口期”等合规场景,因此必须说明:

  1. 条件角色如何与请求时间绑定;
  2. 条件表达式怎么写、放在哪;
  3. 对 Cloud SQL 生效的最小权限粒度
  4. 与中国区云审计(Cloud Audit Logs)的联动取证方式。
    答得太浅会被追问“如果客户端本地时间不对怎么办”;答得太深又容易跑题到 KMS 或 VPC-SC。因此要把
    时间条件
    说透,其余一句带过。

知识点

  1. IAM Condition 语法:以 request.time 为核心变量,支持timestamp 比较函数。
  2. 条件角色 = 预定义角色 + condition 字段;中国区项目同样支持,但需白名单开通条件角色功能(2023 下半年已全量)。
  3. Cloud SQL 支持的资源级 IAM:实例级 cloudsql.instances.connectcloudsql.instances.get不支持表级。
  4. 时间格式必须带时区,国内常用 Asia/Shanghai,否则会被GMT 偏移绕晕。
  5. 审计日志protoPayload.authorizationInfo 会原样记录条件评估结果,秒级延迟即可投递到 Log Service,满足等保 2.0 留存要求。
  6. 失效风险:如果用户通过已缓存的 OAuth2 令牌访问,令牌有效期 1 小时,条件角色只在令牌换取访问权限时评估一次,因此窗口边界需留 1 小时裕量

答案

在 Google Cloud 中国区项目中,先确保组织策略 iam.allowBindingWithCondition 已启用,然后给目标主账号授予带时间条件的角色,步骤如下:

  1. 选取最小权限角色,例如 roles/cloudsql.client(只读连接)。
  2. 在控制台或 gcloud 添加条件,表达式使用 request.time 变量:
    request.time >= timestamp("2024-07-15T08:00:00+08:00") &&
    request.time <  timestamp("2024-07-15T18:00:00+08:00")
    
    注意**+08:00**必须写,避免夏令时歧义。
  3. 绑定到 Cloud SQL 实例级资源,格式:
    gcloud projects add-iam-policy-binding my-project \
      --member="user:dev@company.cn" \
      --role="roles/cloudsql.client" \
      --condition="title=workday08to18,expression=request.time >= timestamp('2024-07-15T08:00:00+08:00') && request.time < timestamp('2024-07-15T18:00:00+08:00')"
    
  4. 验证:
    • 在窗口内使用 gcloud sql connect my-instance --user=dev 可登录;
    • 在窗口外同一命令会报 403 IAM DENIED,原因为 request.time 不满足条件;
    • 审计日志 protoPayload.status.code=7authorizationInfo.permission=cloudsql.instances.connect 记录详情,可供等保审计直接拉取。
  5. 若需周期重复,把日期抽离,改用周几函数:
    request.time.getDayOfWeek("Asia/Shanghai") >= 1 &&
    request.time.getDayOfWeek("Asia/Shanghai") <= 5 &&
    request.time.getHours("Asia/Shanghai") >= 8 &&
    request.time.getHours("Asia/Shanghai") < 18
    
    即可实现工作日 8:00-18:00自动生效,无需每天改策略。
  6. 最后提醒业务方:令牌缓存会导致边界 1 小时内仍可能访问,因此敏感运维需配合Cloud SQL 的维护窗口临时撤销令牌双保险。

拓展思考

  1. 多条件叠加:时间 + IP 段(origin.ip in '10.0.0.0/8')可做成“白天+办公网”双因子,满足金融公司合规要求。
  2. Terraform 模块化:把条件表达式写成变量,通过 google_project_iam_membercondition 块做多环境复用,避免人肉改策略。
  3. 与 PAM 对接:国内大行使用特权账号管理系统,可通过 Service Account 短令牌 + 时间条件,实现工单审批后自动下发 2 小时有效期,到期自动失效,零人工回收
  4. 失效演练:每季度做一次“时间边界突袭演练”,在 08:00:00 整点批量请求,确认无缓存穿透,并观察审计日志是否秒级拒绝,形成可交付客户的运维报告