使用 Ansible 修改 pam

使用 Ansible 修改 pam

作为新服务器设置的一部分,我提供了/etc/security/access.conf允许 ssh 登录的用户/组和源 IP 地址。这需要pam_access/etc/pam.d/login/etc/pam.d/sshd文件中启用(无论如何在 Ubuntu 上)

似乎Ansible 有一个模块可以修改其中一些规则,但我无法让它工作。模块的规定如下:“为了修改 PAM 规则,类型、控制和模块路径必须与现有规则匹配。”这是否意味着如果某条规则被注释掉,pamd模块将无法启用该行?

这是我当前的剧本。我尝试删除with_items任务中的行并使用loginname:参数,但这似乎也不起作用:

---
- hosts: all
  gather_facts: False
  tasks:
    - name: modify pam_access in /etc/pam.d for sshd and login
      pamd:
        name   : "{{ item }}"
        type   : account
        control: required
        module_path: pam_access.so
      with_items:
        - login
        - sshd

这是运行的结果。它没有给我太多的线索:

$ ansible-playbook tests/pam-access.yml -i 192.168.24.66,                                                             
SUDO password: 

PLAY [all] ***********************************************************************************************************

TASK [modify pam_access in /etc/pam.d for sshd and login] ************************************************************
ok: [192.168.24.66] => (item=login)
failed: [192.168.24.66] (item=sshd) => {"changed": false, "item": "sshd", "module_stderr": "Shared connection to 192.168.24.66 closed.\r\n", "module_stdout": "\r\nTraceback (most recent call last):\r\n  File \"/tmp/ansible_vzO7tZ/ansible_module_pamd.py\", line 691, in <module>\r\n    main()\r\n  File \"/tmp/ansible_vzO7tZ/ansible_module_pamd.py\", line 645, in main\r\n    pamd.load_rules_from_file()\r\n  File \"/tmp/ansible_vzO7tZ/ansible_module_pamd.py\", line 361, in load_rules_from_file\r\n    self.load_rules_from_string(stringline.replace(\"\\\\\\n\", \"\"))\r\n  File \"/tmp/ansible_vzO7tZ/ansible_module_pamd.py\", line 380, in load_rules_from_string\r\n    self.rules.append(PamdRule.rulefromstring(stringline))\r\n  File \"/tmp/ansible_vzO7tZ/ansible_module_pamd.py\", line 312, in rulefromstring\r\n    rule_type = result.group(1)\r\nAttributeError: 'NoneType' object has no attribute 'group'\r\n", "msg": "MODULE FAILURE", "rc": 1}

PLAY RECAP ***********************************************************************************************************
192.168.24.66              : ok=0    changed=0    unreachable=0    failed=1   

答案1

最后选择了lineinfile。如果有人有更好的解决方案,我很乐意看到。

   ---
    - hosts: all
      gather_facts: False
      tasks:
        - name: un-comment or add pam_access in /etc/pam.d files
          lineinfile:
            path   : "{{ item }}"
            regexp : "#.*account.*required.*pam_access.so"
            line   : "account   required   pam_access.so"
            insertafter : ".*include.*common-auth"
            state  : present
          with_items:
            - /etc/pam.d/login
            - /etc/pam.d/sshd

答案2

使用 -vvvv 选项运行它以查看失败的原因。在 sshd 和登录文件中,找到已存在的规则,然后使用 state 参数告诉它在现有规则之前或之后插入新规则。例如:

尝试使用以下格式来创建新规则:

- name: modify pam_access in /etc/pam.d for sshd and login
  pamd:
    name: '{{ item }}'
    #Existing type, control, and module_path in sshd and login
    type: account
    control: required
    module_path: pam_nologin.so
    #New rule you want to add
    new_type: account
    new_control: required
    new_module_path: pam_access.so
    module_arguments: insert new args here, if applicable.  Remove if none.
    #Inserts rule before existing rule - can use after as well
    state: before 
  #loops through both files - if existing module exists in both.
  loop:
    - login
    - sshd

或者,您可以找到现有规则并更改模块/控件:

 - name: Update pam_pwquality.so Rule Control 
  pamd:
    name: '{{ item }}'
    type: account
    control: required
    module_path: pam_nologin.so
    new_module_path: pam_pwquality.so
  loop:
    - login
    - sshd

答案3

我最终pam-auth-update --force --enable profile mkhomedir sss tmpdir以 ansible 的形式运行command:(显然需要事先安装 libpam-mkhomedir、libpam-tmpdir 和 libpam-sss)

这种方法的好处是 pam-auth-update 能够以完全一致的方式完成其需要的所有文件。

这种方法的问题是 ansible 总是报告“已更改”。

我正在寻找一个更好的解决方案来检查配置是否真的需要,以使任务完全幂等,但不幸的是唯一的方法似乎是slurp在运行所有远程文件并检查它们,或者在运行之前使用像和这样的技巧lineinfile:check_mode: yes查看changed_when: false这些行是否存在pam-auth-update

我的任务:

- name: enable pam modules (requires libpam-mkhomedir, libpam-tmpdir, libpam-sss installed)
  command: pam-auth-update --force --enable profile mkhomedir sss tmpdir

相关内容