安全和授权

对 Multi-party Compute API 的每个请求都会通过两项单独的检查:对 API 方法的 Identity and Access Management 检查,以及对调用方的 Multi-party Compute 用户及其角色的检查。本页面介绍了这两项检查、IAM 权限以及管理员如何批准对用户角色的更改。

如何对请求进行授权

  1. IAM 检查。在请求到达实例之前,IAM 会检查调用主账号是否具有该方法对请求中的资源所需的权限。如果未通过,请求会失败并返回 403 PERMISSION_DENIED,且永远不会到达实例。该请求会记录在 Cloud Audit Logs 中。如需了解每种方法所需的权限,请参阅 IAM 权限。
  2. 用户和角色检查。对于代表用户执行操作的方法,实例会查找其 principal 与调用方的经过身份验证的身份匹配的用户,并检查该用户的角色。例如,CreateTransaction 的调用方必须是具有 SIGNER 角色的用户。如需了解每种方法执行的检查,请参阅用户角色。

这两项检查都必须通过。IAM 角色和用户角色是互补的,例如:

  • 具有 roles/mpc.editor 但没有具有 POLICY_AUTHOR 角色的用户的主体可以调用 CreateTransactionPolicy,但实例会拒绝该请求。
  • 如果用户拥有 SIGNER 角色,但其主账号没有 mpc.googleapis.com/transactions.create,则无法创建事务,因为 IAM 会首先拒绝该请求。

审批也带有签名。签名者、政策作者和管理员使用其用户注册的授权密钥对每项审批进行签名。这可确保政策和交易不可篡改,并留下持久的审核跟踪记录。

参与者的可信执行环境 (TEE) 会在签署交易或接受交易政策之前验证这些签名,因此,即使请求通过了这两项检查,在没有有效批准的情况下,仍然无法生成签名。如需了解详情,请参阅安全模型。

用户角色

每个用户都具有以下角色之一,这些角色在 User.roles 中设置。此角色是实例中的角色,而不是 IAM 角色。

用户角色 用户可以执行的操作 检查时间
SIGNER 持有密钥共享并批准交易。仅属于一个团队。 CreateTransaction:调用方的用户必须具有 SIGNER 角色。
RecordSignerDecision:调用方的用户必须持有交易密钥的密钥共享。
ListTransactions:如果调用方的用户仅具有 SIGNER 角色,则系统仅返回用户持有密钥共享的密钥上的交易。
POLICY_AUTHOR 提议、批准和停用交易政策。 CreateTransactionPolicy、ApproveTransactionPolicy、DisableTransactionPolicy:调用方的用户必须是拥有已注册授权密钥的活跃政策作者。
ADMIN 管理用户、团队、KeyRing、密钥和 KeyList。批准对 ADMIN 和 POLICY_AUTHOR 角色的更改。 EnableUserRole、DisableUserRole、DisableUser、ApproveUser(针对 ADMIN 和 POLICY_AUTHOR 更改):请求必须带有调用管理员的签名。请参阅管理员审批角色变更。

以下规则适用于用户:

  • 每个用户一个主账号。User.principal 是在您创建用户时设置的,无法更改。它是 Google 账号或员工身份联合主账号。如需更改用户的主账号,请停用该用户并创建一个新用户。
  • 每个签名者一个团队。具有 SIGNER 角色的用户必须设置 Team。只有具有 SIGNER 角色的用户才能持有密钥共享,因此只有签名者属于团队。将签名者移至其他团队会使用 UpdateTeamAssignment,这需要重新共享,我们计划在后续版本中提供此功能。
  • 授权密钥。签名者和政策作者需要授权密钥才能对批准进行签名。管理员需要签名才能请求或批准对ADMIN和POLICY_AUTHOR角色的更改;管理签名者和团队不需要管理员签名。

每个角色的状态

状态 含义 用户能否使用该角色?
PENDING_ACTIVE 角色已授予,正在等待管理员批准。 否
ACTIVE 该角色已生效。 是
PENDING_DISABLED 正在移除该角色,等待管理员批准。 是,直到移除请求获得批准
DISABLED 该角色已被移除。它会继续列出,以便其审批记录保持可见。 否

管理员批准角色变更

管理员可以管理所有用户角色。授予或移除 ADMIN 或 POLICY_AUTHOR 角色需要多位管理员批准。授予或移除 SIGNER 角色时,只需一位管理员操作即可立即生效,无需管理员签名。仅凭 SIGNER 角色无法获得密钥访问权限;只有当管理员将签名者或其团队纳入 KeyRing 的密钥政策并创建密钥时,签名者才会收到密钥共享。

方法 对用户角色的影响
CreateUser 每个请求的 ADMIN 或 POLICY_AUTHOR 角色都从 PENDING_ACTIVE 开始。SIGNER会立即ACTIVE。
EnableUserRole 授予一个角色。ADMIN和POLICY_AUTHOR在 PENDING_ACTIVE 后开始;SIGNER立即ACTIVE。
DisableUserRole 移除一个角色。对于 ADMIN 和 POLICY_AUTHOR,ACTIVE 角色会变为 PENDING_DISABLED,PENDING_ACTIVE 角色会立即取消,无需审批。SIGNER 会立即变为 DISABLED。
DisableUser 通过一个请求移除用户的所有角色,并为所有 ADMIN 和 POLICY_AUTHOR 更改提供一个签名。
ApproveUser 记录一位管理员对用户待更改项的批准。
EnableUser 将已停用的用户恢复为 ACTIVE。它不会恢复任何角色,也不需要审批。

审批流程如下:

  1. 管理员请求进行更改,并附上 authorizationInfo:使用其授权密钥对角色更改进行的签名。此请求算作首次审批。
  2. 其他管理员在 User 上调用 ApproveUser,每个管理员都有自己的签名。一次审批涵盖该用户的所有待处理角色变更。
  3. 当审批数量达到实例的管理员审批阈值时,用户的所有待处理角色更改将一并生效。批准信息存储在 role_statuses.approval_info 中的用户对象上,并由参与者 TEE 进行验证。

以下规则适用于每项 ADMIN 和 POLICY_AUTHOR 更改:

  • 至少有两位活跃的管理员。如果某项更改会导致实例的活跃管理员数量低于管理员审批阈值,则该更改会失败,并显示 FAILED_PRECONDITION。实例始终至少有两位活跃管理员。角色为PENDING_DISABLED的管理员不计为活跃管理员。
  • 无自我审批。被更改的用户无法请求或批准自己的更改。此类请求会失败,并显示 PERMISSION_DENIED。
  • 每位管理员只能批准一次。如果管理员两次批准同一项更改,则第二次请求会失败,并显示 ALREADY_EXISTS。
  • 每个用户只能有一个待更改项。在更改处于待处理状态期间,启用角色的请求会失败,并返回 FAILED_PRECONDITION。停用角色的请求绝不会被屏蔽:停用操作会取消待处理的启用操作,并与任何待处理的停用操作合并为一个新的更改,其审批流程会重新开始。
  • 到期。如果某项更改在 approval_info.expire_time之前未获得足够多的批准,则该更改会过期,其角色会恢复到之前的状态。

在 v1beta API 中,如果用户持有密钥共享,您无法停用 SIGNER 角色,也无法停用该用户。替换签名者的密钥共享需要重新共享,这计划在后续版本中实现。

IAM 权限

下表列出了每个 v1beta 方法、其所需的 IAM 权限,以及包含该权限且权限最少的预定义角色。每个预定义角色还包含其前面角色的所有权限:roles/mpc.editor 包含 roles/mpc.viewer,roles/mpc.admin 包含 roles/mpc.editor。

资源 方法 权限 预定义角色
团队 CreateTeam mpc.googleapis.com/teams.create roles/mpc.admin
DeleteTeam mpc.googleapis.com/teams.delete roles/mpc.admin
GetTeam mpc.googleapis.com/teams.get roles/mpc.viewer
ListTeams mpc.googleapis.com/teams.list roles/mpc.viewer
用户 CreateUser mpc.googleapis.com/users.create roles/mpc.admin
UpdateUser mpc.googleapis.com/users.update roles/mpc.admin
EnableUserRole mpc.googleapis.com/users.enableRole roles/mpc.admin
DisableUserRole mpc.googleapis.com/users.disableRole roles/mpc.admin
ApproveUser mpc.googleapis.com/users.approve roles/mpc.admin
DisableUser mpc.googleapis.com/users.disable roles/mpc.admin
EnableUser mpc.googleapis.com/users.enable roles/mpc.admin
UpdateTeamAssignment mpc.googleapis.com/users.updateTeamAssignment roles/mpc.admin
GetUser mpc.googleapis.com/users.get roles/mpc.viewer
ListUsers mpc.googleapis.com/users.list roles/mpc.viewer
KeyRing CreateKeyRing mpc.googleapis.com/keyRings.create roles/mpc.admin
DeleteKeyRing mpc.googleapis.com/keyRings.delete roles/mpc.admin
GetKeyRing mpc.googleapis.com/keyRings.get roles/mpc.viewer
ListKeyRings mpc.googleapis.com/keyRings.list roles/mpc.viewer
键 CreateKey mpc.googleapis.com/keys.create roles/mpc.admin
DisableKey mpc.googleapis.com/keys.update roles/mpc.editor
GetKey mpc.googleapis.com/keys.get roles/mpc.viewer
ListKeys mpc.googleapis.com/keys.list roles/mpc.viewer
KeyList CreateKeyList mpc.googleapis.com/keyLists.create roles/mpc.admin
DeleteKeyList mpc.googleapis.com/keyLists.delete roles/mpc.admin
AddKeyListEntries mpc.googleapis.com/keyLists.addEntries roles/mpc.admin
RemoveKeyListEntries mpc.googleapis.com/keyLists.removeEntries roles/mpc.admin
GetKeyList mpc.googleapis.com/keyLists.get roles/mpc.viewer
ListKeyLists mpc.googleapis.com/keyLists.list roles/mpc.viewer
TransactionPolicy CreateTransactionPolicy mpc.googleapis.com/transactionPolicies.create roles/mpc.editor
ApproveTransactionPolicy mpc.googleapis.com/transactionPolicies.approve roles/mpc.editor
DisableTransactionPolicy mpc.googleapis.com/transactionPolicies.disable roles/mpc.editor
GetTransactionPolicy mpc.googleapis.com/transactionPolicies.get roles/mpc.viewer
ListTransactionPolicies mpc.googleapis.com/transactionPolicies.list roles/mpc.viewer
事务 CreateTransaction mpc.googleapis.com/transactions.create roles/mpc.editor
RecordSignerDecision mpc.googleapis.com/transactions.recordSignerDecision roles/mpc.editor
GetTransaction mpc.googleapis.com/transactions.get roles/mpc.viewer
ListTransactions mpc.googleapis.com/transactions.list roles/mpc.viewer

如需了解请求和响应详情,请参阅多方计算 API REST 参考文档。

预定义角色

角色 包含 适用于
Multi-party Compute Viewer
roles/mpc.viewer
上表中的 roles/mpc.viewer 权限:对每项资源的 get 和 list。 审计员和监控工具。
Multi-party Compute Editor
roles/mpc.editor
所有 roles/mpc.viewer 权限,以及上表中的 roles/mpc.editor 权限。 签名者和政策作者的主账号。实例接受哪种方法取决于用户的角色。
Multi-party Compute Admin
roles/mpc.admin
所有 roles/mpc.editor 权限,以及上表中的 roles/mpc.admin 权限。 管理员的主账号。

v1beta 资源没有自己的 IAM 政策。在包含实例的项目上授予角色,并使用 IAM Condition将角色范围缩小到密钥环。

建议为每种角色分配的权限

为每个人分配一个独特的主账号,即一个仅拥有所需角色的用户,并为其分配一个匹配的 IAM 角色:

角色 用户角色 IAM 角色
管理员 ADMIN roles/mpc.admin
政策作者 POLICY_AUTHOR roles/mpc.editor,或具有 transactionPolicies.* 权限的自定义角色
Signer SIGNER roles/mpc.editor,或具有 transactions.* 权限的自定义角色
审计者 无 roles/mpc.viewer

联合主账号还需要对使用方项目拥有 Service Usage Consumer 角色 (roles/serviceusage.serviceUsageConsumer)。如需了解详情,请参阅配置员工身份联合 (BYOID)。

自定义角色

如需仅向主账号授予其所需的权限,请创建自定义 IAM 角色。例如,以下角色允许签名者查看交易并批准或拒绝交易,但不能创建交易:

gcloud iam roles create mpcTransactionApprover \
  --project=PROJECT_ID \
  --title="MPC transaction approver" \
  --description="View MPC transactions and record signer decisions" \
  --permissions="mpc.googleapis.com/transactions.get,mpc.googleapis.com/transactions.list,mpc.googleapis.com/transactions.recordSignerDecision"

将 PROJECT_ID 替换为包含实例的项目 ID。

实例仍会检查调用方的 User:User 必须持有交易密钥的密钥共享,才能记录决策。

IAM Conditions

您可以使用资源名称上的 IAM 条件,将角色绑定范围缩小到一个 KeyRing 中的资源。例如,如果两个业务单位共用一个实例,并且每个单位都有自己的 KeyRing,则您可以仅向每个单位的签名者授予其各自 KeyRing 的 roles/mpc.editor 角色:

gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/mpc.editor" \
  --condition="expression=resource.name.startsWith('projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/keyRings/KEYRING_ID'),title=keyring-scoped-editor"

替换以下内容:

  • PROJECT_ID:包含实例的项目的 ID。
  • 将 SA_NAME 替换为服务账号的名称。
  • LOCATION:实例所在的区域。
  • INSTANCE_ID:实例的 ID。
  • KEYRING_ID:KeyRing 的 ID。

v1beta 资源名称不包含 /mpc/。从非公开预览版 (v1alpha1) 文档中复制的条件(例如 .../instances/INSTANCE_ID/mpc/keyRings/KEYRING_ID)与任何 v1beta 资源都不匹配。

用户、团队、KeyList 和事务政策属于实例,而不属于 KeyRing,因此 KeyRing 范围的绑定不会授予对这些资源的访问权限。