thechip911.hardening

Renforcement - le rôle Ansible

Un rôle Ansible pour rendre un serveur AlmaLinux, Debian ou Ubuntu un peu plus sécurisé.
édition systemd.

Nécessite Ansible >= 2.12.

Disponible sur Ansible Galaxy.

Les versions AlmaLinux 8, Debian 11, Ubuntu 20.04 LTS (Focal Fossa) et 22.04 LTS (Jammy Jellyfish) sont prises en charge.

Remarque

N'utilisez pas ce rôle sans d'abord le tester dans un environnement non opérationnel.

Remarque

Il existe un artefact SLSA sous le workflow d'action slsa pour vérification.

Dépendances

Aucune.

Exemples

Playbook

---
- hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: Inclure le rôle de renforcement
      ansible.builtin.include_role:
        name: thechip911.hardening
      vars:
        block_blacklisted: true
        sshd_admin_net:
          - 10.0.0.0/16
        suid_sgid_permissions: false
...

ansible-pull avec git checkout

---
- hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: Installer git
      become: true
      ansible.builtin.package:
        name: git
        state: present

    - name: Cloner thechip911.hardening
      become: true
      ansible.builtin.git:
        repo: 'https://github.com/thechip911/ansible-role-hardening'
        dest: /etc/ansible/roles/thechip911.hardening
        version: master

    - name: Inclure le rôle de renforcement
      ansible.builtin.include_role:
        name: thechip911.hardening
      vars:
        block_blacklisted: true
        sshd_admin_net:
          - 10.0.2.0/16
        suid_sgid_permissions: false
...

Remarque concernant les règles du pare-feu UFW

Au lieu de réinitialiser ufw à chaque exécution, ce qui provoquerait des interruptions dans le trafic réseau, le rôle supprime chaque règle ufw sans le paramètre de tâche comment: ansible managed.

Le rôle définit également des politiques de refus par défaut, ce qui signifie que des règles de pare-feu doivent être créées pour tous les ports supplémentaires sauf ceux spécifiés dans les variables sshd_port et ufw_outgoing_traffic.

Exécution et structure des tâches

Voir STRUCTURE.md pour l'arborescence de la structure du rôle.

Tests de rôle

Voir TESTING.md.

Variables de rôle avec valeurs par défaut

./defaults/main/auditd.yml

auditd_apply_audit_rules: true
auditd_action_mail_acct: root
auditd_admin_space_left_action: suspend
auditd_disk_error_action: suspend
auditd_disk_full_action: suspend
auditd_max_log_file: 8
auditd_max_log_file_action: keep_logs
auditd_mode: 1
auditd_num_logs: 5
auditd_space_left: 75
auditd_space_left_action: email
grub_audit_backlog_cmdline: audit_backlog_limit=8192
grub_audit_cmdline: audit=1

Activez auditd au démarrage avec Grub.

Quand auditd_apply_audit_rules: 'yes', le rôle applique les règles auditd du fichier modèle inclus.

auditd_action_mail_acct doit être une adresse email ou un alias valide.

auditd_admin_space_left_action définit l'action à prendre lorsque le système détecte qu'il manque d'espace disque. suspend arrêtera le démon d'audit d'écrire des enregistrements sur le disque.

auditd_max_log_file_action définit l'action à prendre lorsque le système détecte que la limite de taille de fichier maximum a été atteinte. Par exemple, l'option rotate fera en sorte que le démon d'audit tourne les journaux. L'option keep_logs est similaire à rotate, sauf qu'elle n'utilise pas le paramètre num_logs. Cela empêche les journaux d'audit d'être écrasés.

auditd_space_left_action indique au système l'action à prendre lorsque le système détecte qu'il manque d'espace disque. email signifie qu'un avertissement sera envoyé à l'adresse email spécifiée dans action_mail_acct ainsi qu'à syslog.

auditd_mode définit le mode de défaillance dauditd, 0=silencieux 1=printk 2=paniquer.

auditd.conf(5)

./defaults/main/compilers.yml

compilers:
  - as
  - cargo
  - cc
  - cc-[0-9]*
  - clang-[0-9]*
  - gcc
  - gcc-[0-9]*
  - go
  - make
  - rustc

Liste des compilateurs qui seront restreints à l'utilisateur root.

./defaults/main/disablewireless.yml

disable_wireless: false

Si true, éteignez toutes les interfaces sans fil.

./defaults/main/dns.yml

dns: 127.0.0.1 1.1.1.1
fallback_dns: 9.9.9.9 1.0.0.1
dnssec: allow-downgrade
dns_over_tls: opportunistic

Adresses IPv4 et IPv6 à utiliser comme serveurs DNS système et de secours.
Si dnssec est défini sur "allow-downgrade", une validation DNSSEC sera tentée, mais si le serveur ne prend pas correctement en charge DNSSEC, le mode DNSSEC sera automatiquement désactivé.

Si dns_over_tls est vrai, toutes les connexions au serveur seront chiffrées si le serveur DNS prend en charge DNS-over-TLS et dispose d'un certificat valide.

option systemd.

./defaults/main/ipv6.yml

disable_ipv6: false
ipv6_disable_sysctl_settings:
  net.ipv6.conf.all.disable_ipv6: 1
  net.ipv6.conf.default.disable_ipv6: 1

Si disable_ipv6: true, IPv6 sera désactivé.

./defaults/main/limits.yml

limit_nofile_hard: 1024
limit_nofile_soft: 512
limit_nproc_hard: 1024
limit_nproc_soft: 512

Nombre maximal de processus et de fichiers ouverts.

./defaults/main/misc.yml

install_aide: true
reboot_ubuntu: false
redhat_signing_keys:
  - 567E347AD0044ADE55BA8A5F199E2F91FD431D51
  - 47DB287789B21722B6D95DDE5326810137017186
epel7_signing_keys:
  - 91E97D7C4A5E96F17F3E888F6A2FAEA2352C64E5
epel8_signing_keys:
  - 94E279EB8D8F25B21810ADF121EA45AB2F86D6A1
epel9_signing_keys:
  - FF8AD1344597106ECE813B918A3872BF3228467C

Si install_aide: true, AIDE sera installé et configuré.

Si reboot_ubuntu: true, un nœud Ubuntu sera redémarré si nécessaire.

redhat_signing_keys sont les Clés de signature des produits RedHat.

Les epel7_signing_keys, epel8_signing_keys et epel9_signing_keys sont des clés de signature spécifiques aux versions Fedora EPEL.

./defaults/main/module_blocklists.yml

block_blacklisted: false
fs_modules_blocklist:
  - cramfs
  - freevxfs
  - hfs
  - hfsplus
  - jffs2
  - squashfs
  - udf
misc_modules_blocklist:
  - bluetooth
  - bnep
  - btusb
  - can
  - cpia2
  - firewire-core
  - floppy
  - n_hdlc
  - net-pf-31
  - pcspkr
  - soundcore
  - thunderbolt
  - usb-midi
  - usb-storage
  - uvcvideo
  - v4l2_common
net_modules_blocklist:
  - atm
  - dccp
  - sctp
  - rds
  - tipc

Modules du noyau bloqués.

Définir block_blacklisted: true empêchera tout chargement automatique des modules du noyau "blacklistés". Cela empêche le chargement manuel de modules "blacklistés" via modprobe module_name.

./defaults/main/mount.yml

hide_pid: 2
process_group: root

hide_pid définit le mode d'accès de /proc/<pid>/.

Le paramètre process_group configure le groupe autorisé à apprendre des informations sur les processus autrement interdites par hidepid=.

options de montage /proc.

./defaults/main/ntp.yml

fallback_ntp: 2.ubuntu.pool.ntp.org 3.ubuntu.pool.ntp.org
ntp: 0.ubuntu.pool.ntp.org 1.ubuntu.pool.ntp.org

Noms d'hôtes ou adresses IP des serveurs NTP. option systemd.

./defaults/main/packages.yml

system_upgrade: true
packages_blocklist:
  - apport*
  - autofs
  - avahi*
  - avahi-*
  - beep
  - git
  - pastebinit
  - popularity-contest
  - prelink
  - rpcbind
  - rsh*
  - rsync
  - talk*
  - telnet*
  - tftp*
  - whoopsie
  - xinetd
  - yp-tools
  - ypbind
packages_debian:
  - acct
  - apparmor-profiles
  - apparmor-utils
  - apt-show-versions
  - audispd-plugins
  - auditd
  - cracklib-runtime
  - debsums
  - gnupg2
  - haveged
  - libpam-apparmor
  - libpam-cap
  - libpam-modules
  - libpam-pwquality
  - libpam-tmpdir
  - lsb-release
  - needrestart
  - openssh-server
  - postfix
  - rkhunter
  - rsyslog
  - sysstat
  - tcpd
  - vlock
  - wamerican
packages_redhat:
  - audispd-plugins
  - audit
  - cracklib
  - gnupg2
  - haveged
  - libpwquality
  - openssh-server
  - needrestart
  - postfix
  - psacct
  - rkhunter
  - rsyslog
  - rsyslog-gnutls
  - vlock
  - words
packages_ubuntu:
  - fwupd
  - secureboot-db

system_upgrade: 'yes' exécutera apt upgrade ou dnf update si nécessaire.

Packages à installer selon la distribution et packages à supprimer (packages_blocklist).

./defaults/main/password.yml

crypto_policy: FIPS
pwquality_config:
  dcredit: -1
  dictcheck: 1
  difok: 8
  enforcing: 1
  lcredit: -1
  maxclassrepeat: 4
  maxrepeat: 3
  minclass: 4
  minlen: 15
  ocredit: -1
  ucredit: -1

Définir des politiques cryptographiques si /etc/crypto-policies/config existe.

Configurer la bibliothèque libpwquality.

./defaults/main/sshd.yml

sshd_accept_env: LANG LC_*
sshd_admin_net:
  - 192.168.0.0/24
  - 192.168.1.0/24
sshd_allow_agent_forwarding: 'no'
sshd_allow_groups: sudo
sshd_allow_tcp_forwarding: 'no'
sshd_authentication_methods: any
sshd_banner: /etc/issue.net
sshd_challenge_response_authentication: 'no'
sshd_ciphers: [email protected],[email protected],aes256-ctr
sshd_client_alive_count_max: 1
sshd_client_alive_interval: 200
sshd_compression: 'no'
sshd_gssapi_authentication: 'no'
sshd_hostbased_authentication: 'no'
sshd_host_key_algorithms: [email protected],[email protected],ssh-ed25519,ssh-rsa,[email protected],[email protected],[email protected],ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256
sshd_ignore_user_known_hosts: 'yes'
sshd_kerberos_authentication: 'no'
sshd_kex_algorithms: [email protected],ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
sshd_login_grace_time: 20
sshd_log_level: VERBOSE
sshd_macs: [email protected],[email protected],hmac-sha2-512,hmac-sha2-256
sshd_max_auth_tries: 3
sshd_max_sessions: 3
sshd_max_startups: 10:30:60
sshd_password_authentication: 'no'
sshd_permit_empty_passwords: 'no'
sshd_permit_root_login: 'no'
sshd_permit_user_environment: 'no'
sshd_port: 22
sshd_print_last_log: 'yes'
sshd_print_motd: 'no'
sshd_rekey_limit: 512M 1h
sshd_required_rsa_size: 2048
sshd_strict_modes: 'yes'
sshd_subsystem: sftp internal-sftp
sshd_tcp_keep_alive: 'no'
sshd_use_dns: 'no'
sshd_use_pam: 'yes'
sshd_x11_forwarding: 'no'

Pour une explication des options non décrites ci-dessous, veuillez lire https://man.openbsd.org/sshd_config.

Seuls les réseaux définis dans sshd_admin_net sont autorisés à se connecter à sshd_port. Notez que des règles supplémentaires doivent être mises en place pour permettre l'accès à d'autres services.

La connexion OpenSSH est autorisée uniquement pour les utilisateurs dont le groupe principal ou la liste des groupes supplémentaires correspond à l'un des modèles dans sshd_allow_groups.

sshd_allow_agent_forwarding spécifie si le transfert de ssh-agent(1) est autorisé.

sshd_allow_tcp_forwarding spécifie si le transfert TCP est autorisé. Les options disponibles sont yes ou toutes pour autoriser le transfert TCP, no pour interdire tous les transferts TCP, local pour autoriser uniquement le transfert local (du point de vue de ssh(1)) ou remote pour autoriser uniquement le transfert à distance.

sshd_authentication_methods spécifie les méthodes d'authentification qui doivent être validées avec succès pour accorder l'accès à un utilisateur.

sshd_log_level indique le niveau de verbosité utilisé lors de l'enregistrement des messages.

sshd_max_auth_tries et sshd_max_sessions spécifient respectivement le nombre maximum de tentatives d'authentification SSH autorisées par connexion et le nombre maximum de sessions shell, de connexion ou de sous-système (par exemple, sftp) autorisées par connexion réseau.

sshd_password_authentication spécifie si l'authentification par mot de passe est autorisée.

sshd_port spécifie le numéro de port que sshd(8) écoute.

sshd_required_rsa_size, RequiredRSASize, ne sera défini que si la version de SSH est supérieure à 9.1.

./defaults/main/suid_sgid_blocklist.yml

suid_sgid_permissions: true
suid_sgid_blocklist:
  - ansible-playbook
  - ar
  - as
  - at
  - awk
  - base32
  - base64
  - bash
  - busctl
  - busybox
  [...]

Si suid_sgid_permissions: true, passez en boucle dans suid_sgid_blocklist et retirez toutes les permissions SUID/SGID.

Une liste complète des fichiers est disponible dans defaults/main/suid_sgid_blocklist.yml.

./defaults/main/sysctl.yml

sysctl_dev_tty_ldisc_autoload: 0
sysctl_net_ipv6_conf_accept_ra_rtr_pref: 0

ipv4_sysctl_settings:
  net.ipv4.conf.all.accept_redirects: 0
  net.ipv4.conf.all.accept_source_route: 0
  net.ipv4.conf.all.log_martians: 1
  net.ipv4.conf.all.rp_filter: 1
  net.ipv4.conf.all.secure_redirects: 0
  net.ipv4.conf.all.send_redirects: 0
  net.ipv4.conf.all.shared_media: 0
  net.ipv4.conf.default.accept_redirects: 0
  net.ipv4.conf.default.accept_source_route: 0
  net.ipv4.conf.default.log_martians: 1
  net.ipv4.conf.default.rp_filter: 1
  net.ipv4.conf.default.secure_redirects: 0
  net.ipv4.conf.default.send_redirects: 0
  net.ipv4.conf.default.shared_media: 0
  net.ipv4.icmp_echo_ignore_broadcasts: 1
  net.ipv4.icmp_ignore_bogus_error_responses: 1
  net.ipv4.ip_forward: 0
  net.ipv4.tcp_challenge_ack_limit: 2147483647
  net.ipv4.tcp_invalid_ratelimit: 500
  net.ipv4.tcp_max_syn_backlog: 20480
  net.ipv4.tcp_rfc1337: 1
  net.ipv4.tcp_syn_retries: 5
  net.ipv4.tcp_synack_retries: 2
  net.ipv4.tcp_syncookies: 1

ipv6_sysctl_settings:
  net.ipv6.conf.all.accept_ra: 0
  net.ipv6.conf.all.accept_redirects: 0
  net.ipv6.conf.all.accept_source_route: 0
  net.ipv6.conf.all.forwarding: 0
  net.ipv6.conf.all.use_tempaddr: 2
  net.ipv6.conf.default.accept_ra: 0
  net.ipv6.conf.default.accept_ra_defrtr: 0
  net.ipv6.conf.default.accept_ra_pinfo: 0
  net.ipv6.conf.default.accept_ra_rtr_pref: 0
  net.ipv6.conf.default.accept_redirects: 0
  net.ipv6.conf.default.accept_source_route: 0
  net.ipv6.conf.default.autoconf: 0
  net.ipv6.conf.default.dad_transmits: 0
  net.ipv6.conf.default.max_addresses: 1
  net.ipv6.conf.default.router_solicitations: 0
  net.ipv6.conf.default.use_tempaddr: 2

generic_sysctl_settings:
  fs.protected_fifos: 2
  fs.protected_hardlinks: 1
  fs.protected_symlinks: 1
  fs.suid_dumpable: 0
  kernel.core_uses_pid: 1
  kernel.dmesg_restrict: 1
  kernel.kptr_restrict: 2
  kernel.panic: 60
  kernel.panic_on_oops: 60
  kernel.perf_event_paranoid: 3
  kernel.randomize_va_space: 2
  kernel.sysrq: 0
  kernel.unprivileged_bpf_disabled: 1
  kernel.yama.ptrace_scope: 2
  net.core.bpf_jit_harden: 2

conntrack_sysctl_settings:
  net.netfilter.nf_conntrack_max: 2000000
  net.netfilter.nf_conntrack_tcp_loose: 0

Configuration sysctl.

sysctl.conf.

./defaults/main/ufw.yml

ufw_enable: true
ufw_outgoing_traffic:
  - 22
  - 53
  - 80
  - 123
  - 443
  - 853

ufw_enable: true installe et configure ufw avec les règles associées. Réglez-le sur false pour installer et configurer un pare-feu manuellement.
ufw_outgoing_traffic ouvre les ports ufw spécifiques, permettant le trafic sortant.

./defaults/main/users.yml

delete_users:
  - games
  - gnats
  - irc
  - list
  - news
  - sync
  - uucp

Utilisateurs à supprimer.

Lectures recommandées

Comparer les valeurs DISA STIG et CIS Benchmark

Centre pour la sécurité d'Internet Linux Benchmarks

Numérotation des configurations communes

Guides de mise en œuvre technique de sécurité DISA

Guides de sécurité SCAP

Configuration système centré sur la sécurité systemd

Contribuer

Vous souhaitez contribuer ? Super ! Les contributions sont toujours les bienvenues, peu importe leur taille. Si vous avez trouvé quelque chose d'étrange, n'hésitez pas à soumettre un problème, améliorer le code en créant une demande de tirage, ou en sponsorisant ce projet.

Licence

Licence Apache Version 2.0

Informations sur l'auteur

https://github.com/thechip911

À propos du projet

AlmaLinux, Debian and Ubuntu hardening. systemd edition.

Installer
ansible-galaxy install thechip911.hardening
Licence
apache-2.0
Téléchargements
109
Propriétaire