作为新服务器设置的一部分,我提供了/etc/security/access.conf
允许 ssh 登录的用户/组和源 IP 地址。这需要pam_access
在/etc/pam.d/login
和/etc/pam.d/sshd
文件中启用(无论如何在 Ubuntu 上)
它似乎Ansible 有一个模块可以修改其中一些规则,但我无法让它工作。模块的规定如下:“为了修改 PAM 规则,类型、控制和模块路径必须与现有规则匹配。”这是否意味着如果某条规则被注释掉,pamd
模块将无法启用该行?
这是我当前的剧本。我尝试删除with_items
任务中的行并使用login
该name:
参数,但这似乎也不起作用:
---
- 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