CONSEILS DE SECURITE DESTINES AUX MACHINES UNIX SUR UN RESEAU TCP/IP
Version 2.0 (avril 91)

Jean-Luc Archimbaud   CNRS/UREC
charge de mission "securite informatique" au CNRS
Voir aussi CV et ses autres très intéressantes documentations


Ce document peut etre diffuse sans restriction, mais dans son integralite.
Il est disponibile par "ftp anonymous" sur la machine ftp.imag.fr dans le
fichier pub/securite/conseils.unix.ps.gz. N'hesitez pas a me faire part de
vos corrections et suggestions a l'adresse electronique : jla@imag.fr.

La securite informatique n'est plus un domaine reserve a la Defense
Nationale. Sans devenir paranoiaques, responsables et utilisateurs des
systemes d'information doivent s'appliquer a limiter les risques
qu'encourent leurs donnees et leurs materiels.

Le Responsable de la securite d'un systeme est l'administrateur de ce
systeme

Ce document est donc destine aux administrateurs de stations de travail
Unix, pour les aider dans cette tache. Il a pour but de fournir les
conseils de base pour rendre une machine Unix, connectee sur un reseau
TCP/IP, moins vulnerable aux pirates. C'est une compilation de differentes
publications, volontairement limitee a n'etre qu'un "livre de recettes" au
detriment de l'analyse des failles et des remedes.
Il est limite a l'aspect logiciel (Unix), et n'aborde pas les conseils
generaux de protection contre le feu, le vol, ... Il ne s'adresse ni aux
gourous Unix, ni aux specialistes de securite informatique.

Unix est un systeme d'exploitation cree par des programmeurs, pour des
programmeurs, dans un laboratoire de recherche. La securite n'a donc pas
ete une preoccupation dominante lors de sa conception. Mais, plus que d'un
atavisme, sa vulnerabilite provient principalement de :
. Sa popularite : c'est le systeme d'exploitation le plus connu. Beaucoup
de pirates ont exploite et exploiteront les bugs d'un systeme dont le
source est facilement disponible.
. L'attitude des vendeurs : ils livrent un systeme totalement ouvert.


1. CONSEILS AUX ADMINISTRATEURS

En tant que Responsable de la securite sur votre machine, vous devez
effectuer les verifications necessaires et mettre en place les outils
fournis par les constructeurs pour la proteger. C'est ce que passent en
revue les points suivants. Mais la technique est loin de proteger
integralement votre systeme. L'attention et la vigilance sont vos 2
principales armes. Les militaires ont coutume de dire que "La securite,
c'est 20% de technique et 80 % de bon sens".

Et, avant  toute chose, n'oubliez pas cette conduite a tenir : 

En cas de probleme de piratage, avertissez immediatement  votre responsable
hierarchique

1.1. VERIFICATIONS lors de la mise en service de la machine

Apres l'installation de votre systeme sur disque (a la livraison ou lors
d'un changement de version), faites une sauvegarde et conservez la. Elle
pourra servir de reference.

1.1.1. /etc/passwd et /etc/group

Sur ces fichiers  :
. Verifiez que le proprietaire est root avec les acces 444 ou 644; et que
tous les utilisateurs et tous les groupes sont declares avec un mot de
passe (le second champs de chaque entree ne doit pas etre vide).
. Si vous n'utilisez pas les "Yellow Pages", supprimez la ligne dont le
premier caractere est + (si elle existe).
. Si vous les utilisez, verifiez que les lignes "+ : :0 : :0 : : :" et "+
:" sont absentes dans les fichiers de la station serveur. Elles ne doivent
etre presentes que sur les machines clientes.

Dans /etc/passwd :
. Seul root doit posseder 0 comme "user id" (UID).
. Modifiez les mots de passe que vous avez utilises lors de l'installation
du systeme, ainsi que ceux fournis avec le systeme.
. Otez les utilisateurs de service : guest, visitor, tutor, demo, ...


1.1.2. Fichiers sensibles

. Sous /dev :
        Le super utilisateur "root" doit etre le proprietaire de tous les
fichiers, exceptes les fichiers relatifs aux terminaux actuellement login.
        Les fichiers kmem, mem et les partitions des disques (avec les noms sd*,
rxy*, ... selon le materiel) doivent avoir l'acces 0 pour "other".

. Si votre systeme offre la possibilite de "secure terminal", mettez la en
pratique : enlevez le mot "secure" dans chaque ligne du fichier /etc/ttytab
(ou /etc/ttys). L'absence de cet attribut proscrira le login direct sous
root. L'acces au super utilisateur se fera uniquement par la commande su.
Specifiez aussi les quelques utilisateurs qui pourront faire su lors de la
declaration du groupe wheel dans /etc/group.

. Supprimez "." (le directory courant) dans les regles de recherche de
l'utilisateur root (la variable path est initialisee dans /.cshrc et PATH
dans /.profile).

. Detruisez le ficher /.rhosts s'il existe.
. Effacer le fichier /etc/hosts.equiv si vous n'en avez pas l'utilite. Dans
le cas contraire, verifiez que ce fichier ne contient pas une seule ligne
d'un seul caractere : +.

. Si vous n'utilisez pas NFS, ou si vous ne desirez pas rendre accessible
(exporter) une partie de votre arborescence, detruisez le fichier
/etc/exports. Dans le cas contraire, verifiez que chaque nom de directory
que vous desirez "exporter" est suivi des noms des stations qui ont le
droit d'y acceder. Autrement, n'importe qu'elle station pourra "monter" ce
directory. La syntaxe depend des versions d'Unix (faites : man exports).

. Enlevez, s'ils sont presents, les alias "decode" et "uudecode" dans le
fichier aliases sous /etc ou /usr/lib.
. Supprimez l'acces w a other sur aliases, aliases.dir et aliases.pag sous
/etc ou /usr/lib.
. Dans le ficher sendmail.cf (sous /etc ou sous /usr/lib), verifiez que la
variable W (wizard password) a pour valeur le caractere etoile.
Concretement, dans ce fichier, la ligne commencant par OW (la lettre O
suivie de la lettre W) doit etre de la forme : OW*
. Supprimez les acces a "other" sur le fichier
/usr/var/spool/cron/crontabs/root. Verifiez que root est le seul
utilisateur a posseder l'acces w sur toutes les procedures lancees par ce
fichier.


1.1.3. inetd.conf

Le daemon inetd, toujours actif, offre des services tels que telnet,
rlogin, ftp, ... . Ces services, qui s'executent sur votre machine, sont
accessibles depuis les machines du reseau. Seuls les services declares dans
le fichier inetd.conf (sous /etc ou /usr/lib) ou /etc/servers repondront
aux machines distantes. N'hesitez pas a faire du menage dans ce fichier, en
ajoutant un # devant les services que vous n'utilisez pas.

Ce peut etre :
. fingerd (ou in.fingerd) : tres utile au demeurant (pour obtenir le numero
de telephone d'un utilisateur, par exemple); il permet aussi a un pirate,
depuis une machine quelconque du reseau, de connaitre les personnes
connectees sur votre station.
. tftpd (ou in.tftpd) : version simplifiee de ftp, il est utilise pour
charger le systeme d'une station sans disque (un terminal X par exemple)
via le reseau. Les versions anterieures a la fin de l'annee 88 ont un bug
tres dangereux. Les versions recentes et securisees se reconnaissent par la
presence de l'argument "-s" dans la ligne qui lance le daemon.

De maniere plus restrictive encore, si votre station n'est jamais accedee
depuis une autre machine (donc dans le sens entrant), vous pouvez supprimer
:
. telnetd (ou in.telnetd) : gere les acces interactifs a votre machine par
telnet
. ftpd (ou in.ftpd) : gere les transferts de fichiers par ftp initialises
depuis une machine distante
. rlogind (ou in.rlogind) : gere les rlogin entrants
. rshd (ou in.rshd) : gere les executions de commandes sur votre machine,
lancees depuis une machine distante
. rexecd (ou in.rexecd) : le pendant de rshd pour les fonctions
. rpc.* : repond aux requetes RPC (Yellow Pages, NFS, ...) venant de
machines distantes

Ces suppressions n'affectent pas le sens sortant. Vous pourrez toujours,
depuis votre station, utiliser telnet, ftp, ...


1.1.4. /etc/rc*

Les scripts /etc/rc* lancent des daemons reseaux, similaires a inetd. Les
scripts livres avec les systemes ont la facheuse tendance d'activer des
daemons inutiles. Il est preferable de ne pas les lancer (en ajoutant un #
devant les lignes add hoc du script) si vous n'en avez nul besoin. Entre
autres :
. rwhod (ou in.rwhod) : diffuse regulierement a toutes les machines du
reseau des informations concernant les utilisateurs login sur votre
station.
. sendmail : pour recevoir du courrier (mail) venant d'autres machines du
reseau (c'est l'option de debug distant de certaines versions de sendmail
qui est dangereuse). Attention, ce daemon est obligatoire pour la
messagerie inter-machines.
. routed (ou in.routed) : met a jour et diffuse des tables de routage IP de
maniere automatique et incontrolable.
. nfsd : pour etre serveur NFS.
. biod : pour etre client NFS.


1.2. ACCES TCP/IP

1.2.1. Rappels sur TCP/IP

Sur un reseau TCP/IP, pour acceder a un service offert par une machine
(interactif, transfert de fichiers, nfs, rwho, lpd ...) il faut que ce
service soit ouvert : le daemon doit etre lance et vous devez posseder les
autorisations necessaires (mot de passe, ...). Mais, avant cette phase, il
faut que les machines puissent dialoguer en TCP/IP. C'est ce que l'on peut
appeler "l'acces TCP/IP". En limitant les possibilites d'acces TCP/IP a
votre machine, vous minimisez d'autant les risques de piratage.
Avec TCP/IP, l'acces est toujours symetrique. Si vous pouvez acceder a une
machine X, un utilisateur sur cette machine X pourra acceder a votre
materiel. Inversement, si vous ne pouvez pas acceder a X, X ne pourra pas
vous atteindre. Donc, si vous ne pouvez pas atteindre un reseau, vous etes
certain que les machines de ce reseau ne pourront pas vous pirater. Par
contre, si vous pouvez acceder aux ordinateurs du monde entier ...


1.2.2. Routage IP

Les routages IP installes sur votre machine (visualises par la commande
netstat -r) determinent les acces TCP/IP de votre machine. Voici quelques
conseils :
. Ne mettez en place que les routages necessaires aux acces dont vous avez
besoin.
. Sauf si vous connaissez RIP, supprimez le daemon routed (ou in.routed)
lance dans un des scripts /etc/rc*. Utilisez de preference le routage
manuel avec des commandes route.
. Mesurez bien la consequence d'une route par defaut (commande route add
default ...) : toutes les machines TCP/IP du Monde peuvent essayer d'entrer
sur votre systeme.
. De maniere plus restrictive encore, privilegiez le routage par machine au
routage par reseau. Ainsi la commande : route add 129.89.32.2 ... vous
permettra de communiquer avec cette machine particuliere, sans ouvrir
l'acces a toutes les machines du reseau 129.89.


1.2.3. Passerelle avec l'exterieur

Si votre laboratoire dispose d'un reseau Ethernet TCP/IP, raccorde sur un
reseau federateur (d'un campus ou d'une region) lui-meme connecte sur un
reseau national, ...  il peut etre sage d'installer un  equipement avec 2
coupleurs Ethernet entre votre reseau interne et le reseau federateur. Il
sera routeur IP, passerelle entre votre laboratoire et le monde exterieur.
Ce peut etre un materiel dedie ou une banale station de travail.
En limitant le routage IP (en otant, par exemple, le daemon routed sur la
passerelle et en ajoutant aucune commande route add ...), les stations
internes ne seront jamais inquietees. Il vous suffira de surveiller l'acces
a cette passerelle; et de n'y installer aucun daemon ou utilitaire
dangereux, et aucune donnee confidentielle. Mais attention, un utilisateur
qui a pu entrer sur la passerelle pourra acceder aux machines internes.


1.3. OPERATIONS A EFFECTUER REGULIEREMENT

1.3.1. Sauvegardes

De maniere evidente, une bonne politique de sauvegardes periodiques est
imperative pour la securite de votre systeme. Il faut pouvoir revenir a un
etat anterieur propre et sur.
Utilisez dump  et non pas tar, ni cpio  pour ces operations.


1.3.2. Mot de passe

Dans /etc/passwd :
. Otez les utilisateurs qui ne travaillent plus sur votre machine.
Detruisez aussi tous les fichiers de ces utilisateurs. La commande suivante
liste les fichiers qui appartiennent a personne (en fait les fichiers dont
l'UID du proprietaire n'est plus dans /etc/passwd). Elle peut etre utile :
        find / -nouser -o -nogroup -print
. Verifiez que tous possedent un mot de passe et que 2 utilisateurs n'ont
pas le meme UID.
. Verifiez que le caractere "+" n'a pas disparu de la ligne "+ : :0 : :0 :
: :" si elle existe.
Rappelez a vos utilisateurs (par mail ou par motd) de changer leur mot de
passe.


1.3.3. Root

Parcourez l'historique des login (et des su) de root. Vous pouvez consulter
ces traces dans des fichiers tels que messages* ou sulog sous /usr/adm.


1.3.4. Verifications sur certains fichiers

Verifiez que :
. Il n'y a pas de fichier etrange dont le nom commence par un "." sous /tmp
et /usr/tmp.
. Le contenu de /etc/hosts.equiv et de /etc/exports est correct.
. Les executables des programmes su, login et telnet sont ceux d'origine.
. Les fichiers lances par cron pour root ne presentent aucune anomalie
(dans /usr/var/spool/cron/crontabs/root ou ...)
. Il n'y a pas plethore de fichiers avec l'acces w a "other", avec la
commande :
        find / -type f -perm -2 -exec ls -al {} \;


1.3.5. Sushi

Un Sushi (Super User SHell Interactive), permet a un utilisateur d'etre
sous le shell avec tous les privileges de root. C'est le programme shell
avec le Set-User-ID bit (SUID) positionne. Pour depister un Sushi, verifiez
regulierement que les fichiers qui appartiennent a root avec le Set-User-Id
bit sont uniquement des utilitaires. Il ne doit pas y avoir ce genre de
fichier sous une arborescence d'utilisateur. La commande :
find / -user root -perm -4000 -exec ls -al {} \;
permet de lister ce type de fichier.


1.4. CONSEILS GENERAUX

N'oubliez pas qu'une station peut-etre relancee en mode stand alone et que
dans cet etat, l'utilisateur a tous les privileges. Il faut donc prendre en
compte cette possibilite, en controlant par exemple l'acces physique aux
machines.


1.4.1. Habitudes de travail

. Le mot de passe de root est la clef qui ouvre toutes les portes :
choisissez le apres reflexion, changez le tres regulierement, ne le
divulguez pas. 
. Faites logout chaque fois que vous quittez votre poste de travail.
. Si vous utilisez X-Window, conservez en permanence une fenetre "console"
sur votre terminal (commande : xterm -C)
. Reservez le login sous root a l'administration du systeme. Utilisez un
autre login lorsque vous n'avez pas besoin de privilege.
. Ne laissez jamais une autre personne travailler sous root, meme pour
quelques minutes.
. Faites /bin/su au lieu de su pour acceder a root.
. Dans votre fichier .login ou .profile, rajoutez la commande who. Elle
peut vous permettre de detecter des utilisateurs qui ne devraient pas etre
presents sur votre machine.
. Utilisez un compte special, avec le minimum de privilege, lors des
demonstrations, essais, ... en presence d'autres personnes.


1.4.2. /etc/hosts.equiv

Avec hosts.equiv vous deleguez entierement les controles de securite aux
machines citees dans ce fichier. Vous faites alors totalement confiance a
d'autres administrateurs. Ceci est tres dangereux. Donc, sauf besoin tres
particulier, proscrivez l'utilisation du fichier hosts.equiv (detruisez
le).



1.4.3. .rhosts
Controlez l'utilisation des fichiers .rhosts chez vos utilisateurs. Ils
permettent d'entrer sur votre systeme sans mot de passe local. Pour
afficher le contenu de ces fichiers, vous pouvez utiliser la commande :
find / -name .rhosts -print -exec cat {} \;


1.4.4. Groupes

. Si des utilisateurs desirent partager des fichiers, ne les laissez pas
ceder a la facilite de l'acces rw a "other" sur les fichiers. Les
possibilites des groupes (cf /etc/group, /etc/passwd, umask 007, chown,
chmod, newgrp, ...) resolvent ce probleme d'acces partage.
. Chaque compte declare sur votre machine doit correspondre a une et une
seule personne physique clairement identifiee. Vous devez posseder les
coordonnees de chaque utilisateur, avec son domaine d'activite sur votre
machine.


1.4.5. Divers

. Sensibilisez vos utilisateurs aux problemes de securite. La premiere
action est de diffuser largement le chapitre "Conseils aux utilisateurs".


2. CONSEILS AUX UTILISATEURS

Une regle officielle et primordiale : si vous decouvrez un piratage, un
essai de piratage ou un etat suspect : 
avertissez immediatement l'administrateur de la machine et 
votre responsable hierarchique


2.1. Mot de passe

. Prenez du temps pour le choisir.
. Changer le regulierement.
. Ne reprenez pas un mot de passe que vous avez deja utilise.
. Modifiez le avant de partir en vacances.
. Ne l'ecrivez pas, ne le confiez a personne.

. Ne choisissez pas :
        . Votre nom, prenom ou celui de vos proches.
        . Une information personnelle : numero de telephone, ...
        . Un nom commun ou un nom propre contenu dans un dictionnaire.
        . Une variation sur les 3 groupes precedents (inversion, initiales, ...)

. Un bon mot de passe doit etre compose :
        . d'au moins 6 caracteres.
        . d'un melange de majuscules, minuscules, chiffres et caracteres de
ponctuation 

. Exemple : c'est1KO
Pour decouvrir un mot de passe, le pirate ne teste pas toutes les
combinaisons de caracteres. Il s'appuie sur les habitudes de l'utilisateur
moyen. Il essaie, entre autres, toutes les informations relatives a
l'utilisateur (nom, ... avec les variations) et les mots du dictionnaire.


2.2. umask

La commande umask permet de creer un masque qui force les modes d'acces
attribues aux fichiers crees. Generalement, ce masque est initialise a 002
ou 022 pour tous les utilisateurs du systeme, ce qui correspond a l'acces
775 ou 755. Ainsi, par defaut, tout nouveau fichier est accessible en
lecture a tous.
En ajoutant la commande umask dans votre .login ou .profile, vous pouvez
modifier l'acces par defaut. Ainsi umask 077 vous assurera une protection
maximale sur les fichiers crees.


2.3. Travail en groupe

Si vous devez partager un meme environnement de travail avec plusieurs
collaborateurs, demandez a l'administrateur d'enregistrer tous les membres
de votre equipe sous un meme groupe. Pour stocker les fichiers partageables
sont un repertoire "Commun" :
. Creez un sous-repertoire qui contiendra les objets partageables : mkdir
Commun
. Donnez les acces rws au groupe sur ce repertoire : chmod g+rws Commun
. Pour eviter certains conflits d'acces : chmod +t Commun
. Rajoutez dans votre .login ou .profile : umask 007


2.4. Divers

Dans les regles de recherche (path ou PATH), specifiez le repertoire
courant "." en fin de liste et non au debut.
Lorsque vous accedez a votre machine, lisez attentivement l'heure et la
date de votre derniere connexion, information generalement contenue dans la
banniere d'accueil.
Utilisez a bon escient .rhosts et verifiez regulierement son contenu.


3. DOCUMENTS

Documents ayant inspires ce "livre de recette" :

. Improving the security of your unix system
        David A. Curry
. Security features guide
        Sun Microsystems OS 4.0.3
. The Internet Worm Program : An Analysis
        Eugene H. Spafford
. Unix System Administration (chapitre security)
        David Fiedler & Bruce H.Hunter
. Internet Intruder Warning
        CERT