更改多个用户的 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 权限等。,
参考:
由于您在评论部分提到此策略绑定文件仅包含您要更改策略的用户。我能够创建一个小流程来帮助您更改项目的用户策略绑定。
下面详细描述了执行每个步骤所需的代码,以更改您的用户权限:
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.csv 和 emails_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 策略中,所有不需要的用户都被删除了。然后,使用组别名和适当的权限将它们添加回项目。我们这样做是因为,您的项目中还有其他权限,我假设您不想更改(另外,这也是我们在开始时进行安全复制的原因)。
我有一百多个具有混合角色的 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 权限等。,
参考:
由于您在评论部分提到此策略绑定文件仅包含您要更改策略的用户。我能够创建一个小流程来帮助您更改项目的用户策略绑定。
下面详细描述了执行每个步骤所需的代码,以更改您的用户权限:
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.csv 和 emails_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 策略中,所有不需要的用户都被删除了。然后,使用组别名和适当的权限将它们添加回项目。我们这样做是因为,您的项目中还有其他权限,我假设您不想更改(另外,这也是我们在开始时进行安全复制的原因)。