【问题标题】:Changing GCP IAM roles for multiple users更改多个用户的 GCP IAM 角色
【发布时间】:2020-10-28 06:26:59
【问题描述】:

我有超过 100 名具有混合角色的 GCP 用户。这些用户是由不同的管理员通过 IAM 控制台手动创建的。我们想对项目进行一些清理。这些用户所需的角色只是项目查看器、bigquery 用户、bigquery 数据查看器和 bigquery jobuser。我想用一个命令来改变这 100 多个用户的角色。有没有办法做到这一点?

以下是我从 GCP 命令检索到的 IAM 列表示例

gcloud projects get-iam-policy example-project-id-1

出于安全原因,这只是一个虚拟数据和修改版本。

---
policy:
  bindings:
  - members:
    - user:Sanaa.Keller@abc.com
    - user:adam.skill@abc.com
    - user:albert.withmore@abc.com
    - user:alison.mcknight@abc.com
    - user:andre.soretti@abc.com
    - user:andrew.born@abc.com
    - user:andrew.hill@abc.com
    - user:andrew.ives@abc.com
    - user:andrew.windridge@abc.com
    - user:angela.hammond@abc.com
    - user:anil.patel@abc.com
    - user:anna.lynch@abc.com
    - user:ben.carlson@abc.com
    - user:elisabeth.morrison@abc.com

    role: roles/editor
project: projects/926557397521
resource: //cloudresourcemanager.googleapis.com/projects/abc-staging
---
policy:
  bindings:
  - members:
    - user:Sanaa.Keller@abc.com
    - user:adam.skill@abc.com
    - user:albert.withmore@abc.com
    - user:alison.mcknight@abc.com
    - user:andre.soretti@abc.com
    - user:andrew.born@abc.com
    - user:andrew.hill@abc.com
    - user:andrew.ives@abc.com
    - user:andrew.windridge@abc.com
    - user:angela.hammond@abc.com
    - user:anil.patel@abc.com
    - user:anna.lynch@abc.com
    - user:ben.carlson@abc.com
    - user:elisabeth.morrison@abc.com

    roles:roles/bigquery.dataEditor
project: projects/926557397521
resource: //cloudresourcemanager.googleapis.com/projects/abc-staging
---
policy:
  bindings:
  - members:
    - user:Sanaa.Keller@abc.com
    - user:adam.skill@abc.com
    - user:albert.withmore@abc.com
    - user:alison.mcknight@abc.com
    - user:andre.soretti@abc.com
    - user:andrew.born@abc.com
    - user:andrew.hill@abc.com
    - user:andrew.ives@abc.com
    - user:andrew.windridge@abc.com
    - user:angela.hammond@abc.com
    - user:anil.patel@abc.com
    - user:anna.lynch@abc.com
    - user:ben.carlson@abc.com
    - user:elisabeth.morrison@abc.com

    roles:roles/bigquery.jobUser
project: projects/926557397521
resource: //cloudresourcemanager.googleapis.com/projects/abc-staging
---
policy:
  bindings:
  - members:
    - user:brian.king@abc.com
    role: roles/editor
project: projects/926557397521
resource: //iam.googleapis.com/projects/abc-staging/serviceAccounts/qlikview@abc-staging.iam.gserviceaccount.com

所以,我想从上面的示例中删除项目编辑角色,并简单地为他们分配 BigQuery Data Viewer 和 BigQuery Job User 角色

【问题讨论】:

  • 对于with single command,您正在寻找一个命令或一个简单的方法来做到这一点?我想到了 Terraform,但不确定您是在寻找一种命令操作还是一种自动方式。
  • 我所说的使用单个命令是一种简单的方法,而不仅仅是一个命令。一种自动的方法
  • @busheriff 您是否有一个 .csv 文件,其中包含您想要更改权限的所有用户的列表?
  • 您可以构建一个脚本来执行此操作,但作为一个简单的命令(或几个命令列表)并不“容易”。而且,如果他们拥有所有相同的角色,最好的方法是使用 Google 群组
  • 嗨,我已经修改了问题,以便更清楚地展示我想做的事情

标签: google-cloud-platform google-bigquery google-iam


【解决方案1】:

由于您在评论部分提到此策略绑定文件仅包含您要更改策略的用户。我能够创建一个小流程来帮助您更改项目的用户策略绑定。

下面详细描述了执行每个步骤所需的代码,以更改用户的权限:

1.获取你的Policy Bindings文件,并以yaml格式保存在你的shell环境中,如下:

gcloud projects get-iam-policy PROJECT_ID --format yaml > policy.yaml

2.出于安全原因,使用命令复制当前策略绑定

cp policy.yaml your_policy_bindings_file_SECURITY_COPY.yaml

3.在您的 Cloud Shell 环境中,使用以下代码创建一个 python 文件,并将其命名为 python_script.py。此脚本从您的策略绑定 YAML 文件 中提取用户的电子邮件并创建一个 csv 文件,其格式描述为 here (Upload users from a CSV file)。此外,它还会创建另一个仅包含电子邮件的 .csv 文件。因此,它可用于删除每个用户的当前策略。下面是代码:

import yaml
import re
import pandas as pd
import csv

#declaring the list which will contain all the user's emails from the policy biding yaml
final_list=[]

def yaml_as_python(val):
    """Convert YAML to dict"""
    try:
        return yaml.load_all(val,Loader=yaml.FullLoader)
    except yaml.YAMLError as exc:
        return exc

with open('policy.yaml','r') as input_file, open('emails_to_remove_policies.csv', 'w') as emails_to_remove_policies:
    results = yaml.load_all(input_file,Loader=yaml.FullLoader)

    #print(results)
    for value in results:

        try:
            mydict=value['policy']['bindings'][0]['members']
            mydict=sorted(mydict)
            r=re.compile(r'.+\@(abc.com)')
            my_newlist=[email.lstrip("user:") for email in mydict if re.match(r,email)]
            
            final_list.extend(my_newlist)
            #final_list.writerow(email_list)

            
        except TypeError:
            #print("type erorr")
            continue
            
    #writing the csv with the list of emails which will be removed from the policies        
    wr = csv.writer(emails_to_remove_policies, quoting=csv.QUOTE_NONE, delimiter = '\n')
    wr.writerow(final_list)

#CSV file example from documentation
#Header: Group Email [Required],Member Email,Member Type,Member Role
#Entry: yourgroup@email.com, membername@email.com,USER,MEMBER 


df = pd.DataFrame(final_list)
df2 = pd.DataFrame(final_list, columns=['Member Email'])
df2 = df2.assign(GroupEmail='yourgroup@email.com').assign(MemberType='USER').assign(MemberRole= 'MEMBER')
df2 = df2.reindex(columns=['GroupEmail','Member Email','MemberType','MemberRole'])


df2 = df2.rename(columns={'GroupEmail': 'Group Email [Required]', 'MemberType': 'Member Email', 
                          'MemberRole': 'Member Role' })
#in case you want to check the final output in the terminal
#print (df2)
print("Finished")

#list of emails to add in the google group
df2.to_csv('emails_to_add.csv',index=False)
print("\n\nStarting removing the policies for the list of users\n\n")

请注意,将创建两个 .csv 文件:emails_to_remove_policies.csvemails_to_add.csv。第一个将在 bash 脚本中用于从您的项目中删除这些用户的当前策略。第二个将用于将电子邮件添加到 Google 组,然后该组将用于在您的 策略绑定项目 yaml 文件中授予适当的权限

4. 使用以下代码创建一个名为 exec_all.sh 的文件来执行 python_script.py 并删除当前的策略不受欢迎的用户列表。

python3 python_script.py

while IFS=, read -r email
do
    for i in $email
        do
        echo "Removing $i"
        gcloud projects remove-iam-policy-binding PROJECT_ID --member user:$i --role ROLE_ID
        #echo "Next"
        done
done < emails_2.csv

在您的 shell 环境中通过键入:bash exec_all.sh 来执行它。

5. 现在,按照here 所述的步骤创建一个 Google 群组。之后,将多个成员添加到您的 Google 群组,您必须提供一个包含所有用户的特定格式的 .csv,使用第二步的 emails_to_add.csv 输出。这是documentation

要将 .csv 文件下载到您的本地环境,然后使用 Google Admin 将其上传到您的 Google 群组,请使用以下命令:

cloudshell download emails_to_add.csv

6.第 4 步中删除不需要的用户后,获取新的策略绑定文件。如下:

gcloud projects get-iam-policy PROJECT_ID --format yaml > new_policy.yaml

7.打开它,你可以使用cat、vim或shell编辑器,这是最简单的方法。现在,在文件的开头添加:

---
bindings:
- members:
  - user: yourgroup@email.com
  role: role_id
---

注意第一行和最后一行的---。此外,为了获取角色 ID,您必须转到:IAM & Admin > Roles(在左侧菜单底部)> 点击您想要的角色 > 您可以在 ID旁边看到角色ID。最后,请注意,组电子邮件用于向所有所需用户授予权限。

8. 您的项目有了新的策略绑定。因此,您需要将其设置为项目的新策略here is the documentation。你可以这样做:

gcloud projects set-iam-policy PROJECT_ID new_policy.yaml

注意事项:

  • 你必须准备好你的环境才能运行上面的代码,安装必要的包。 Here is the documentation for it.
  • 请注意,从您的项目的 IAM 策略中,所有不需要的用户都将被删除。然后,使用组别名和适当的权限将它们添加回项目。我们这样做是因为,我假设您不想更改您的项目中的其他权限(另外,这也是原因,我们在开始时做了一个安全副本)。

【讨论】:

    【解决方案2】:

    GCP 建议将具有相同职责的用户收集到组中,并将 Cloud IAM 角色分配给组而不是单个用户。

    这将解决您的问题,并且您将获得额外的好处,例如轻松加入/退出用户、轻松添加/删除权限等,

    参考:

    https://cloud.google.com/docs/enterprise/best-practices-for-enterprise-organizations#groups-and-service-accounts

    【讨论】:

    • 我已经有很多用户想要更改他们的角色。我已经创建了一个单独的角色,其中包含选定数量的权限。当我们开始分配时,建议似乎很有用。我想做的是要么更改这 100 多个用户的权限,然后简单地将它们分配给具有预定义角色的组,要么一次更改所有这些用户的权限
    猜你喜欢
    • 2015-07-11
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2019-05-10
    • 2020-12-11
    相关资源
    最近更新 更多