Outils Serveur
Protection des limites
Dans le chapitre précédent, nous avons vu comment protéger le système fondamentalement en s’assurant de son intégrité. Le contrôle d’accès a d’ailleurs été évoqué. Nous allons maintenant accéder un peu aux coulisses du système et nous assurer que les accès qui sont effectués sont bien autorisés. L’objectif ici est de sécuriser le serveur dans son ensemble, et plus particulièrement au niveau de son noyau central ou au travers de ses services fondamentaux.
1. Compteurs de ressources
À partir du moment où des utilisateurs commencent à utiliser les ressources d’un système, il convient de vérifier que celles-ci sont en quantité suffisante pour répondre à la demande. Nous disposons pour cela d’un baromètre, grâce à la commande ulimit. Le contrôle des ressources proposées aux utilisateurs d’un système GNU/Linux est un élément de base essentiel de la fiabilisation du système d’exploitation. En effet, une machine correctement configurée ne doit en aucun cas souffrir de déni de services, en cas de dysfonctionnement d’un processus ou d’un ensemble plus large concernant une application. D’autant que la distribution Debian (comme beaucoup d’autres, d’ailleurs) permet de borner les ressources allouées aux différents usagers ou groupes d’utilisateurs du système, en précisant les limites dans le fichier /etc/security/limits.conf.
Ce même fichier est d’ailleurs chargé par les modules Pluggable Authentication Modules (ou PAM), que nous verrons ultérieurement.
Chaque utilisateur dispose, à son niveau, d’une possibilité de réglage de ces ressources, à l’aide de la commande ulimit. En règle générale, il est possible de définir des seuils bas (appelés limites soft ou souples), pour certaines limites telles que : nombre de fichiers ouverts, taille maximum de ces fichiers, nombre de processus instanciés, temps CPU, etc. Ces limites peuvent être augmentées dynamiquement par l’utilisateur lui-même, jusqu’à la valeur maximum appelée...
Protection du paramétrage
Afin de gérer les nombreux paramètres du système, il est possible d’utiliser la commande sysctl qui agit comme une interface permettant d’examiner et/ou de modifier dynamiquement les paramètres du système d’exploitation GNU/Linux, stockés au sein d’une Management Information Base (ou MIB).
Ce sous-système est également exporté en partie dans procfs, au niveau de l’arborescence /proc/sys.
Cette remarque implique d’abord que l’on doit consulter ou modifier certains paramètres des fichiers du pseudo-système procfs. D’autre part, certains de ces paramètres du noyau sont essentiels et méritent plus d’attention que d’autres. Dans son comportement standard, sur la plupart des systèmes GNU/Linux, la commande sysctl active un comportement particulier permettant de configurer les valeurs des paramètres du noyau linux. Ces valeurs resteront actives jusqu’au prochain démarrage du système.
RAPPEL : dans le répertoire /etc/default, nous trouvons les fichiers de paramétrage par défaut de chaque service fonctionnant sur le serveur. C’est généralement dans les fichiers de ce répertoire que l’on place les variables supplémentaires :
Si l’on souhaite que cette modification soit effective de façon permanente, il faut ajouter une ligne dans le fichier /etc/sysctl.conf en exécutant l’instruction suivante :
# sysctl -w <Paramètre>=<Valeur>
ATTENTION : certains paramètres ne peuvent être modifiés, même après un redémarrage. Dans ce cas, on parle de variables statiques, qui doivent être fixées lors de la compilation du noyau ou dans la configuration du bootloader.
Pour ce qui touche la sécurité du système, ce qui est intéressant ici est de protéger le réseau et ses accès en modifiant les paramètres sysctl suivants :
-
Protection contre le spoofing d’adresse IP
-
Protection contre les opérations de scan du réseau
-
Utilisation de sysctl avancée
-
Paramétrage divers de sécurisation
RAPPEL : le spoofing d’adresse IP consiste à utiliser une adresse IP non conforme à son paramétrage...
Contrôle d’accès
La bonne gestion de ses fichiers, ses dossiers, ne passe pas nécessairement uniquement par un bon archivage, une bonne hiérarchie et de bons outils de sécurité. Il faut aussi définir une stratégie d’administration des droits. Il faut donc systématiquement se demander :
-
qui peut lire, écrire ou exécuter tel ou tel élément ?
-
qui peut accéder ou non à tel ou tel répertoire ?
-
quel groupe(s) de personne(s) peut ou non modifier tel ou tel fichier ?
1. Les droits standards
Sous Unix/Linux, tout est fichier. La gestion des droits de ces fichiers s’effectue selon trois orientations :
-
le droit de lecture (ou Read)
-
le droit d’écriture (ou Write)
-
le droit d’exécution (ou eXecute)
Le droit de lecture autorise la lecture du contenu d’un fichier (ou d’un répertoire). Le droit d’écriture permet la modification et la suppression de ces mêmes éléments. Enfin, le droit d’exécution, sur des programmes binaires ou des scripts, autorise à exécuter ce programme ou ce script. Sous Linux, on attribue un poids octal à chaque type d’opération :
-
la lecture (ou Read) vaut 4
-
l’écriture (ou Write) vaut 2
-
l’exécution (ou eXecute) vaut 1
À ce stade, nous allons distinguer les opérations que l’on peut effectuer sur de simples fichiers ou sur des répertoires (appelés directory) :
Code d’accès |
Sigle |
Fichier |
Répertoire |
Lecture (r) |
Read |
Le fichier peut être lu. |
Le répertoire peut être listé. |
Écriture (w) |
Write |
Le contenu du fichier peut être modifié ou ses attributs modifiés. |
Dans le répertoire, on peut supprimer, créer ou modifier un fichier. |
Exécution (x) |
eXecute |
Le fichier/script peut être exécuté. |
On peut entrer dans ce répertoire, qui devient alors le directory courant. |
Chacun de ces droits sont alors distribués à trois catégories de personnes, classifiées selon leur appartenance :
-
le propriétaire (appelé owner et référencé par son UID).
-
le groupe (appelé group et référencé par son GID).
-
le reste du monde (appelé...
Protection des sessions
1. Authentification standard
Jusqu’à récemment, pour authentifier un utilisateur, une application faisait appel aux bibliothèques du système. Ces dernières scrutaient alors les fichiers /etc/passwd et /etc/shadow à la recherche de l’enregistrement correspondant à l’utilisateur, pour déterminer la validité de son mot de passe. En fait, au sein de la communauté des distributions Unix/Linux, quatre fichiers permettent de gérer l’authentification des utilisateurs :
-
/etc/passwd : contenant les informations des utilisateurs.
-
/etc/group : contenant les informations des groupes d’utilisateurs.
-
/etc/shadow : contenant les informations sécurisées des comptes utilisateurs.
-
/etc/gshadow : contenant les informations sécurisées des groupes d’utilisateurs.
Le premier fichier contient les informations des différents utilisateurs en respectant le format suivant :
-
nom d’utilisateur
-
spécification du mot de passe
-
identifiant de l’utilisateur (UID)
-
identifiant du groupe (GID)
-
commentaire
-
répertoire personnel de l’utilisateur
-
interpréteur de commandes
Ainsi, on peut créer alternativement des comptes autorisés à la connexion et d’autres non. Il n’est pas conseillé d’éditer manuellement le fichier /etc/passwd. Il vaut mieux utiliser la commande vipw.
Exemple
Création du compte phil (autorisé à la connexion)
# useradd phil -U 500 -g users -c "Compte Phil" -m -s /bin/bash
L’option -m permet de créer automatiquement l’arborescence personnelle (en s’appuyant sur le fichiers modèles de /etc/skels), dans /home sous le répertoire phil en utilisant l’interpréteur /bin/bash.
Exemple
Création d’un compte test non autorisé à se connecter
# useradd test -u 501 -g users -c TEST -s /bin/false
Les mots de passe sont fournis après la création des comptes utilisateurs en utilisant la commande passwd :
# passwd phil
Password :*******
Re-type Password :********
En ce qui concerne la spécification du mot de passe, anciennement, celui-ci était codifié dans le fichier /etc/passwd. Mais, dans les versions récentes...
Sécurisation des services
1. Différents modèles de sécurité
Après avoir mis en œuvre le confinement des processus via chroot, il est possible d’aller encore plus loin dans la sécurisation du système, et s’assurer d’adopter un modèle de contrôle d’accès fiable. Le contrôle d’accès, aussi appelé politique d’autorisation, représente l’ensemble des fonctionnalités permettant de contrôler les utilisateurs ou les processus interagissant entre eux. Une politique d’autorisation se divise alors en deux catégories :
-
politique ouverte, considérant que tous les accès sont permis, sauf ceux que l’on interdit.
-
politique fermée, où tous les accès sont interdits, sauf ceux que l’on autorise.
Nous allons alors distinguer différents modèles de contrôles d’accès selon les systèmes d’information :
-
le modèle Discretionary Access Control (DAC) reposant sur la notion de propriété où chaque objet (processus ou fichiers) du système se voit attribuer un propriétaire pouvant décider qui d’autre que lui peut accéder à ses objets. Selon ce modèle, on peut autoriser les permissions d’accès avec plein contrôle, de type créateur ou déterminées par le créateur ;
-
le modèle Role-Based Access Control (RBAC) reposant alors sur la notion de rôle désignant une entité intermédiaire entre l’utilisateur et ses privilèges. On attribue ainsi à chaque rôle un ensemble de permissions ;
-
le modèle Mandatory Access Control (MAC) reposant sur le niveau d’habilitation et de classification des utilisateurs et des processus du système d’exploitation.
Au sein des systèmes Linux, ces différents modèles peuvent s’appliquer et permettre de confiner les fichiers en restreignant leur utilisation vis-à-vis de certains utilisateurs, ou de certains ensembles de processeurs. C’est ce que nous allons étudier maintenant, pour sécuriser les services initialisés sur le système.
2. Sécurité des services
Security Enhanced Linux (abrégé...
Sécurité des Serveurs d’impression
1. Généralités
Depuis le début de l’informatique, les impressions ont beaucoup évolué. Les premières imprimantes généraient des caractères, codés à l’aide de la table ASCII. Seuls quelques caractères dits « spéciaux » permettaient de gérer les retours à la ligne et les sauts de page. Le gestionnaire d’impression transmettait à l’imprimante les suites de caractères transcrits. Depuis, certains constructeurs comme HP et Adobe ont fait évoluer cela, en mettant au point des langages, comme PCL (Printer Command Language) ou PostScript, permettant de décrire les pages et ce qui doit être imprimé sous forme graphique puis transformé en fichier bitmap. Ces langages sont spécifiques aux différents matériels.
On peut également trouver un langage Gutenprint décrivant le contenu des pages à imprimer, du logiciel GIMP, alternative open source du non moins célèbre Photoshop.
Le travail d’un serveur d’impression doit donc :
-
fournir la liste des imprimantes disponibles sur le système,
-
définir la manière de les utiliser au travers du pilote,
-
gérer les files d’attente,
-
gérer les droits d’accès,
-
effectuer des statistiques.
Étant donné la lourdeur et la complexité des tâches à accomplir, la société Easy Software Products a mis au point le système CUPS en 1999. Cette société a été rachetée par Apple, en 2007. Mais, depuis les années 2000, ce logiciel équipe les serveurs Linux et Mac OS. C’est ce même serveur CUPS qui permet de distribuer les pilotes, de gérer les connexions automatiques en les rendant accessibles depuis d’autres machines, de gérer les listes d’attente ou les droits d’accès sur les serveurs Linux, y compris ceux équipés de distributions Debian. L’utilitaire CUPS (abréviation de Common Unix Printing System) est un gestionnaire d’impression pouvant facilement remplacer les sempiternels lpd et autres systèmes archaïques. Cet utilitaire fournit à Debian une interface...