使用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のレコード情報をいい感じにエクスポートする(全件対応版)
广告
将在 10 秒后关闭
bannerAds