AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 913796
Accepted
Server Fault
Server Fault
Asked: 2018-05-26 06:04:34 +0800 CST2018-05-26 06:04:34 +0800 CST 2018-05-26 06:04:34 +0800 CST

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

  • 772

Ansible 新手,有几台机器pam_access使用/etc/security/access.conf. 多行指定 ALLOW/DENY (+/-),然后指定用户或组以及要匹配的 src 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 服务器上登录,因此将为该组(- : ALL : ALL行前)插入 ACL,如下所示:

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

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

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

对于每台机器,规则变得非常具体,我看不到管理此文件的简单方法。我从下面的 playbook 和 group_vars 开始,但对于同一台机器有多个定义需要帮助。可能需要剧本中的数组定义line:并进行调查。

此外,此模型每次都需要重新写入文件,因为从中删除主机group_vars不会从access.conf. 的唯一状态lineinfile是absent或present。我需要一个名为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'
linux
  • 1 1 个回答
  • 2550 Views

1 个回答

  • Voted
  1. Best Answer
    Server Fault
    2018-05-26T10:34:19+08:002018-05-26T10:34:19+08:00

    这就是我最终使用的。也许它对其他人有用。{{ acl_dir }}playbook 会将基本 ACL 应用到每个主机,然后在目录下查找具有当前配置的主机名称的附加 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"
    

    基本 ACL:

    + : 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
    
    • 0

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve