更改多个用户的 GCP IAM 角色

Changing GCP IAM roles for multiple users

我有一百多个具有混合角色的 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 数据查看器和 BigQuery 作业用户角色

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

这将解决您的问题,您将获得额外的好处,例如轻松 onboarding/off 加入用户、轻松 add/remove 权限等。,

参考:

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

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

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

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 文件 .[=23 中授予适当的权限=]

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. Afterwards, add multiple members to your Google Group, you have to provide a .csv with an specific format containing all the users, use the emails_to_add.csv output from step two. Here is the documentation.

中描述的步骤创建一个 Google 组

要将 .csv 文件下载到您的本地环境,然后使用 Google 管理员将其上传到您的 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 策略中,所有不需要的用户都被删除了。然后,使用组别名和适当的权限将它们添加回项目。我们这样做是因为,您的项目中还有其他权限,我假设您不想更改(另外,这也是我们在开始时进行安全复制的原因)。