跨受管节点自动化安全设置

AnsibleBeginner
立即练习

介绍

安全自动化通常聚焦于账户、所有权、权限和证据收集。一套优秀的 Playbook 能够在不削弱管理用户访问权限的前提下应用这些设置。

在本实验中,你将创建一个锁定的系统账户,部署归属于 root 的安全策略文件,收集 SELinux 模式的证据,并验证 Playbook 的幂等性。

创建安全自动化项目

在此步骤中,你将创建一个安全基准项目,该项目不会更改 LabEx 的 SSH 或 sudo 访问权限。

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[managed]
host ansible_connection=local
EOF

本实验特意避免更改 labex 账户、SSH 服务或 sudo 访问权限。受管账户和策略文件仅作为练习目标。

定义安全基准变量

在此步骤中,你将定义 Playbook 将要管理的账户、目录和策略文件。 在执行本步骤的命令之前,请返回 Ansible 项目目录。这能确保即使 LabEx 分步运行,命令依然稳定有效。

cd /home/labex/project/rhce-ansible
mkdir -p inventory/group_vars
cat > inventory/group_vars/managed.yml <<'EOF'
audit_user: rhce_audit
security_dir: /etc/rhce-security
security_policy: /etc/rhce-security/policy.conf
EOF

这些变量指定了服务账户和归属于 root 的策略路径。将它们存放在变量中,可以更方便地在更改系统状态前对安全基准进行审计。

cat inventory/group_vars/managed.yml

编写安全基准 Playbook

在此步骤中,你将编写一个 Playbook,用于创建锁定的系统账户、归属于 root 的目录、模式为 0600 的策略文件,以及工作区证据报告。 在执行本步骤的命令之前,请返回 Ansible 项目目录。

cd /home/labex/project/rhce-ansible
cat > playbooks/security-baseline.yml <<'EOF'
---
- name: Apply safe security baseline
  hosts: managed
  become: true
  gather_facts: true
  tasks:
    - name: Ensure locked audit service account exists
      ansible.builtin.user:
        name: "{{ audit_user }}"
        system: true
        shell: /sbin/nologin
        create_home: false
        password_lock: true
        state: present

    - name: Ensure root-owned security directory exists
      ansible.builtin.file:
        path: "{{ security_dir }}"
        state: directory
        owner: root
        group: root
        mode: '0750'

    - name: Deploy root-only security policy
      ansible.builtin.copy:
        dest: "{{ security_policy }}"
        owner: root
        group: root
        mode: '0600'
        content: |
          managed_by=ansible
          selinux_status={{ ansible_selinux.status | default('unknown') }}

    - name: Check current SELinux mode
      ansible.builtin.command: getenforce
      register: selinux_mode
      changed_when: false
      failed_when: false

    - name: Write learner-readable security report
      ansible.builtin.copy:
        dest: /home/labex/project/rhce-ansible/reports/security-report.txt
        owner: labex
        group: labex
        mode: '0640'
        content: |
          audit_user={{ audit_user }}
          policy_mode=0600
          selinux_mode={{ selinux_mode.stdout | default('unknown') }}
EOF

该 Playbook 结合了强制执行与证据收集。它创建了一个锁定的系统账户,写入仅限 root 访问的策略文件,在不标记任务为“已更改”的情况下读取 SELinux 模式,并将一份学员可读的报告写回项目中。

ansible-playbook playbooks/security-baseline.yml --syntax-check

在运行前请检查这些安全敏感值:shell: /sbin/nologin、password_lock: true、root 所有权以及策略文件的 0600 权限模式。

运行并检查安全基准

在此步骤中,你将应用基准并检查账户、文件权限和证据报告。

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/security-baseline.yml | tee reports/security-first.txt

首次运行应创建账户和策略目录。下方的检查命令将直接确认系统状态,而不是仅依赖 Playbook 的输出。

getent passwd rhce_audit

账户条目应以 /sbin/nologin 结尾,表明它不用于交互式 Shell 访问。

sudo stat -c "%U:%G %a %n" /etc/rhce-security /etc/rhce-security/policy.conf

策略文件应归属于 root:root 并使用 600 权限模式,这对于仅限 root 的策略内容是合适的。

cat reports/security-report.txt

报告记录了受管账户、预期的策略模式以及观察到的 SELinux 模式,以便快速查阅。

确认安全基准的幂等性

在此步骤中,你将再次运行安全基准。现有的安全状态不应再有任何变动。

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/security-baseline.yml | tee reports/security-second.txt

第二次运行验证了安全基准是否已收敛。如果再次报告有更改,请检查是哪个任务发生了变化,因为这意味着预期的状态不稳定。

grep -E 'host.*changed=0' reports/security-second.txt

总结

你成功实现了锁定的服务账户、归属于 root 的安全策略文件、SELinux 证据收集以及幂等性验证的自动化,且全程未更改 LabEx 的访问路径。