使用 ansible 管理 /etc/security/access.conf

使用 ansible 管理 /etc/security/access.conf

我是 Ansible 的新手,有几台机器使用了pam_access在 中配置的模块/etc/security/access.conf。多行指定 ALLOW/DENY (+/-),然后指定用户或组以及要匹配的源 IP 地址。

在 Ansible 中管理此文件的更清洁的方法是什么?

该文件/etc/security/access.conf看起来是这样的:

+ : root     : cron crond :0 ttyS0 tty1 tty2 tty3 tty4 tty5 tty6
+ : root     : 10.137.198.176
+ : inventory: 10.137.198.25
+ : sysadmin : 10.137.198.202
- : ALL : ALL

大多数机器将使用此基本 ACL,然后可以根据需要添加其他组或用户。Web 开发人员通过 SFTP 登录两个 Web 服务器上,因此将为该组插入 ACL(行前- : ALL : ALL),如下所示:

+ : webdev   : 10.137.198.0/24
- : ALL : ALL

一些 Web 服务器也运行passenger。这些系统的开发人员以用户身份发布代码passenger,因此允许该用户从开发 LAN 访问,但并非所有 Web 服务器都允许访问。

+ : passenger: 10.137.197.0/24
- : ALL : ALL

每台机器的规则都非常具体,我看不出有什么简单的方法来管理这个文件。我从下面的剧本和 group_vars 开始,它们有点管用,但同一台机器有多个定义需要帮助。可能line:需要剧本中的数组定义,正在研究这个问题。

此外,此模型每次都需要重写文件,因为从中删除主机group_vars不会从中删除条目access.conf。 的唯一状态lineinfileabsentpresent。我需要一个名为 的状态add_line_if_missing_remove_if_absent_from_vars。 有没有更好的方法?


- hosts: all
  vars_files:
    - ../group_vars/test-etc-security-access-conf.yml
  gather_facts: false

  tasks:
    - name: "Set up /etc/security/access.conf for {{ inventory_hostname }}"
      when: inventory_hostname is match (item.name)
      lineinfile:
        dest  : /tmp/access.conf
        regexp: '{{ item.regexp }}'
        line: '{{ item.line }}'
      with_items: "{{ access_rules }}"

group_vars-必须有一个更好的方法:

access_rules:
  - name: 10.137.1.66
    regexp: '.*passenger.*'
    line: '+ : passenger : 10.137.10.0/24'

  - name: 10.137.1.66
    regexp: '.*webdev.*'
    line: '+ : webdev : 10.137.198.0/24'

答案1

这是我最终使用的。也许对其他人有用。剧本将对每个主机应用基本 ACL,然后在目录下查找{{ acl_dir }}具有当前正在配置的主机名称的附加 ACL。如果存在,则应用它。最后,最后附加默认拒绝规则。

我认为在文件开头添加一条注释会很好,可以记录文件最后更新的时间。这gather_facts会增加很多执行时间,因此选择使用shell:命令来获取日期。

---
- hosts: all
  vars:
    dest_file: /etc/security/access.conf
    base_acl : base
    acl_dir  : ../group_vars/pam_access
  gather_facts: false

  tasks:
    - name: "Empty existing ACL and replace with base ACL"
      copy:
        content: ""
        dest   : "{{ dest_file }}"
        owner  : root
        group  : root
        mode   : 0644

    - name: "Get current date from shell rather than wait for gather_facts"
      shell: date '+%Y-%m-%d'
      register: date_now

    - name: "Add ansible header with modified date to beginning of file"
      copy:
        content: "# updated via ansible on {{ date_now.stdout }} by {{ lookup ('env', 'LOGNAME') }}"
        dest: "{{ dest_file }}"
        owner  : root
        group  : root
        mode   : 0644

    - name: "Add base ACL {{ acl_dir }}/base to {{ inventory_hostname }}"
      lineinfile:
        dest: "{{ dest_file }}"
        line: "{{ lookup ('file', '{{ acl_dir }}/{{ base_acl }}') }}"

    - name: "Check for additional ACL {{ acl_dir }}/{{ inventory_hostname }}..."
      stat:
        path  : "{{ acl_dir }}/{{ inventory_hostname }}"
      register: host_acl

    - name: "Add host specific ACL from {{ acl_dir }}/{{ inventory_hostname }}"
      when: host_acl.stat.exists
      lineinfile:
        dest: "{{ dest_file }}"
        line: "{{ lookup ('file', '{{ acl_dir }}/{{ inventory_hostname }}') }}"

    - name: "Add default DENY as last ACL as a security precaution"
      lineinfile:
        dest: "{{ dest_file }}"
        line: "- : ALL : ALL"

基本访问控制列表:

+ : root     : cron crond :0 ttyS0 tty1 tty2 tty3 tty4 tty5 tty6
+ : root     : 10.137.198.176
+ : inventory: 10.137.198.25
+ : sysadmin : 10.137.198.202

附加主机 ACL 名为websrv01.mydom.com

+ : webdev   : 10.137.198.0/24
+ : passenger: 10.137.197.0/24

相关内容