Automatizar configuraciones de seguridad en nodos gestionados

AnsibleBeginner
Practicar Ahora

Introducción

La automatización de la seguridad suele centrarse en las cuentas, la propiedad, los permisos y la evidencia. Un buen playbook aplica estos ajustes sin debilitar el acceso del usuario de gestión.

En este laboratorio, creará una cuenta de sistema bloqueada, desplegará archivos de política de seguridad propiedad de root, recopilará evidencia del modo SELinux y demostrará que el playbook es idempotente.

Crear un proyecto de automatización de seguridad

En este paso, creará un proyecto para una línea base de seguridad segura que evite modificar el acceso SSH o sudo de LabEx.

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

Este laboratorio evita deliberadamente cambiar la cuenta labex, el servicio SSH o el acceso sudo. La cuenta gestionada y los archivos de política son objetivos de práctica aislados.

Definir variables de la línea base de seguridad

En este paso, definirá la cuenta, el directorio y el archivo de política que gestionará el playbook. Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible. Esto mantiene los comandos estables incluso cuando LabEx ejecuta cada paso por separado.

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

Las variables nombran la cuenta de servicio y la ruta de la política propiedad de root. Mantenerlas en variables facilita la auditoría de la línea base de seguridad antes de que cambie el estado del sistema.

cat inventory/group_vars/managed.yml

Escribir el playbook de la línea base de seguridad

En este paso, escribirá un playbook que crea una cuenta de sistema bloqueada, un directorio propiedad de root, un archivo de política con modo 0600 y un informe de evidencia del espacio de trabajo. Antes de ejecutar los comandos en este paso, regrese al directorio del proyecto de Ansible. Esto mantiene los comandos estables incluso cuando LabEx ejecuta cada paso por separado.

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

El playbook combina la aplicación de políticas y la recopilación de evidencia. Crea una cuenta de sistema bloqueada, escribe archivos de política solo para root, lee el modo SELinux sin marcar la tarea como modificada y escribe un informe legible para el usuario en el proyecto.

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

Revise los valores sensibles a la seguridad antes de ejecutar: shell: /sbin/nologin, password_lock: true, propiedad de root y modo 0600 en el archivo de política.

Ejecutar e inspeccionar la línea base de seguridad

En este paso, aplicará la línea base e inspeccionará la cuenta, los permisos de archivo y el informe de evidencia.

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

La primera ejecución debería crear la cuenta y el directorio de políticas. Las comprobaciones a continuación confirman el estado del sistema directamente en lugar de confiar únicamente en la salida del playbook.

getent passwd rhce_audit

La entrada de la cuenta debe terminar en /sbin/nologin, lo que indica que no está destinada al acceso interactivo por shell.

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

El archivo de política debe ser propiedad de root:root y usar el modo 600, lo cual es apropiado para contenido de política exclusivo de root.

cat reports/security-report.txt

El informe registra la cuenta gestionada, el modo de política esperado y el modo SELinux observado para una revisión rápida.

Confirmar la idempotencia de la línea base de seguridad

En este paso, ejecutará la línea base de seguridad nuevamente. El estado seguro existente no debería requerir más cambios.

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

La segunda ejecución verifica que la línea base de seguridad converja. Si informa cambios nuevamente, inspeccione qué tarea cambió, ya que eso significa que un estado deseado no era estable.

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

Resumen

Ha automatizado una cuenta de servicio bloqueada, archivos de política de seguridad propiedad de root, la recopilación de evidencia de SELinux y la validación de idempotencia sin cambiar la ruta de acceso de LabEx.