konstruktoid.hardening

Rôle Ansible pour le Renforcement de Sécurité des Serveurs

Ceci est un rôle Ansible conçu pour améliorer la sécurité des serveurs fonctionnant sous AlmaLinux, Debian ou Ubuntu.

Il est focalisé sur systemd et nécessite une version d'Ansible 2.15 ou supérieure.

Le rôle prend en charge les systèmes d'exploitation suivants :

Pour ceux qui utilisent AWS ou Azure, il existe également des images Amazon Machine Images (AMIs) et des images de machines virtuelles Azure renforcées sous Ubuntu.

Celles-ci sont disponibles dans le dépôt konstruktoid/hardened-images. Ces images sont créées à l'aide de Packer et ce rôle Ansible est utilisé pour leur configuration.

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

Remarque Un artefact SLSA est présent sous le workflow d'action SLSA pour vérification.

Dépendances

Aucune.

Exemples

Exigences

---
roles:
  - name: konstruktoid.hardening
    version: v2.1.0
    src: https://github.com/konstruktoid/ansible-role-hardening.git
    scm: git

Playbook

---
- name: Importer et utiliser le rôle de renforcement
  hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: Importer le rôle de renforcement
      ansible.builtin.import_role:
        name: konstruktoid.hardening
      vars:
        sshd_admin_net:
          - 10.0.2.0/24
          - 192.168.0.0/24
          - 192.168.1.0/24
        suid_sgid_permissions: false

Playbook local utilisant git checkout

---
- name: Cloner et configurer konstruktoid.hardening
  hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: Cloner le dépôt de renforcement
      become: true
      tags:
        - always
      block:
        - name: Installer git
          ansible.builtin.package:
            name: git
            state: present

        - name: Cloner konstruktoid.hardening
          become: true
          ansible.builtin.git:
            repo: https://github.com/konstruktoid/ansible-role-hardening
            dest: /etc/ansible/roles/konstruktoid.hardening
            version: v2.1.0

        - name: Supprimer git
          ansible.builtin.package:
            name: git
            state: absent

    - name: Inclure le rôle de renforcement
      ansible.builtin.include_role:
        name: konstruktoid.hardening
      vars:
        sshd_allow_groups:
          - ubuntu
        sshd_login_grace_time: 60
        sshd_max_auth_tries: 10
        sshd_use_dns: false
        sshd_update_moduli: true

Remarque concernant les règles UFW

Au lieu de réinitialiser ufw à chaque exécution, ce qui provoquerait une interruption du trafic réseau, le rôle supprime chaque règle ufw sans le paramètre et la valeur 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_ports et ufw_outgoing_traffic.

Voir ufw(8) pour plus d'informations.

Exécution des Tâches et Structure

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

Test du Rôle

Voir TESTING.md.

Variables du Rôle avec valeurs par défaut

./defaults/main/aide.yml

manage_aide: true

aide_checksums: sha512
aide_dir_exclusions:
  - /var/lib/docker
  - /var/lib/lxcfs
  - /var/lib/private/systemd
  - /var/log/audit
  - /var/log/journal

Si manage_aide: true, alors AIDE sera installé et configuré.

aide_checksums modifie la variable Checksums d'AIDE. Notez que la variable Checksums peut ne pas être présente selon la distribution.

aide_dir_exclusions est une liste de répertoires qui seront exclus de la base de données AIDE.

aide.conf(5)

./defaults/main/auditd.yml

manage_auditd: true

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_enable_flag: 2
auditd_flush: incremental_async
auditd_max_log_file: 20
auditd_max_log_file_action: rotate
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

Si manage_auditd: true, alors le Système d'Audit Linux sera configuré et activé lors du démarrage à l'aide de 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 a détecté qu'il manque d'espace disque. suspend fera en sorte que le démon d'audit arrête d'écrire des enregistrements sur le disque.

auditd_enable_flag règle le flag activé. Si 0 est passé, l'audit sera temporairement désactivé. 1 activera l'audit et 2 verrouillera la configuration d'audit.

auditd_flush: sync indique au démon d'audit de garder les données et les métadonnées entièrement synchronisées à chaque écriture sur le disque.

auditd_max_log_file_action définit l'action à prendre lorsque le système a confirmé que la limite de taille de fichier maximale 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 à entreprendre lorsque le système détecte qu'il manque d'espace disque. email signifie qu'un avertissement sera envoyé à l'adresse spécifiée dans action_mail_acct, ainsi qu'un message envoyé à syslog.

auditd_mode définit le mode de défaillance d'auditd, 0=silencieux 1=printk 2=panic.

auditd.conf(5)

./defaults/main/automatic_updates.yml

automatic_updates:
  enabled: true
  reboot: false

Si automatic_updates est activé, il installera et configurera dnf-automatic ou unattended-upgrades, selon la distribution.

Si l'option reboot est réglée sur true, elle redémarrera le système si nécessaire, voir Unattended-Upgrade::Automatic-Reboot et dnf_automatic: reboot.

./defaults/main/compilers.yml

manage_compilers: true

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

Si manage_compilers: true, alors les compilateurs listés seront restreints à l'utilisateur root.

./defaults/main/crypto_policies.yml

set_crypto_policy: true
crypto_policy: DEFAULT:NO-SHA1

Définir et utiliser des politiques cryptographiques si /etc/crypto-policies/config existe et que set_crypto_policy: true.

./defaults/main/disablewireless.yml

disable_wireless: false

Si true, désactive toutes les interfaces sans fil.

./defaults/main/dns.yml

manage_resolved: true

dns:
  - 1.1.1.2
  - 9.9.9.9
fallback_dns:
  - 1.0.0.2
  - 149.112.112.112
dnssec: allow-downgrade
dns_over_tls: opportunistic

Si manage_resolved: true, configure systemd-resolved.

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

Si dns_over_tls est vrai, toutes les connexions au serveur seront cryptées si le serveur DNS prend en charge DNS-over-TLS et possède un certificat valide.

./defaults/main/ipv6.yml

disable_ipv6: false
sysctl_net_ipv6_conf_accept_ra_rtr_pref: 0

ipv6_disable_sysctl_settings:
  net.ipv6.conf.all.disable_ipv6: 1
  net.ipv6.conf.default.disable_ipv6: 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

Si disable_ipv6: true, IPv6 sera désactivé et les paramètres sysctl associés configurés.

ipv6_sysctl_settings est la configuration sysctl utilisée si l'hôte utilise IPv6.

sysctl.conf

./defaults/main/journal.yml

rsyslog_filecreatemode: "0640"

journald_compress: true
journald_forwardtosyslog: false
journald_storage: persistent

rsyslog_filecreatemode définit le mode de création avec lequel rsyslogd crée de nouveaux fichiers, voir rsconf1_filecreatemode.

journald_compress peut prendre une valeur booléenne. Si activé (valeur par défaut), les objets de données sont compressés avant d'être écrits sur le système de fichiers.

journald_storage contrôle où stocker les données de journal. L'une des options est volatile, persistent, auto ou none.

journald_forwardtosyslog contrôle si les messages d'enregistrement reçus par le démon de journal doivent être transférés à un démon syslog traditionnel.

Voir journald.conf pour plus d'informations.

./defaults/main/kernel.yml

allow_virtual_system_calls: true
enable_page_poisoning: true
kernel_lockdown: false
page_table_isolation: true
slub_debugger_poisoning: false

allow_virtual_system_calls permettra les appels système virtuels si true, sinon aucun mappage vsyscall ne sera défini, voir CONFIG_LEGACY_VSYSCALL_NONE.

enable_page_poisoning: true activera CONFIG_PAGE_POISONING.

kernel_lockdown configure la fonctionnalité de verrouillage du noyau. Les valeurs valides sont false, true, integrity et confidentiality. Si true, le noyau sera verrouillé en mode integrity.

page_table_isolation est une contre-mesure contre les attaques sur l'espace d'adresse partagé utilisateur/noyau, voir CONFIG_PAGE_TABLE_ISOLATION.

slub_debugger_poisoning, s'il est réglé sur true, prévient de nombreux types de vulnérabilités liées au dépassement de mémoire et empêche les fuites de données ainsi que la détection de mémoire corrompue. Voir Guide utilisateur court pour SLUB.

./defaults/main/limits.yml

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

Définir le nombre maximum de processus et de fichiers ouverts, voir limits.conf(5).

./defaults/main/misc.yml

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

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

redhat_signing_keys sont les Clés de Signature de Produit RedHat.

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

./defaults/main/module_blocklists.yml

fs_modules_blocklist:
  - cramfs
  - freevxfs
  - hfs
  - hfsplus
  - jffs2
  - squashfs
  - udf

misc_modules_blocklist:
  - bluetooth
  - bnep
  - btusb
  - can
  - cpia2
  - firewire-core
  - floppy
  - ksmbd
  - 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 à mettre sur liste noire et désactiver à l'aide d'une installation factice.

Remarque

Désactiver le module usb-storage désactivera tous les dispositifs de stockage USB. Si de tels dispositifs sont nécessaires, USBGuard ou un outil similaire doit être configuré en conséquence.

./defaults/main/mount.yml

hide_pid: 2
process_group: root

hide_pid règle le mode d'accès de /proc/<pid>/.

Le paramètre process_group configure le groupe autorisé à connaître les informations sur les processus autrement prohibées par hidepid=.

/proc options de montage

./defaults/main/ntp.yml

manage_timesyncd: true

fallback_ntp:
  - ntp.netnod.se
  - ntp.ubuntu.com
ntp:
  - 2.pool.ntp.org
  - time.nist.gov

Si manage_timesyncd: true, alors configure le système timesyncd, sinon il est recommandé d'installer un client NTP.

./defaults/main/packagemgmt.yml

apt_hardening_options:
  - Acquire::AllowDowngradeToInsecureRepositories "false";
  - Acquire::AllowInsecureRepositories "false";
  - Acquire::http::AllowRedirect "false";
  - APT::Get::AllowUnauthenticated "false";
  - APT::Get::AutomaticRemove "true";
  - APT::Install-Recommends "false";
  - APT::Install-Suggests "false";
  - APT::Periodic::AutocleanInterval "7";
  - APT::Sandbox::Seccomp "1";
  - Unattended-Upgrade::Remove-Unused-Dependencies "true";
  - Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";

Configurer la suite d'outils APT.

./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*
  - tuned
  - 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
  - rsyslog
  - sysstat
  - systemd-journal-remote
  - tcpd
  - vlock
  - wamerican

packages_redhat:
  - audispd-plugins
  - audit
  - cracklib
  - gnupg2
  - haveged
  - libpwquality
  - openssh-server
  - needrestart
  - postfix
  - psacct
  - python3-dnf-plugin-post-transaction-actions
  - rsyslog
  - rsyslog-gnutls
  - systemd-journal-remote
  - vlock
  - words

packages_ubuntu:
  - fwupd
  - secureboot-db
  - snapd

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

Les paquets à installer dépendent de la distribution et les paquets à supprimer (packages_blocklist).

./defaults/main/password.yml

manage_faillock: true

faillock:
  admin_group: []
  audit: true
  deny: 5
  dir: /var/run/faillock
  even_deny_root: true
  fail_interval: 900
  local_users_only: true
  no_log_info: false
  nodelay: true
  root_unlock_time: 600
  silent: false
  unlock_time: 600

login_defs:
  login_retries: 5
  login_timeout: 60
  pass_max_days: 60
  pass_min_days: 1
  pass_warn_age: 7

password_remember: 5

pwquality:
  dcredit: -1
  dictcheck: 1
  dictpath: ""
  difok: 8
  enforce_for_root: true
  enforcing: 1
  gecoscheck: 1
  lcredit: -1
  local_users_only: true
  maxclassrepeat: 4
  maxrepeat: 3
  minclass: 4
  minlen: 15
  ocredit: -1
  retry: 3
  ucredit: -1
  usercheck: 1
  usersubstr: 3

manage_faillock: true activera la bibliothèque faillock.

password_remember définit la taille de l'historique des mots de passe que l'utilisateur ne pourra pas réutiliser.

Les variables faillock, login_defs et pwquality sont utilisées pour configurer les pam_faillock, login.defs et libpwquality.

./defaults/main/rkhunter.yml

manage_rkhunter: true

rkhunter_allow_ssh_prot_v1: false
rkhunter_allow_ssh_root_user: false
rkhunter_mirrors_mode: "0"
rkhunter_update_mirrors: true
rkhunter_web_cmd: curl -fsSL

Si manage_rkhunter: true, alors configure rkhunter.

./defaults/main/sshd.yml

manage_ssh: true

sshd_accept_env: LANG LC_*
sshd_admin_net:
  - 192.168.0.0/24
  - 192.168.1.0/24
sshd_allow_agent_forwarding: false
sshd_allow_groups:
  - sudo
sshd_allow_tcp_forwarding: false
sshd_allow_users:
  - "{{ ansible_user | default(lookup('ansible.builtin.env', 'USER')) }}"
sshd_authentication_methods: any
sshd_authorized_principals_file: /etc/ssh/auth_principals/%u
sshd_banner: /etc/issue.net
sshd_ca_signature_algorithms:
  - ecdsa-sha2-nistp256
  - ecdsa-sha2-nistp384
  - ecdsa-sha2-nistp521
  - ssh-ed25519
  - rsa-sha2-256
  - rsa-sha2-512
  - ssh-rsa
sshd_kbd_interactive_authentication: false
sshd_ciphers:
  - [email protected]
  - [email protected]
  - aes256-ctr
sshd_client_alive_count_max: 1
sshd_client_alive_interval: 200
sshd_compression: false
sshd_config_d_force_clear: false
sshd_config_force_replace: false
sshd_debian_banner: false
sshd_deny_groups: []
sshd_deny_users: []
sshd_gssapi_authentication: false
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_host_keys_files: []
sshd_host_keys_group: root
sshd_host_keys_mode: "0600"
sshd_host_keys_owner: root
sshd_hostbased_authentication: false
sshd_ignore_rhosts: true
sshd_ignore_user_known_hosts: true
sshd_kerberos_authentication: false
sshd_kex_algorithms:
  - [email protected]
  - ecdh-sha2-nistp521
  - ecdh-sha2-nistp384
  - ecdh-sha2-nistp256
  - diffie-hellman-group-exchange-sha256
sshd_listen:
  - 0.0.0.0
sshd_log_level: VERBOSE
sshd_login_grace_time: 20
sshd_macs:
  - [email protected]
  - [email protected]
  - hmac-sha2-512
  - hmac-sha2-256
sshd_match_addresses: {}
sshd_match_groups: {}
sshd_match_local_ports: {}
sshd_match_users: {}
sshd_max_auth_tries: 3
sshd_max_sessions: 3
sshd_max_startups: 10:30:60
sshd_password_authentication: false
sshd_permit_empty_passwords: false
sshd_permit_root_login: false
sshd_permit_tunnel: false
sshd_permit_user_environment: false
sshd_ports:
  - 22
sshd_print_last_log: true
sshd_print_motd: false
sshd_print_pam_motd: false
sshd_rekey_limit: 512M 1h
sshd_required_ecdsa_size: 521
sshd_required_rsa_size: 4096
sshd_sftp_enabled: true
sshd_sftp_only_chroot: true
sshd_sftp_only_chroot_dir: "%h"
sshd_sftp_only_group: ""
sshd_sftp_subsystem: internal-sftp -f LOCAL6 -l INFO
sshd_strict_modes: true
sshd_syslog_facility: AUTH
sshd_tcp_keep_alive: false
sshd_trusted_user_ca_keys_base64: ""
sshd_trusted_user_ca_keys_file: /etc/ssh/trusted-user-ca-keys.pem
sshd_update_moduli: false
sshd_use_dns: false
sshd_use_pam: true
sshd_use_privilege_separation: sandbox
sshd_x11_forwarding: false

Si manage_ssh: true, le client SSH et le démon SSH seront configurés.

Remarque

CASignatureAlgorithms, Ciphers, HostKeyAlgorithms, KexAlgorithms et MACs seront configurés selon les politiques cryptographiques si /etc/crypto-policies/config existe et que set_crypto_policy: true.

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

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

La connexion OpenSSH n'est autorisée que pour les utilisateurs dont le groupe principal ou la liste des groupes supplémentaires correspond à l'un des motifs de sshd_allow_groups. La connexion OpenSSH est également autorisée pour les utilisateurs dans sshd_allow_users. Pour interdire l'accès, utilisez les paramètres sshd_deny_groups et sshd_deny_users, qui ont la priorité sur les paramètres précédents.

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

sshd_allow_tcp_forwarding spécifie si le transfert TCP est autorisé. Les options disponibles sont true ou all pour permettre le transfert TCP, false pour empêcher tout transfert 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 correctement complétées afin d'accorder l'accès à un utilisateur.

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

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

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

sshd_ports spécifie le(s) port(s) sur le(s)quel(s) sshd(8) écoute.

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

sshd_config_d_force_clear force le nettoyage du répertoire /etc/ssh/sshd_config.d. Par défaut : false.

sshd_config_force_replace force le remplacement du fichier de configuration /etc/ssh/sshd_config. Par défaut : false.

Remarque

Par défaut, le rôle vérifie si le répertoire /etc/ssh/sshd_config.d existe et s'il est lié par le paramètre Include dans le fichier /etc/ssh/sshd_config. Si c'est le cas, un fichier de configuration supplémentaire est créé dans /etc/ssh/sshd_config.d. Sinon, le fichier /etc/ssh/sshd_config est écrasé.

Avertissement

Si un de ces paramètres sshd_match_(users|groups|addresses|local_ports) ou sshd_sftp_only_group est défini, la valeur true sera implicite.

sshd_host_keys_files spécifie les clés d'hôte pour sshd. Si vide, ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key'] sera utilisé, selon les supportées par la version installée de sshd.

sshd_host_keys_owner définit le propriétaire des clés d'hôte pour sshd.

sshd_host_keys_group définit le groupe des clés d'hôte pour sshd.

sshd_host_keys_mode définit la permission des clés d'hôte pour sshd.

sshd_match_users ajoute un bloc conditionnel pour les utilisateurs. Si tous les critères de la ligne d'accord (Match) sont satisfaits, les règles/paramètres définis dans les lignes suivantes remplacent ceux définis dans la section globale du fichier de configuration, jusqu'à la prochaine ligne d'accord ou la fin du fichier.

Structure de configuration attendue :

sshd_match_users:
  - user: <nom_utilisateur>
    rules:
      - <paramètre sshd> <valeur>
      - <paramètre sshd> <valeur>

Exemple, autoriser l'accès de l'utilisateur ubuntu via l'authentification par mot de passe et permettre à l'utilisateur ansible d'accéder sans une bannière :

sshd_match_users:
  - user: ubuntu
    rules:
      - AllowUsers ubuntu
      - AuthenticationMethods password
      - PasswordAuthentication yes
  - user: ansible
    rules:
      - AllowUsers ansible
      - Banner none

sshd_match_groups ajoute un bloc conditionnel pour les groupes. Plus de détails et d'exemples se trouvent dans la description des paramètres sshd_match_users.

Structure de configuration attendue :

sshd_match_groups:
  - group: <nom_groupe>
    rules:
      - <paramètre sshd> <valeur>
      - <paramètre sshd> <valeur>

sshd_match_addresses ajoute un bloc conditionnel pour les adresses. Plus de détails et d'exemples se trouvent dans la description des paramètres sshd_match_users.

Structure de configuration attendue :

sshd_match_addresses:
  - address: <ip>
    rules:
      - <paramètre sshd> <valeur>
      - <paramètre sshd> <valeur>

sshd_match_local_ports ajoute un bloc conditionnel pour les ports. Plus de détails et d'exemples se trouvent dans la description des paramètres sshd_match_users.

Structure de configuration attendue :

sshd_match_ports:
  - port: <port>
    rules:
      - <paramètre sshd> <valeur>
      - <paramètre sshd> <valeur>

sshd_print_pam_motd spécifie si l'affichage de la MOTD via pam est autorisé.

sshd_sftp_enabled spécifie si la configuration sftp est activée.

sshd_sftp_subsystem définit le sous-système pour le démon de transfert de fichiers.

sshd_sftp_only_group spécifie le nom du groupe qui aura un accès restreint au service sftp uniquement.

sshd_sftp_only_chroot spécifie que l'accès du groupe sera via l'isolation chroot.

sshd_sftp_only_chroot_dir spécifie le répertoire chroot. Accepte les tokens %% (un littéral %), %h (répertoire personnel de l'utilisateur), et %u (nom d'utilisateur).

sshd_syslog_facility définit le code de facility utilisé lors de l'enregistrement des messages de sshd.

sshd_update_moduli, s'il est réglé sur true, téléchargera un fichier moduli mis à jour depuis le dépôt konstruktoid/ssh-moduli.

./defaults/main/suid_sgid_blocklist.yml

suid_sgid_permissions: true
suid_sgid_blocklist:
  - 7z
  - aa-exec
  - ab
  - agetty
  - alpine
  - ansible-playbook
  - ansible-test
  - aoss
  - apt
  - apt-get
  [...]

Si suid_sgid_permissions: true, parcourt suid_sgid_blocklist et supprime toute permission SUID/SGID.

Une liste complète des fichiers est disponible dans defaults/main/suid_sgid_blocklist.yml et est basée sur le travail de @GTFOBins.

./defaults/main/sysctl.yml

manage_sysctl: true
sysctl_conf_dir: "{{ '/usr/lib/sysctl.d' if usr_lib_sysctl_d_dir else '/etc/sysctl.d' }}"

sysctl_dev_tty_ldisc_autoload: 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

generic_sysctl_settings:
  fs.protected_fifos: 2
  fs.protected_hardlinks: 1
  fs.protected_symlinks: 1
  fs.suid_dumpable: 0
  kernel.core_pattern: "|/bin/false"
  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
  user.max_user_namespaces: 62967

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

Si manage_sysctl: true, alors met à jour la configuration sysctl.

sysctl_conf_dir est l'endroit où la configuration sysctl sera placée.

Voir sysctl.conf et la documentation du noyau.

./defaults/main/templates.yml

adduser_conf_template: etc/adduser.conf.j2
common_account_template: etc/pam.d/common-account.j2
common_auth_template: etc/pam.d/common-auth.j2
common_password_template: etc/pam.d/common-password.j2
coredump_conf_template: etc/systemd/coredump.conf.j2
faillock_conf_template: etc/security/faillock.conf.j2
hardening_rules_template: etc/audit/rules.d/hardening.rules.j2
hosts_allow_template: etc/hosts.allow.j2
hosts_deny_template: etc/hosts.deny.j2
initpath_sh_template: etc/profile.d/initpath.sh.j2
issue_template: etc/issue.j2
journald_conf_template: etc/systemd/journald.conf.j2
limits_conf_template: etc/security/limits.conf.j2
login_defs_template: etc/login.defs.j2
login_template: etc/pam.d/login.j2
logind_conf_template: etc/systemd/logind.conf.j2
logrotate_conf_template: etc/logrotate.conf.j2
motd_template: etc/motd.j2
pwquality_conf_template: etc/security/pwquality.conf.j2
resolved_conf_template: etc/systemd/resolved.conf.j2
rkhunter_template: etc/default/rkhunter.j2
ssh_config_template: etc/ssh/ssh_config.j2
sshd_config_template: etc/ssh/sshd_config.j2
sysctl_ipv6_config_template: etc/sysctl/sysctl.ipv6.conf.j2
sysctl_main_config_template: etc/sysctl/sysctl.main.conf.j2
system_conf_template: etc/systemd/system.conf.j2
timesyncd_conf_template: etc/systemd/timesyncd.conf.j2
tmp_mount_template: etc/systemd/tmp.mount.j2
user_conf_template: etc/systemd/user.conf.j2
useradd_template: etc/default/useradd.j2

Chemins pour soutenir le remplacement des modèles par défaut du rôle.

./defaults/main/ufw.yml

manage_ufw: true

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

ufw_rate_limit: false

Voir la remarque concernant les commentaires nécessaires.

manage_ufw: 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.

ufw_rate_limit, s'il est true, mettra des limites de taux de connexion sur toutes les interfaces réseau physiques disponibles.

./defaults/main/umask.yml

session_timeout: 900
umask_value: "077"

session_timeout fixe, en secondes, la variable d'environnement TMOUT.

umask_value définit la valeur par défaut de umask.

./defaults/main/usbguard.yml

manage_usbguard: true

usbguard_configuration_file: /etc/usbguard/usbguard-daemon.conf
usbguard_rulefile: /etc/usbguard/rules.conf

usbguard_auditbackend: LinuxAudit
usbguard_auditfilepath: /var/log/usbguard/usbguard-audit.log
usbguard_authorizeddefault: none
usbguard_devicemanagerbackend: uevent
usbguard_deviceruleswithport: false
usbguard_hidepii: false
usbguard_implicitpolicytarget: block
usbguard_inserteddevicepolicy: apply-policy
usbguard_ipcaccesscontrolfiles: /etc/usbguard/IPCAccessControl.d/
usbguard_ipcallowedgroups:
  - plugdev
  - root
  - wheel
usbguard_ipcallowedusers:
  - root
usbguard_presentcontrollerpolicy: keep
usbguard_presentdevicepolicy: apply-policy
usbguard_restorecontrollerdevicestate: false

manage_usbguard: true installe et configure USBGuard.

Une politique sera générée si des règles peuvent être listées et si une politique n'existe pas encore.

Voir la documentation de configuration pour les options disponibles.

./defaults/main/users.yml

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

Utilisateurs à supprimer.

Lecture Recommandée

Comparer les valeurs DISA STIG et CIS Benchmark

Center for Internet Security Linux Benchmarks

Common Configuration Enumeration

DISA Security Technical Implementation Guides

SCAP Security Guides

Configuration système de sécurité axée sur systemd

Contribuer

Vous voulez 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 à sponsorer ce projet.

Licence

Licence Apache Version 2.0

Informations sur l'Auteur

https://github.com/konstruktoid

À propos du projet

AlmaLinux, Debian and Ubuntu hardening. systemd edition.

Installer
ansible-galaxy install konstruktoid.hardening
Licence
apache-2.0
Téléchargements
33.6k
Propriétaire