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

原创 吴就业 96 0 2024-07-08

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

本文链接:https://wujiuye.com/article/f6237b0697ed4856b2ac439ed17f28ed

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

继上篇:“如何理解Google Cloud的ServiceAccount、Role和Policy等概念”,本篇继续聊聊Google Cloud如何给ServiceAccount授予资源细粒度的权限控制。举例:如何给一个ServiceAccount授权Cloud SQL Admin角色,并且只允许操作某个Mysql实例。

首先介绍如何在控制台上配置,然后介绍如何通过API写代码配置。与前一篇相比,本篇介绍的是另一个通用的API,也是笔者踩的坑。

我们打开Google Cloud控制台,转到IAM和管理->IAM下,如下图:

截屏2024-07-08 17.47.00

点击授予访问权限,我们会看到下面的侧边弹窗。

截屏2024-07-08 17.46.46

在“新的主账号”输入需要被授权的ServiceAccount账号,然后点击添加其它角色,然后选择Cloud SQL Admin角色,这样就可以给ServiceAccount授权了Cloud SQL Admin角色,这个ServiceAccount就有了Cloud SQL Admin角色拥有的权限。

然而,这样粒度太粗了,这个ServiceAccount将能操作所有的Mysql实例。

那么怎么限制只能操作某个实例呢?点击角色右边的IAM条件编辑图标,给这个授权添加一个条件。

截屏2024-07-08 15.10.03

首先给条件取个名称,然后在条件编辑器输入条件表达式,如图中:resource.name=="资源name",这里我们填mysql实例的资源名称。

以上所有步骤都保存后,这个授权就生效了。

那么对应的代码怎么写呢?

上一篇文章我们也介绍了如何给资源实例授权,并用Cloud Storage的Buckets实例来举例。根据Google Cloud的文档介绍,要管理对资源的访问权限,我们应该使用资源的GetIamPolicy、SetIamPolicy接口,例如:

// Cloud Storage 伪代码
	var svc2 *storage.Service
	svc2.Buckets.GetIamPolicy()
	svc2.Buckets.SetIamPolicy()

除了Cloud Storage支持,Pub/Sub也支持,例如:

// Pub/Sub 伪代码
  var svc *pubsub.Service
	svc.Projects.Topics.GetIamPolicy()
	svc.Projects.Topics.SetIamPolicy()

但,Mysql、Redis等资源并不提供这样的API。

那Mysql、Redis等资源怎么授权呢?

根据在Google Cloud控制台的操作,通过浏览器控制台debug,我们找到添加条件调用的接口传的body是:

{"fullResourceName":"//cloudresourcemanager.googleapis.com/projects/infrastructure-xxxx","condition":{"title":"tets","description":null,"expression":"resource.name == \"ddd\""}}

然后顺藤摸瓜找到了cloud resource manager,然后根据官方文档”Resource Manager“我们找到了对应的接口。

        crmSvc,err := cloudresourcemanager.NewService(ctx,option.WithTokenSource(tokenSource))
        // .....

        resource := "projects/xxxxxxxx/instances/gcni-mysql-test"
        role := "roles/cloudsql.admin"
        serviceAccountEmail:=""
        projectId := "xxxxxxxx"
	
	// GetIamPolicy
	policy, err := crmSvc.Projects.GetIamPolicy(projectId, &cloudresourcemanager.GetIamPolicyRequest{
	}).Context(ctx).Do()

	if err != nil {
		return err
	}
 
        // 绑定角色
	policy.Bindings = append(policy.Bindings, &cloudresourcemanager.Binding{
		Condition: &cloudresourcemanager.Expr{
			Expression: fmt.Sprintf("resource.name == \"%s\"", resource),
			Title:      "auto-add-" + util.MD5String(resource),
		},
		Members: []string{
			fmt.Sprintf("serviceAccount:%s", serviceAccountEmail),
		},
		Role: role,
	})

        // SetIamPolicy
	_, err = crmSvc.Projects.SetIamPolicy(projectId, &cloudresourcemanager.SetIamPolicyRequest{
		Policy: policy,
	}).Context(ctx).Do()

其它编程语言同理,找到cloud resource manager相关的API即可。

这个方法适合给所有资源授权。


参考文档:

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

文章推荐

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

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

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

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

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

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

关于mount踩的一些坑

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

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

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