Recommandations de configuration d’un système GNU/Linux : Différence entre versions

De Docaposte Cyberdéfense
Aller à : navigation, rechercher
(Recommendations)
(Recommendations)
Ligne 156 : Ligne 156 :
 
<br>
 
<br>
 
|}
 
|}
 
+
<br>
 
{| style="color: black; background-color: #ffffcc; width: 100%;"
 
{| style="color: black; background-color: #ffffcc; width: 100%;"
 
| style="width: 10%; background-color: #E0E6F8; text-align:center; color: #046AAF;"|
 
| style="width: 10%; background-color: #E0E6F8; text-align:center; color: #046AAF;"|

Version du 4 septembre 2018 à 09:55

DocapostCyberdefense.logo15.textlong.green.png
Centre Opérationnel de Sécurité et de Cyberdéfense

Recommandations de configuration d’un système GNU/Linux
DRAFT

Gestion du document

Date de la première version :

27/08/2018

Date de la dernière version :

27/08/2018

Version :

1.0

Source :

SLCC  : Service de Lutte Contre la Cybercriminalité
ANSSI : Agence National de la Sécurité des Systèmes d'Information
COSC  : Centre Opérationnel de Sécurité et de Cyberdéfense

Préambule

“Hardening” est un terme anglais signifiant “durcissement“. Appliqué à la sécurité d’un système d’information, il s’agit donc d’améliorer la sécurité d’un système, d’un réseau ou d’une application via le durcissement de sa configuration ou de sa structure. Plus précisément, le durcissement d’un système informatique consiste à le rendre plus résistant et mieux protégé face à des attaques ou des mauvaises utilisations. Cela peut s’effectuer à plusieurs niveaux sur un système, et cela est même nécessaire. Ainsi, le durcissement d’un système complet va passer par : – Le durcissement de la couche réseau – Le durcissement du système d’exploitation – Le durcissement des applications installées – Le durcissement des accès physiques – etc. Le durcissement est donc plus globalement le fait de réduire la surface d’attaque d’un système et de rendre plus résistants les points d’entrée nécessaires à sa bonne utilisation. La notion de surface d’attaque illustre bien l’intérêt du hardening. L’hardening ayant pour objectif principal de minimiser les risques en termes de sécurité suite à l’installation d’un système ou d’une application. Il existe des outils d’audit comme Lynis, openscap (serveurs Redhat) qui peuvent, par exemple, lister les fonctionnalités inutiles ou manquantes dans les fichiers de configuration et effectuer diverses autres préconisations de sécurité.

La première étape du durcissement d'un serveur GNU / Linux est de déterminer la fonction du serveur, ce qui permet d’identifier les services qui doivent être installés. Par exemple, si le serveur est utilisé comme serveur Web, vous devez installer uniquement les services adaptés (Apache, PHP, …). Les seules applications et services qui devraient être autorisés à s'exécuter sont ceux requis pour la tâche qu'il doit effectuer. Rien de plus ne devrait être installé.

L'installation de logiciels supplémentaires ou l'exécution de services supplémentaires crée des vulnérabilités. Par exemple, si vous exécutez Lightweight Directory Access Protocol (LDAP) sur un serveur pour des services d'annuaire, le système d'exploitation et LDAP doivent être à jour avec les correctifs de sécurité. Si un environnement LAMP (ou tout autre logiciel) a été installé sur ce serveur, il faut également le mettre à jour, même s’il n'est pas utilisé. Sa simple existence sur le serveur donne à un attaquant un autre vecteur d’attaque sur le système. L'installation d'un logiciel supplémentaire sur un serveur signifie que quelqu'un pourra tenter d’en détourner l’utilisation. L'utilisation du serveur pour des tâches autres que sa tâche principale détourne les ressources de son travail principal et l'expose à d’autres menaces potentielles.

Par conséquent, la sécurité du socle n’est pas acquise à l’installation, mais doit être construite dans le contexte d’utilisation de ce socle.

Pour assurer une protection efficace dans la durée, la sécurisation du socle doit être revue et mise à jour régulièrement (patches, évolution des menaces et des pratiques de durcissement, …).


A minima, l’ANSSI estime que les 5 recommandations suivantes doivent être appliquées.

Il s’agit de principes qui ont été appliqués aux préconisations que vous trouverez dans la suite de ce document.

Sécurité du système physique / Virtuel

Pour les serveurs physiques

Configurez le BIOS pour désactiver le démarrage à partir de CD/DVD et de périphériques externes. Activer le mot de passe du BIOS et protéger GRUB avec le mot de passe pour restreindre l'accès physique de votre système. Malgré cela, ces mesures servent de mécanismes de retardement car une personne non autorisée ayant un accès physique peut prendre la main sur votre système (moyennant qu’elle dispose de suffisamment de temps).

Pour les serveurs Virtuels

Les serveurs Virtuels sont également, dans une moindre mesure, vulnérables. Il est également important de protéger le BIOS et GRUB. Dans la mesure du possible, il faut désactiver le mode single user qui permet de démarrer le système avec l'utilisateur Root sans mot de passe.


Recommendations

R1


Ajout de l'authentification pour le mode Single User

Editez le fichier /etc/sysconfig/init et y ajouter la ligne suivante :

SINGLE=/sbin/sulogin



R2


Supprimer le « mode recovery » dans GRUB

Editez le fichier /etc/default/grub et dé commenter la ligne ci-dessous :

GRUB_DISABLE_RECOVERY="true"

Mettre à jour GRUB

# update-grub



R3


Ajouter un mot de passe dans GRUB

# grub-mkpasswd-pbkdf2
Enter password:

Editez le fichier /etc/grub.d/00_header et ajoutez à la fin du fichier le contenu suivant :

cat << EOF
set superusers="<user>"
password_pbkdf2 <user> grub.pbkdf2.sha512.10000.DABE******* 
EOF

Mettre à jour GRUB

# update-grub



La commande pour les serveurs redhat est « grub2-mkpasswd-pbkdf2 »
Les configurations des BIOS sont documentées dans les notices des constructeurs (physiques et virtuels).

R4


Désactivez la séquence Ctrl-Alt-Del

Editez le fichier /etc/init/control-alt-delete.conf et remplacer la ligne suivante :

exec /sbin/shutdown -r now "Control-Alt-Delete pressed"

Par :

exec /usr/bin/logger -p security.info "Control-Alt-Delete pressed"



R5


Appliquer les permissions au fichier grub.cfg

sudo chmod 600/boot/grub2/grub.cfg



Prationnement du stockage

Un schéma de partitionnement intelligent dépend de l'utilisation de la machine. Une bonne règle est d'être assez large avec vos partitions et de faire attention aux facteurs suivants :

  • Les arborescences de répertoires modifiables par un utilisateur, telles que /home, /tmp et /var/tmp, doivent être sur des partitions distinctes. Cela réduit le risque qu'un déni de service provoqué par un utilisateur ne remplisse le point de montage « / » rendant ainsi le système inutilisable (remarque : ce n'est pas strictement vrai car il existe toujours un espace réservé au superutilisateur qu'un utilisateur normal ne pourra pas remplir) et cela empêche les attaques de liens directs (hardlinks).
  • Toute partition qui peut fluctuer, par exemple /var (surtout /var/log) devrait être également sur une partition distincte. Vous devriez créer /var un petit peu plus grand que la normale car les paquets téléchargés sont stockés dans /var/cache.
  • Toute partition où vous voulez installer des logiciels ne faisant pas partie de la distribution devrait être sur une partition distincte. Selon la norme de hiérarchie des fichiers (FHS), c'est /opt ou /usr/local. Si ce sont des partitions distinctes, elles ne seront pas effacées.
  • D'un point de vue sécurité, il est souhaitable de mettre les données statiques sur une partition et de monter celle-ci en lecture seule.


Recommendations


Point de montage

Options

Description

/

<sans option>

Partition racine, contient le reste de l’arborescence

/boot

nosuid,nodev,noexec (noauto optionnel)

Contient le noyau et le chargeur de démarrage. Pas d’accès nécessaire une fois le boot terminé (sauf mise à jour)

/opt

nosuid,nodev (ro optionnel)

Packages additionnels au système. Montage en lecture seule si non utilisé

/tmp

nosuid,nodev,noexec

Fichiers temporaires. Ne doit contenir que des éléments non exécutables. Nettoyé après redémarrage(sauf mise à jour)

/srv

nosuid,nodev (noexec,ro optionnels)

Contient des fichiers servis par un service type web, ftp, etc.

/home

nosuid,nodev,noexec

Contient les HOME utilisateurs. Montage en lecture seule si non utilisé

/proc

hidepid=1

Contient des informations sur les processus et le système

/usr

nodev

Contient la majorité des utilitaires et fichiers système

/var

nosuid,nodev,noexec

Partition contenant des fichiers variables pendant la vie du système (mails, fichiers PID, bases de données d’un service)

/var/log

nosuid,nodev,noexec

Contient les logs du système

/var/tmp

nosuid,nodev,noexec

Fichiers temporaires conservés après extinction


La partition /boot contient le noyau de démarrage ainsi que le(s) fichier(s) System.map contenant la table des symboles utilisée par celui-ci. Ce fichier est souvent parcouru par différents programmes malveillants afin de construire plus facilement des « exploits » de code noyau. Le partitionnement idéal demande à ce que cette partition ne soit pas montée automatiquement au démarrage (option noauto), et que le montage de celle-ci soit un évènement critique d’un point de vue système (pour une mise à jour ou un correctif noyau par exemple). Mais cette mesure demande d’adapter les outils système à cette configuration particulière, et donc demande une expertise système pointue lors de son déploiement.

RX


Quand la partition /boot ne peut être démontée (ou qu’elle n’existe pas), le(s) fichier(s) System.map doivent être restreints en lecture à root uniquement.


Il faut noter que certains services peuvent toujours avoir besoin d’accéder à une arborescence donnée après une opération de chroot, sans que cette arborescence ne soit rattachée et visible directement depuis la cage chroot. Dans de tels cas, l’usage de points de montage bind est à envisager.

Mise à jour

Il est important de mettre à jour régulièrement le système (noyau et logiciel). De nombreuses vulnérabilités (CVE – Common Vulnerabilities Exposure) paraissent chaque jour pour l’exploitation de failles critiques ou majeures (remote, ddos, …). Le fait de patcher régulièrement diminue drastiquement la surface d’attaque.

Recommendations

  • Red Hat :
# yum update  
# yum –y upgrade  
  • Debian :
# apt-get update –y
# apt-get upgrade -y


RX


Il est recommandé d'utiliser la plateforme Cyberwatch


Suppression des services et logiciels inutiles

Appliquer les mises à jour et les correctifs du système contribue à corriger les vulnérabilités connues, l'une des meilleures façons de protéger le système contre les vulnérabilités non encore signalées est de désactiver tous les services qui ne sont pas requis pour un fonctionnement normal du système. Cela empêche l'exploitation de vulnérabilités découvertes ultérieurement. Si un service n'est pas activé, il ne peut pas être attaqué.

Recommendations

Pour les serveurs Debian

Commande de suppression :

# apt-get purge <service>
  • Ci-dessous la liste des services qui doivent être supprimés :
    • is
    • rsh-client
    • rsh-reload-client
    • talk
    • xserver-xorg-core

Modification d'inetd :

Commenter (ou supprimer) les lignes dans le fichier /etc/inetd.conf

#talk dgram udp wait nobody.tty /usr/sbin/in.talkd in.talkd 
#ntalk dgram udp wait nobody.tty /usr/sbin/in.ntalkd in.ntalkd
#shell stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rshd 
#login stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rlogind 
#exec stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rexecd
#telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.telnetd
#tftp stream tcp nowait root internal
#chargen stream tcp nowait root internal
#daytime stream tcp nowait root internal
#echo stream tcp nowait root internal
#discard stream tcp nowait root internal
#time stream tcp nowait root internal

Liste des services qui doivent être désactivés :

Commande de suppression :

# update-rc.d <service> disable
  • avahi-daemon
  • rpcbind
  • xinetd
  • smbd
  • squid3
  • snmpd

Commande de suppression :

# systemctl disable <service>
  • vsftpd
  • bind9
  • dovecot
Pour les serveurs RedHat

Commande de suppression :

# yum erase <service>

Ci-dessous la liste des services qui doivent être supprimés :

  • telnet-server
  • telnet
  • rsh-server
  • ypbind
  • ypserv
  • tftp
  • tftp-server
  • talk
  • talk-server
  • xinetd
  • xorg-x11-server-common
  • dhcp
  • openldap-servers
  • openldap-clients
  • bind
  • vsftpd
  • dovecot
  • samba
  • net-snmp

Commande de suppression :

# systemctl disable <service>

Ci-dessous la liste des services qui doivent être supprimés :

  • avahi-daemon
  • nfslock
  • rpcgssd
  • rpcbind
  • rpcidmapd
  • rpcsvcgssd

Sécurisation de SSH

Activation du service d’audit et de Log

Audit

Les logs système classiques permettent de surveiller une partie de l’activité du système mais un certain nombre d’événements sensibles ne sont pas tracés au niveau du noyau. Auditd est un démon qui permet de surveiller ce qui se passe au niveau du noyau. Une fois activé il se met en écoute de nouvelles règles de surveillance et enregistre dans un fichier de journalisation (/var/log/audit/audit.log) tous les événements correspondants aux règles définies.


Pourquoi installer auditd ?


En utilisant un cadre de vérification puissant, le système peut suivre de nombreux types d'événements.
Par exemple :

  • L'accès aux fichiers (voir qui a changé un fichier particulier, détecter les modifications non autorisées)
  • La surveillance des appels et des fonctions système
  • Détecter les anomalies comme les processus qui tombent
  • Commandes utilisées par les utilisateurs

RX

Il est préconisé d’intégrer les logs au sein d'un SIEM comme par exemple celui du C.O.S.C pour que ces logs puissent être supervisées et que les incidents puissent être traités.


Lancement et Activation d’auditd


# systemctl start auditd
# systemctl enable auditd


Optimisation de la configuration


Dans le fichier /etc/audit/auditd.conf, ajouter (ou modifier) les lignes ci-dessous :

max_log_file = <MB>
space_left_action = email 
action_mail_acct = root 
admin_space_left_action = rotate
max_log_file_action = keep_logs


Dans le fichier /etc/audit/audit.rules, ajouter (ou modifier) les lignes ci-dessous :

-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time-change 
-a always,exit -F arch=b32 -S adjtimex -S settimeofday -S stime -k time-change 
-a always,exit -F arch=b64 -S clock_settime -k time-change 
-a always,exit -F arch=b32 -S clock_settime -k time-change -w /etc/localtime -p wa -k time-change
-w /etc/group -p wa -k identity 
-w /etc/passwd -p wa -k identity 
-w /etc/gshadow -p wa -k identity 
-w /etc/shadow -p wa -k identity 
-w /etc/security/opasswd -p wa -k identity
-a exit,always -F arch=b64 -S sethostname -S setdomainname -k system-locale 
-a exit,always -F arch=b32 -S sethostname -S setdomainname -k system-locale 
-w /etc/issue -p wa -k system-locale 
-w /etc/issue.net -p wa -k system-locale
-w /etc/hosts -p wa -k system-locale 
-w/etc/network -p wa -k system-locale
-w/var/log/faillog -p wa -k logins 
-w/var/log/lastlog -p wa -k logins 
-w/var/log/tallylog -p wa -k logins
-w/var/run/utmp -p wa -k session 
-w/var/log/wtmp -p wa -k session 
-w/var/log/btmp -p wa -k session
-a always,exit -F arch=b64 -S chmod -S fchmod -S fchmodat -F auid>=1000 \ 
-F auid!=4294967295 -k perm_mod 
-a always,exit -F arch=b32 -S chmod -S fchmod -S fchmodat -F auid>=1000 \ 
-F auid!=4294967295 -k perm_mod 
-a always,exit -F arch=b64 -S chown -S fchown -S fchownat -S lchown -F auid>=1000 \ 
-F auid!=4294967295 -k perm_mod 
-a always,exit -F arch=b32 -S chown -S fchown -S fchownat -S lchown -F auid>=1000 \
-F auid!=4294967295 -k perm_mod 
-a always,exit -F arch=b64 -S setxattr -S lsetxattr -S fsetxattr -S removexattr -S \ 
lremovexattr -S fremovexattr -F auid>=1000 -F auid!=4294967295 -k perm_mod 
-a always,exit -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 always,exit -F arch=b64 -S creat -S open -S openat -S truncate -S ftruncate \ 
-F exit=-EACCES -F auid>=1000 -F auid!=4294967295 -k access 
-a always,exit -F arch=b32 -S creat -S open -S openat -S truncate -S ftruncate \ 
-F exit=-EACCES -F auid>=1000 -F auid!=4294967295 -k access 
-a always,exit -F arch=b64 -S creat -S open -S openat -S truncate -S ftruncate \ 
-F exit=-EPERM -F auid>=1000 -F auid!=4294967295 -k access 
-a always,exit -F arch=b32 -S creat -S open -S openat -S truncate -S ftruncate \
-F exit=-EPERM -F auid>=1000 -F auid!=4294967295 -k access
-a always,exit -F arch=b64 -S mount -F auid>=1000 -F auid!=4294967295 -k mounts 
-a always,exit -F arch=b32 -S mount -F auid>=1000 -F auid!=4294967295 -k mounts
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 \
-F auid!=4294967295 -k delete 
-a always,exit -F arch=b32 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 \ 
-F auid!=4294967295 -k delete
-w /etc/sudoers -p wa -k scope
-w /var/log/sudo.log -p wa -k actions
-w /sbin/insmod -p x -k modules 
-w /sbin/rmmod -p x -k modules 
-w /sbin/modprobe -p x -k modules
-a always,exit -F arch=b64 -S init_module -S delete_module -k modules


Logging

Les principales distributions Linux font appel à Rsyslog pour nous fournir, dans des fichiers, l’ensemble des événements autour du fonctionnement du système d’exploitation. La configuration de ce service est définie au travers du fichier /etc/rsyslog.conf.

Installation sur les serveurs Redhat

# yum –y install rsyslog

Installation sur les serveurs Debian

# apt-get install rsyslog -y

Activation & démarrage

# systemctl enable rsyslog
# systemctl start rsyslog

Configuration

Le stockage sur un serveur distant des logs permet de préserver leur intégrité. Si un attaquant réussit à obtenir un accès root, il pourrait altérer ou supprimer les données du journal qui sont stockées sur le système local.

Ajouter dans le fichier /etc/rsyslog.conf :

*.* @@loghost.example.com #serveur distant

Configuration réseau

Les paramètres de réseau ci-dessous déterminent si le système doit agir en tant qu'hôte. Un système est considéré comme hôte uniquement s’il dispose d'une ou plusieurs interfaces, mais ne sera pas configuré comme un routeur. Ces paramètres sont renseignés dans /etc/sysctl.conf

net.ipv4.conf.all.send_redirects=0 
net.ipv4.conf.default.send_redirects=0
net.ipv4. net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.all.accept_redirects=0 
net.ipv4.conf.default.accept_redirects=0 
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
net.ipv4.conf.all.log_martians=1
net.ipv4.conf.default.log_martians 1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter 1

#Desactivation ipv6
net.ipv6.conf.all.disable_ipv6=1 
net.ipv6.conf.default.disable_ipv6=1 
net.ipv6.conf.lo.disable_ipv6=1
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.default.accept_redirects=0 

Sécurisation réseau

Le firewall est l’élément indispensable pour sécuriser son serveur. Il va en effet filtrer tout le trafic en n’autorisant que les échanges permis par l’administrateur. Sans firewall correctement réglé, tous les échanges réseaux sont autorisés par défaut et ce genre de faille est détectable par un simple scan de ports.

Or, le noyau Linux offre déjà un pare-feu à l’utilisateur, qu’il est possible de configurer via le logiciel iptables (normalement contenu dans /sbin/iptables).

Ci-dessous, un script pour paramétrer le firewall de façon générique :

#!/bin/bash
## On flush iptables.
iptables -F

## On supprime toutes les chaînes utilisateurs.
iptables -X

## On drop tout le trafic entrant.
iptables -P INPUT DROP

## On drop tout le trafic sortant.
iptables -P OUTPUT DROP

## On drop le forward.
iptables -P FORWARD DROP

## On drop les scans XMAS et NULL.
iptables -A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

## Dropper silencieusement tous les paquets broadcastés.
iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP

## Permettre à une connexion ouverte de recevoir du trafic en entrée.
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

## Permettre à une connexion ouverte de recevoir du trafic en sortie.
iptables -A OUTPUT -m state ! --state INVALID -j ACCEPT 

## On accepte la boucle locale en entrée.
iptables -I INPUT -i lo -j ACCEPT
 
## On log les paquets en entrée.
iptables -A INPUT -j LOG
 
## On log les paquets forward.
iptables -A FORWARD -j LOG 
 
exit 0

Contrôle d'accès

Le contrôle d’accès consiste à s’assurer qu’une entité (processus ou utilisateur) a des droits suffisants en vue d’accéder à une ressource donnée. Bien qu’un contrôle d’accès permette lui aussi d’effectuer du cloisonnement, l’approche choisie est généralement différente de celle adoptée au travers de mécanismes de virtualisation : le contrôle d’accès laisse souvent la référence à un objet système visible à l’application et retourne une erreur en cas de privilège insuffisant pour y accéder, tandis qu’un système reposant sur de la virtualisation cloisonnera l’application par l’absence de référence à cet objet (pointeur, chemin d’accès, etc.).

La configuration suivante impose un mot de passe de 12 caractères minimum, contenant minuscules, majuscules, chiffres et caractères spéciaux, avec au moins 3 caractères différents du mot de passe précédent.

Fichier : /etc/pam.d/common-password

password required pam_cracklib.so retry=3 minlen=12 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1 difok=3

Il également recommandé d'empêcher la réutilisation des mots de passe :

password [success=1 default=ignore] pam_unix.so obscure sha512 remember=9

L'installation de pam_cracklib est préconisée


Comptes utilisateurs

Sous Linux, les utilitaires liés au mot de passe et les fichiers de configuration proviennent du shadow password. Le fichier /etc/login.defs définit la configuration spécifique. Ce fichier est un fichier texte lisible, chaque ligne du fichier décrivant un paramètre de configuration. Les lignes se composent d'un nom et d'une valeur de configuration, séparés par des espaces.

Vous devez définir l'expiration du mot de passe par défaut en utilisant le fichier /etc/login.defs

  • PASS_MAX_DAYS: Nombre maximum de jours qu'un mot de passe peut être utilisé. Si le mot de passe est plus ancien, un changement de mot de passe sera forcé
  • PASS_MIN_DAYS: Nombre minimum de jours autorisés entre les modifications de mot de passe. Tout changement de mot de passe a tenté plus tôt que cela sera rejeté
  • PASS_WARN_AGE: Nombre d'avertissement de jours avant qu'un mot de passe expire. Un zéro signifie que l'avertissement est donné uniquement le jour de l'expiration, une valeur négative signifie qu'aucun avertissement n'est donné. Si ce n'est pas indiqué, aucun avertissement ne sera fourni.


Editer le fichier /etc/login.defs et ajouter les paramètres ci-dessous :

PASS_MAX_DAYS 43
PASS_MIN_DAYS 7
PASS_WARN_DAYS 7

De plus, dans un contexte de production, il doit y avoir un minimum de comptes applicatifs, à privilèges,... Pour vérifier la liste des comptes présents vous pouvez lancer la commande ci-dessous :

# cat /etc/passwd | grep sh | egrep -v '(nologin|shutdown)'
root:x:0:0:root:/root:/bin/bash
mean:x:1000:0::/home/mean:/bin/bash
cosc:x:1001:1001::/home/cosc:/bin/bash
bob:x:1002:1002::/home/bob:/bin/bash
moe:x:1004:1004::/home/moe:/bin/bash
admin:x:1005:1005::/home/admin:/bin/bash

Il est également important de vérifier qu’il n’y ait pas de clones de root avec un uid et un gid à 0.Les comptes système ou logiciel doivent être en /nologin ou /bin/false

SUDO

Utiliser sudo est plus sûr pour lancer des commandes que de les faire en tant que superutilisateur (root) pour un certain nombre de raisons :

  • Personne n'a à connaitre le mot de passe du superutilisateur (due aux contraintes de cyberark, la demande de mot de passe de SUDO a été supprimé). Des droits supplémentaires peuvent être accordés temporairement à des utilisateurs puis retirés
  • Il est facile de n'exécuter que les commandes qui nécessitent des droits spéciaux avec sudo et le reste du temps, on travaille en tant qu'utilisateur non-privilégié, ce qui réduit les dommages qu’un utilisateur peut commettre par erreur.
  • Contrôler et enregistrer : quand une commande sudo est exécutée, le nom de l'utilisateur et la commande sont enregistrés.
  • Il faut raisonner la construction d’un fichier sudoers en pensant « liste-blanche », car en implémentant avec un ALL suivi d’interdiction est rarement efficace et laisse trop de place à l’oubli et/ou l’erreur

Exemple de configuration dans /etc/sudoers :

# define command aliases
Cmnd_Alias ARCH = /bin/tar, /bin/gzip, /bin/gunzip
Cmnd_Alias CRYPT = /sbin/losetup, /sbin/cryptsetup
Cmnd_Alias DIR = /bin/mkdir, /bin/rmdir
Cmnd_Alias DEVICE = /sbin/ifup, /sbin/ifdown
Cmnd_Alias DISK = /bin/mount, /bin/umount
Cmnd_Alias EDIT = /usr/bin/nano, /usr/bin/gedit
Cmnd_Alias FILE = /bin/cp, /bin/echo, /bin/ln, /bin/mv, /bin/rm, /usr/bin/touch, /usr/bin/rename
Cmnd_Alias FORMAT = /sbin/mkfs.ext2, /sbin/mkfs.ext3, /sbin/mkfs.ext4, /sbin/mkfs.msdos, /sbin/mkfs.vfat
Cmnd_Alias NAV = /usr/bin/nautilus
Cmnd_Alias NETWORK = /sbin/route, /sbin/iptables, /usr/bin/nmap, /usr/sbin/hping3
Cmnd_Alias PERM = /bin/chattr, /bin/chgrp, /bin/chmod, /bin/chown
Cmnd_Alias PROCESS =  /usr/bin/ps, /bin/kill, /usr/bin/killall, /sbin/shutdown, /usr/sbin/halt
Cmnd_Alias SELINUX = /usr/sbin/semanage, /usr/bin/chcon, /sbin/restorecon, /usr/sbin/setsebool
Cmnd_Alias SERVERS = /etc/init.d/network, /etc/init.d/cups, /etc/init.d/nfs, /etc/init.d/httpd, /etc/init.d/vsftpd
Cmnd_Alias SERVICE = /usr/bin/systemctl, /sbin/chkconfig, /sbin/service, /usr/sbin/updatedb
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, /usr/local/bin/tcsh, /usr/bin/rsh, /usr/local/bin/zsh
Cmnd_Alias SOFTWARE = /usr/bin/dpkg, /usr/bin/apt-get
Cmnd_Alias SU = /usr/bin/su
Cmnd_Alias VIEW = /bin/cat, /usr/bin/du, /bin/ls, /bin/tree, /bin/top, /bin/tails

# Profile type 
root ALL = (ALL) ALL
admin ALL = NOPASSWD: ARCH, CRYPT, DIR, DISK, DEVICE, EDIT, FILE, FORMAT, NAV, NETWORK, PERM, PROCESS, SERVERS, SERVICE, SOFTWARE, VIEW, 
SU, SHELLS

Crontab

Crontab est un utilitaire bien utile et plutôt simple à mettre en oeuvre. Il permet de programmer des actions régulières sur votre machine. L’utilisation de crontab n’est pas recommandée dans un contexte de production lorsque un ordonnanceur est présent. De plus, uniquement root doit y avoir accès. Les fichiers et dossier cron* doivent avoir uniquement « root » comme propriétaire et groupe.

[root@cosc-centos etc]# stat -L -c "%A %u %g %n" /etc/cron*
drwxr-xr-x 0 0 /etc/cron.d
drwxr-xr-x 0 0 /etc/cron.daily
-rw------- 0 0 /etc/cron.deny
drwxr-xr-x 0 0 /etc/cron.hourly
drwxr-xr-x 0 0 /etc/cron.monthly
-rw-r--r-- 0 0 /etc/crontab
drwxr-xr-x 0 0 /etc/cron.weekly