使用Ansible进行IAM策略管理
首先
我之前介绍了如何使用Ansible来管理IAM用户和组的Playbook,但这次我想尝试使用Ansible来管理IAM策略。
做的事情
-
- グループにインラインポリシーアタッチ
- グループに管理ポリシーアタッチ
點數
- Ansibleのモジュールは管理ポリシーの操作に対応していないので、AWS CLIにて実装
请留意
这次没有关注用户的附加和角色。
客观条件
-
- AWS関連のモジュール実行にはbotoが必要です。
-
- AWS CLIが必要です。
- credential情報は環境変数かaws configureでセットしてある必要があります。
例子
将内嵌策略和AWS管理策略附加到以下组中。
策略内容只是示例,可以随意修改。
-
- ansible
インラインポリシー
SourceIpを制限したAdminポリシー
AWS管理ポリシー
CloudWatchReadOnlyAccess
AmazonEC2ReadOnlyAccess
目录结构
site.yml
roles/
|--iam/
| |--tasks/
| | |--main.yml
| |--templates/
| | |--admin_policy.json.j2
group_vars/
|--group.yml
变量
我们会这样定义变量。
---
my_vars:
aws:
iam:
inline_policies:
- group_name: ansible
policy:
- name: admin_ip_restricted
template: admin_policy.json.j2
params:
condition: '{"IpAddress": {"aws:SourceIp": ["XX.XX.XX.XX/32"]}}'
managed_policies:
- group_name: ansible
policy:
- arn:aws:iam::aws:policy/CloudWatchReadOnlyAccess
- arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
角色 (Jué sè)
内联策略通过加载JSON模板进行定义。
关于管理策略的附加,我们使用shell模块执行AWS CLI。
虽然重复执行不会报错,但由于每次都会改变状态,所以我们会与已附加的策略进行比对。
使用aws iam list-attached-group-policies命令获取附加到目标组的管理策略的ARN,并通过from_json过滤器将结果的json传递给set_fact模块,这将生成一个名为<<组名>>_policies的ARN列表,对应每个组。
通过 “when” 条件来判断是否有要添加到上述列表的管理策略ARN。
---
- name: IAM Inline-Policy作成
iam_policy:
profile: "{{ lookup('env', 'AWS_DEFAULT_PROFILE') }}"
iam_type: group
iam_name: "{{ item.0.group_name }}"
policy_name: "{{ item.1.name }}"
state: present
policy_json: "{{ lookup( 'template', item.1.template ) }}"
with_subelements:
- "{{ my_vars.aws.iam.inline_policies }}"
- policy
- name: Get managed-policy list
shell: >-
aws iam list-attached-group-policies \
--group-name {{ item.group_name }} \
--query 'AttachedPolicies[].PolicyArn'
changed_when: no
with_items: "{{ my_vars.aws.iam.managed_policies }}"
register: iam_managed_policies
- name: Create managed-policy list
set_fact:
"{{ item.item.group_name }}_policies": "{{ item.stdout | from_json }}"
with_items: "{{ iam_managed_policies.results }}"
when: not ansible_check_mode
- name: Attach managed-policy
shell: >-
aws iam attach-group-policy \
--group-name {{ item.0.group_name }} \
--policy-arn {{ item.1 }}
with_subelements:
- "{{ my_vars.aws.iam.managed_policies }}"
- policy
when: "'{{ item.1 }}' not in {{ item.0.group_name }}_policies"
模板
{% set params = item.1.params %}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
{% if params.condition is defined %}
"Resource": "*",
"Condition": {{ params.condition }}
{% else %}
"Resource": "*"
{% endif %}
}
]
}
总结
我认为通过这种方式,您可以更容易地管理从复制中难以理解的策略。
您可以将其连接到此角色的后面,并将其作为一个角色使用,请尝试一下。
请参考
使用Ansible来管理AWS资源的系列。
-
- VPCをAnsibleで作成する
-
- IAMユーザをAnsibleで管理する
-
- AWSのセキュリティグループをAnsibleで管理する
-
- EC2をAnsibleで管理する
-
- ec2_group_factsモジュールをAnsible2.2で使えるようにする
-
- RDSをAnsibleで管理する
-
- AnsibleでRoute53を管理する
-
- Ansibleの実行対象AWSアカウントを事前にチェックして事故防止
-
- ACMを利用した独自取得SSL証明書更新をAnsibleでやってみる
- AnsibleでRoute53のレコード情報をいい感じにエクスポートする(全件対応版)