对 Multi-party Compute API 的每个请求都会通过两项单独的检查:对 API 方法的 Identity and Access Management 检查,以及对调用方的 Multi-party Compute 用户及其角色的检查。本页面介绍了这两项检查、IAM 权限以及管理员如何批准对用户角色的更改。
如何对请求进行授权
- IAM 检查。在请求到达实例之前,IAM 会检查调用主账号是否具有该方法对请求中的资源所需的权限。如果未通过,请求会失败并返回
403 PERMISSION_DENIED,且永远不会到达实例。该请求会记录在 Cloud Audit Logs 中。如需了解每种方法所需的权限,请参阅 IAM 权限。 - 用户和角色检查。对于代表用户执行操作的方法,实例会查找其
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。它不会恢复任何角色,也不需要审批。 |
审批流程如下:
- 管理员请求进行更改,并附上
authorizationInfo:使用其授权密钥对角色更改进行的签名。此请求算作首次审批。 - 其他管理员在 User 上调用
ApproveUser,每个管理员都有自己的签名。一次审批涵盖该用户的所有待处理角色变更。 - 当审批数量达到实例的管理员审批阈值时,用户的所有待处理角色更改将一并生效。批准信息存储在
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 Viewerroles/mpc.viewer |
上表中的 roles/mpc.viewer 权限:对每项资源的 get 和 list。 |
审计员和监控工具。 |
Multi-party Compute Editorroles/mpc.editor |
所有 roles/mpc.viewer 权限,以及上表中的 roles/mpc.editor 权限。 |
签名者和政策作者的主账号。实例接受哪种方法取决于用户的角色。 |
Multi-party Compute Adminroles/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." \
--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 范围的绑定不会授予对这些资源的访问权限。