Serveur d'impression

Guide de renforcement du serveur CentOS 7 | Lisenet.com :: Linux | Sécurité – Serveur d’impression

Par Titanfall , le 4 mai 2019 - 43 minutes de lecture

Ce guide est basé sur une installation minimale de CentOS 7 selon l’idée que vous n’installez que les logiciels dont vous avez besoin.

Pour ceux qui connaissent OpenSCAP, vous remarquerez le guide divisé en deux sections principales: Paramètres du système et Services. La première partie contient des règles qui vérifient les paramètres du système, tandis que la seconde partie vise à renforcer les services.

Une clause de non-responsabilité générale s'applique: n'implémentez pas les modifications dans les systèmes de production à moins que vous ne compreniez ce qu'elles font.

Sommaire

1. Paramètres système – Partitionnement de disque et post-installation

1.1 Cryptage de disque avec kickstart

Le moyen le plus simple de chiffrer une partition est lors de l'installation de Kickstart.

Ceci peut être réalisé en ajoutant le –Crypté et –Passphrase = options à la définition d'un volume physique LVM.

Notre modèle de Kickstart est fourni ci-dessous. Notez que le modèle nécessite un disque de 32 Go.

# version = CentOS7.5

# Informations d'autorisation du système



auth --enableshadow --passalgo = sha512
# Utiliser le support d'installation du CD-ROM



CD ROM

ignoredisk --only-use = sda

# Disposition du clavier



clavier --vckeymap = gb --xlayouts = 'gb'
# Langue du système



lang en_GB.UTF-8
# SELinux



selinux - en vigueur

# Informations sur le réseau



réseau --bootproto = dhcp --device = eth0 --onboot = on --activate
réseau --hostname = ks-c7.example.com

# Mot de passe root en clair: PleaseChangeMe



rootpw --iscrypted $ 6 $ nS0mBJyS $ q / QgCof5unWrT9W3qngTISueSDhDHVNntDqd8sOcgmHp2lq4f / niUbjCmoEzaf3EWQ2x3z / k0eIZaOxkfNtJw
# Fuseau horaire du système



fuseau horaire Europe / London --isUtc
# Configuration du chargeur de démarrage du système



chargeur de démarrage --location = mbr --boot-drive = sda --timeout = 3
# Informations de nettoyage de partition



clearpart --all --drives = sda
zerombr 

# Informations de partitionnement de disque
#
# Votre disque doit faire 32 Go: 1 Go pour / boot et 30 Go pour le volume physique.
#
# Journal pour le démarrage n'est pas nécessaire donc ext2



part / boot --fstype = "ext2" --ondisk = sda --size = 1024 --label = boot --mkfsoptions = "- m 0" --fsoptions = "rw, nodev, noexec, nosuid"

# La ligne ci-dessous créera un volume physique de 30 Go



part pv.01 --fstype = "lvmpv" --ondisk = sda --size = 30720 --encrypted --passphrase = PleaseChangeMeToSomethingElse
volgroup vg_crypto pv.01

# Besoin de pouvoir réduire les systèmes de fichiers donc ext4 sur xfs par défaut



logvol / --fstype = "ext4" --size = 6144 --vgname = vg_crypto --name = lv_root --mkfsoptions = "- m 1"
logvol / home --fstype = "ext4" --size = 2048 --vgname = vg_crypto --name = lv_home --mkfsoptions = "- m 0" --fsoptions = "rw, nodev, nosuid"
logvol / tmp --fstype = "ext4" --size = 1024 --vgname = vg_crypto --name = lv_tmp --mkfsoptions = "- m 1" --fsoptions = "rw, nodev, noexec, nosuid"
logvol / var --fstype = "ext4" --size = 4096 --vgname = vg_crypto --name = lv_var --mkfsoptions = "- m 1" --fsoptions = "rw, nosuid"
logvol / var / log --fstype = "ext4" --size = 1024 --vgname = vg_crypto --name = lv_var-log --mkfsoptions = "- m 0" --fsoptions = "rw, nodev, noexec, nosuid "
logvol / var / log / audit --fstype = "ext4" --size = 512 --vgname = vg_crypto --name = lv_var-aud --mkfsoptions = "- m 0" --fsoptions = "rw, nodev, noexec , nosuid "
logvol / var / tmp --fstype = "ext4" --size = 1024 --vgname = vg_crypto --name = lv_var-tmp --mkfsoptions = "- m 1" --fsoptions = "rw, nodev, noexec, nosuid "
logvol / var / www --fstype = "ext4" --size = 1024 --vgname = vg_crypto --name = lv_var-www --mkfsoptions = "- m 0" --fsoptions = "rw, nodev, nosuid"
logvol swap --fstype = "swap" --size = 512 --vgname = vg_crypto --name = lv_swap --fsoptions = "swap"

%paquets
@coeur

%fin

1.2 Schéma de partitionnement

Gardez les partitions suivantes séparées: /démarrage, /maison, / tmp, / var, / var / log, / var / tmp, / var / log / audit, / var / www.

Le fait de les placer dans leurs propres partitions donne plus de contrôle sur les options de montage. Cela garantit également que le système ne peut pas être arrêté en raison de l’espace disque insuffisant sur une partition.

Se séparer /opter dépend d'une configuration et n'est généralement pas utile, mais non plus nuisible.

1.3 Post-installation

Sauvegarder un en-tête LUKS, où / dev / sda2 est la partition chiffrée de LUKS:

# cryptsetup luksHeaderBackup / dev / sda2 --header-backup-file /root/luks-header.backup

Assurez-vous que le fichier de sauvegarde est stocké hors site, puis supprimé du serveur.

Assurez-vous que le système est à jour:

# miam mise à jour

Supprimez les packages dont vous n’avez pas besoin sur un serveur, par exemple firmware des cartes son, firmware de WinTV, pilotes sans fil, etc.

# yum remove alsa- * ivtv- * iwl * firmware aic94xx-firmware

2. Paramètres système – Autorisations de fichiers et masques

2.1 Limiter les options de montage de partition

Les partitions doivent avoir des options de montage renforcées:

  1. /démarrage – rw, nodev, noexec, nosuid
  2. /maison – rw, nodev, nosuid
  3. / tmp – rw, nodev, noexec, nosuid
  4. / var – rw, nosuid
  5. / var / log – rw, nodev, noexec, nosuid
  6. / var / log / audit – rw, nodev, noexec, nosuid
  7. / var / www – rw, nodev, nosuid

En règle générale, les applications malveillantes écrivent généralement sur / tmp et ensuite essayer d'exécuter tout ce qui était écrit. Un moyen d'éviter cela est de monter / tmp sur une partition séparée avec les options noexec, Nodev et nosuid activée.

Cela empêchera l'exécution binaire de / tmp, désactivez tout binaire en tant que suid root et désactivez la création de tout bloc de périphériques.

Le lieu de stockage / var / tmp devrait être lié à monté / tmp, car il n’est pas nécessaire d’avoir plusieurs emplacements pour le stockage temporaire:

/ tmp / var / tmp none, nodev, noexec, nosuid, bind 0 0

La même chose s'applique à la mémoire partagée / dev / shm:

tmpfs / dev / shm tmpfs rw, nodev, noexec, nosuid 0 0

Le pseudo-système de fichiers proc / proc devrait être monté avec caché. Lorsque vous définissez hidepid sur 2, les entrées de répertoires dans / proc sera caché.

proc / proc proc rw, hidepid = 2 0 0

Durcissez les supports amovibles en ajoutant Nodev, noexec et nosuid, par exemple.:

/ dev / cdrom / mnt / cdrom iso9660 ro, noexec, nosuid, nodev, noauto 0 0

2.2 Restreindre le montage et le démontage dynamiques de systèmes de fichiers

Ajouter ce qui suit à /etc/modprobe.d/hardening.conf pour désactiver les systèmes de fichiers inhabituels:

installer cramfs / bin / true
installer freevxfs / bin / true
installer jffs2 / bin / true
installer hfs / bin / true
installer hfsplus / bin / true
installer squashfs / bin / true
installer udf / bin / true

Selon la configuration (si vous n’exécutez pas de grappes, NFS, CIFS, etc.), vous pouvez également désactiver les éléments suivants:

installer fat / bin / true
installer vfat / bin / true
installer cifs / bin / true
installer nfs / bin / true
installer nfsv3 / bin / true
installer nfsv4 / bin / true
installer gfs2 / bin / true

Il est sage de laisser ext4, xfs et btrfs activés à tout moment.

2.3 Empêcher les utilisateurs de monter un stockage USB

Ajouter ce qui suit à /etc/modprobe.d/hardening.conf Pour désactiver le chargement de modprobe des pilotes de stockage USB et FireWire:

liste noire usb-storage
liste noire firewire-core
installer usb-storage / bin / true

Désactiver l'autorisation USB. Créer un fichier /opt/usb-auth.sh avec le contenu suivant:

#! / bin / bash
echo 0> / sys / bus / usb / devices / usb1 / autorisé
echo 0> / sys / bus / usb / devices / usb1 / registered_default

Si plusieurs périphériques USB sont disponibles, ajoutez-les tous. Créer un fichier de service /etc/systemd/system/usb-auth.service avec le contenu suivant:

[Unit]



Description = Désactiver l'authentification USB
DefaultDependencies = no

[Service]
Type = coup unique
ExecStart = / bin / bash /opt/usb-auth.sh

[Install]
WantedBy = multi-user.target

Définissez les autorisations, activez et démarrez le service:

# chmod 0700 /opt/usb-auth.sh
# systemctl enable usb-auth.service
# systemctl start usb-auth.service

Si nécessaire, désactivez la prise en charge du noyau pour USB via la configuration du chargeur de démarrage. Pour ce faire, ajoutez nousb à la ligne de noyau GRUB_CMDLINE_LINUX dans / etc / default / grub et générez le fichier de configuration Grub2:

# grub2-mkconfig -o / boot/grub2/grub.cfg

Notez que la désactivation de toute la prise en charge du noyau pour USB causera probablement des problèmes pour les systèmes dotés de claviers USB, etc.

2.4 Restreindre les programmes à partir de schémas d'exécution dangereux

Configurer /etc/sysctl.conf avec ce qui suit:

# Désactiver les core dumps



fs.suid_dumpable = 0

# Désactiver la fonctionnalité de débogage des requêtes système



kernel.sysrq = 0

# Restreindre l'accès aux journaux du noyau



kernel.dmesg_restrict = 1

# Activer la protection ExecShield - non disponible sur CentOS 7



# kernel.exec-shield = 1

# Randomise l'espace mémoire



kernel.randomize_va_space = 2

# Masquer les pointeurs du noyau



kernel.kptr_restrict = 2

Charger les paramètres sysctl:

# sysctp -p

2.5 Set UMASK 027

Les fichiers suivants nécessitent le renforcement de umask: / etc / bashrc, /etc/csh.cshrc, /etc/init.d/functions et / etc / profile.

Sed one-liner:

# sed -i -e '/ umask 022 / umask 027 / g' -e '/ umask 002 / umask 027 / g' / etc / bashrc
# sed -i -e '/ umask 022 / umask 027 / g' -e '/ umask 002 / umask 027 / g' /etc/csh.cshrc
# sed -i -e '/ umask 022 / umask 027 / g' -e '/ umask 002 / umask 027 / g' / etc / profile
# sed -i -e '/ umask 022 / umask 027 / g' -e '/ umask 002 / umask 027 / g' /etc/init.d/functions

2.6 Désactiver les core dumps

Ouvrir /etc/security/limits.conf et définissez les éléments suivants:

* noyau dur 0

2.7 Fixer des limites de sécurité pour empêcher les dénis de service

Ajouter ce qui suit à /etc/security/limits.conf pour appliquer des limites de sécurité sensibles:

# 4096 est un bon point de départ



* nofile souple 4096
* nofile dur 65536
* soft nproc 4096
* dur nproc 4096
* Soft Locks 4096
* serrures dures 4096
* pile souple 10240
* pile dure 32768
* Soft Memlock 64
* memlock difficile 64
* maxlogins durs 10

# Soft limite 32 Go, 64 Go dur



* taille douce 33554432
* taille dure 67108864

# Limites pour root



racine molle nofile 4096
racine dure nofile 65536
racine douce nproc 4096
racine dure nproc 4096
pile logicielle racine 10240
racine dure pile 32768
racine molle fsize 33554432

2.8 Vérifier les autorisations des fichiers

Assurez-vous que tous les fichiers appartiennent à un utilisateur:

# find / -ignore_readdir_race -nouser -print -exec racine chown  ;

Assurez-vous que tous les fichiers appartiennent à un groupe:

# find / -ignore_readdir_race -nogroup -print -exec chgrp root  ;

Si nécessaire, un chemin spécifique peut être exclu de la recherche, par exemple:

# find / -ignore_readdir_race -not -path "/ proc / *" -nouser -print -exec chown root  ;

Automatiser le processus en créant un fichier cron /etc/cron.daily/unowned_files avec le contenu suivant:

#! / bin / bash
find / -ignore_readdir_race  (-nouser -print -exec chown root  ; ),  (-nogroup -print -exec chgrp root  ; )

Définir la propriété et les autorisations:

# racine chown: root /etc/cron.daily/unowned_files
# chmod 0700 /etc/cron.daily/unowned_files

2.9 Surveiller les fichiers SUID / GUID

Recherchez les fichiers setuid / setgid et identifiez-les si tous sont requis:

# find / -xdev -type f -perm -4000 -o -perm -2000

3. Paramètres système – Configuration du pare-feu et du réseau

3.1 Pare-feu

Si vous définissez la zone de pare-feu par défaut à supprimer, tous les paquets qui ne sont pas explicitement autorisés à être rejetés.

# sed -i "s / DefaultZone =. * / DefaultZone = déposer / g" /etc/firewalld/firewalld.conf

Sauf si firewalld est requis, masquez-le et remplacez-le par iptables:

# systemctl stop firewalld.service
# systemctl mask firewalld.service
# systemctl daemon-reload
# miam installe iptables-services
# systemctl enable iptables.service ip6tables.service

Ajouter ce qui suit à / etc / sysconfig / iptables pour n'autoriser que le trafic sortant minimal (DNS, NTP, HTTP / S et SMTPS):

*filtre
-F INPUT
-F SORTIE
-F EN AVANT
-PASSEMENT ACCEPTER
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -i lo -m commentaire - commentaire local -j ACCEPTER
-A INPUT -d 127.0.0.0/8! -i lo -j REJECT - rejette-avec icmp-port-inaccessible
-A INPUT -m conntrack --ctstate CONNEXE, ÉTABLI -j ACCEPTER
-A INPUT -p tcp -m tcp -m conntrack --ctstate NOUVEAU --dport 22 -s 10.0.0.0/8 -j ACCEPTER
-A INPUT -p tcp -m tcp -m conntrack --ctstate NOUVEAU --dport 22 -s 172.16.0.0/12 -j ACCEPTER
-A INPUT -p tcp -m tcp -m conntrack --ctstate NOUVEAU --dport 22 -s 192.168.0.0/16 -j ACCEPT
-A INPUT -p tcp -m tcp -m conntrack --ctstate NOUVEAU - rapport 22 -j ACCEPTER
-Une entrée -j DROP
-A SORTIE -d 127.0.0.0/8 -o lo -m commentaire - commentaire local -j ACCEPTER
-A OUTPUT -m conntrack --ctstate RELATED, ESTABLISHED -j ACCEPT
-A SORTIE -p icmp -m icmp --icmp-type quelconque -j ACCEPTER
-A SORTIE -p udp -m udp -m conntrack --ctstate NOUVEAU --dport 53 -j ACCEPTER
-A SORTIE -p tcp -m tcp -m conntrack --ctstate NOUVEAU - rapport 53 -j ACCEPTER
-A SORTIE -p udp -m udp -m conntrack --ctstate NOUVEAU - rapport 123 -j ACCEPTER
-A SORTIE -p tcp -m tcp -m conntrack --ctstate NOUVEAU --dport 80 -j ACCEPT
-A SORTIE -p tcp -m tcp -m conntrack --ctstate NOUVEAU --dport 443 -j ACCEPTER
-A SORTIE -p tcp -m tcp -m conntrack --ctstate NOUVEAU - rapport 587 -j ACCEPTER
-A SORTIE -j LOG - préfixe-journal "iptables_output"
-A SORTIE -j REJET - rejette-avec icmp-port-inaccessible
COMMETTRE

Notez que la règle autorisant tout le trafic SSH entrant doit être supprimée, limitant l'accès à une liste blanche IP uniquement ou masquant SSH derrière un VPN.

Idéalement, les règles sortantes devraient être renforcées en limitant l'accès aux serveurs DNS, NTP et SMTP locaux uniquement. Si un système de correctif local est utilisé (par exemple, Red Hat Satellite), le trafic HTTP / S peut également être renforcé, en fonction de la configuration.

Ajouter ce qui suit à / etc / sysconfig / ip6tables refuser tout IPv6:

*filtre
-F INPUT
-F SORTIE
-F EN AVANT
-PUT ENTREE DROP
-P FORWARD DROP
-P SORTIE DROP
COMMETTRE

Appliquer les configurations:

# iptables-restore </ etc / sysconfig / iptables
# ip6tables-restore </ etc / sysconfig / ip6tables

3.2 TCP Wrappers

Ouvrir /etc/hosts.allow et autoriser le trafic localhost et SSH:

TOUS: 127.0.0.1
sshd: ALL

Le fichier /etc/hosts.deny devrait être configuré pour tout refuser par défaut:

TOUS: TOUS

3.3 Paramètres du noyau qui affectent la mise en réseau

Ouvrir /etc/sysctl.conf et ajoutez ce qui suit:

# Désactiver le transfert de paquets



net.ipv4.ip_forward = 0

# Désactive les redirections, pas un routeur



net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

# Désactiver le routage source



net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0

# Activer la validation de la source par chemin inversé



net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Journalise les paquets avec des adresses impossibles dans le journal du noyau



net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

# Désactiver les diffusions ICMP



net.ipv4.icmp_echo_ignore_broadcasts = 1

# Ignorer les erreurs fictives ICMP



net.ipv4.icmp_ignore_bogus_error_responses = 1

# Contre les attaques par inondation SYN



net.ipv4.tcp_syncookies = 1

# La désactivation des horodatages peut améliorer la sécurité mais dégrader les performances.
# Les horodatages TCP sont utilisés pour améliorer les performances et se protéger contre
# Les paquets en retard perturbent votre flux de données. Un effet secondaire de cette fonctionnalité est
# que le temps de disponibilité de l'hôte peut parfois être calculé.
# Si vous désactivez les horodatages TCP, vous devriez vous attendre à de moins bonnes performances.
# et des connexions moins fiables.



net.ipv4.tcp_timestamps = 1

# Désactiver IPv6 sauf si requis



net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

# Ne pas accepter les annonces de routeur



net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0

3.4 Modules de noyau qui affectent la mise en réseau

Ouvrir /etc/modprobe.d/hardening.conf et désactivez les modules du noyau Bluetooth:

installer bnep / bin / true
installer bluetooth / bin / true
installer btusb / bin / true
installer net-pf-31 / bin / true

Désactivez également AppleTalk:

installer appletalk / bin / true

Si nécessaire, désactivez la prise en charge d'IPv6:

options ipv6 désactiver = 1

Désactiver les protocoles (rares):

installer dccp / bin / true
installez sctp / bin / true
installer rds / bin / true
installer tipc / bin / true

Puisque nous examinons la sécurité des serveurs, le sans fil ne devrait pas être un problème, nous pouvons donc désactiver tous les pilotes sans fil.

# pour i dans $ (trouver / lib / modules / $ (uname -r) / kernel / drivers / net / wireless -name "* .ko" -type f);
  echo blacklist "$ i" >> / etc / modprobe.d / hardening-wireless.conf; done

3.5 Désactiver les radios

Désactiver les radios (wifi et wwan):

# nmcli radio tout est éteint

3.6 Désactiver le réseau Zeroconf

Ouvrir / etc / sysconfig / network et ajoutez ce qui suit:

NOZEROCONF = oui

3.7 Désactiver l'utilisation de l'interface IPv6 par l'interface

Ouvrir / etc / sysconfig / network et ajoutez ce qui suit:

NETWORKING_IPV6 = no
IPV6INIT = no

3.8 renifleur de réseau

Le serveur ne doit pas agir comme un renifleur réseau et une capture de packages. Exécutez ce qui suit pour déterminer si une interface est en cours d'exécution en mode promiscuous:

# lien ip | grep PROMISC

3.9 Connexion VPN sécurisée

Installez le paquet libreswan si la mise en oeuvre de IPSec et IKE est requise.

# miam installer libreswan

3.10 Désactiver le client DHCP

L'attribution manuelle d'adresses IP offre un degré de gestion supérieur.

Pour chaque interface réseau disponible sur le serveur, ouvrez un fichier correspondant. / etc / sysconfig / network-scripts / ifcfg-interface et configurez les paramètres suivants:

BOOTPROTO = aucun
IPADDR =
NETMASK =
PASSERELLE =

4. Paramètres système – SELinux

Assurez-vous que SELinux n'est pas désactivé dans / etc / default / grubet vérifiez que l'état applique:

# sestatus

5. Paramètres système – Contrôle de compte et d'accès

5.1 Supprimer les comptes et les groupes inutilisés

Supprimez tout compte non requis, par exemple:

# userdel -r adm
# userdel -r ftp
# userdel -r jeux
# userdel -r lp

Supprimer tout groupe non requis, par exemple:

# jeux groupdel

5.2 Désactiver la connexion root directe

# echo> / etc / securetty

5.3 Activer la stratégie de mot de passe sécurisé (haute qualité)

Notez que lancer authconfig va écraser les fichiers de configuration PAM détruisant les modifications apportées manuellement. Assurez-vous que vous avez un sauvegarde.

Les règles de stratégie de mot de passe sécurisé sont décrites ci-dessous.

  1. Longueur minimale du mot de passe – 16.
  2. Nombre minimum de classes de caractères dans un mot de passe – 4.
  3. Nombre maximum de mêmes caractères consécutifs dans un mot de passe – 2.
  4. Nombre maximal de caractères consécutifs de la même classe dans un mot de passe – 2.
  5. Exigez au moins une lettre minuscule et une lettre majuscule dans un mot de passe.
  6. Exiger au moins un chiffre dans un mot de passe.
  7. Exiger au moins un autre caractère dans un mot de passe.

La commande suivante activera SHA512 et définira les exigences de mot de passe ci-dessus:

# authconfig --passalgo = sha512 
 --passminlen = 16 
 --passminclass = 4 
 --passmaxrepeat = 2 
 --passmaxclassrepeat = 2 
 --enablereqlower 
 --enablerequpper 
 --enablereqdigit 
 --enablereqother 
 --mettre à jour

Ouvrir /etc/security/pwquality.conf et ajoutez ce qui suit:

difok = 8
gecoscheck = 1

Cela garantira que 8 caractères du nouveau mot de passe ne seront pas présents dans l'ancien mot de passe et vérifiera les mots de la chaîne GECOS de mot de passe de l'utilisateur.

5.4 Empêcher la connexion à des comptes avec un mot de passe vide

Supprimer toutes les occurrences de nullok de /etc/pam.d/system-auth et /etc/pam.d/password-auth pour empêcher les connexions avec des mots de passe vides.

Sed one-liner:

# sed -i's / // g '/etc/pam.d/system-auth /etc/pam.d/system-auth-ac
# sed -i's / // g '/etc/pam.d/password-auth /etc/pam.d/password-auth-ac

5.5 Définir l'expiration du compte après l'inactivité

Désactivez les comptes dès que le mot de passe a expiré.

Ouvrir / etc / default / useradd et définissez les éléments suivants:

INACTIF = 0

Sed one-liner:

# sed -i 's / ^ INACTIVE. * / INACTIF = 0 /' / etc / default / useradd

5.6 Politique de mot de passe sécurisé

Ouvrir /etc/login.defs et définissez les éléments suivants:

PASS_MAX_DAYS 60
PASS_MIN_DAYS 1
PASS_MIN_LEN 14
PASS_WARN_AGE 14

Sed one-liner:

# sed -i -e '/ ^ PASS_MAX_DAYS. * / PASS_MAX_DAYS 60 /' 
  -e 's / ^ PASS_MIN_DAYS. * / PASS_MIN_DAYS 1 /' 
  -e 's / ^ PASS_MIN_LEN. * / PASS_MIN_LEN 14 /' 
  -e 's / ^ PASS_WARN_AGE. * / PASS_WARN_AGE 14 /' /etc/login.defs

5.7 Journal des tentatives de connexion infructueuses

Ouvrir /etc/login.defs et activer la journalisation:

FAILLOG_ENAB oui

Ajoutez également un délai en secondes avant de pouvoir effectuer une autre tentative après un échec de connexion:

FAIL_DELAY 4

5.8 S'assurer que les répertoires de base sont créés pour les nouveaux utilisateurs

Ouvrir /etc/login.defs et configurer:

CREATE_HOME oui

5.9 Vérifier que tous les mots de passe du compte sont masqués

La commande ci-dessous devrait renvoyer «x»:

# cut -d: -f2 / etc / passwd | uniq

5.10 Définir le délai de refus et de verrouillage pour les tentatives de mot de passe infructueuses

Ajouter la ligne suivante immédiatement avant le pam_unix.so déclaration dans le AUTH section de /etc/pam.d/system-auth et /etc/pam.d/password-auth:

auth requis pam_faillock.so preauth silencieux deny = 3 unlock_time = 900 fail_interval = 900

Ajoutez la ligne suivante immédiatement après le pam_unix.so déclaration dans le AUTH section de /etc/pam.d/system-auth et /etc/pam.d/password-auth:

auth [default=die] pam_faillock.so authfail deny = 3 unlock_time = 900 fail_interval = 900

Ajouter la ligne suivante immédiatement avant le pam_unix.so déclaration dans le COMPTE section de /etc/pam.d/system-auth et /etc/pam.d/password-auth:

compte requis pam_faillock.so

Le contenu du fichier /etc/pam.d/system-auth peut être vu ci-dessous.

#% PAM-1.0



auth requis pam_env.so
auth requis pam_faillock.so preauth silencieux deny = 3 unlock_time = 900 fail_interval = 900
autorisation suffisante pam_unix.so try_first_pass
auth        [default=die] pam_faillock.so authfail deny = 3 unlock_time = 900 fail_interval = 900
autorisation requise pam_succeed_if.so uid> = 1000 quiet_success
auth requis pam_deny.so

compte requis pam_faillock.so
compte requis pam_unix.so
compte suffisant pam_localuser.so
compte suffisant pam_succeed_if.so uid <1000 silencieux
compte requis pam_permit.so

mot de passe requis pam_pwquality.so try_first_pass local_users_only retry = 3 authtok_type =
mot de passe suffisant pam_unix.so sha512 shadow try_first_pass use_authtok rappelez-vous = 5
mot de passe requis pam_deny.so

session facultative pam_keyinit.so révoquer
session requise pam_limits.so
-session optionnel pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service dans crond quiet use_uid
session requise pam_unix.so

De plus, n'autorisez pas les utilisateurs à réutiliser des mots de passe récents en ajoutant le rappelles toi option.

Faire /etc/pam.d/system-auth et /etc/pam.d/password-auth configurations immuables pour qu’elles ne soient pas écrasées lors de l’exécution d’authconfig:

# chattr + i /etc/pam.d/system-auth /etc/pam.d/password-auth

Les comptes seront verrouillés après 3 tentatives de connexion infructueuses:

s'identifier[]: pam_faillock (login: auth): échecs de connexion consécutifs pour le compte utilisateur tomas temporairement bloqué 

Utilisez ce qui suit pour effacer le nombre d’échecs de l’utilisateur:

# faillock --user tomas --reset

5.11 Définir le mot de passe du chargeur d'amorçage

Empêcher les utilisateurs d’entrer dans la ligne de commande grub et d’éditer les entrées du menu:

# grub2-setpassword
# grub2-mkconfig -o / boot/grub2/grub.cfg

Cela va créer le fichier /boot/grub2/user.cfg s'il n'y en a pas déjà un, qui contiendra le mot de passe haché du chargeur de démarrage Grub2.

Vérifier les autorisations de /boot/grub2/grub.cfg:

# chmod 0600 /boot/grub2/grub.cfg

5.12 Mode utilisateur unique protégé par mot de passe

Le mode utilisateur unique CentOS 7 est protégé par mot de passe par le mot de passe root par défaut dans le cadre de la conception de Grub2 et de systemd.

5.13 Assurer que les utilisateurs s'authentifient de nouveau pour l'escalade des privilèges

La balise NOPASSWD permet à un utilisateur d’exécuter des commandes à l’aide de sudo sans devoir fournir de mot de passe. Bien que cela puisse parfois être utile, il est également dangereux.

Assurez-vous que la balise NOPASSWD n’existe pas dans / etc / sudoers fichier de configuration ou /etc/sudoers.d/.

5.14 Écrans multiples de la console et verrouillage de la console

Installez le package d'écran pour pouvoir émuler plusieurs fenêtres de console:

# yum install screen

Installez le paquet vlock pour activer le verrouillage de l’écran de la console:

# miam installer vlock

5.15 Désactiver l'activation de redémarrage Ctrl-Alt-Suppr

Empêcher un utilisateur de la console connecté localement de redémarrer le système lorsque vous appuyez sur Ctrl-Alt-Suppr:

# systemctl mask ctrl-alt-del.target

5.16 Bannières d'avertissement pour l'accès au système

Ajouter la ligne suivante aux fichiers / etc / issue et /etc/issue.net:

Accès non autorisé interdit. Les journaux sont enregistrés et surveillés.

5.17 Définir le délai d'expiration de la session interactive

Ouvrir / etc / profile Et mettre:

en lecture seule TMOUT = 900

5.18 Authentification à deux facteurs

La version récente du serveur OpenSSH permet de chaîner plusieurs méthodes d'authentification, ce qui signifie qu'elles doivent toutes être satisfaites pour qu'un utilisateur puisse se connecter avec succès.

Ajout de la ligne suivante à / etc / ssh / sshd_config nécessiterait que l'utilisateur s'authentifie d'abord avec une clé, puis fournisse également un mot de passe.

AuthenticationMethods publickey, mot de passe

Il s’agit par définition d’une authentification à deux facteurs: le fichier de clé est une propriété de l’utilisateur et le mot de passe du compte est connu de l’utilisateur.

L'authentification à deux facteurs pour SSH peut également être configurée à l'aide de Google Authenticator.

5.19 Configurer la taille du fichier d'historique

Ouvrir / etc / profile et définissez le nombre de commandes à mémoriser dans l'historique des commandes à 5000:

HISTSIZE = 5000

Sed one-liner:

# sed -i's / HISTSIZE =. * / HISTSIZE = 5000 / g '/ etc / profile

6. Paramètres système – Comptabilité système avec auditd

6.1 Configuration auditée

Ouvrir /etc/audit/auditd.conf et configurez les éléments suivants:

local_events = yes
write_logs = yes
log_file = /var/log/audit/audit.log
max_log_file = 25
num_logs = 10
max_log_file_action = rotation
space_left = 30
space_left_action = email
admin_space_left = 10
admin_space_left_action = email
disk_full_action = suspendre
disk_error_action = suspendre
action_mail_acct = [email protected]
flush = data

La configuration auditd ci-dessus ne doit jamais utiliser plus de 250 Mo d’espace disque (10 x 25 Mo = 250 Mo) sur / var / log / audit.

Ensemble admin_space_left_action = single si vous souhaitez que le système passe en mode utilisateur unique pour une action corrective plutôt que d'envoyer un courrier électronique.

Rotation automatique des bûches (max_log_file_action = rotation) minimise les chances que le système manque d’espace disque de manière inattendue en étant rempli de données de journal.

Nous devons nous assurer que les données d’événement d’audit sont entièrement synchronisées (flush = data) avec les fichiers de log sur le disque.

6.2 Règles d'audit

Les règles d'audit système doivent avoir le mode 0640 ou moins permissif et appartenir à l'utilisateur root:

# racine chown: root /etc/audit/rules.d/audit.rules
# chmod 0640 /etc/audit/rules.d/audit.rules

Ouvrir /etc/audit/rules.d/audit.rules et ajoutez ce qui suit:

# Supprimer toutes les règles actuellement chargées



-RÉ

# Définir la taille de la mémoire tampon du noyau



-b 8192

# Définit l'action à effectuer lorsqu'une erreur critique est détectée.
# Modes d'échec: 0 = silencieux 1 = printk 2 = panique



-f 1

# Record tente de modifier le fichier localtime



-w / etc / localtime -p wa -k audit_time_rules

# Enregistrer des événements qui modifient les informations utilisateur / groupe



-w / etc / group -p wa -k audit_rules_usergroup_modification
-w / etc / passwd -p wa -k audit_rules_usergroup_modification
-w / etc / gshadow -p wa -k audit_rules_usergroup_modification
-w / etc / shadow -p wa -k audit_rules_usergroup_modification
-w / etc / security / opasswd -p wa -k audit_rules_usergroup_modification

# Enregistrer des événements qui modifient l'environnement réseau du système



-w /etc/issue.net -p wa -k audit_rules_networkconfig_modification
-w / etc / issue -p wa -k audit_rules_networkconfig_modification
-w / etc / hosts -p wa -k audit_rules_networkconfig_modification
-w / etc / sysconfig / network -p wa -k audit_rules_networkconfig_modification
-a toujours, quittez -F arch = b32 -S nom_hôte -S nom_domaine_s -k audit_rules_networkconfig_modification
-a toujours, quittez -F arch = b64 -S nom_hôte -S nom_domaine_s -k audit_rules_networkconfig_modification

# Enregistrer des événements qui modifient les contrôles d'accès obligatoires du système



-w / etc / selinux / -p wa -k MAC-policy

# Enregistrer les tentatives de modification des événements de connexion et de déconnexion



-w / var / log / tallylog -p wa -k connexions
-w / var / log / lastlog -p wa -k connexions
-w / var / run / faillock / -p wa -k connexions

# Enregistrer les tentatives de modification des informations de démarrage du processus et de la session



-w / var / log / btmp -p wa -k session
-w / var / log / wtmp -p wa -k session
-w / var / run / utmp -p wa -k session

# Assurez-audit auditd de collecter des informations sur le chargement et le déchargement des modules du noyau



-w / usr / sbin / insmod -p x -k modules
-w / usr / sbin / modprobe -p x -k modules
-w / usr / sbin / rmmod -p x -k modules
-a toujours, quittez -F arch = b64 -S init_module -S delete_module -k modules

# S'assurer que auditd collecte les actions de l'administrateur système



-w / etc / sudoers -p wa -k actions
-w /etc/sudoers.d/ -p wa -k actions

# Enregistrez les tentatives de modification du temps avec adjtimex



-a toujours, quittez -F arch = b32 -S adjtimex -S settimeofday -S temps -k audit_time_rules

# Record tentatives de changer le temps par settimeofday



-a toujours, quittez -F arch = b64 -S adjtimex -S settimeofday -k audit_time_rules

# Enregistrez les tentatives de modification de l'heure via clock_settime



-a toujours, quitte -F arch = b32 -S clock_settime -F a0 = 0x0 -k changement d'heure

# Enregistrez les tentatives de modification de l'heure via clock_settime



-a toujours, quitte -F arch = b64 -S clock_settime -F a0 = 0x0 -k changement d'heure

# Enregistrer des événements qui modifient les contrôles d'accès discrétionnaires du système



-a toujours, quittez -F arch = b32 -S chmod -S fchmod -S fchmodat -F auid> = 1000 -F auid! = 4294967295 -k perm_mod
-a toujours, quittez -F arch = b32 -S chown -S fchown -S fchownat -S lchown -F auid> = 1000 -F auid! = 4294967295 -k perm_mod
-a toujours, quittez -F arch = b64 -S chmod -S fchmod -S fchmodat -F auid> = 1000 -F auid! = 4294967295 -k perm_mod
-a toujours, quittez -F arch = b64 -S chown -S fchown -S fchownat -S lchown -F auid> = 1000 -F auid! = 4294967295 -k perm_mod
-a toujours, quittez -F arch = b32 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -F auid> = 1000 -F auid! = 4294967295 -k perm_mod
-a toujours, quittez -F arch = b64 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S lremovexattr -S fremovexattr -F auid> = 1000 -F auid! = 4294967295 -k perm_mod

# S'assurer que auditd collecte les tentatives d'accès non autorisé aux fichiers (non réussi)



-a toujours, quittez -F arch = b32 -S cré -S ouvert -S ouvert à -S ouvert_by_handle_at -S tronqué -S ftruncate -F sortie = -EACCES -F auid> = 1000 -F auid! = 4294967295 -k accès
-a toujours, quittez -F arch = b32 -S cré -S ouvrir -S ouvrirat -S open_by_handle_at -S tronquer -S ftronquer -F quitter = -EPERM -F auid> = 1000 -F auid! = 4294967295 -k accès
-a toujours, quittez -F arch = b64 -S cré -S ouvert -S ouvert à -S ouvert_by_handle_at -S tronqué -S ftruncate -F sortie = -EACCES -F auid> = 1000 -F auid! = 4294967295 -k accès
-a toujours, quittez -F arch = b64 -S cré -S ouvrir -S ouvrirat -S open_by_handle_at -S tronquer -S ftronquer -F quitter = -EPERM -F auid> = 1000 -F auid! = 4294967295 -k accès

# S'assure que auditd collecte des informations sur l'exportation vers le support (avec succès)



-a toujours, quittez -F arch = b32 -S montage -F auid> = 1000 -F auid! = 4294967295 -k export
-a toujours, quittez -F arch = b64 -S montage -F auid> = 1000 -F auid! = 4294967295 -k export

# S'assure que auditd collecte les événements de suppression de fichier par utilisateur



-a toujours, quittez -F arch = b32 -S rmdir -S unlink -S unlinkat -S renommer -S renameat -F auid> = 1000 -F auid! = 4294967295 -k supprimer
-a toujours, quittez -F arch = b64 -S rmdir -S unlink -S unlinkat -S renommer -S renameat -F auid> = 1000 -F auid! = 4294967295 -k supprimer

# Assurez-audit auditd de collecter des informations sur l'utilisation de commandes privilégiées



-a toujours, sortie -F chemin = / usr / bin / chage -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, quitte -F chemin = / usr / bin / chcon -F perm = x -F auid> = 1000 -F auid! = 4294967295 -F clé = privileged-priv_change
-a toujours, quitte -F chemin = / usr / bin / chfn -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, sortie -F chemin = / usr / bin / chsh -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, sortie -F chemin = / usr / bin / crontab -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, sortie -F chemin = / usr / bin / gpasswd -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, sortie -F chemin = / usr / bin / mount -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, quitte -F chemin = / usr / bin / newgrp -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, quitter -F chemin = / usr / bin / passwd -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, quitter -F chemin = / usr / bin / pkexec -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, quitte -F chemin = / usr / bin / screen -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, quittez -f chemin = / usr / bin / ssh-agent -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, sortie -F chemin = / usr / bin / sudo -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, quitte -F chemin = / usr / bin / sudoedit -F perm = x -F auid> = 1000 -F auid! = 4294967295 -F clé = privilégié
-a toujours, quitter -F chemin = / usr / bin / su -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, sortie -F chemin = / usr / bin / umount -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, sortie -F chemin = / usr / bin / mur -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a toujours, sortie -F chemin = / usr / bin / écriture -F perm = x -F auid> = 1000 -F auid! = 4294967295 -k privilégié
-a always,exit -F path=/usr/lib64/dbus-1/dbus-daemon-launch-helper -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/libexec/openssh/ssh-keysign -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/libexec/utempter/utempter -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/lib/polkit-1/polkit-agent-helper-1 -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/sbin/netreport -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/sbin/pam_timestamp_check -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/sbin/postdrop -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/sbin/postqueue -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/sbin/restorecon -F perm=x -F auid>=1000 -F auid!=4294967295 -F key=privileged-priv_change
-a always,exit -F path=/usr/sbin/semanage -F perm=x -F auid>=1000 -F auid!=4294967295 -F key=privileged-priv_change
-a always,exit -F path=/usr/sbin/setsebool -F perm=x -F auid>=1000 -F auid!=4294967295 -F key=privileged-priv_change
-a always,exit -F path=/usr/sbin/unix_chkpwd -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/sbin/userhelper -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged
-a always,exit -F path=/usr/sbin/usernetctl -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged

# Make the auditd configuration immutable.
# The configuration can only be changed by rebooting the machine.



-e 2

The auditd service does not include the ability to send audit records to a centralised server for management directly.

It does, however, include a plug-in for audit event multiplexor to pass audit records to the local syslog server.

To do so, open the file /etc/audisp/plugins.d/syslog.conf and set:

active = yes

Enable and start the service:

# systemctl enable auditd.service
# systemctl start auditd.service

6.3. Enable Kernel Auditing

Ouvrir /etc/default/grub and append the following parameter to the kernel boot line GRUB_CMDLINE_LINUX:

audit=1

Update Grub2 configuration to reflect changes:

# grub2-mkconfig -o /boot/grub2/grub.cfg

7. System Settings – Software Integrity Checking

7.1 Advanced Intrusion Detection Environment (AIDE)

Install AIDE:

# yum install aide

Build AIDE database:

# /usr/sbin/aide --init

By default, the database will be written to the file /var/lib/aide/aide.db.new.gz.

# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

Storing the database and the configuration file /etc/aide.conf (or SHA2 hashes of the files) in a secure location provides additional assurance about their integrity.

Check AIDE database:

# /usr/sbin/aide --check

By default, AIDE does not install itself for periodic execution. Configure periodic execution of AIDE by adding to cron:

# echo "30 4 * * * root /usr/sbin/aide --check|mail -s 'AIDE' [email protected]" >> /etc/crontab

Periodically running AIDE is necessary in order to reveal system changes.

7.2 Tripwire

Open Source Tripwire is an alternative to AIDE. It is recommended to use one or another, but not both.

Install Tripwire from the EPEL repository:

# yum install epel-release
# yum install tripwire
# /usr/sbin/tripwire-setup-keyfiles

The Tripwire configuration file is /etc/tripwire/twcfg.txt and the policy file is /etc/tripwire/twpol.txt. These can be edited and configured to match the system Tripwire is installed on, see this blog post for more details.

Initialise the database to implement the policy:

# tripwire --init

Check for policy violations:

# tripwire --check

Tripwire adds itself to /etc/cron.daily/ for daily execution therefore no extra configuration is required.

7.3 Prelink

Prelinking is done by the prelink package, which is not installed by default.

# yum install prelink

To disable prelinking, open the file /etc/sysconfig/prelink and set the following:

PRELINKING=no

Sed one-liner:

# sed -i 's/PRELINKING.*/PRELINKING=no/g' /etc/sysconfig/prelink

Disable existing prelinking on all system files:

# prelink -ua

8. System Settings – Logging and Message Forwarding

8.1 Configure Persistent Journald Storage

By default, journal stores log files only in memory or a small ring-buffer in the directory /run/log/journal. This is sufficient to show recent log history with journalctl, but logs aren’t saved permanently. Enabling persistent journal storage ensures that comprehensive data is available after system reboot.

Open the file /etc/systemd/journald.conf and put the following:

[Journal]



Storage=persistent

# How much disk space the journal may use up at most



SystemMaxUse=256M

# How much disk space systemd-journald shall leave free for other uses



SystemKeepFree=512M

# How large individual journal files may grow at most



SystemMaxFileSize=32M

Restart the service:

# systemctl daemon-reload
# systemctl restart systemd-journald

8.2 Configure Message Forwarding to Remote Server

Depending on your setup, open /etc/rsyslog.conf and add the following to forward messages to a some remote server:

*.* @graylog.example.com:514

Ici *.* représente facility.severity. Note that a single @ sends logs over UDP, where a double @ sends logs using TCP.

8.3 Logwatch

Logwatch is a customisable log-monitoring system.

# yum install logwatch

Logwatch adds itself to /etc/cron.daily/ for daily execution therefore no configuration is mandatory.

9. System Settings – Security Software

9.1 Malware Scanners

Install Rkhunter and ClamAV:

# yum install epel-release
# yum install rkhunter clamav clamav-update
# rkhunter --update
# rkhunter --propupd
# freshclam -v

Rkhunter adds itself to /etc/cron.daily/ for daily execution therefore no configuration is required. ClamAV scans should be tailored to individual needs.

9.2 Arpwatch

Arpwatch is a tool used to monitor ARP activity of a local network (ARP spoofing detection), therefore it is unlikely one will use it in the cloud, however, it is still worth mentioning that the tools exist.

Be aware of the configuration file /etc/sysconfig/arpwatch which you use to set the email address where to send the reports.

9.3 Commercial AV

Consider installing a commercial AV product that provides real-time on-access scanning capabilities.

9.4 Grsecurity

Grsecurity is an extensive security enhancement to the Linux kernel. Although it isn’t free nowadays, the software is still worth mentioning.

The company behind Grsecurity stopped publicly distributing stable patches back in 2015, with an exception of the test series continuing to be available to the public in order to avoid impact to the Gentoo Hardened and Arch Linux communities.

Two years later, the company decided to cease free distribution of the test patches as well, therefore as of 2017, Grsecurity software is available to paying customers only.

10. System Settings – OS Update Installation

Install the package yum-utils for better consistency checking of the package database.

# yum install yum-utils

Configure automatic package updates via yum-cron.

# yum install yum-cron

Add the following to /etc/yum/yum-cron.conf to get notified via email when new updates are available:

update_cmd = default
update_messages = yes
download_updates = no	
apply_updates = no
emit_via = email	
email_from = [email protected]
email_to = [email protected]
email_host = localhost

Add the following to /etc/yum/yum-cron-hourly.conf to check for bugfix-related updates every hour and automatically download and install them:

update_cmd = minimal # yum --bugfix update-minimal



update_messages = yes
download_updates = yes
apply_updates = yes
emit_via = stdio

Remarque: security information is provided by RedHat only. When you query a repository that is provided by CentOS it does not supply security metadata (however the EPEL repository does have security metadata).

Therefore if you decide to use update_cmd = security, yum will always tell you that nothing from CentOS needs a security update.

Enable and start the service:

# systemctl enable yum-cron.service
# systemctl start yum-cron.service

11. System Settings – Process Accounting

The package psacct contain utilities for monitoring process activities:

  1. ac – displays statistics about how long users have been logged on.
  2. lastcomm – displays information about previously executed commands.
  3. accton – turns process accounting on or off.
  4. sa – summarises information about previously executed commands.

Install and enable the service:

# yum install psacct
# systemctl enable psacct.service
# systemctl start psacct.service

1. Services – SSH Server

Create a group for SSH access as well as some regular user account who will be a member of the group:

# groupadd ssh-users
# useradd -m -s /bin/bash -G ssh-users tomas

Generate SSH keys for the user:

# su - tomas
$ mkdir --mode=0700 ~/.ssh
$ ssh-keygen -b 4096 -t rsa -C "tomas" -f ~/.ssh/id_rsa

Generate SSH host keys:

# ssh-keygen -b 4096 -t rsa -N "" -f /etc/ssh/ssh_host_rsa_key
# ssh-keygen -b 1024 -t dsa -N "" -f /etc/ssh/ssh_host_dsa_key
# ssh-keygen -b 521 -t ecdsa -N "" -f /etc/ssh/ssh_host_ecdsa_key
# ssh-keygen -t ed25519 -N "" -f /etc/ssh/ssh_host_ed25519_key

Pour RSA keys, 2048 bits is considered sufficient. DSA keys must be exactly 1024 bits as specified by FIPS 186-2.

Pour ECDSA keys, the -b flag determines the key length by selecting from one of three elliptic curve sizes: 256, 384 or 521 bits. ED25519 keys have a fixed length and the -b flag is ignored.

The host can be impersonated if an unauthorised user obtains the private SSH host key file, therefore ensure that permissions of /etc/ssh/*_key are properly set:

# chmod 0600 /etc/ssh/*_key

Configurer /etc/ssh/sshd_config with the following:

# SSH port.



Port 22

# Listen on IPv4 only.



ListenAddress 0.0.0.0

# Protocol version 1 has been exposed.



Protocol 2

#
# OpenSSH cipher-related release notes.
# OpenSSH 6.2: added support for AES-GCM authenticated encryption. 
# The cipher is available as [email protected] et [email protected]
# OpenSSH 6.5: added new cipher [email protected]
# OpenSSH 6.7: removed unsafe algorithms. CBC ciphers are disabled by default:
# aes128-cbc, aes192-cbc, aes256-cbc, 3des-cbc, blowfish-cbc, cast128-cbc.
# OpenSSH 6.9: promoted [email protected] to be the default cipher.
#



Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr

#
# OpenSSH 6.2: added support for the UMAC-128 MAC as [email protected] 
# and [email protected] The latter being an encrypt-then-mac mode.
# Do not use umac-64 or umac-64-etm because of a small 64 bit tag size.
# Do not use any SHA1 (e.g. hmac-sha1, [email protected]) MACs 
# because of a weak hashing algorithm. 
# Do not use hmac-sha2-256, hmac-sha2-512 or [email protected] 
# because of an encrypt-and-MAC mode. See the link below:
# https://crypto.stackexchange.com/questions/202/should-we-mac-then-encrypt-or-encrypt-then-mac
#



MACs [email protected],[email protected],[email protected]

#
# OpenSSH 6.5: added support for ssh-ed25519. It offers better security 
# than ECDSA and DSA.
# OpenSSH 7.0: disabled support for ssh-dss. 
# OpenSSH 7.2: added support for rsa-sha2-512 and rsa-sha2-256.
#



HostKeyAlgorithms ssh-ed25519,[email protected],ssh-rsa,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,[email protected],[email protected],[email protected],[email protected],[email protected]

#
# OpenSSH 6.5: added support for key exchange using elliptic-curve
# Diffie Hellman in Daniel Bernstein's Curve25519.
# OpenSSH 7.3: added support for diffie-hellman-group14-sha256,
# diffie-hellman-group16-sha512 and diffie-hellman-group18-sha512.
#



KexAlgorithms [email protected],diffie-hellman-group18-sha512,diffie-hellman-group16-sha512,diffie-hellman-group14-sha256

# HostKeys for protocol version 2.



HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

# Disabled because uses a small 1024 bit key.



#HostKey /etc/ssh/ssh_host_dsa_key

# Disabled because uses weak elliptic curves.
# See: https://safecurves.cr.yp.to/



#HostKey /etc/ssh/ssh_host_ecdsa_key


# INFO is a basic logging level that will capture user login/logout activity.
# DEBUG logging level is not recommended for production servers.



LogLevel INFO

# Disconnect if no successful login is made in 60 seconds.



LoginGraceTime 60

# Do not permit root logins via SSH.



PermitRootLogin no

# Check file modes and ownership of the user's files before login.



StrictModes yes

# Close TCP socket after 2 invalid login attempts.



MaxAuthTries 2

# The maximum number of sessions per network connection.



MaxSessions 3

# User/group permissions.



AllowUsers
AllowGroups ssh-users
DenyUsers root
DenyGroups root

# Password and public key authentications.



PasswordAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys

# Disable unused authentications mechanisms.



RSAAuthentication no # DEPRECATED



RhostsRSAAuthentication no # DEPRECATED



ChallengeResponseAuthentication no
KerberosAuthentication no
GSSAPIAuthentication no
HostbasedAuthentication no
IgnoreUserKnownHosts yes

# Disable insecure access via rhosts files.



IgnoreRhosts yes

AllowAgentForwarding no
AllowTcpForwarding no

# Disable X Forwarding.



X11Forwarding no

# Disable message of the day but print last log.



PrintMotd no
PrintLastLog yes

# Show banner.



Banner /etc/issue

# Do not send TCP keepalive messages.



TCPKeepAlive no

# Default for new installations.



UsePrivilegeSeparation sandbox

# Prevent users from potentially bypassing some access restrictions.



PermitUserEnvironment no

# Disable compression.



Compression no

# Disconnect the client if no activity has been detected for 900 seconds.



ClientAliveInterval 900
ClientAliveCountMax 0

# Do not look up the remote hostname.



UseDNS no

UsePAM yes

You can use the ssh-audit tool to test your SSH server configuration.

In case you want to change the default SSH port to something else, you will need to tell SELinux about it.

# yum install policycoreutils-python

For example, to allow SSH server to listen on TCP 2222, do the following:

# semanage port -a -t ssh_port_t 2222 -p tcp

Ensure that the firewall allows incoming traffic on the new SSH port and restart the sshd service.

2. Service – Network Time Protocol

CentOS 7 should come with Chrony, make sure that the service is enabled:

# systemctl enable chronyd.service

3. Services – Mail Server

3.1 Postfix

Postfix should be installed and enabled already. In case it isn’t, the do the following:

# yum install postfix
# systemctl enable postfix.service

Ouvrir /etc/postfix/main.cf and configure the following to act as a null client:

smtpd_banner = $myhostname ESMTP
inet_interfaces = loopback-only
inet_protocols = ipv4
mydestination =
local_transport = error: local delivery disabled
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8
relayhost = [mail.example.com]:587

Optionally (depending on your setup), you can configure Postfix to use authentication:

# yum install cyrus-sasl-plain

Ouvrir /etc/postfix/main.cf and add the following:

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CApath = /etc/ssl/certs
smtp_use_tls = yes

Ouvrir /etc/postfix/sasl_passwd and put authentication credentials in a format of:

[mail.example.com]:587 [email protected]:password

Set permissions and create a database file:

# chmod 0600 /etc/postfix/sasl_passwd
# postmap /etc/postfix/sasl_passwd

Restart the service and ensure that firewall allows outgoing traffic to the SMTP relay server.

3.2 Mail Distribution to Active Mail Accounts

Configure the file /etc/aliases to have a forward rule for the root user.

4. Services – Remove Obsolete Services

None of these should be installed on CentOS 7 minimal:

# yum remove xinetd telnet-server rsh-server 
  telnet rsh ypbind ypserv tfsp-server bind 
  vsfptd dovecot squid net-snmpd talk-server talk

Check all enabled services:

# systemctl list-unit-files --type=service|grep enabled

Disable kernel dump service:

# systemctl disable kdump.service
# systemctl mask kdump.service

Disable everything that is not required, e.g.:

# systemctl disable tuned.service

5. Services – Restrict at and cron to Authorised Users

Si le fichier cron.allow exists, then only users listed in the file are allowed to use cron, and the cron.deny file is ignored.

# echo root > /etc/cron.allow
# echo root > /etc/at.allow
# rm -f /etc/at.deny /etc/cron.deny

Note that the root user can always use cron, regardless of the usernames listed in the access control files.

6. Services – Disable X Windows Startup

This can be achieved by setting a default target:

# systemctl set-default multi-user.target

7. Services – Fail2ban

Install Fail2ban from the EPEL repository:

# yum install epel-release
# yum install fail2ban

If using iptables rather than firewalld, open the file /etc/fail2ban/jail.d/00-firewalld.conf and comment out the following line:

#banaction = firewallcmd-ipset

Fail2Ban uses /etc/fail2ban/jail.conf. Configuration snippet for SSH is provided below:

[sshd]



port    = ssh
enabled = true
ignoreip = 10.8.8.61
bantime  = 600
maxretry = 5

If you run SSH on a non-default port, you can change the port value to any positive integer and then enable the jail.

# systemctl enable fail2ban.service
# systemctl start fail2ban.service

8. Services – Sysstat to Collect Performance Activity

Sysstat may provide useful insight into system usage and performance, however, unless used, the service should be disabled, or not installed at all.

# yum install sysstat
# systemctl enable sysstat.service
# systemctl start sysstat.service

Références

OpenSCAP Security Guide

NSA Guide to the Secure Configuration of Red Hat Enterprise Linux 5

https://highon.coffee/blog/security-harden-centos-7/

https://linux-audit.com/linux-system-hardening-adding-hidepid-to-proc/

https://www.openssh.com/releasenotes.html

Secure Secure Shell

What is pam_faillock and how to use it in Red Hat Enterprise Linux

Revision

This guide was last updated on 26/03/2018.

Click to rate this post!
[Total: 0 Average: 0]

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.