Linux en général

Stéphane RAULT -

Version 0.1 - Dernière mise à jour le 19 Janvier 2005

Version originale disponible http://www.espace-groupware.com/linux/fedora-core3.html

Table des matières

Introduction

La procédure de sécurisation minimale, est valable également pour la Redhat 9 & ES3 ainsi que toutes les distributions compatibles Redhat.

J'ai essayé de rassembler l'ensemble de mes connaissances acquises ces deux dernières années sur Linux et quelques applications très utilisés.

Vous trouverez certainement des erreurs d'orthographe voir techniques, alors n'hésitez pas à m'envoyer un mail pour me les signaler.

Installation

Type d'installation :

Ne laissez pas Linux s'installer comme Windows, il y a plus souvent de mauvaises installation que de mauvais produits. Choisissez l'installation personnalisée !.


Partitionnement :

Il faut adapter, le partitionnement des disques et la répartition des files systems en fonction de l'utilisation finale de la machine.

Voici quelques règles qui peuvent s'appliquer à tous les besoins :

Rappel de quelques règles concernant le partionnement :


Chargeur d'amorçage :

J'ai une préférence pour Lilo mais je n'ai pas assé de recul sur Grub pour fournir un avis.

Un petit rappel valable pour toutes les distributions et chargeurs.


Configuration du Réseau :

Renseignez tous les champs et particulièrement ceux qui vous permettront de lancer la mise à jour du système après l'installation. Dans le champs 'hôte', entrez un bien un nom complet hote.domaine.com.


Configuration du pare-feu (firewall) :

Choisissez : pas de pare-feu. Je vous conseille d'appliquer d'abord, les règles de sécurités décrites dans les chapitres suivant, avant de vous lancer dans l'utilisation d'un firewall local.

Activez SElinux, nous reviendrons dessus dans un prochain chapitre (en cours d'écriture).


X-Windows :

Si vous installez la couche X-windows, vous ajouterez sûrement, un environnement comme KDE ou Gnome.

N'oubliez pas qu'installer X-windows sur un serveur de production est contraire aux règles élémentaires de sécurité.

Même si X-windows n'est pas démarré, son installation entraîne l'ajout de centaines de binaires et bibliothèques supplémentaires qui peuvent êtres la source d'une faille de sécurité.

Préférez l'utilisation de SSH et Webmin pour la maintenance de votre serveur.


Selection de la langue :

Selectionnez uniquement l'Anglais US. Celà permettre d'obtenir un bon niveau de compatibilité avec la pluspart des applications serveurs.

Remarque : Cette préconisation ne s'applique pas au choix de langue en début d'installation mais à l'écran Redhat "Choix de la prise en charge des langues"


Paramètres de l'horloge :

Laissez les paramètres par défaut, nous reviendrons dessus dans le chapitre sur la sécurisation avec la synchronisation NTP et l'internationalisation.


Authentification :

Laissez les paramètres par défaut.


Selection des packages :

Moins vous installerez de packages et plus vous améliorez les conditions d'exploitation de la machine. Je vous conseille de cochez la case "minimal".


Mise à jour après l'installation :

La procédure se résume aux opérations suivantes :


# Paramétrez votre sortie proxy, si vous en avez un : 

[root@linux /]$ echo '#!/bin/sh' > /etc/profile.d/proxy.sh
[root@linux /]$ echo 'export http_proxy=http://192.168.10.200:8080' >> /etc/profile.d/proxy.sh
[root@linux /]$ echo 'export ftp_proxy=http://192.168.10.200:8080' >> /etc/profile.d/proxy.sh
[root@linux /]$ chmod +x /etc/profile.d/proxy.sh
[root@linux /]$ source /etc/profile


# Ajout de référentiels à la liste des serveurs utilisé par yum :

[root@linux /]$ vi /etc/yum.repos.d/fedora.repo

# Le fichier final, contiendra les lignes suivantes :

[base]
name=Fedora Core $releasever - $basearch - Base
#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/$releasever/$basearch/os/
mirrorlist=http://fedora.redhat.com/download/mirrors/fedora-core-$releasever
enabled=1
gpgcheck=1

[dag]
name=Dag
baseurl=http://apt.sw.be/fedora/$releasever/en/$basearch/dag/
enabled=1
gpgcheck=0

[livna-stable]
name=Livna.org Fedora Compatible Packages (stable)
baseurl= http://rpm.livna.org/fedora/$releasever/$basearch/RPMS.stable
gpgcheck=1

[livna-unstable]
name=Livna.org Fedora Compatible Packages (unstable)
baseurl=http://rpm.livna.org/fedora/$releasever/$basearch/RPMS.unstable
gpgcheck=1

[livna-testing]
name=Livna.org Fedora Compatible Packages (testing)
baseurl=http://rpm.livna.org/fedora/$releasever/$basearch/RPMS.testing
gpgcheck=1

[dries]
name=Extra Fedora rpms dries - $releasever - $basearch
baseurl=http://apt.sw.be/dries/fedora/linux/$releasever/$basearch/dries/RPMS/
gpgcheck=1

[freshrpms]
name=Fedora Linux $releasever - $basearch - freshrpms
baseurl=http://ayo.freshrpms.net/fedora/linux/$releasever/$basearch/freshrpms
gpgcheck=1

[newrpms]
name=Fedora Core 3 NewRPMS.sunsite.dk
baseurl=http://newrpms.sunsite.dk/apt/redhat/en/i386/fc3
gpgcheck=1


Importation des clés pour la signature des RPM : 

[root@linux /]$ rpm --import /usr/share/rhn/RPM-GPG-KEY-fedora
[root@linux /]$ rpm --import http://freshrpms.net/packages/builds/yum/RPM-GPG-KEY.freshrpms
[root@linux /]$ rpm --import http://rpm.livna.org/RPM-LIVNA-GPG-KEY


Pour tester la mise à jour de votre distribution : 

#Cette commande permet de lister les mises à jour disponibles sans les installer.
[root@linux /]$ yum check-update

Pour lancer une mise à jour complète : 

[root@linux /]$ yum update


Internationalisation :

Il est important pour la traçabilité des opérations, que le serveur soit à l'heure et que les paramètres d'affichage horaires soit parfaitement définies. Même chose pour les paramètres d'internationalisation.

Un conseil : Laissez ces valeurs car cela à des conséquences sur la compilation ou d'autres opérations

# Editez le fichier /etc/sysconfig/i18n :

# Le "en_US.UTF-8" utilisé par défaut pose des problèmes d'affichage et de compilation

[root@linux /]$ vi /etc/sysconfig/i18n
LANG="en_US"
SUPPORTED="en_US:en"
LANGUAGE="en_US"

# Editez le fichier /etc/sysconfig/clock :
[root@linux /]$ vi /etc/sysconfig/clock
ZONE="Europe/Paris"
UTC=true
# Europe/Paris correspond au fichier :/usr/share/zoneinfo/Europe/Paris

Vérifiez et remplacez si nécessaire le fichier /etc/localtime

Ce fichier définit, les paramètres d'affichage de l'horloge. Il est une copie d'un des fichiers que l'on trouve dans /usr/share/zoneinfo. Faites différents essai pour voir le fonctionnement et les changements apportés

# Affichage de la date avec un localtime /usr/share/zoneinfo/UTC :
[root@linux /]$ date
Mon Feb  2 15:07:28 UTC 2004

# Affichage de la date avec un localtime /usr/share/zoneinfo/Europe/Paris :
[root@linux /]$ date
Mon Feb  2 16:10:19 CET 2004

Vous remarquerez, le décalage horaire ainsi que le libellé CET au lieu du UTC. L'affichage des jours et mois en Français n'est pas lié au localtime utilisé mais à la langue dans la variable d'environnement "LANG"

# Exemple, si vous changer cette variable :
[root@linux /]$ export LANG=fr_FR
[root@linux /]$ date
lun fév  2 16:14:11 CET 2004

# Pour éviter de relancer la session à chaque modification :
[root@linux /]$ source /etc/sysconfig/i18n
[root@linux /]$ source /etc/sysconfig/clock

# Vérifier si le fichier /etc/localtime actuel correspond à celui vous voulez utiliser :
[root@linux /]$ diff /etc/localtime /usr/share/zoneinfo/UTC
Binary files /etc/localtime and /usr/share/zoneinfo/UTC differ

[root@linux /]$ diff /etc/localtime /usr/share/zoneinfo/Europe/Paris
Vous ne devriez n'avoir aucune réponse

Quelques soit le localtime utilisé au final, le principal est qu'il soit le même sur toutes vos machines.

# Pour changer le localtime
[root@linux /]$ cd /etc
[root@linux /]$ rm -f localtime
[root@linux /]$ ln -s /usr/share/zoneinfo/Europe/Paris localtime

Synchronisation de l'heure avec NTP

Paramétrage de la synchronisation automatique avec un serveur de temps. Si vous avez un serveur NTP en interne, utilisez-le à la place de celui proprosé.


# Installation de NTP :
[root@linux /]$ yum install ntp

# Modification du fichier de config /etc/ntp.conf :
[root@linux /]$ vi /etc/ntp.conf
# Ajoutez la ligne suivante, (a mettre avant le premier "server  127.127.1.0")
server  fr.pool.ntp.org prefer

# Ajouter ce serveur dans /etc/ntp/step-tickers
[root@linux /]$ echo 'fr.pool.ntp.org' >> /etc/ntp/step-tickers

# Vérifiez la date et l'heure actuel :
[root@linux /]$ date
Mon Feb  2 15:51:15 UTC 2004

# Lancer la commande une première fois à la main :
[root@linux /]$ /usr/sbin/ntpdate -s -b -p 8 -u `cat /etc/ntp/step-tickers`

# Vérifiez la date et l'heure après la synchronisation :
[root@linux /]$ date
Mon Feb  2 15:00:51 UTC 2004

Ajoutez une tâche cron pour la mise à jour horaire, directement dans /etc/crontab ou créez un fichier ntp.cron dans /etc/cron.daily

[root@linux /]$ echo "02 4 * * * root nice -n 19 /usr/sbin/ntpdate \ 
                  -s -b -p 8 -u `cat /etc/ntp/step-tickers`" >> /etc/crontab

Conclusion :

L'installation est une question de bon sens et d'expérience. N'hésitez pas à vous entraîner sur une machine de test, jusqu'à obtenir une certaine maitrîse.


Sécurisation de base d'un serveur Linux

Méthodologie :

Dans la plupart de cas, même en installation minimal, le service SSH est prêt à fonctionner dès la fin de l'installation de votre distribution.

Pour ma part, j'effectue les opérations suivantes à l'aide d'un client SSH installé sur mon poste de travail.

Ce type de fonctionnement me permet en autre d'effectuer des copier/coller de lignes de commandes et de paramètres que j'ai stocké dans des fichiers textes.

Remarques :


Sauvegarde avant toutes modifications :

# Inventaire

# Création d'un répertoire de stockage pour les sauvegardes et inventaires
[root@linux /]$ mkdir /var/sauvegarde

# Remarque : Remplacer ddmmaaaa-hhmm par les valeurs correspondantes

# Tracer tous les fichiers présents avec attributs et propriétaire
[root@linux /]$ ls -aRl / > /var/sauvegarde/ls-aRl-ddmmaaaa-hhmm.log

# Liste des rpm trié installé actuellement sur le système
[root@linux /]$ rpm -qa | sort > /var/sauvegarde/rpm-qa-ddmmaaaa-hhmm.log

# Organisation actuel des files System
[root@linux /]$ df -ah > /var/sauvegarde/df-ah-ddmmaaaa-hhmm.log

# Il est important de sauvegarder les fichiers qui nous seront amenés à modifier.
# Normalement, tous se trouve dans l'arborescence du répertoire /etc
[root@linux /]$ cd /
[root@linux /]$ tar -czvf /var/sauvegarde/sav-av-securisation-etc.tar.gz etc


Ajoutez un timeout pour les sessions


[root@linux /]$ vi /etc/profile
# Ajouter la ligne suivante à la fin du fichier (délai de déconnection en secondes) :
TMOUT=3600


Sécurisation de base pour SSH

Dans la section réservé à SSH, nous aborderons en profondeur sa sécurisation mais il s'agit pour le moment du minimum requis.

# Editer /etc/ssh/sshd_config et mettre PermitRootLogin no
[root@linux /]$ vi /etc/ssh/sshd_config
PermitRootLogin no

# Relancer le service SSH
[root@linux /]$ /etc/init.d/sshd restart

Désactivation des services :

Vous pouvez trouvez plus ou moins de services que ceux exposés ci-après. La liste suivante correspond à l'installation d'une Redhat Entreprise ES 9.0 en mode minimal.

# Pour désactiver un service au niveau d'exécution 3 :
[root@linux /]$ chkconfig --level 3 nom_service off

# Pour activer un service au niveau d'exécution 3 :
[root@linux /]$ chkconfig --level 3 nom_service on

# Pour supprimer un service (sans supprimer l'application) :
[root@linux /]$ chkconfig --del nom_service

# Pour ajouter un service :
[root@linux /]$ chkconfig --add nom_service

/etc/init.d/atd ................. : OFF - Tâches programmés par la commande "at"
/etc/init.d/autofs .............. : OFF - Montage automatique de périphérique amovible (fdd, cdrom, jazz, etc...)
/etc/init.d/crond ............... : ON  - Programmateur de tâches
/etc/init.d/functions ........... : N/A - Ce n'est pas un service mais une bibliothèque de scrips bash
/etc/init.d/gpm ................. : OFF - Gestionnaire de souris pour Vim et MC
/etc/init.d/halt ................ : N/A - Ce n'est pas un service mais le scripts utilisé pour arrêter la machine
/etc/init.d/ip6tables ........... : OFF - Firewall iptable (version ipv6)
/etc/init.d/iptables ............ : OFF - Firewall iptable (version ipv4)
/etc/init.d/irqbalance .......... : ?   - ???
/etc/init.d/kdcrotate ........... : OFF - Kerberos (execution des scripts du fichier /etc/krb5.conf)
/etc/init.d/keytable ............ : ON  - Outils de configuration de la console, clavier, etc...
/etc/init.d/killall ............. : N/A - Ce n'est pas un service.
/etc/init.d/kudzu ............... : OFF - Utilitaire pour découvrir et configurer les périphériques PNP
/etc/init.d/mdmonitor ........... : ON  - Moniteur pour les systèmes RAID
/etc/init.d/microcode_ctl ....... : ?   - Microcode pour le CPU ???
/etc/init.d/netdump ............. : OFF - ???
/etc/init.d/netfs ............... : OFF - Pour monter des FS réseau comme (SMB, NCP)
/etc/init.d/network ............. : ON  - Activation des fonctions réseaux
/etc/init.d/nfs ................. : OFF - Services NFS
/etc/init.d/nfslock ............. : OFF - Service de vérrouillage NFS
/etc/init.d/nscd ................ : OFF - Service de cache pour les recherches NIS, DNS, ???
/etc/init.d/portmap ............. : OFF - Gestionnaire de sécurité pour NFS, NIS (RPC)
/etc/init.d/psacct .............. : OFF - Moniteur d'activité
/etc/init.d/random .............. : ON  - Garantie un bon niveau d'entropie pour les valeurs aléatoires
/etc/init.d/rawdevices .......... : OFF - Assignation de RawDevices à des périphériques bloc ???
/etc/init.d/rhnsd ............... : OFF - Service de mise à jour automatique Redhat Network
/etc/init.d/saslauthd ........... : OFF - Serveur d'authentification SASL
/etc/init.d/single .............. : N/A - A priori, remplace l'ancien fichier /etc/init.d/local ???
/etc/init.d/smartd .............. : OFF - SMART Disk Monitoring Daemon ???
/etc/init.d/sshd ................ : ON  - Serveur SSH
/etc/init.d/syslog .............. : ON  - Gestionnaire des logs
/etc/init.d/xinetd .............. : OFF - Services Xinetd
/etc/init.d/ypbind .............. : OFF - Services NIS ???

# D'autres services que vous pourriez trouver :

/etc/init.d/anacron ............. : OFF - Ordonnanceur de tâches (ne l'activez que si vous l'utilisez)

Login root via SU :

Un serveur peut avoir plusieurs personnes chargés de son administration. Si chacune se logue directement en tant que "root", vous perdrez toutes traçabilités.

L'objectif de cette opération, est d'obliger les administrateurs à ouvrir d'abord un login sous leur compte puis de passer en compte "root" par la commande "su -"

Cette méthode permet également de retirer les droits d'administration à une personne sans avoir à changer le mot de passe du compte "root"

# Création d'un compte administrateur - A faire pour chaque administrateur
# Evitez les noms génériques comme "admin1", ce n'est qu'un exemple
[root@linux /]$ useradd -G wheel,adm admin1

# Mettre le fichier /etc/pam.d/su dans l'état suivant :
# Cela permet ne n'autoriser que les membres du groupe "wheel" à utiliser "su"

[root@linux /]$ vi /etc/pam.d/su
auth       sufficient   /lib/security/$ISA/pam_rootok.so
#auth      sufficient   /lib/security/$ISA/pam_wheel.so trust use_uid
auth       required     /lib/security/$ISA/pam_wheel.so use_uid
auth       required     /lib/security/$ISA/pam_stack.so service=system-auth
account    required     /lib/security/$ISA/pam_stack.so service=system-auth
password   required     /lib/security/$ISA/pam_stack.so service=system-auth
session    required     /lib/security/$ISA/pam_stack.so service=system-auth
session    optional     /lib/security/$ISA/pam_xauth.so

# Remarque : D'autres options sont possibles mais elles sortent des limites de ce chapitre.

Modification du fichier /etc/inittab :

# Editez le fichier /etc/inittab
[root@linux /]$ vi /etc/inittab

# Si vous avez suivi mes conseils et n'avez pas installé X-Windows vous devriez trouvez
# la ligne suivant qui correspond au niveau d'initialisation par défaut.
id:3:initdefault:

# Désactivez le shutdown par les touches CTRL-ALT-SUPP en commentant la ligne
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# Désactivez les consoles inutilisés en commentant les lignes
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
#3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6

# Remarque : La console tty2 sera utilisée pour redirigé les sorties de syslog

Modification du fichier /etc/syslog.conf :

# Editez le fichier /etc/syslog.conf
[root@linux /]$ vi /etc/syslog.conf

# Ajouter une entrée dans /etc/syslog pour rediriger toutes les sorties vers une des consoles :
[root@linux /]$ echo "*.*        /dev/tty2" >> /etc/syslog.conf

# Ajouter une entrée dans /etc/syslog pour rediriger toutes les sorties vers un fichier unique :
[root@linux /]$ echo "*.*        /var/log/full.log" >> /etc/syslog.conf

# Relancez syslog :
[root@linux /]$ /etc/init.d/syslog restart

Modification du fichier /etc/securetty :

Ce fichier permet de définir sur quels consoles, l'utilisateur "root" est autorisé à se connecter à distances. Ayant définit que l'utilisateur ne pouvait jamais se connecter directement, il est normal d'enlever toutes les entrées de ce fichier.

# Editez le fichier /etc/securetty
[root@linux /]$ vi /etc/securetty

# Commentez avec "#" ou supprimez toutes les entrées.
#tty1
#tty2
#tty3
#tty4
#tty5
#tty6

Modification du fichier /etc/fstab :

Les fonctions d'auto-montage sont parfaites pour une station de travail mais doivents être désactivés dans le cas d'un serveur.

# Editez le fichier /etc/fstab
[root@linux /]$ vi /etc/fstab

# Commentez avec "#" les lignes concernant les périphériques amovibles
#/dev/cdrom             /mnt/cdrom              udf,iso9660 noauto,owner,kudzu,ro 0 0
#/dev/fd0               /mnt/floppy             auto   noauto,owner,kudzu 0 0

# Remarque : Si vous ne désactivez pas le service "kudzu", ces entrées seront ajoutées à chaque démarrage

Les règles PAM (Pluggable Authentication Modules) :

# Les fichiers PAM principaux sont :

/etc/pam.d/other
/etc/pam.d/su
/etc/pam.d/system-auth
/etc/pam.d/login
/etc/pam.d/passwd
/etc/pam.d/halt
/etc/pam.d/poweroff
/etc/pam.d/reboot
/etc/pam.d/sudo
/etc/pam.d/sshd

# Les autres fichiers PAM :
/etc/pam.d/redhat-config-mouse
/etc/pam.d/authconfig
/etc/pam.d/chfn
/etc/pam.d/chsh
/etc/pam.d/kbdrate
/etc/pam.d/rhn_register
/etc/pam.d/setup
/etc/pam.d/up2date-config
/etc/pam.d/up2date
/etc/pam.d/up2date-nox
/etc/pam.d/webmin


Routez les messages pour root :

Par défault, tous les messages générés par la machines, sont livrés au compte root local. il faut pensé à rediriger tous les mails de root vers une email opérationelle.


[root@linux /]$ vi /etc/aliases
# Remplacer la ligne root:... par
root    : votreemail@votredomaine.net

# Mettez à jour la base de données d'alias :
[root@linux /]$ newaliases

Annexes

Les commandes utiles de VI :

A l'intérieur de VI, vous êtes soit en mode commande, soit en mode édition

Le passage d'un mode à l'autre peut se faire de la façon suivante :

Pour accèder au prompt des commandes, j'utilise toujours "ESC :" (touche Echappement et ensuite les deux points) quelque soit le mode dans lequel je me trouve.

# Edition d'un fichier :
[root@linux /]$ vi nom_du_fichier

# Les commandes principales :

:q!  -> quitte l'éditeur vi sans sauvegarder les modifications

:wq  -> quitte et sauvegarde

:w   -> sauve et se replace en mode commande


Gestion des mises à jour avec Yum :


# Installation du package NTP :
[root@linux /]$ yum install ntp

# Supression d'un package :
[root@linux /]$ yum remove ntp

# Cette commande permet de lister tous les rpm disponibles :
[root@linux /]$ yum list ntp

# Celle-ci permet de chercher des rpm dont le terme recherché est dans la description du rpm, et non par le nom du rpm :
[root@linux /]$ yum search ntp

# Cette commande permet de nettoyer Yum des anciens headers ainsi que des rpm stockés :
[root@linux /]$ yum clean

# Cette commande supprimera tous les headers, récents ou non :
[root@linux /]$ yum clean headers

# Cette commande supprimera du disque tous les rpm stockés :
[root@linux /]$ yum clean packages


Quelques options de RPM :

Remarque : En principe, dans les requettes "-q", soit vous ajoutez un "p" ce qui donne "-qp" pour interroger un fichier RPM que vous avez sous la main, soit sans le "p", vous interrogez la base RPM pour un package déja installé et dans ce cas, c'est le nom du package qu'il faut fournir.

# Savoir à quel package un fichier appartient :
[root@linux /]$ rpm -qf fichier

# Simuler l'installation ou la mise à jour d'un package avec --test :
[root@linux /]$ rpm -Uvh --test fichier.rpm

# Demander la liste complète des packages installés :
[root@linux /]$ rpm -qa

# Demander la liste complète des packages installés avec un tri par ordre alphabétique :
[root@linux /]$ rpm -qa | sort

# Demander la liste complète des fichiers dans un package (à partir du fichier RPM) :
[root@linux /]$ rpm -qpl fichier.rpm

# Demander la liste complète des fichiers dans un package déja installé :
[root@linux /]$ rpm -ql nom_du_package

# Interroger la fiche d'information d'un package :
[root@linux /]$ rpm -qpi fichier.rpm

# Désinstaller un package :
[root@linux /]$ rpm -e nom_du_package


Conclusion

Remerciements

Merci tous d'abord à Olivier ALLARD-JACQUIN pour la charte graphique dont je me suis totalement inspiré.

Au passage, j'aimerais citer son excellent travail sur la mise en oeuvre d'un firewall sous Linux.

Mes remerciements à Aron Hsiao pour son livre sur la Sécurité sous Linux, édité chez CampusPress

Liens