如何理解Google Cloud的ServiceAccount、Role和Policy等概念

原创 吴就业 102 0 2024-07-04

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/36a75f9513ac4b26807ddab4c231ec6a

作者:吴就业
链接:https://wujiuye.com/article/36a75f9513ac4b26807ddab4c231ec6a
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

这些云平台搞的权限控制是真难理解,搞得好复杂。这篇写给刚接触Google Cloud的开发者,介绍一下如何快速理解Google Cloud的IAM的一些概念。

Google Cloud的IAM有服务账号(ServiceAccount)、角色(Role)、权限(Permissions)的概念。

一个ServiceAccount可以理解是一个子账号,ServiceAccount是归属到项目(Project)下面的, 每个项目的ServiceAccount是隔离的。

角色,也是归属到项目下的,角色可以被赋予很多权限(Permissions)。

截屏2024-07-04 16.15.24

最后,通过给服务账号分配角色来授权账号相关权限。怎么分配呢?每个服务账号都有一个IAM策略(Policy), 每个IAM策略都可以配置很多Binding,每个Binding用来给账号的IAM策略绑定一个角色。

角色也是可以自定义的,当Google Cloud提供的角色不满足我们对资源粒度的控制的时候,就可以使用自定义角色。

func CreateRoles(ctx context.Context, roleId string, includedPermissions []string) (*iam.Role, error) {
    var iamSvc *iam.Service
    // ....
    return iamSvc.Projects.Roles.Create(fmt.Sprintf("projects/%s", project),
       &iam.CreateRoleRequest{
          RoleId: roleId,
          Role: &iam.Role{
             Name:                roleId,
             IncludedPermissions: includedPermissions,
          },
       }).Do()
}

如果需要细粒度的控制权限,比如针对资源的实例级别,那么可以通过资源的IAM策略配置。

例如,给一个ServiceAccount赋予一个Cloud Storage的bucket实例的Admin权限。

当我们创建出一个Cloud Storage的bucket实例的时候,这个bucket就有了默认的IAM策略(Policy)。我们只需要给这个bucket的Policy添加一个Binding。

func TestAuthBucketAdminToServiceAccount(t *testing.T) {
     serviceAccountEmail := "[email protected]"
     var storageSvc *storage.Service
    // ....
    saMember := fmt.Sprintf("serviceAccount:%s", serviceAccountEmail)
    roleId := "roles/storage.admin" 
    // 获取云产品实例的IAM策略(产品创建就有)
    instanceName := "gcf-v2-sources-295403105839-us-central1"
    policy, err := storageSvc.Buckets.GetIamPolicy(instanceName).Do()
    if err != nil {
       t.Errorf(err.Error())
       return
    }
    policy.Version = 3
    // 添加条件限制 (不是必须的)
    condition := &storage.Expr{
       Title:       "Nebula Integrations Resource Admin Condition",
       Description: "This is a condition automatically added by google-cloud-nebula-integration.",
       Expression: ${表达式},
    }
    // 存在绑定则修改绑定的条件
    found := false
    for _, binding := range policy.Bindings {
       if util.ArrayContains(binding.Members, saMember) {
          found = true
          binding.Role = roleId
          binding.Condition = condition // (不是必须的)
       }
    }
    if !found {
       // 添加绑定到IAM策略
       newBinding := &storage.PolicyBindings{
          Role:      roleId,
          Members:   []string{saMember},
          Condition: condition, // (不是必须的)
       }
       policy.Bindings = append(policy.Bindings, newBinding)
    }
    // 更新IAM策略
    updatePolicy, err := storageSvc.Buckets.SetIamPolicy(instanceName, policy).Do()
    fmt.Println("update policy:", updatePolicy, err)
}

我们找到桶实例,查看桶的详情,找到权限。

截屏2024-07-04 16.11.35

不出意外我们就能找到上面代码添加的Bindings。

截屏2024-07-04 16.11.24

问:此案例中的角色id是从哪里来的?

从“IAM和管理”->“角色”找的。

截屏2024-07-04 16.14.40


本篇文章涉及的相关API:

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

cloud.google.com/go/cloudsqlconn 创建数据库实例Ipv4Enabled设置为false无效

创建或更新数据库实例设置Ipv4Enabled为false时无效,不管设置true或false,最终的效果都是true。

Google Cloud如何给ServiceAccount授予资源细粒度的权限控制

Google Cloud如何给ServiceAccount授予资源细粒度的权限控制?介绍如何在控制台上配置,然后介绍如何通过API写代码配置。

技术的成长其实是被逼出来的

如何提升解决问题的能力,那一定是在实战中成长,经历-挑战-总结,不断的训练。

关于mount踩的一些坑

关于mount命令使用遇到的一些问题,以及如何解决。

原创被抄袭,付费专栏变免费,版权问题如何解决?

我最痛恨的事情还是发生了,我的付费专栏被抄了,付费变免费。