--- # Durcissement CIS Ubuntu 24.04 — retrait rsync/telnet/ftp + permissions cron + cron.allow/at.allow # (checks 35573, 35585, 35587, 35594-35601) # # IMPORTANT : # - rsync/telnet/ftp verifies avant retrait sur cette infra : aucun daemon actif, aucun cron/script # n'en dependait (grep sur les crontabs + scripts de backup). Purge sans risque constate. # - Le paquet 'at' n'est PAS installe sur cette infra et ce playbook ne l'installe PAS : ajouter un # service juste pour le verrouiller ensuite serait contre-productif (surface d'attaque en plus # pour un compliance-checkbox). /etc/at.allow est quand meme cree en defense en profondeur, mais # le check CIS 35601 restera en echec par ce choix assume tant que 'at' n'est pas installe. # - /etc/cron.allow doit avoir owner:group EXACTEMENT root:root pour satisfaire le check automatise # 35600 — la documentation CIS mentionne le groupe "crontab" comme alternative acceptable, mais la # regex du check SCA (`r:^root root$`) n'accepte que root:root en pratique (verifie empiriquement). # # `serial: 1` + `any_errors_fatal` : un host a la fois, arret immediat si un host casse. # # Usage recommande : tester sur un host avant le rollout complet : # ansible-playbook hardening/playbook-cron-packages-hardening.yml --limit pre-prod-uber - name: Durcissement cron/at + retrait paquets insecurises (CIS Ubuntu 24.04) hosts: prod,pre-prod,bdd-redis-prod,replica-prod,infra,infra-runner,infra-utils,load-balancer become: true serial: 1 any_errors_fatal: true tasks: - name: Purger rsync, telnet et ftp (clients/services insecurises) ansible.builtin.apt: name: - rsync - telnet - inetutils-telnet - ftp - tnftp state: absent purge: true - name: Permissions /etc/crontab (0600 root:root) ansible.builtin.file: path: /etc/crontab owner: root group: root mode: "0600" - name: Permissions repertoires cron (0700 root:root) ansible.builtin.file: path: "{{ item }}" state: directory owner: root group: root mode: "0700" loop: - /etc/cron.hourly - /etc/cron.daily - /etc/cron.weekly - /etc/cron.monthly - /etc/cron.d - name: Verifier si /etc/cron.deny existe ansible.builtin.stat: path: /etc/cron.deny register: cron_deny - name: Creer /etc/cron.allow (crontab restreint aux utilisateurs autorises) ansible.builtin.file: path: /etc/cron.allow state: touch owner: root group: root mode: "0640" access_time: preserve modification_time: preserve when: not cron_deny.stat.exists - name: Permissions /etc/cron.deny si present ansible.builtin.file: path: /etc/cron.deny owner: root group: root mode: "0640" when: cron_deny.stat.exists - name: Creer /etc/at.allow (defense en profondeur, meme si 'at' non installe) ansible.builtin.file: path: /etc/at.allow state: touch owner: root group: daemon mode: "0640" access_time: preserve modification_time: preserve - name: Confirmer le succes pour cet host ansible.builtin.debug: msg: "✅ Durcissement cron/paquets appliqué sur {{ inventory_hostname }}"