evoformations/support/securite.tex

1031 lines
52 KiB
TeX
Raw Normal View History

2012-05-21 16:07:10 +02:00
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Copyright (c) 2005-2011 eVoLiX. Tous droits reserves.%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2012-05-21 16:07:10 +02:00
\chapter{Administration Syst<73>me et R<>seau}
2012-05-21 16:07:10 +02:00
\section{Gestion des droits}
2012-05-21 16:07:10 +02:00
Sous les syst<73>mes de type Unix ou Linux, il existe plusieurs types de fichiers : les fichiers, les r<>pertoires, les liens symboliques, les fichiers-p<>riph<70>riques.\\
~\\
2012-05-21 16:07:10 +02:00
Un fichier appartient <20> un utilisateur (en fait un num<75>ro d'utilisateur) et <20> un groupe (en fait un num<75>ro de groupe).\\
On peut changer l'utilisateur par la commande:
\begin{verbatim}
$ chown <new_user> fichier
\end{verbatim}
~\\
2012-05-21 16:07:10 +02:00
On peut changer le groupe par la commande:
\begin{verbatim}
$ chgrp <new_group> fichier
\end{verbatim}
~\\
2012-05-21 16:07:10 +02:00
On peut changer l'utilisateur et le groupe par la commande:
\begin{verbatim}
$ chown <new_user>.<new_group> fichier
\end{verbatim}
~\\
2012-05-21 16:07:10 +02:00
Les 3 droits fondamentaux sont la lecture, l'<27>criture et l'<27>xecution.\\
Pour un fichier, ces 3 droits sont d<>finis pour 3 cat<61>gories: l'utilisateur, le groupe et le "reste du monde". Pour chacune de ces cat<61>gories: on note les droits sous la forme rwx.\\
\textbf{r} correspond <20> l'<27>criture, \textbf{w} <20> l'<27>criture et \textbf{x} <20> l'ex<65>cution. Par exemple, \textbf{r-x} correspond <20> des droits de lecture et d'ex<65>cution autoris<69>s, mais l'<27>criture interdite.\\
Un notation pratique est de voir \textbf{rwx} comme 3 bits. L'autorisation correspond <20> 1 et l'interdication <20> 0.\\
Par exemple \textbf{r-x} correspond <20> 101. En base 10, 101=1*4+0*2+1*1=5. Cela correspond donc <20> 5.On notera c<>te <20> c<>te les droits des 3 cat<61>gories.\\
Par exemple \textbf{rwxr-xr--} correspond <20> des droits \textbf{rwx} pour l'utilisateur, \textbf{r-x} pour le groupe et \textbf{r--} pour le reste du monde. Si vous avez bien suivi, \textbf{rwxr-xr--}=111101100=754\\
On ajoute (ou retire) des droits avec la commande :
\begin{verbatim}
$ chmod <cat<61>gorie>+<nouveau_droit> fichier
\end{verbatim}\\
~\\
2012-05-21 16:07:10 +02:00
\texttt{<cat<61>gorie>} peut <20>tre u (utilisateur), g (groupe) ou a (all=reste du monde). \texttt{<nouveau\_droit>} peut <20>tre r,w ou x\\
Pour retirer, on mettra un - <20> la place du +\\
On peut changer compl<70>tement les droits d'un fichier par la commande:
\begin{verbatim}
$ chmod <nouveaux_droits> fichier
\end{verbatim}
Par exemple, \texttt{<nouveaux\_droits>}=777 pour autoriser tout par tout le monde.\\
~\\
2012-05-21 16:07:10 +02:00
Pour un r<>pertoire, on pourra lister les fichiers dans ce r<>pertoire si on a les droits \textbf{r} du r<>pertoire (et ceux des r<>pertoires sup<75>rieurs). Si on a pas ces droits, on ne pourra pas lister. Le droit \textbf{rx} permet en plus d'entrer dans ce r<>pertoire. Sans lui, on ne pourra pas effectuer des op<6F>rations sur un des fichiers contenus dans ce r<>pertoire. Par exemple, le r<>pertoire \texttt{/root/} n'a souvent aucun droit pour "all" et donc on ne peut rien faire dans ce r<>pertoire si l'on est pas root.\\
~\\
2012-05-21 16:07:10 +02:00
Notons que le droit \textbf{x} seul permet de traverser le r<>pertoire mais pas d'y entrer ou de le lister\\
~\\
2012-05-21 16:07:10 +02:00
Attention, pour pouvoir effacer un fichier ou un r<>pertoire vide, il suffit d'avoir les droits \textbf{wx} sur le r<>pertoire contenant ! (avoir uniquement de droit \textbf{w} ne sert -a priori- <20> rien pour un r<>pertoire). Notez que dans un r<>pertoire avec droit \textbf{wx}, on peut effacer les fichiers (ou r<>pertoires vides) sur lesquels on n'a pas les droits (par contre, on ne peut pas effacer les r<>pertoires non vides sur lesquels on a pas les droits \textbf{wx}).\\
~\\
En plus de cela, il existe des droits sp<73>ciaux: setuid, setgid et sticky bit\\
- Un fichier ex<65>cutable peut <20>tre \texttt{setuid}, c'est-<2D>-dire qu'au lieu d'<27>tre ex<65>cut<75> avec les droits de l'utilisateur qui le lance, il sera ex<65>cut<75> avec les droits du propri<72>taire de l'ex<65>cutable. Ceci s'av<61>re assez dangereux notamment pour les ex<65>cutables \texttt{setuid} root. L'exemple-type est le programme \texttt{passwd} qui permet de changer de mot de passe. Il est ex<65>cutable par un utilisateur mais il est \texttt{setuid} root car seul root peut <20>crire dans les fichiers \texttt{/etc/passwd} et \texttt{/etc/shadow}\\
- Un fichier ex<65>cutable peut <20>tre \texttt{setguid}. Il s'agit de la m<>me notion que celle vue ci-dessus pour le groupe. Le fichier est donc ex<65>cut<75> avec les droits du groupe auquel il appartient.\\
- Un fichier ex<65>cutable peut <20>tre \texttt{sticky}, c'est-<2D>-dire avoir le \texttt{sticky bit} positionn<6E>. Cela signifie qu'il reste en m<>moire m<>me apr<70>s la fin de son ex<65>cution afin d'<27>tre relanc<6E> plus rapidement. Attention, seul root peut positionner le \texttt{sticky bit}.
%<25> pr<70>ciser
- Un r<>pertoire peut <20>tre \texttt{setgid}. Cela signifie que tous les fichiers cr<63><72>s dans ce r<>pertoire appartiendront au m<>me groupe que le r<>pertoire.\\
- Un r<>pertoire peut <20>tre \texttt{sticky} bit. Cela signifie dans ce r<>pertoire, un utilisateur ne pourra effacer que les fichiers qui lui appartiennent. L'exemple-type est le r<>pertoire /tmp o<> tout le monde peut <20>crire mais o<> l'on ne peut effacer que ce que l'on a cr<63><72>.\\
Ces droits sp<73>ciaux sont not<6F>s \texttt{sst} o<> le premier \texttt{s} correspond au \texttt{setuid}, le second au \texttt{setgid} et le \texttt{t} au \texttt{sticky bit}.\\
On <20>crira <20>galement cela sous la forme de bits. Par exemple s-t=101=5 On ajoute (ou retire) des droits sp<73>ciaux avec la commande:
\begin{verbatim}
2012-05-21 16:07:10 +02:00
$ chmod +<droit_sp<EFBFBD>cial> fichier
\end{verbatim}
~\\
2012-05-21 16:07:10 +02:00
\texttt{<droit\_sp<EFBFBD>cial>} peut <20>tre \texttt{s (setuid+setgid)} ou \texttt{t (sticky bit)}\\
On change compl<70>tement les droits sp<73>ciaux et les droits d'un fichier par la commande:
\begin{verbatim}
$ chmod <nouveaux_droits_sp<EFBFBD>ciaux><nouveaux_droits> fichier
\end{verbatim}
~\\
2012-05-21 16:07:10 +02:00
\texttt{<nouveaux\_droits\_sp<EFBFBD>ciaux>} s'<27>crit en base 10. Par exemple, 5 pour setuid et \texttt{sticky bit}.\\
~\\
2012-05-21 16:07:10 +02:00
Il faut aussi d<>finir la politique de gestion des droits de la machine, c'est-<2D>-dire se poser la question "Qui a le droit de faire quoi~?" \\
D<EFBFBD>finissons tout d'abord les droits au niveau des donn<6E>es utilisateurs. Les droits par d<>faut sont g<>r<EFBFBD>s par la directive \texttt{umask}. On mettra donc, selon sa politique, dans le fichier \textit{/etc/profile} (et dans login.defs pour g<>rer lors de la cr<63>ation de l'utilisateur) :\\
~\\
2012-05-21 16:07:10 +02:00
\textit{umask 022} : pour que les donn<6E>es utilisateurs soient visibles par tous les utilisateurs\\
~\\
2012-05-21 16:07:10 +02:00
\textit{umask 027} : pour que les donn<6E>es d'un utilisateur soient visibles entre eux par les utilisateurs du m<>me groupe\\
~\\
2012-05-21 16:07:10 +02:00
\textit{umask 077} : pour que seul l'utilisateur puisse lire ses fichiers par d<>faut\\
~\\
2012-05-21 16:07:10 +02:00
Il faut ensuite g<>rer les droits sur les p<>riph<70>riques. Les diff<66>rents p<>riph<70>riques appartiennent souvent <20> un groupe (cdrom, audio, video, etc.) et on peut g<>rer les droits en ajoutant ou non les utilisateurs <20> ces groupes. On ne d<>taillera pas trop cette proc<6F>dure car elle est surtout valable dans le cas o<> il s'agit de postes de travail accessible physiquement aux utilisateurs.\\
~\\
Il faut <20>galement penser <20> mettre des protections sur les r<>pertoires et partitions accessibles <20> l'utilisateur (on traitera le cas des journaux syst<73>mes <20> part : voir par la suite). Ces protections ne sont pas infaillibles mais constituent un premier rempart dans le cas d'attaques d'un utilisateur inexp<78>riment<6E> (souvent appel<65>s script-kiddy). Voici un exemple de protection que l'on peut mettre dans le fichier \textit{/etc/fstab}~:\\
~\\
\begin{verbatim}
2012-05-21 16:07:10 +02:00
/dev/sda8 /tmp ext3 defaults,nodev,nosuid,noexec,usrquota,grpquota 0 2
# disques amovibles
/dev/fd0 /mnt/fd0 ext2 defaults,users,nodev,nosuid,noexec 0 0
/dev/fd0 /mnt/floppy vfat defaults,users,nodev,nosuid,noexec 0 0
/dev/hdc /mnt/cdrom iso9660 ro,users,nodev,nosuid,noexec 0 0
\end{verbatim}
2012-05-21 16:07:10 +02:00
Remarque~: certains paquets (screen, PostgreSQL, etc.) n<>cessitent d'ex<65>cuter un script dans \textit{/tmp/}. On fera donc~:
\begin{verbatim}
# mount -o exec,remount /tmp
\end{verbatim}
Avant d'installer des paquets, puis on refera~:
\begin{verbatim}
# mount -o remount /tmp
\end{verbatim}
Plus g<>n<EFBFBD>ralement on peut v<>rifier ce que peut voir un utilisateur par les commandes~:
\begin{verbatim}
$ find / -type f -a -perm +006 2>/dev/null}
$ find / -type d -a -perm +007 2>/dev/null}
\end{verbatim}
On prendra garde par exemple aux donn<6E>es sensibles des fichiers de configuration ou des scripts (notamment des donn<6E>es web). On peut par exemple voir les fichiers du r<>pertoire /etc non visibles par un utilisateur~:
\begin{verbatim}
# find /etc -type f -a -perm 600 -a -uid 0
\end{verbatim}
On peut <20>galement restreindre les droits sur certaines applications dangereuses.\\
Exemple :\\
\begin{verbatim}
chmod o-x /usr/bin/nmap
chmod -s /bin/ping
\end{verbatim}
On pourra autoriser l'utilisation de n'importe quel programme (m<>me des programmes administrateurs) gr<67>ce au logiciel sudo\footnote{\url{http://www.courtesan.com/sudo/}}. Son fichier de configuration est \textbf{/etc/sudoers}. Voici un exemple~: \\
~\\
2012-05-21 16:07:10 +02:00
\texttt{User\_Alias STAFF=jo,zette\\
Cmnd\_Alias NET=/bin/ping,/usr/bin/traceroute,/usr/bin/nmap\\
~\\
2012-05-21 16:07:10 +02:00
root ALL=(ALL) ALL\\
STAFF ALL=(ALL) NET\\
}\\
~\\
2012-05-21 16:07:10 +02:00
\textit{ \# /etc/init.d/sudo restart}
~\\
\section{Quotas}
Il est souvent int<6E>ressant de d<>finir des quotas~:\\
~\\
\emph{Configuration du noyau :} CONFIG\_QUOTA \\
~\\
Ajoutez les options \textit{usrquota} et \textit{grpquota} pour les partitions concern<72>es dans le fichier \textit{/etc/fstab}~:\\
{\small \texttt{/dev/hdc8 /home ext3 rw,nosuid,nodev,exec,nouser,auto,async,usrquota,grpquota 0 2}}\\
~\\
\texttt{\# touch /home/aquota.user /home/aquota.group}\\
\texttt{\# chmod 600 /home/aquota.* \&\& chown root:root /home/aquota.*}\\
\texttt{\# mount -v -o remount /home}\\
2012-05-21 16:07:10 +02:00
\texttt{\# apt-get install quota quotatool -> warnquota}\\
\texttt{\# update-rc.d -f quotarpc remove}\\
\texttt{\# quotacheck -auvg}\\
\texttt{\# quotaon -auvg}\\
~\\
On peut maintenant cr<63>er un utilisateur qui va servir d'exemple pour les quotas des autres utilisateurs~:\\
\begin{verbatim}
# adduser --home /dev/null --shell /bin/false --ingroup nogroup --disabled-password forquota
# edquota -u forquota
\end{verbatim}
~\\
La taille d'un "block" est habituellement de 1024 octets sous Linux. Elle peut varier selon les options des syst<73>mes de fichiers.\\
~\\
%\begin{verbatim}
%dumpe2fs /dev/myvol1-home |grep "Block size"
%\end{verbatim}
Les inodes repr<70>sentent le nombre maximum de fichiers ou de r<>pertoires que l'on pourra cr<63>er.\\
%http://lea-linux.org/admin/admin_fs/quotas.html
%http://www.enel.ucalgary.ca/People/Norman/enel315_winter1997/disk_quotas/
~\\
On pourra <20>galement d<>finir le d<>lai (grace period) qui d<>finit le temps au-del<65> duquel la limie douce devient limite dure. On change ce d<>lai avec la commande :\\
\texttt{\# edquota -t}\\
~\\
On peut ensuite appliquer les quotas <20> chaque utilisateur par la commande :\\
\texttt{\# edquota -p forquota USER}\\
~\\
On peut utiliser le fichier adduser.conf pour imposer un quota lors de la cr<63>ation de l'utilisateur [voir plus haut].
~\\
D'autres commandes int<6E>ressantes permettent de v<>rifier le bon fonctionnement des quotas (quotacheck), d'envoyer des messages d'avertissement aux utilisateurs d<>passant la limite douce (warnquota) et de g<>n<EFBFBD>rer des statistiques:\\
\texttt{\# repquota -ugva}\\
~\\
Note :\\
Attention, l'utilitaire dd semble mal g<>rer les quotas.
Liens : \\
\url{http://www.freenix.fr/unix/linux/HOWTO/mini/Quota.html}\\
\url{http://linux.developpez.com/cours/securedeb/?page=page5\#L5.4}
2012-05-21 16:07:10 +02:00
\section{Crontab}
~\\
2012-05-21 16:07:10 +02:00
Cron est d<>mon qui permet d'ex<65>cuter automatiquement des commandes ou des scripts <20> une date et une heure sp<73>cifi<66>es <20> l'avance.\\
~\\
2012-05-21 16:07:10 +02:00
C'est <20>videmment tr<74>s utile pour toutes les t<>ches d'aministration. Le d<>mon cron se base sur le fichier \textit{/etc/crontab} pour lancer des actions toutes les heures (cron.hourly), tous les jours (cron.daily), toutes les semaines (cron.weekly) et tous les mois (cron.monthly). \\
~\\
2012-05-21 16:07:10 +02:00
D<EFBFBD>j<EFBFBD>, il peut <20>tre int<6E>ressant de personnaliser les param<61>tres du \textit{/etc/crontab} afin d'<27>viter l'utilisation des horaires par d<>faut.\\
Ensuite on peut placer des scripts (ex<65>cutables) dans les cron.*ly ou bien dans le r<>pertoire cron.d afin de personnaliser l'horaire :
~\\
2012-05-21 16:07:10 +02:00
\textbf{Squelette} :
~\\
2014-10-14 18:38:56 +02:00
"minute" "heure" "jours" "mois" "jour/semaine" "utilisateur" "commande"\\
~\\
2012-05-21 16:07:10 +02:00
Exemple signifiant du lundi au vendredi, toutes les 3h <20> la 5<>me minute:\\
2014-10-14 18:38:56 +02:00
\texttt{5 */3 * * 1-5 root ntpdate serveur-ntp\\
2012-05-21 16:07:10 +02:00
}
2012-05-21 16:07:10 +02:00
\section{Gestion des Journaux}
Les journaux sont des fichiers qui contiennent des informations d'activit<69> dat<61>e. Ils sont essentiels pour un serveur pour de nombreuses raisons : v<>rifier des actions pass<73>es, g<>n<EFBFBD>rer des statistiques, d<>boguer un programme. La v<>rification des actions pass<73>es est notamment importante en cas de probl<62>me (piratage, service d<>fectueux). La justice oblige <20>galement <20> conserver certains journaux pendant une certaine dur<75>e. Un flou concerne ce qu'il faut r<>ellement conserver (apparemment seules les informations d'ent<6E>tes mais pas le contenu en lui-m<>me) et la dur<75>e (cela varie entre 3 mois, 1 an et 3 ans si l'on se base sur les lois fran<61>aises ou europ<6F>ennes). Des d<>crets d'application devraient <20>claircir ces points dans les prochains mois.\\
~\\
Sous Debian, les journaux se trouvent g<>n<EFBFBD>ralement dans le r<>pertoire \textit{/var/log}. On va distinguer les journaux syst<73>mes et les journaux applicatifs. Les journaux syst<73>mes sont g<>r<EFBFBD>s par le d<>mon SYSLOG\footnote{\url{ftp://ftp.rfc-editor.org/in-notes/rfc3164.txt}}. Sa configuration se trouve dans le fichier \textit{syslog.conf}. Voici quelques ligne extraites de ce fichier~:
\begin{verbatim}
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
mail.* -/var/log/mail.log
*.=debug;auth,authpriv.none;news.none;mail.none -/var/log/debug
*.emerg *
*.*;auth,authpriv.none /dev/tty8
\end{verbatim}
2012-05-21 16:07:10 +02:00
Voici les fichiers pincipaux g<>n<EFBFBD>r<EFBFBD>s par SYSLOG : \\
~\\
\begin{itemize}
\item[\textbf{auth.log :}] authentification syst<73>me (login, su, getty)
\item[\textbf{daemon.log :}] relatif aux daemons
\item[\textbf{mail.* :}] messages relatifs aux mails
\item[\textbf{kern.log :}] messages g<>n<EFBFBD>r<EFBFBD>s par le noyau
\item[\textbf{user.log :}] message g<>n<EFBFBD>r<EFBFBD> par des programmes utilisateur
\item[\textbf{debug :}] messages de bogues
\item[\textbf{messages :}] messages d'info
\item[\textbf{syslog :}] tous les messages
\end{itemize}
~\\
~\\
Les journaux applicatifs sont g<>n<EFBFBD>r<EFBFBD>s par chaque application. Ils sont souvent dans un r<>pertoire du nom de l'application situ<74> dans \textit{/var/log}.\\
~\\
L'un des points essentiels est la rotation des journaux, c'est-<2D>-dire l'action de fermer le journal actuel (et <20>ventuellement le compresser) et d'en ouvrir un autre. Il existe actuellement deux programmes qui se chargent d'effectuer ce travail. Le script \texttt{savelog} (un outil Debian) et le programme \texttt{logrotate}. Par d<>faut \texttt{savelog} g<>re les journaux syst<73>me et \texttt{logrotate} g<>re les journaux applicatifs (apache, mysql, ppp, etc.).\\
Logrotate est ex<65>cut<75> tous les jours (cron.daily) \\
Savelog est ex<65>cut<75> tous les jours (crond.daily) pour syslog notamment.\\
Savelog est ex<65>cut<75> toutes les semaines (crond.weekly) pour les autres journaux syst<73>me.\\
~\\
L'option "-d" de savelog permet d'utiliser la date lors de la rotation des journaux et de ne pas les effacer. On pourra donc ajouter ses propres r<>gles dans les scripts cron pour faire une sauvegarde distante des journaux (<28>ventuellement dans une base de donn<6E>es). Pour des serveurs d<>di<64>s (applications cl<63>s), on peut augmenter la fr<66>quence des rotations et des sauvegardes distantes, mais <20>galement utiliser des scripts afin de d<>tecter toutes alertes ou anomalies et les envoyer par courrier <20>lectronique ou m<>me SMS. \\
Il existe des programmes analysant les journaux permettant de d<>tecter des probl<62>mes, avoir des statistiques (lire logtool prelude).\\
~\\
Il faut donc bien insister sur la n<>cessit<69> de surveiller les services en production <20> l'aide d'outils adapt<70>s. On dispose donc d'outils s'appuyant souvent sur le protocole SNMP (Simple Network Management Protocol) qui permet de g<>rer et diagnostiquer les probl<62>mes en transf<73>rant des informations syst<73>me (r<>seau, charge, <20>tat, etc.).
~\\
Pour exploiter ces informations, on pourra tracer des courbes MRTG\footnote{\url{http://people.ee.ethz.ch/~oetiker/webtools/mrtg/}} ou RRDtool\footnote{\url{http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/}}. Ces logiciels permettent de produire des courbes totalement personnalis<69>es pour tracer des courbes.\\
~\\
%TODO
%http://www.linpro.no/projects/munin/
%http://stat.trackfire.net/statspppd/src/
%http://people.ee.ethz.ch/~oetiker/webtools/smokeping/
\section{OpenSSH}
SSH signifie Secure SHell (Shell s<>curis<69>). Le protocole SSH est en cours de standardisation par l'IETF\footnote{\url{http://www.ietf.org/html.charters/secsh-charter.html}}. Les outils du protocole SSH sont utilis<69>s par un nombre croissant de personnes. Ils sont destin<69>s <20> s<>curiser le login <20> distance, s<>curiser les transferts de fichiers et s<>curiser les TCP/IP et X11 forwardings. Il peut automatiquement chiffrer, authentifier et compresser des donn<6E>es transmises.\\
~\\
La principale impl<70>mentation du protocole est OpenSSH\footnote{\url{http://www.openssh.org}}. OpenSSH est une version libre de la suite d'outils du protocole SSH. De nombreux utilisateurs de telnet, rlogin, ftp et autres programmes identiques ne r<>alisent pas que leur mot de passe et leurs donn<6E>es sont transmis de fa<66>on non chiffr<66>e. OpenSSH chiffre tout le trafic (mots de passe inclus) de fa<66>on <20> d<>jouer les <20>coutes r<>seau, les prises de contr<74>le de connexion, et autres attaques. De plus, OpenSSH fournit toute une palette de possibilit<69>s de tunnel et de m<>thodes d'authentification. OpenSSH \textbf{doit} <20>tre utilis<69> <20> la place de telnet et autres logiciels non-s<>rs.\\
Pour la plupart de ses fonctionnalit<69>s cryptographiques, OpenSSH s'appuie sur la biblioth<74>que OpenSSL. La suite logicielle OpenSSH inclue les programmes ssh qui remplace telnet et rlogin, scp qui remplace rcp, et sftp qui remplace ftp. De plus sshd, la partie serveur, est inclus ainsi que d'autres utilitaires tels que ssh-add, ssh-agent, ssh-keygen, ssh-keysign, ssh-keyscan, et sftp-server. OpenSSH supporte les protocoles SSH 1.3, 1.5 et 2.0. Int<6E>ressons nous <20> sa configuration, qui se trouve dans le fichier \textit{sshd\_config} :\\
\begin{verbatim}
2012-05-21 16:07:10 +02:00
Protocol 2
LoginGraceTime 30
PermitRootLogin no
AllowUsers moi admin
ClientAliveInterval 15
ClientAliveCountMax 45
\end{verbatim}
2012-05-21 16:07:10 +02:00
~\\
2012-05-21 16:07:10 +02:00
On peut <20>galement imposer des restrictions suppl<70>mentaires dans le fichier pam.d/ssh :\\
\begin{verbatim}
2012-05-21 16:07:10 +02:00
auth required pam_listfile.so sense=allow onerr=fail
item=user file=/etc/loginusers
\end{verbatim}
2012-05-21 16:07:10 +02:00
~\\
Si des utilisateurs normaux sont destin<69>s <20> utiliser SSH, il peut <20>tre int<6E>ressant de l'installer dans une prison Chroot. Voici quelques liens qui expliquent cette mise en place~: \\
2012-05-21 16:07:10 +02:00
Liens : \\
{\small
\url{http://chrootssh.sourceforge.net/index.php} \\
\url{http://www.debian.org/doc/manuals/securing-debian-howto/ap-chroot-ssh-env.fr.html} \\
\url{http://vince.kerneled.org/files/ssh\_chroot.txt} \\
}
~\\
2012-05-21 16:07:10 +02:00
\section{Transfert de fichiers}
~\\
Le transfert de fichiers par le protocole FTP fait circuler identifiants, mot de passe et donn<6E>es en clair sur le r<>seau. Il est vraiment pr<70>f<EFBFBD>rable d'utiliser scp ou sftp, du projet OpenSSH, qui permet de transf<73>rer des fichiers de fa<66>on plus s<>curis<69>e. Mais dans certains cas, notamment dans le cas de serveur web mutualis<69>, il est de coutume d'offrir un acc<63>s FTP. Il faut donc prendre quelques pr<70>cautions. Par exemple, avec le serveur ProFTPD\footnote{\url{http://www.proftpd.org/}}, certaines directives du fichier de configuration \textit{proftpd.conf} sont importantes : \\
\begin{verbatim}
2012-05-21 16:07:10 +02:00
DefaultRoot ~
DenyFilter \*.*/
\end{verbatim}
2012-05-21 16:07:10 +02:00
On pourra <20>galement utiliser PAM pour limiter l'acc<63>s selon les utilisateurs. Dans le fichier \textit{/etc/pam.d/proftpd}~: \\
auth required pam\_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
2012-05-21 16:07:10 +02:00
~\\
On aura donc un fichier \textit{/etc/ftpusers} qui sp<73>cifiera les identifiants ne pouvant pas utiliser les services FTP (on pourrait faire l'inverse aussi). \\
~\\
Dans le but de chiffrer les connexions FTP, on peut <20>galement utiliser une couche SSL. Les serveurs Pure-FTP\footnote{\url{http://www.pureftpd.org/}} ou linux-ftpd-ssl\footnote{\url{http://freshmeat.net/projects/linux-ftpd-ssl/}} permettent cela. Il faut bien noter qu'il faut utiliser un programme client capable de l'utiliser (mais c'est le cas de plus en plus de clients). \\
\section{Authentification}
2014-10-14 18:38:56 +02:00
Le fichier \texttt{/etc/passwd} contient la liste des utilisateurs avec le mot de passe chiffr<66>. Ainsi lors de la proc<6F>dure d'authentification d'un utilisateur, le syst<73>me teste si le chiffrement du mot de passe entr<74> correspond au mot de passe chiffr<66> (\texttt{/etc/passwd} est accessible en lecture aux utilisateurs). Il est souhaitable d'utiliser l'algorithme de chiffrement SHA-512 pour chiffrer les mots de passe. Il est <20>galement conseill<6C> d'utiliser l'authentification shadow. Avec cette authentification, les mots de passe du fichier /etc/passwd sont remplac<61>s par 'x' et sont stock<63>s dans le fichier \texttt{/etc/shadow}, inaccessible en lecture aux utilisateurs. D'autres m<>thodes d'authentification locale existent comme sous OpenBSD\footnote{\url{http://openbsd.org/}} mais l'utilisation de la m<>thode shadow est r<>pandue sur les distributions Linux. Il faut bien avoir conscience que cela repose sur la solidit<69> de l'algorithme de chiffrement\footnote{\url{http://evolix.org/man/crypt.html}}.\\
2012-05-21 16:07:10 +02:00
Le fichier \texttt{/etc/group} stocke la liste des groupes, c'est-<2D>-dire des entit<69>s regroupant plusieurs utilisateurs et permettant de donner <20> ce groupe d'utilisateurs les m<>mes droits sur des fichiers. Un utilisateur peut conna<6E>tre les groupes auxquels il appartient en tapant la commande \texttt{groups} ou encore \texttt{id}.\\
Le fichier /etc/adduser.conf contient les valeurs par d<>faut pour les programmes \textit{adduser} \textit{addgroup} \textit{deluser} et \textit{delgroup}. Chaque option est de la forme option = valeur. Les simples ou doubles guillemets sont autoris<69>s autour de la valeur. Les lignes de commentaires doivent avoir un caract<63>re di<64>se (\#) au d<>but de la ligne.\\
~\\
Exemple~:\\
\texttt{
DSHELL=/bin/bash\\
DHOME=/home\\
SKEL=/etc/skel\\
QUOTAUSER="forquota"\\
DIR\_MODE=0755\\
}\\
~\\
Le r<>pertoire /etc/skel/ contient le profil par d<>faut qui sera copi<70> dans le r<>pertoire personnel d'un nouvel utilisateur. Il contient souvent les fichiers .bashrc, .bash\_profile, etc. Pour configurer un profil pour les utilisateurs, on ajoutera des fichiers dans /etc/skel (par exemple des boites <20> mail, param<61>tres pour certaines applications, etc.)\\
~\\
La gestion des utilisateurs se fait gr<67>ce aux commandes adduser et addgroup. Notez bien que les commandes useradd, groupadd, userdel et groupdel ont une syntaxe diff<66>rente et n'utilisent pas forc<72>ment les m<>mes configurations.\\
~\\
Exemple~:\\
\begin{verbatim}
2014-10-14 18:38:56 +02:00
# addgroup --gid 107 student
2012-05-21 16:07:10 +02:00
# adduser --home /home/jean --shell /bin/bash
--uid 1057 --ingroup student jean
\end{verbatim}
2012-05-21 16:07:10 +02:00
~\\
L'utilisation d'un mot de passe al<61>atoire contenant des lettres majuscules et minuscules, des chiffres et des caract<63>res sp<73>ciaux (au total plus de 8 caract<63>res) est fortement recommand<6E>e.\\
Toute trace <20>crite devra <20>tre bannie si possible surtout pour un administrateur - c'est son boulot ;) - <20> l'exception d'endroits s<>curis<69>s (coffre-fort, banque, etc.) accessibles par des sup<75>rieurs hi<68>rarchiques. Une proc<6F>dure en cas d'accident corporel de l'administrateur pourra <20>tre mise en place.\\
~\\
Pour les mots de passe utilisateurs, il peut <20>tre utile d'emp<6D>cher les mots de passe trop simples (cracklib) et de faire tourner des crackeurs de mots de passe afin de v<>rifier en permanence qu'aucun utilisateur n'a un mot de passe trop simple etc.\\
~\\
Voici quelques programmes de g<>n<EFBFBD>ration de mot de passe al<61>atoire disponibles sous Debian~:\\
\texttt{otp} \texttt{apg} \texttt{makepasswd} \texttt{pwgen}\\
~\\
Il existe <20>galement des outils pour tenter de cracker les mots de passe. L'un des plus connu est le programme \texttt{john} qu'il est int<6E>ressant de faire tourner r<>guli<6C>rement afin de d<>tecter si des utilisateurs ont des mots de passe trop simples.
~\\
\section{Gestion de l'authentification}
Nous savons comment fonctionne la proc<6F>dure d'authentification [voir plus haut] mais au-del<65> de l'authentification, il est n<>cessaire d'imposer des restrictions au niveau de la proc<6F>dure de login pour <20>viter des d<>sagr<67>ments. Pour cela on dispose de plusieurs moyens de restreindre les acc<63>s et imposer d'autres param<61>tres.\\
~\\
Commen<EFBFBD>ons par le fichier \texttt{/etc/login.defs} qui d<>finit les param<61>tres d'authentification. Certains param<61>tres sont notamment importants~:
\begin{verbatim}
# delai minimum entre deux tentatives de login
FAIL_DELAY 10
# journaliser les tentatives rat<61>es
FAILLOG_ENAB yes
# retenir les identifiants iconnus essay<61>s
LOG_UNKFAIL_ENAB yes
# retenir les tentatives r<>ussies
LOG_OK_LOGINS yes
2014-10-14 18:38:56 +02:00
# delai maximum pour authentification
LOGIN_TIMEOUT 60
\end{verbatim}
Le fichier \texttt{/etc/securetty} contient la liste des terminaux sur lesquels la connexion de 'root' est autoris<69>e. Il est conseill<6C> de mettre ce fichier vide afin de d<>sactiver le login de 'root'. Seul 'su' permettra donc de devenir superutilisateur. Faire donc~:
\begin{verbatim}
# sed -e 's/^/#/' /etc/securetty > /tmp/sed
# mv /tmp/sed /etc/securetty
\end{verbatim}
~\\
\textbf{Linux-PAM}
~\\
La plupart des distributions Linux utilisent l'authentification PAM par d<>faut.\\
De nombreuses applications utilisent l'authentification PAM et notamment login, su qui sont assez importantes...\\
On v<>rifiera qu'une application utilise l'authentification PAM gr<67>ce <20> \texttt{ldd}\\
Ex~:
\begin{verbatim}
ldd $(which su)
\end{verbatim}
\textit{Lien~:}
\url{http://www.kernel.org/pub/linux/libs/pam/}\\
~\\
La configuration se passe dans le r<>pertoire \texttt{/etc/pam.d/}\\
Si ce r<>pertoire est absent, la configuration pourra avoir lieu dans un fichier unique: \texttt{/etc/ldap.conf} (ignor<6F> sinon)\\
Chaque application est configur<75>e dans un fichier portant son nom.\\
Le r<>pertoire \texttt{/etc/security/} contient des fichiers de configuration s<>curit<69> pour PAM.\\
~\\
Le comportement par d<>faut est dans le fichier \texttt{/etc/pam.d/other}
La syntaxe des fichiers est constitu<74>e de lignes telles que :
"type" "niveau" "module" "arguments"\\
~\\
"type" peut <20>tre :\\
\begin{itemize}
\item[\textbf{auth}] : authentification
\item[\textbf{account}] : v<>rification des types de services autoris<69>s
\item[\textbf{session}] : t<>ches <20> effectuer avant/apr<70>s l'acc<63>s
\item[\textbf{password}] : m<>canismes d'authentification
\end{itemize}
~\\
"niveau" peut <20>tre :\\
\begin{itemize}
\item[\textbf{required}] : le succ<63>s <20> cette <20>tape est n<>cessaire
\item[\textbf{requisite}] : le succ<63>s est n<>cessaire et l'acc<63>s est refus<75> en cas d'erreur
\item[\textbf{sufficient}] : le succ<63>s <20> cette <20>tape suffit
\item[\textbf{optional}] : l'acc<63>s pourra <20>tre refus<75> en fonction d'autres param<61>tres
\end{itemize}
~\\
"module":\\
(Ils se trouvent par d<>faut dans le r<>pertoire /lib/security/)\\
\begin{itemize}
\item[\textbf{pam\_access.so}] : restriction d'acc<63>s avec le fichier access.conf\\
\end{itemize}
~\\
2014-10-14 18:38:56 +02:00
Le fichier \texttt{/etc/security/access.conf} permet de g<>rer les permissions de login (si activ<69> dans PAM) selon la syntaxe suivante :\\
~\\
~[*] permission : users : origins
~\\
~[*] = + (acc<63>s permis) ou - (acc<63>s refus<75>)\\
~\\
\textbf{Exemples :}
~\\
\begin{itemize}
\item[\textit{-:mechant pasbeau:ALL}] -> les comptes mechant et pasbeau ne peuvent pas se loguer
~\\
\item[\textit{-:ALL EXCEPT admin:ALL EXCEPT LOCAL}] -> seuls admin peut se loguer <20> distance\\
~\\
Sur un serveur o<> seuls les administrateurs peuvent se connecter :
~\\
\item[\textit{-:ALL EXCEPT admin admin2:LOCAL}]
~\\
\item[\textit{pam\_deny.so}] : interdiction d'acc<63>s
~\\
\item[\textit{pam\_env.so}] : utilise les variables d'environnement de pam\_env.conf en plus du fichier /etc/environment
~\\
\item[\textit{pam\_filter.so}] : utiliser divers filtres
~\\
\item[\textit{pam\_ftp.so}] : avoir un acc<63>s de type FTP anonyme
~\\
\item[\textit{pam\_group.so}] : utilise group.conf pour imposer des restrictions selon le groupe
~\\
\item[\textit{pam\_issue.so}] : pour afficher /etc/issue lors d'un login
~\\
\item[\textit{ pam\_lastlog.so}] : donne des informations sur la derni<6E>re connexion de l'utilisateur
~\\
\item[\textit{ pam\_ldap.so}] : module pour l'authentification LDAP
~\\
\item[\textit{ pam\_limits.so }]: restrictions particuli<6C>res avec le fichier limits.conf
~\\
\end{itemize}
~\\
2014-10-14 18:38:56 +02:00
Le fichier \texttt{/etc/security/limits.conf} permet d'imposer des limites diverses sur les groupes ou les identifiants :\\
~\\
Structure: "qui" "type" "quoi" "combien"\\
~\\
\begin{itemize}
\item[\textbf{qui}] = compte, @groupe, *
~\\
\item[\textbf{type}] = soft (soft limits) ou hard (hard limits)
~\\
\item[\textbf{quoi}] = core, data, fsize, memlock, nofile, rss, stack, cpu, nproc, as, maxlogins, priority, locks
\end{itemize}
~\\
\textbf{Exemples }:\\
\begin{verbatim}
ftpusers - maxlogins 3
@invite hard cpu 5
@users hard data 10000
\end{verbatim}
~\\
\begin{itemize}
\item[\textit{pam\_listfile.so}] : permet d'autoriser ou non d'apr<70>s une liste
~\\
\item[\textit{pam\_mail.so}] : pour indiquer si de nouveaux mails sont arriv<69>s
~\\
login session optional pam\_mail.so dir=~/Maildir/
~\\
~\\
\item[\textit{pam\_mkhomedir.so}] : pour cr<63>er le home des utilisateurs authentifi<66>s (pratique pour les utilisateur NIS ou LDAP)
~\\
\texttt{session required pam\_mkhomedir.so skel=/etc/skel/ umask=022}\\
~\\
\item[\textit{pam\_nologin.so}] : emp<6D>cher tout login ! = root si le fichier /etc/nologin existe
~\\
\item[\textit{pam\_permit.so}] : autoriser l'acc<63>s (dangereux)
~\\
\item[\textit{pam\_rootok.so}] : autoriser si l'utilisateur est root (id=0)
~\\
\item[\textit{pam\_securetty.so}] : permettre l'acc<63>s de root seulement si le PAM\_TTY figure dans le fichier \texttt{/etc/securetty}
~\\
\item[\textit{pam\_shells.so}] : permettre l'acc<63>s si le shell de l'utilisateur est list<73> dans le fichier \texttt{/etc/shells}
~\\
\item[\textit{pam\_tally.so}] : permet de bloquer les tentatives au bout d'un certain nombre d'<27>checs
~\\
\texttt{account required /lib/security/pam\_tally.so per\_user deny=5}\\
~\\
\item[\textit{pam\_time.so}] : permet de restreindre certains services selon le temps d'apr<70>s le fichier time.conf
~\\
\texttt{games ; * ; !waster ; Wd0000-2400 | Wk1800-0800}\\
~\\
\item[\textit{pam\_unix.so}] : module standard d'authentification Unix
~\\
\item[\textit{pam\_userdb.so}] : module d'authentification sur une Berkeley DB
~\\
\texttt{auth sufficient pam\_userdb.so icase db=/etc/id.db}\\
~\\
\item[\textit{pam\_warn.so}] : journalise certains param<61>tres pour syslog
~\\
2012-05-21 16:07:10 +02:00
\item[\textit{pam\_wheel.so}] : permettre l'acc<63>s root uniquement au membre de whell (gid=0)
~\\
\item[\textit{pam\_cracklib.so}] : v<>rifie que le mot de passe r<>pond <20> certains crit<69>res (taille, simplicit<69>)
~\\
\texttt{password required pam\_crackedlib.so type=Evolix retry=0 minlen=8}\\
\texttt{dcredit=2 ucredit=2 lcredit=2 ocredit=1}\\
\texttt{password required pam\_pwdb.so use\_authtok nullok md5}\\
\end{itemize}
~\\
Lien: \url{http://perso.wanadoo.fr/alexandre.vidal/pam/}
~\\
On rappelle que pour avoir des renseignements sur l'utilisateur actuellement connect<63>, on fera~:\\
\textit{ \# whoami}\\
\textit{ \# id}\\
~\\
On peut <20>galement avoir divers renseignements sur les utilisateurs~:\\
~\\
\textit{ \# who} : donne les utilisateurs actuellement connect<63>s\\
\textit{ \# last} : donne les derni<6E>res connections gr<67>ce <20> fichier wtmp\\
\textit{ \# w.procs} : donne les utilisateurs actuellement connect<63>s et des renseignements compl<70>mentaires\\
~\\
\section{S<EFBFBD>curit<EFBFBD>}
La s<>curit<69> informatique englobe non seulement la s<>curit<69> r<>seau pour se
pr<EFBFBD>munir d'attaque locale ou ext<78>rieure, mais <20>galement la s<>curit<69> physique,
la gestion des utilisateurs, des droits, des journaux et des sauvegardes.\\
\textbf{S<EFBFBD>curit<EFBFBD> physique au niveau des infrastructures} \\
~\\
M<EFBFBD>me si les gens ont plut<75>t tendance <20> l'oublier, la s<>curit<69> physique de la
machine est tr<74>s importante. Il est n<>cessaire qu'un disque dur ne soit pas en
<EFBFBD>vidence, pr<70>t <20> <20>tre vol<6F> avec toutes les informations qu'il contient. Il est
important que l'alimentation d'un serveur soit prot<6F>g<EFBFBD>e, et qu'il ne suffise
pas juste au pirate de d<>brancher le cordon <20> la prise pour que des dizaines de
couches de s<>curit<69> logicielles soient an<61>anties.\\
\textbf{S<EFBFBD>curit<EFBFBD> physique au niveau de l'utilisation} \\
~\\
Lorsque vous tapez un mot de passe, il n'est pas superflu de vous assurer que
personne ne soit pench<63> ou dessus de votre <20>paule, ou qu'aucun <20>l<EFBFBD>ment d'<27>coute
2012-05-23 05:43:40 +02:00
a <20>t<EFBFBD> rajout<75> (keylogger logiciel ou physique).\\
2012-05-21 16:07:10 +02:00
\textbf{Au niveau du BIOS} \\
~\\
Une premi<6D>re m<>thode de s<>curisation consiste <20> autoriser uniquement le disque
dur <20> d<>marrer. Il faut aussi d<>finir un mot de passe au niveau du BIOS
emp<EFBFBD>chant de changer les param<61>tres de ce dernier pour un d<>marrage sur un
autre p<>riph<70>rique dans l'espoir de pouvoir ensuite avec diff<66>rents outils
acc<EFBFBD>der aux donn<6E>es du disque dur.\\
Il est <20>galement possible d'avoir des protections complexes, comme une
authentification mutuelle entre le BIOS et le disque, mais ces protections sont
rarement mises en place.\\
\textbf{Au niveau du Boot Loader}\\
~\\
\emph{Lilo}\\
Le fichier de configuration principal est lilo.conf (\textit{/etc/lilo.conf})\\
Dans ce fichier la possibilit<69> est donn<6E>e de mettre en place un mot de passe par l'ajout de la ligne : \texttt{password = motdepasse}.
A remarquer que contrairement <20> grub que l'on va d<>crire, une modification de lilo.conf pour <20>tre prise en compte doit <20>tre suivie de la commande \texttt{\#lilo} ex<65>cut<75>e en tant que root.\\
~\\
\emph{Grub}\\
De m<>me que pr<70>cedemment il est possible avec grub d'ajouter un mot de passe qui peut m<>me <20>tre crypt<70>~:\\
\\
Lancer le shell GRUB~:\\
~\\
\texttt{\# grub}\\
\texttt{grub> md5crypt}\\
~\\
entrez votre mot de passe :\\
\\
Password: *********\\
Encrypted: {\small{\$1\$gxRBf0\$pe0rH7/nG9KPJLvc.XV7V.}}\\
~\\
puis, copiez le mot de passe crypt<70> dans votre fichier de configuration \texttt{/boot/grub/menu.lst}~:
\begin{verbatim}
password --md5 $1$gxRBf0$pe0rH7/nG9KPJLvc.XV7V.
\end{verbatim}
L'argument password peut <20>tre utilis<69> pour restreindre certaines entr<74>es; dans ce cas il est ins<6E>r<EFBFBD> juste sous la ligne "title" <20> d<>marrer. \\
~\\
Dans le fichier \textit{/etc/inittab} permet <20> un utilisateur physique de red<65>marrer la machine. Vous pouvez donc supprimer cette ligne~:\\
\texttt{ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now}
~\\
Pour demander <20> init (le processus d'initialisation) de r<>examiner \texttt{/etc/inittab}, faire~:\\
\texttt{\# init q} \\
~\\
N<EFBFBD>anmoins, malgr<67> toutes ces protections possibles, il faut consid<69>rer qu'avoir
un acc<63>s physique <20> une machine permet d'en faire ce que l'on veut. C'est
pourquoi on se contente souvent des protections basiques comme fermer la salle
des machines <20> cl<63>, mettre en place des cadenas sur les boitiers ou encore
avoir un syst<73>me de vid<69>osurveillance. \\
\textbf{Firewall}
~\\
Sous Linux, il existe un programme puissant qui permet d'avoir des r<>gles de firewall complexes. Ce programme se nomme (depuis le noyau Linux 2.4.x) Netfilter/IPTables\footnote{\url{http://www.netfilter.org/}}. Il permet d'<27>crire des r<>gles en ligne de commande, et donc le lancement de r<>gles se fait souvent sous forme de script.\\
~\\
Un script d<>taill<6C> se trouve en annexe <20> titre d'exemple.\\
~\\
%TODO
%Fire-Starter : http://www.fs-security.com/
%http://qtables.radom.org/index.php
\textbf{D<EFBFBD>tection d'intrusion}
~\\
Au-del<65> des pr<70>cautions prises, il faut avoir conscience des diverses possibilit<69>s d'intrusion et d'attaque. Dans le but de d<>tecter et pr<70>venir ce type de danger, il existe des programmes de d<>tections d'intrusion (IDS) qui permettent d'obtenir des rapports de trafic, des alertes et <20>ventuellement des r<>actions dynamiques.\\
Les logiciels Prelude\footnote{\url{http://www.prelude-ids.org/}} et Snort\footnote{\url{http://www.snort.org/}} sont les IDS libres les plus connus. \\
Ils peuvent <20>tre coupl<70>s avec une base de donn<6E>es (MySQL, PostGreSQL) et respectivement avec les logiciels Piwi et ACID (Analysis Console for Intrusion Databases)\footnote{\url{http://acidlab.sourceforge.net/}} pour obtenir les rapports par une interface web.\\
~\\
Il existe un autre type de logiciels de s<>curit<69> : le \textit{pot de miel}. Il s'agit de serveur (ou serveur virtuel) laiss<73> sous surveillance <20>troite sur un r<>seau et dont le r<>le est d'<27>tre attaqu<71> et compromis afin d'<27>tudier le comportement et les outils des pirates.\\
Le programme libre le plus connu est honeyd\footnote{\url{http://www.honeyd.org/}} mais il existe d'autres impl<70>mentations (tinyhoneypot\footnote{\url{http://www.alpinista.org/thp/}}, etc.) D'autres programmes moins <20>labor<6F>s permettent de surveiller des actions d'utilisateurs:\\
~\\
TTYSnoop\footnote{\url{http://freshmeat.net/projects/ttysnoop/}} permet de d<>river des terminaux de connexion, \\
Snoopy\footnote{\url{http://sourceforge.net/projects/snoopylogger/}} pour intercepter les commandes sur le syst<73>me, \\
~\\
2012-05-21 16:07:10 +02:00
%TODO
%port-sentry
%ScanLogd : http://www.openwall.com/scanlogd/
%debian package AIDE
On citera <20>galement les nombreux outils qui permettent d'<27>couter et d'analyser le trafic r<>seau:\\
~\\
\texttt{tcpdump, ethereal, dsniff, sniffit\footnote{\url{http://reptile.rug.ac.be/~coder/sniffit/sniffit.html}}, ngrep, hunt, tcpick}\\
\texttt{nast, karpski, vnstat, ndiff, etc.} \\
~\\
2012-05-21 16:07:10 +02:00
\textbf{Piratage ?}
~\\
2012-05-21 16:07:10 +02:00
On peut v<>rifier l'int<6E>grit<69> du syst<73>me gr<67>ce <20> des outils de d<>tection des rootkits : Chkrootkit\footnote{\url{http://www.chkrootkit.org/}} :\\ ou Rootkit Hunter\footnote{\url{http://www.rootkit.nl/projects/rootkit\_hunter.html}}\\
~\\
2012-05-21 16:07:10 +02:00
% voir script checksecurity (Debian package)
\textbf{Isoler les services}
~\\
2012-05-21 16:07:10 +02:00
\textit{Chroot} \\
Chroot est un utilitaire permettant d'emprisonner un service dans une arborescence limit<69>e. Cela permet de limiter l'acc<63>s aux services offerts et <20>viter d'avoir un acc<63>s complet au syst<73>me en cas de failles logiciel. Sous Debian, il existe quelques services tournant dans une prison Chroot par d<>faut (Postfix notamment) mais si l'on veut emprisonner des services comme Bind, Apache, serveur FTP, OpenSSH, il faudra cr<63>er la prison Chroot manuellement. Le script makejail\footnote{\url{http://www.floc.net/makejail/}} permet d'aider <20> la cr<63>ation de prisons Chroot <20> l'aide de fichiers de configuration. On notera que les syst<73>mes *BSD (notamment OpenBSD\footnote{\url{http://www.openbsd.org/}}) sont en avance pour les services d'emprisonnement. De nombreux services sont ainsi emprisonn<6E>s par d<>faut. \\
~\\
2012-05-21 16:07:10 +02:00
D'autres programmes permettent d'<27>muler plusieurs syst<73>mes sur une seule machine :\\
\textit{Vserver} \\
Linux-VServer est projet libre proposant un patch pour le noyau Linux ainsi qu'un ensemble d'outils pour permettre de lancer plusieurs distributions Linux au dessus d'un seul noyau et partager les ressources. \\
Lien : \url{http://www.linux-vserver.org/}\\
~\\
2012-05-21 16:07:10 +02:00
\textit{UML} \\
UML (User Mode Linux) est un projet libre permettant de lancer plusieurs noyaux Linux comme un simple programme (en mode utilisateur donc) ce qui permet d'avoir des machines virtuelles Linux. Le contenu du disque du syst<73>me virtuel est stock<63> dans un seul fichier. \\
Lien : \url{http://user-mode-linux.sourceforge.net/}
~\\
2012-05-21 16:07:10 +02:00
\textit{Vmware} \\
Vmware est un programme propri<72>taire plut<75>t r<>put<75> permettant de lancer plusieurs machines virtuelles (MS-Windows, Linux, *BSD) Il existe une version Workstation permettant de lancer des machines virtuelles comme des applications et une version Serveur permettant de lancer <20> distance des machines virtuelles sur un serveur. \\
Lien : \url{http://www.vmware.com/}
~\\
2012-05-21 16:07:10 +02:00
\textbf{Mises-<2D>-jour logicielles de s<>curit<69>}
~\\
2012-05-21 16:07:10 +02:00
"Nous ne cacherons pas les probl<62>mes. Nous garderons toujours notre base de donn<6E>es des rapports de bogues ouverte au public. Les rapports que les utilisateurs remplissent en ligne seront imm<6D>diatement visibles par les autres." extrait du Contrat social Debian\\
~\\
2012-05-21 16:07:10 +02:00
Comme pour la plupart des logiciels, la politique de s<>curit<69> de Debian est d'avoir une gestion transparente des failles et des bogues. Plusieurs <20>tudes ont montr<74> que cette politique <20>tait la plus efficace en terme de s<>curit<69>. N<>anmoins, cela a pour cons<6E>quence pour l'administrateur d'avoir une r<>activit<69> accrue pour faire le n<>cessaire d<>s qu'un probl<62>me est annonc<6E>. Il existe donc une <20>quipe de s<>curit<69> Debian qui est charg<72>e de publier des paquets corrig<69>s pour la version stable de Debian d<>s qu'un probl<62>me est d<>couvert. Pour pouvoir profiter de ces paquets mis <20> jour, il faut avoir la ligne suivante dans son fichier \textit{sources.list}~:\
~\\
\texttt{deb http://security.debian.org/ stable/updates main contrib non-free}
~\\
2012-05-21 16:07:10 +02:00
Le minimum est de s'abonner <20> la liste de diffusion debian-security-announce. Mais pour aller plus loin, il est conseill<6C> de suivre de pr<70>s les listes de diffusion des logiciels utilis<69>s en production et <20>galement des listes traitant de s<>curit<69> notamment la liste Bugtraq\footnote{\url{http://www.securityfocus.com/archive/1}}. \\
~\\
2012-05-21 16:07:10 +02:00
\section{R<EFBFBD>seau}
~\\
Au niveau d'un serveur, il est pr<70>f<EFBFBD>rable d'opter pour une configuration r<>seau statique. En effet d<>pendre d'un tiers (serveur DHCP) pour des param<61>tres aussi essentiels que les param<61>tres r<>seau n'est pas prudent. Dans le cas o<> l'on voudrait quand m<>me avoir un configuration par DHCP, il faudra au minimum une authentification par adresse MAC.
~\\
2012-05-21 16:07:10 +02:00
Tout d'abord, parlons de quelques outils r<>seau utiles~:
~\\
\begin{itemize}
\item[\textbf{netstat :}] netstat -a -u
\item[\textbf{lsof :}] lsof -i 4
\item[\textbf{tcpdump :}] tcpdump -X -i eth2 port 22 > log\_ssh
\item[\textbf{nmap :}] http://www.insecure.org/nmap/ nmap -O -P0 192.168.23.27
\item[\textbf{hping :}] outil g<>n<EFBFBD>rateur de paquet r<>seau
\item[\textbf{scapy :}] outil de manipulation de paquets
\item[\textbf{arping :}] arping -a -S 192.168.3.12 -c 3 -i wlan0 192.168.54.22
\item[\textbf{dsniff :}] dsniff -i eth1
\end{itemize}
~\\
On va donc commencer par contr<74>ler les services r<>seau ouverts sur la machine et les fermer si n<>cessaires~:\\
~\\
Sur un syst<73>me install<6C> depuis peu, on trouve souvent ces services ouverts :\\
~\\
\texttt{\# nmap localhost}
\texttt{
9/tcp~~~open~~discard\\
13/tcp~~open~~daytime\\
37/tcp~~open~~time\\
111/tcp~open~~rpcbind\\
113/tcp~open~~auth\\
}
~\\
discard, daytime et time sont d<>marr<72>s par inetd\\
~\\
Inetd est historiquement un "super-serveur" permettant de configurer plusieurs services. Pour d<>sactiver les services pr<70>c<EFBFBD>dents on proc<6F>dera <20> la commande suivante :\\
\begin{verbatim}
# update-inetd --disable discard,daytime,time,ident
\end{verbatim}
\begin{verbatim}
WARNING!!!!!! /etc/inetd.conf contains multiple entries for
the `discard' service. You're about to disable these entries.
Do you want to continue? [n] y
\end{verbatim}
~\\
\textbf{Le super-d<>mon} \\
~\\
2012-05-21 16:07:10 +02:00
Si vous avez l'intention d'utiliser le serveur Inetd, il est pr<70>f<EFBFBD>rable
d'utiliser Xinetd\footnote{\url{http://www.xinetd.org/}}, qui remplace Inetd en
offrant des fonctionnalit<69>s plus compl<70>tes notamment en terme de s<>curit<69>. Pour
installer Xinetd, on installera le paquet xinetd tout simplement. Voici un
exemple du fichier de configuration xinetd.conf~:
\begin{verbatim}
service imap3
{
socket_type = stream
protocol = tcp
wait = no
user = root
passenv =
server = /usr/bin/tcpd
server_args = /usr/sbin/imapd
}
\end{verbatim}
~\\
2012-05-21 16:07:10 +02:00
On fermera <20>galement le port 111 en supprimant le programme portmap (utile pour NIS ou NFS notamment):\\
\begin{verbatim}
2012-05-21 16:07:10 +02:00
# aptitude remove portmap nfs-comon
\end{verbatim}
~\\
2012-05-21 16:07:10 +02:00
On supprimera tous les services inutiles.\\
On v<>rifie les services TCP ouverts par~:\\
~\\
\texttt{
\# nmap localhost\\
\# netstat -a -t\\
}
~\\
Et les services UDP par~:\\
~\\
\texttt{
\# nmap -sU localhost\\
\# netstat -a -u\\
}
~\\
On peut v<>rifier quels sont les processus qui ouvrent les ports par :\\
~\\
\texttt{
\# lsof -i 4\\
\# lsof -i 6\\
}
~\\
~\\
{\small{Note : dans le cas o<> l'on utilise une configuration r<>seau par DHCP, on ne s'<27>tonnera pas de trouver le port 68 ouvert en UDP.}}
\section{Monitoring}
Voyons un exemple simple qui trace des courbes en fonctions du temps de r<>ponse de \texttt{ping}. \\
On installera les programmes snmpd et mrtg.\\
Dans \texttt{/etc/snmp/snmpd.conf}, ajouter cette ligne:\\
\textit{com2sec readonly default public}\\
Attention, bien veillez <20> supprimer cette ligne :\\
\textit{com2sec paranoia default public}\\
~\\
\texttt{/etc/mrtg/ping :}
~\\
\begin{verbatim}
#!/bin/sh
P=`ping -c3 -q google.fr |grep avg|cut -d" " -f4`
MIN=`echo $P|cut -d"/" -f1`
MAX=`echo $P|cut -d"/" -f2`
echo $MAX
echo $MIN
\end{verbatim}
~\\
\textit{\bf mrtg.conf :}
\begin{verbatim}
WorkDir: /var/www/mrtg
Language: French
Target[ping]: `/etc/mrtg/ping`
Options[ping]: nopercent,growright,gauge,noinfo, nobanner
MaxBytes[ping]: 10000
AbsMax[ping]: 10000
YLegend[ping]: Latence
ShortLegend[ping]: ms
Legend1[ping]: Latence max en ms
Legend2[ping]: Latence min en ms
LegendI[ping]: Latence Max:
LegendO[ping]: Latence Min:
Title[ping]: Ping sur Google
PageTop[ping]: <h1>Latence Google.fr</h1>
WithPeak[ping]:wmy
Legend4[ping]: Max de la latence min
Legend3[ping]: Max de la latence max
\end{verbatim}
~\\
Il suffit ensuite de lancer la commande :\\
\texttt{\# mrtg /etc/mrtg.conf}\\
~\\
On la placera dans un cron pour obtenir des courbes de statistiques r<>guli<6C>res.\\
~\\
On pourra cr<63>er des courbes de statistiques en s'appuyant sur les nombreux outils disponibles sous Linux (sysstat, smartmontools, etc.)\\
~\\
Il existe de nombreux programmes <20>volu<6C>s permettant de g<>n<EFBFBD>rer des courbes et statistiques. Citons Nagios\footnote{\url{http://www.nagios.org/}}, Cacti\footnote{\url{http://www.cacti.net/}} et Ntop\footnote{\url{http://www.ntop.org/}}. Le plus connu d'entre eux est certainement Nagios qui permet de surveiller de nombreux services (SMTP, POP3, HTTP, NNTP, PING, etc.) mais <20>galement les ressources (charge processeur, utilisation des disques, etc.). On peut visualiser les r<>sultats, historiques des probl<62>mes, journaux par interface web et obtenir des alertes personnalis<69>es et <20>crire ses propres plugins pour des v<>rifications sp<73>cifiques. La mise en place de Nagios (ou d'un <20>quivalent) pour un nombre de serveurs d<>passant la dizaine est fortement conseill<6C>e.\\
~\\
Pour une surveillance syst<73>me en direct, on peut utiliser GKrellM\footnote{\url{http://www.gkrellm.net/}} en mode client-serveur : chaque serveur fait tourner un serveur gkrellmd et pour surveiller tous les serveurs, on d<>marre les clients sur un poste de travail. On peut <20>galement s<>curiser les transmissions en encapsulant le trafic dans un tunnel SSH.
~\\
\url{http://www.debian.org/doc/manuals/securing-debian-howto/index.fr.html}\\
\url{http://entreelibre.com/scastro/debian-secinst/debian-secinst.txt}\\
2012-05-21 16:07:10 +02:00
\section{Scripts shell}
~\\
2012-05-21 16:07:10 +02:00
~\\
En informatique, on distingue les langages compil<69>s et les langages
interpr<EFBFBD>t<EFBFBD>s. On peut consid<69>rer qu'un "script" est un programme <20>crit dans un
langage interpr<70>t<EFBFBD>. Cela comprendra donc les shells (sh, csh, ksh, tcsh, bash,
pdksh) les outils de manipulation de texte (sed, awk), Perl, Tcl, Ruby et
Python.
~\\
~\\
La plupart de ces langages pourraient m<>riter une formation enti<74>re aussi nous nous concentrons sur quelques fonctionnalit<69>s int<6E>ressantes du shell :\\
~\\
\begin{itemize}
\item[\bf cut]
Utilitaire qui s<>lectionne des sections sur chaque ligne d'un fichier sur la sortie standard.\\
~\\
\texttt{cut -d " " -f 1 fichier}\\
~\\
\item[\bf head]
Utilitaire qui renvoie les premi<6D>res parties d'un fichier sur la sortie standard.\\
\texttt{head -n 7 fichier}\\
\item[\bf tail ]
Utilitaire qui renvoie les derni<6E>res parties d'un fichier sur la sortie standard.\\
\texttt{tail -f fichier}\\
\texttt{tail -n 7 fichier}\\
\item[\bf sort ]
Utilitaire qui trie les lignes d'un fichier sur la sortie standard.\\
\texttt{sort -d fichier}\\
\item[\bf tr]
Utilitaire pour convertir ou supprimer des caract<63>res d'un fichier sur la sortie standard.\\
\texttt{echo -e "plop\textbackslash nplop" | tr -d "\textbackslash n"}\\
\item[\bf wc]
Utilitaire qui renvoie le nombre de lignes, fichiers ou octets d'un fichier.\\
\texttt{wc -l fichier}\\
\item[\bf grep]
Utilitaire renvoyant les lignes correspondant au mod<6F>le indiqu<71>.\\
\texttt{grep -i HtTp /etc/services}\\
\item[\bf seq]
Utilitaire renvoyant une s<>quence de nombres.\\
\texttt{seq 4 3 20}\\
\item[\bf for]
Boucle\\
\texttt{for i in 1 2 5; do echo \$i; done}\\
\texttt{for i in \`ls \*.php\`; do mv \$i \$(\$i\%\%.php).html; done}\\
\end{itemize}
2012-05-21 16:07:10 +02:00
\section{Proc<EFBFBD>dures de sauvegarde}
~\\
La mise en place de proc<6F>dures de sauvegarde n<>cessite souvent un audit pr<70>cis pour <20>valuer le juste milieu entre le niveau de s<>curit<69> et le co<63>t.\\
Prenons quelques exemples concrets.\\
Il est impensable qu'une entreprise, m<>me petite, doive mettre la cl<63> sous la porte en cas de petite castrophe naturelle (temp<6D>te, foudre, incendie).\\
Des sauvegardes dans un endroit physiquement diff<66>rent sont donc
obligatoires. <20> l'inverse, pour une petite entreprise, mettre en place
des sauvegardes sur bande rapatri<72>e dans un coffre-fort toutes les
heures en fourgon blind<6E> sera probablement disproportionn<6E>. Il faut donc
<EFBFBD>valuer chaque risque et le chiffrer. Les param<61>tres <20> prendre en compte sont:\\
~\\
- les risques\\
- le co<63>t de mise en place et le co<63>t r<>gulier\\
- le temps d'administration de la solution\\
- le temps de red<65>ploiement ou de recherche\\
~\\
Il existe principalement deux types de pr<70>ventions:\\
~\\
- Pr<50>vention crash mat<61>riel\\
La solution est <20> choisir parmi la solution RAID, les sauvegardes syst<73>me (disque/bande/p<>riph<70>rique amovible) et sauvegarde des fichiers syst<73>me.\\
~\\
- Pr<50>vention erreurs logicielles ou humaines\\
La solution est de faire des sauvegardes r<>guli<6C>res.\\
~\\
tar est l'outil le plus utilis<69> pour la sauvegarde.\\
~\\
Exemple :\\
\begin{verbatim}
tar -czvps --same-owner --atime-preserve backup.tar.gz /rep/
\end{verbatim}
~\\
\emph{Table des partitions :}\\
~\\
\textit{Sauvegarde} : \texttt{dd if=/dev/hda of=NOM\_FIC bs=512 count=1}\\
~\\
\textit{Restauration} : \texttt{dd if=NOM\_FIC of=/dev/hda bs=1 count=64 skip=446 seek=446}\\
~\\
\textit{Partimage}\footnote{\url{http://www.partimage.org/}} :
~\\
\begin{itemize}
\item[Sauvegarde] : \\
\texttt{partimage -z1 -o -d save /dev/hda12 /mnt/backup/sav.partimg.gz}\\
\item[Restauration] :\\
\texttt{partimage restore /dev/hda12 /mnt/backup/sav.partimg.gz}\\
\end{itemize}
~\\
L'outil rsync\footnote{\url{http://samba.anu.edu.au/rsync/}} est tr<74>s puissant car il permet de mettre <20> jour en local ou <20> distance uniquement les fichiers modifi<66>s.\\
~\\
client rsync <-> serveur rsynd\\
~\\
\begin{verbatim}
22/tcp open ssh
873/tcp open rsync
\end{verbatim}
~\\
Options int<6E>ressantes :\\
\begin{verbatim}
-v, --verbose
\end{verbatim}
-> plus verbeux
\begin{verbatim}
-a, --archive
\end{verbatim}
-> mode archive (equivalent to -rlptgoD), ne pr<70>serve pas les liens hard
\begin{verbatim}
-r, --recursive
\end{verbatim}
-> visite r<>cursive des r<>pertoires
\begin{verbatim}
-l, --links
\end{verbatim}
-> copie les liens symboliques comme liens symboliques
\begin{verbatim}
-p, --perms
\end{verbatim}
-> pr<70>serve les permissions
\begin{verbatim}
-o, --owner
\end{verbatim}
-> pr<70>serve le propri<72>taire (root uniquement)
\begin{verbatim}
-g, --group
\end{verbatim}
-> pr<70>serve le groupe
\begin{verbatim}
-t, --times
\end{verbatim}
-> pr<70>serve les dates
\begin{verbatim}
-S, --sparse
\end{verbatim}
-> traite les fichiers <20> trous efficacement
\begin{verbatim}
-C, --cvs-exclude
\end{verbatim}
-> ignore automatiquement des fichiers, comme le ferait CVS
\begin{verbatim}
--delete
\end{verbatim}
-> efface les fichiers qui n'existent pas du cot<6F> exp<78>dition
\begin{verbatim}
--partial
\end{verbatim}
-> conserve les fichiers partiellement transf<73>r<EFBFBD>s
\begin{verbatim}
--progress
\end{verbatim}
-> affiche la progression
\begin{verbatim}
-z, --compress
\end{verbatim}
-> compresse les donn<6E>es
\begin{verbatim}
-e ssh
\end{verbatim}
-> utilise ssh
\begin{verbatim}
-D, --devices
\end{verbatim}
-> pr<70>serve les devices
~\\
L'astuce supr<70>me consiste <20> utiliser des "liens hards" gr<67>ce <20> la commande \texttt{cp -al}\\
Un fichier est donc supprim<69> lorsqu'aucun lien mat<61>riel ne pointe vers lui :\\
~\\
\begin{verbatim}
mv backup.1 backup.2
cp -al backup.0 backup.1
rsync -e -a --delete source backup.0/
\end{verbatim}