为服务帐号授予角色

授予 IAM 角色时,您可以将服务帐号视为资源身份

您的应用使用服务帐号作为身份来向 Google Cloud Platform 服务进行身份验证。举例来说,如果您将 Compute Engine 虚拟机 (VM) 作为服务帐号运行,则可以为该服务帐号(身份)授予项目(资源)的编辑者角色。

同时,您可能还需要控制谁可以启动虚拟机。为此,您只需为用户(身份)授予服务帐号(资源)的 serviceAccountUser 角色即可。

如需了解服务帐号的信息以及更多将服务帐号作为资源和身份使用的示例,请参阅服务帐号

使用本指南的前提条件

  • 如果您想使用本指南中的命令行示例,请安装 gcloud 命令行工具

  • 如需查看您可以为服务帐号授予的预定义角色列表,请参阅了解角色

为服务帐号授予特定资源的角色

您可以为服务帐号授予角色,让该服务帐号有权对 Cloud Platform 项目中的资源完成特定操作。例如,您可以将 storage.admin 角色授予服务帐号,使其拥有 Google Cloud Storage 中对象和存储分区的控制权。

如需为服务帐号授予角色,请使用以下其中一种方法:

Console

您可以像管理项目中的用户角色那样,管理服务帐号的角色。

  1. 在 Cloud Console 中打开 IAM 和管理页面。

    打开“IAM 和管理”页面

  2. 点击选择项目,然后选择一个项目并点击打开

  3. 确定要向其添加角色的服务帐号。

    • 如果该服务帐号不在成员列表中,则表明还没有为它分配任何角色。点击添加,然后输入该服务帐号的电子邮件地址。
    • 如果该服务帐号已在成员列表中,则表明该帐号已被分配角色。如需修改服务帐号的角色,请点击修改 按钮。
  4. 选择一个或多个要应用于该服务帐号的角色。

  5. 点击保存以将角色应用于服务帐号。

gcloud

向单个服务帐号添加角色。

gcloud projects add-iam-policy-binding my-project-123 \
  --member serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com \
  --role roles/editor

该命令会输出更新后的政策:

bindings:
- members:
  - user:email1@example.com
  role: roles/owner
- members:
  - serviceAccount:our-project-123@appspot.gserviceaccount.com
  - serviceAccount:123456789012-compute@developer.gserviceaccount.com
  - serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com
  - user:email3@example.com
  role: roles/editor
- members:
  - user:email2@example.com
  role: roles/viewer
etag: BwUm38GGAQk=
version: 1

如需了解如何为服务帐号(作为身份)授予项目的访问权限,请参阅授予、更改和撤消项目成员的访问权限

API

以下 POST 请求使用 projects.setIamPolicy() 方法,向服务帐号 my-sa-123 授予项目 my-project-123 的编辑者权限。请求正文必须包含为服务帐号授予权限的新政策。每个角色可以包含多个成员。

POST https://cloudresourcemanager.googleapis.com/v1/projects/my-project-123:setIamPolicy

{
    "policy":
    {
        "version": 1,
        "etag": "BwUqMvZQGfo=",
        "bindings": [
        {
            "role": "roles/editor",
            "members": [
                "serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com",
                "user:robin@example.com"
            ]
        },
        {
            "role":"roles/owner",
            "members":
            [
                "user:hollis@example.com",
            ]
        },
        {
            "role":"roles/viewer",
            "members":
            [
                "user:john@example.com",
            ]
        },
        {
            "role":"roles/iam.serviceAccountUser",
            "members":
            [
                "user:robin@example.com"
            ]
        },
        ]
    },
}

响应中包含新政策:

{
    "version": 1,
    "etag": "BwUqMvZQGfo=",
    "bindings": [
    {
        "role": "roles/editor",
        "members": [
            "serviceAccount:my-sa-123@my-project-123.iam.gserviceaccount.com",
            "user:robin@example.com"
        ]
    },
    {
        "role":"roles/owner",
        "members":
        [
            "user:hollis@example.com",
        ]
    },
    {
        "role":"roles/viewer",
        "members":
        [
            "user:john@example.com",
        ]
    },
    {
        "role":"roles/iam.serviceAccountUser",
        "members":
        [
            "user:robin@example.com"
        ]
    },
    ]
}

查看授予服务帐号的角色

您可以像查看项目中用户的角色一样查看服务帐号的角色:

  • 在 Cloud Console 中打开“IAM”页面。

    打开 IAM 页面

  • 点击选择项目
  • 选择您的项目,然后点击打开
  • 在与项目关联的成员列表中找到您的服务帐号。这些服务帐号的角色将列在角色列中。

配置服务帐号的所有权和访问权限

您可以将服务帐号的所有权和访问权限提供给特定用户,方法是将服务帐号视为资源(而非身份)。本节中的步骤将服务帐号视为资源。如需详细了解每种使用类型之间的差异,请参阅服务帐号主题。

具有原初项目所有者和项目编辑者角色的用户可以修改服务帐号,但您可能希望允许某些用户仅对服务帐号资源执行特定操作。

要为服务帐号授予用户权限,请使用以下方法之一:

控制台

  1. 在 Cloud Console 中打开 IAM 和管理页面。

    打开“IAM 和管理”页面

  2. 点击选择项目,然后选择一个项目并点击打开

  3. 在左侧导航栏中,点击服务帐号

  4. 选择一个服务帐号,然后点击显示信息面板。系统会显示所有可以访问该服务帐号的用户。

  5. 点击添加成员

  6. 添加项目成员的电子邮件地址。

  7. 为该成员选择一个角色以定义该成员可以对服务帐号执行的操作。

  8. 点击添加,将此角色应用于该项目成员。

gcloud

更新整个政策

首先,获取您要修改的政策,并将其写入 JSON 文件。您可以使用 --format 标志来选择输出格式(可用的输出格式为 JSON、YAML 和文本)。本页面上的其他示例使用默认的文本输出格式,但此示例将输出写入 JSON 文件 (policy.json),以便在设置现有政策之前修改该政策。

gcloud iam service-accounts get-iam-policy \
  my-sa-123@my-project-123.iam.gserviceaccount.com \
  --format json > policy.json

请注意,此命令仅会返回已在服务帐号上设置的政策。如果未在服务帐号上设置任何现有政策,则 JSON 文件包含默认的 ETag 值,不包含其他任何内容。

如果不存在现有政策,您可以按照以下步骤设置具有单个绑定的新政策,或者在以下步骤中使用 JSON 手动创建政策以将其作为模板。

如果政策已经生效,则输出 policy.json 文件的内容将类似如下所示:

{
  "bindings": [
    {
      "members": [
        "user:hollis@example.com"
      ],
      "role": "roles/owner"
    }
  ],
  "etag": "BwUqLaVeua8="
}

接着,使用文本编辑器向 bindings 数组添加一个新对象(用于定义群组成员及其角色),以修改 policy.json 文件。如果 bindings 数组不存在,请创建一个。要将 serviceAccountUser 角色授予 robin@example.com,您需要更改上述示例,如下所示:

{
    "bindings": [
    {
        "role": "roles/iam.serviceAccountUser",
        "members": [
            "user:robin@example.com"
        ]
    },
    {
        "role": "roles/owner",
        "members": [
            "user:hollis@example.com"
        ]
    }
    ],
    "etag": "BwUqLaVeua8="
}

最后,运行以下命令来更新该政策:

gcloud iam service-accounts set-iam-policy \
  my-sa-123@my-project-123.iam.gserviceaccount.com policy.json

该命令会输出更新后的政策:

bindings:
- members:
  - user:robin@example.com
  role: roles/iam.serviceAccountUser
- members:
  - hollis@example.com
  role: roles/owner
etag: BwUjMhXbSPU=
version: 1

添加单个绑定

您可以通过运行以下命令将单个绑定添加到新政策或现有政策中:

gcloud iam service-accounts add-iam-policy-binding \
  my-sa-123@my-project-123.iam.gserviceaccount.com \
  --member='user:jane@example.com' --role='roles/editor'

该命令会输出更新后的政策:

bindings:
- members:
  - user:robin@example.com
  role: roles/iam.serviceAccountUser
- members:
  - user:hollis@example.com
  role: roles/owner
- members:
  - user:jane@example.com
  role: roles/editor
etag: BwUqKjVeua8=
version: 1

移除单个绑定

您可以通过运行以下命令从现有政策中移除单个绑定:

gcloud iam service-accounts remove-iam-policy-binding \
    my-sa-123@my-project-123.iam.gserviceaccount.com \
    --member='user:jane@example.com' --role='roles/editor'

该命令会输出更新后的政策:

bindings:
- members:
  - user:robin@example.com
  role: roles/iam.serviceAccountUser
- members:
  - user:hollis@example.com
  role: roles/owner
etag: BwUqNkVeua8=
version: 1

API

请求:

POST https://iam.googleapis.com/v1/projects/my-project-123/serviceAccounts/my-sa-123@my-project-123.iam.gserviceaccount.com:setIamPolicy

请求正文必须包含要授予的政策:

{
    "policy":
    {
        "etag": "BwUqLaVeua8=",
        "bindings": [
        {
            "role": "roles/iam.serviceAccountUser",
            "members": [
                "user:robin@example.com"
            ]
        },
        {
            "role": "roles/owner",
            "members": [
                "user:hollis@example.com"
            ]
        }
        ]
    },
}

响应中包含更新后的政策:

{
    "etag": "BwUqMqbViM8=",
    "bindings": [
    {
        "role": "roles/iam.serviceAccountUser",
        "members": [
            "user:robin@example.com"
        ]
    },
    {
        "role": "roles/owner",
        "members": [
        "user:hollis@example.com"
        ]
    }
    ]
}

查看服务帐号的现有角色

由于服务帐号可视为资源,因此该帐号会像其他 Google Cloud 资源一样拥有 Cloud IAM 政策。在这种情况下,若要查看已在指定服务帐号中获授角色的成员,请使用 serviceAccounts.getIamPolicy() 方法、Cloud Console 或 gcloud 工具来获取服务帐号的 Cloud IAM 政策。

控制台

  1. 在 Cloud Console 中打开 IAM 和管理页面。

    打开“IAM 和管理”页面

  2. 点击选择项目,然后选择一个项目并点击打开。该页面现在会列出此项目的所有用户及其对应的角色。

  3. 在左侧导航栏中,点击服务帐号

  4. 选中所需服务帐号旁边的复选框,然后点击显示信息面板。系统会显示已授予该服务帐号的角色列表。展开每个角色即可查看已被授予该服务帐号角色的成员。

gcloud

如需获取服务帐号的政策,请运行以下命令:

gcloud iam service-accounts get-iam-policy \
    my-sa-123@my-project-123.iam.gserviceaccount.com

系统输出的政策如下所示:

bindings:
- members:
  - user:hollis@example.com
  role: roles/owner
- members:
  - user:robin@example.com
  role: roles/iam.serviceAccountUser
etag: BwUqLaVeua8=
version: 1

如果您尚未将角色分配给服务帐号,则输出将只显示 ETag 值。

API

以下代码段可获取服务帐号 my-sa-123@my-project-123.iam.gserviceaccount.com 的 IAM 政策。

请求:

POST https://iam.googleapis.com/v1/projects/my-project-123/serviceAccounts/my-sa-123@my-project-123.iam.gserviceaccount.com:getIamPolicy
Response:

{
    "etag": "BwUqLaVeua8=",
    "bindings": [
    {
        "role": "roles/iam.serviceAccountUser",
        "members": [
            "user:robin@example.com"
        ]
    }
    ]
}

如果您尚未向服务帐号分配角色,则响应将只包含 Etag 值。

如需详细了解 IAM 政策,请参阅政策