=============================================================================== Installation et securisation d'une station Debian 3.0 stable - v0.2.2 Simon Castro - Aout 2004 http://www.entreelibre.com/scastro/debian-secinst/ =============================================================================== Copyright (c) 2003,2004 Simon Castro, scastro [ at ] entreelibre.com. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. You must have received a copy of the license with this document and it should be present in the fdl.txt file. If you did not receive this file or if you don't think this fdl.txt license is correct, have a look on the official http://www.fsf.org/licenses/fdl.txt licence file. =============================================================================== Ce document presente l'installation et la securisation d'une station GNU Linux Debian 3.0 stable. Vous pouvez vous en servir comme aide-memoire, comme "guide" pour redaction d'une procedure, comme d'un exemple de que vous pourriez faire ou que vous ne feriez pas, etc... Notez que les versions systeme/outils/etc employees lors de la redaction de ce document importent peu en regard de la mentalite (qui a dit paranoiaque ?) sous-jacente qu'il convient de conserver. Tout ce qui est inscrit dans le document a ete teste. Je fais les manipulations et consigne les commandes dans le document quand le resultat me convient. Cependant, je vous rappelle que j'ai teste tout ceci sur mes stations et que, vous en ayant informe, je ne saurais etre tenu pour responsable de ce qui pourrait vous arriver si vous rencontriez des problemes. Ce document est decoupe en plusieurs parties. Les cinq premieres, numerotees de 1 a 5 et composees de plusieurs etapes, concernent l'installation et la securisation plus ou moins fine de la station : * La premiere partie commence au moment ou vous bootez sur le CD d'installation jusqu'au premier reboot. Rien de bien difficile. * La seconde partie commence apres le premier reboot jusqu'au moment ou le systeme vous propose le prompt. Toujours rien de bien complique. * La troisieme partie vous permet de proceder a la configuration initiale du systeme, a sa securisation minimale et a sa mise a jour. Vous obtenez en resultat une station stable avec le minimum de services actives et le firewall Ipchains active. * La quatrieme partie aborde une serie de procedures a suivre pour obtenir une securisation "moderee" de la station. Vous pouvez choisir d'ignorer des etapes. * La cinquieme partie presente diverses actions que vous pouvez suivre pour obtenir une securisation "approfondie" de la station. Libre a vous de vous y interesser ou non. Les parties finales du document numerotees "romaines" presentent des aide-memoire ou des procedures a suivre pour ajouter des elements sur la station. Quand des ajouts d'elements sont presentes, ils ont toujours ete effectues sur une station installee suivant les etapes decrites dans les parties 1 a 5. N'hesitez pas a me faire part de vos commentaires et/ou idees, surtout si : vous n'avez rien compris a ce que j'ai ecris :) ou si vous avez suivi une procedure qui n'a pas donne le resultat escompte. ================================================================================ REMERCIEMENTS ============= o Cedric B. pour ses remarques. o Damien Degorre pour son travail de mise en page qui m'a enfin decide a imprimer (oui oui, j'imprime encore ;>) ce document sur papier. Vous pouvez consultez sa version sur : http://www.u-admin.org/misc/secu-deb/ o Pierre C. de la redaction de developpez.com pour sa mise en page HTML et son offre de publication sur : http://linux.developpez.com/cours/securedeb/ o David pour toutes ses questions et pour avoir saute comme ca a pieds joints (en fermant les yeux ?) dans le monde GNU/Linux et principalement dans cette distrib... ================================================================================ CHANGEMENTS =========== v0.2.2 (22/08/2004) : --------------------- Un nombre consequent de modifications et de corrections a ete pris en compte pour cette version - je vous laisse consulter le sommaire et les annexes pour en avoir un apercu. Les commentaires de plusieurs lecteurs et un emploi frequent des procedures decrites ont permis, je l'espere, de corriger les fotes et de preciser certains points. Certaines questions m'ont egalement ammene a ajouter quelques commandes qu'il est ardu de garder en memoire sans employer le man... ================================================================================ REMERCIEMENTS CHANGEMENTS SOMMAIRE ======== 1. INSTALLATION DU SYSTEME 1.1. Booter sur le CD 1.2. Menu d'installation 1.3. Choisir la langue 'Francais (fr)' puis 'Francais (France)' 1.4. Configurer le clavier avec le mode 'azerty/fr latin1' 1.5. 'Partitionnez le disque dur' 1.6. 'Initialisez une partition d'echange' 1.7. 'Initialisez les partitions Linux' crees en 1.5. 1.8. 'Installez le noyau et les modules' 1.9. 'Configurez les modules et pilotes materiel' 1.10. 'Configurez le reseau' 1.11. 'Installez le systeme de base' 1.12. 'Rendez le systeme amorcable' 1.13. 'Creez une disquette d'amorcage' 1.14. Retirez la disquette et le CDROM et 'reamorcez le systeme' 2. CONFIGURATION INITIALE DU SYSTEME 2.1. GMT : Oui 2.2. Mots de passe 2.3. Creez un premier utilisateur 2.4. 'Retirer le package PCMCIA' => Oui, si vous ne l'avez pas deja supprime 2.5. 'Connexion PPP pour installer le systeme' => Non 2.6. 'Configuration APT' 2.7. 'Utiliser TaskSel' => Non 2.8. 'Utiliser Dselect' => Non 2.9. Si vous avez supprime le package PCMCIA en 2.4., repondez 'Oui' quand on vous demande de le retirer du systeme 2.10. 'Supprimer les .deb' => Oui 2.11. 'Configuration des Mails' 3. PREMIER ACCES AU SYSTEME ET SECURISATION MINIMALE 3.1. Logguez vous sous votre utilisateur puis en root 3.2. Lancez Dselect 3.3. Script de securisation minimale 3.4. Recompilation du noyau pour le support firewall ipchains 3.5. Configuration du firewall Ipchains 3.6. Mise a jour securite du systeme (super-utilisateur) 4. SECURISATION MODEREE 4.1. Notes sur le boot du systeme et sur le noyau 4.2. Securisation du systeme de fichiers 4.3. Securisation des comptes 4.4. Les administrateurs n'ont pas besoin de passer root 4.5. Synchronisation horaire avec un serveur NTP 4.6. Generation automatisee d'un rapport systeme 4.7. Installation et premiers pas avec Modular-Syslog 4.8. Verification des empreintes des packages a installer 4.9. Systeme de fichiers ext3 avec un noyau 2.4 : de ext2 a ext3 4.10. Backup du systeme sur une partition specifique 4.11. Preparation d'une restauration du systeme en cas d'incident 5. SECURISATION APPROFONDIE 5.1. Installation du patch OpenWall 5.2. Installation du wrapper libsafe 5.3. Conserver une empreinte de verification d'integrite du systeme 5.4. Gestion des quotas 5.5. Securisation PAM : Gestion des limites 5.6. Disquette de secours avec Tomsrtbt 5.7. Installation de Prelude-Lml pour une remontee de log securisee vers un serveur centralise 5.8. Securisation approfondie avec GrSecurity I. INFORMATIONS SUR LA GESTION DE PACKAGES DEBIAN I.a. Creation d'un package Debian II. COMPILATION DU NOYAU II.a. Compilation d'un noyau personnalise II.b. Installation du noyau III. ADMINISTRATION : QUELQUES CONSEILS III.a. J'ai oublie de preparer une partition ... III.b. Dselect ne parvient pas a configurer les packages a cause des permissions de /tmp III.c. SmartHost Exim III.d. Client Samba III.e. Graver CD et DVD III.f. Accents dans le shell IV. INSTALLATION ET SECURISATION D'UN SERVEUR APACHE MODSSL IV.a. Installation IV.b. Configuration initiale IV.c. Integration des quotas IV.d. Empreinte du systeme IV.e. Sauvegarde du systeme IV.f. Etapes de configuration supplementaires V. INSTALLATION ET SECURISATION D'UN SERVEUR D'APPLICATION WEBSPHERE V.a. Installation V.b. Configuration initiale : Restauration du 'read-only' sur /usr, deplacement vers /var/was, attribution de permissions restreintes et execution du service WAS sous une identite restreinte V.c. Recommandations V.d. Empreinte du systeme V.e. Sauvegarde du systeme VI. INTEGRATION DE NETFILTER / IPTABLES VI.a. Compilation du noyau VI.b. Scripts d'initialisation VII. INSTALLATION D'UN SERVEUR SAMBA POUR UNE GESTION DE BACKUP VII.a. Installation VII.b. Configuration VIII. INSTALLATION D'UN DEMON NAGIOS VIII.a Archives VIII.b Creation des groupes/utilisateurs VIII.c Compilation/Installation de Nagios VIII.d Deplacement des repertoires et attribution de permissions specifiques VIII.e Configuration d'Apache VIII.f Configuration des autorisations d'acces VIII.g Script d'initialisation et administrateurs Nagios VIII.h Et pour finir IX. GRAPHIQUES MRTG POUR LE SERVER-STATUS APACHE IX.a Archives IX.b Configuration X. INSTALLATION D'UN DEMON VSFTPD X.a. Installation X.b. Configuration initiale XI. LINUX-VSERVER + GRSECURITY XI.a Archives et installation du noyau patche XI.b Installation de l'interface linux-vserver utilisateur XI.c Configuration initiale et espace reserve aux serveurs virtuels XI.d Installation du serveur de reference XI.e Installation des serveurs virtuels XI.f Continuons quelque peu XI.g Mise a jour des vservers dedies XI.h Points de securisation supplementaires XI.i Notes finales XI.j Quelques informations sur le script DS_setup_vserver XII. SYSTEME DE COURRIER XII.a Postfix XII.b Popa3d XII.c Pop-before-smtp XII.d Installation dans un vserver dedie XII.e Configuration du systeme XIII. BIND9 WEBOGRAPHIE ANNEXE 1 - Parametrage du firewall Ipchains ANNEXE 2 - Generation automatisee de rapport systeme ANNEXE 3 - syslogd-listfiles.msyslog.patch ANNEXE 4 - Script d'arret/demarrage de prelude-lml ANNEXE 5 - Fichier de regles pour un support Ipchains avec Prelude-lml ANNEXE 6 - Fichier de configuration Apache minimal ANNEXE 7 - Parametrage du firewall NetFilter ANNEXE 8 - Script de backup ANNEXE 9 - Script de restauration ANNEXE 10 - Exemple de script Fdisk ANNEXE 11 - Parametres de configuration d'un noyau GrSecurity ANNEXE 12 - Configuration Sysctl de GrSecurity ANNEXE 13 - ACLs GrSecurity pour Debian-secinst ANNEXE 14 - Script d'initialisation Nagios ANNEXE 15 - debian-secinst.sh ANNEXE 16 - Parametrage noyau GrSecurity 2.0 ANNEXE 17 - Configuration Sysctl GrSecurity 2.0 pour Linux-Vserver ANNEXE 18 - Patch debian-newvserver.sh ANNEXE 19 - DS_setup_vserver.sh ANNEXE 20 - Patchs httpd.conf pour DS_setup_vserver.sh ANNEXE 21 - Patch responsefile pour Websphere ANNEXE 22 - Patch pop-before-smtp-1.35 modifie pour popa3d-0.6.4.1.tar.gz ANNEXE 23 - Exemple de configuration Bind9 ANNEXE 24 - Fichiers de configuration Postfix VERSIONS ================================================================================ 1. INSTALLATION DU SYSTEME ========================== NDR : * Si le systeme est 'critique' ou l'environnement 'dangereux' et que l'adressage est statique, ne branchez pas la station sur le reseau. * Si l'adressage est dynamique 'DHCP' et que vous etes dans le cas precedent, branchez la station pour l'etape 1.10. uniquement. * Si vous effectuez une installation par VmWare (tm) (ou tout autre outil du meme genre), je suppose que vous devez avoir confiance dans votre systeme hote. Faites cependant attention a ce que votre systeme cible ne soit pas up sur le reseau avant d'etre securise un minimum ? * Comme me l'a recommande un lecteur, il convient bien entendu de *toujours* verifier la signature des ISO que vous telechargez avant de les employer. 1.1. Booter sur le CD. 1.2. Menu d'installation : Si le disque dur ou des peripheriques sont SCSI => entrer compact puis 'enter' Sinon, => entrer 'enter' 1.3. Choisir la langue 'Francais (fr)' puis 'Francais (France)'. 1.4. Configurer le clavier avec le mode 'azerty/fr latin1'. 1.5. 'Partitionnez le disque dur' * Effacez toutes les partitions presentes. * Creez les partitions suivantes : => Les lignes suivantes sont baties sur le modele primaire/logique - nom de la partition - taille (Mo) - montage Partitionnement du disque : Primaire - /sda1 - 100 - / Primaire - /sda2 - 300 - Swap (pas de point de montage) Primaire - /sda3 - 20 - /boot Logique - /sda5 - 50 - /root Logique - /sda6 - 120 - /var Logique - /sda7 - 50 - /var/log Logique - /sda8 - 200 - /tmp Logique - /sda9 - 2000 - /usr Logique - /sda10 - 500 - /home Logique - /sda11 - ? - /local -> La premiere partition doit etre marquee comme bootable. -> Toutes les partitions doivent etre de type 'Linux' sauf la deuxieme partition qui doit etre de type 'Linux Swap'. -> La derniere partition est d'une taille relative a l'espace disque restant apres creation des partitions principales. Note sur le partitionnement relatif a l'installation d'un serveur Web : [...] Logique - /sda10 - 500 - /home Logique - /sda11 - 300 - /var/www Logique - /sda12 - ? - /local -> La taille 300M est arbitraire, prevoyez une allocation relative a VOTRE installation. N'oubliez pas de consulter 'IV. INSTALLATION ET SECURISATION D'UN SERVEUR APACHE MODSSL' Note sur le partitionnement relatif a l'installation d'un serveur IBM Websphere : [...] Logique - /sda10 - 500 - /home Logique - /sda11 - 300 - /var/www Logique - /sda12 - 200 - /var/was Logique - /sda13 - ? - /local -> La taille 200M est arbitraire, prevoyez une allocation relative a VOTRE installation. N'oubliez pas de consulter 'V. INSTALLATION ET SECURISATION D'UN SERVEUR D'APPLICATION WEBSPHERE' Note sur le partitionnement relatif a la creation d'une partition de backup : [...] Logique - /sda10 - 500 - /home Logique - /sda11 - 300 - /var/www Logique - /sda12 - 200 - /var/was Logique - /sda13 - 1000 - /backup Logique - /sda14 - ? - /local -> La taille 1000M est arbitraire, prevoyez une allocation relative a VOTRE installation. Personnellement, 500 Mo pour une sauvegarde full mensuelle + les sauvegardes incrementales journalieres me conviennent en faisant du menage tous les mois, mais je prefere voir large. N'oubliez pas de consulter 'VII. INSTALLATION D'UN SERVEUR SAMBA POUR UNE GESTION DE BACKUP' => Terminer en ecrivant les partitions sur le disque 'Write' puis en sortant du menu 'Quit'. Commentaires : Selon l'utilisation finale du serveur, il est parfois utile de creer des partitions supplementaires. Une partition /usr/src si vous testez plusieurs noyaux, une partition /var/cache/apt si vous conservez les packages sur un serveur centralise, diverses partitions /var/wwwX dans le cas de plusieurs serveurs Web. 1.6. 'Initialisez une partition d'echange' => Pour se faire, acceptez de l'initialiser sur /dev/sda2 et recherchez les blocs defectueux. 1.7. 'Initialisez les partitions Linux' crees en 1.5. => 'Suivant' pour la premiere, 'Autre choix' pour les suivantes. => Recherchez les blocs defectueux pour chacune des partitions => Entrez les points de montage precises dans 1.5. 1.8. 'Installez le noyau et les modules' => 'CDROM Debian trouve ?', repondez 'Oui'. 1.9. 'Configurez les modules et pilotes materiel' => Choisissez des pilotes a ajouter au systeme. => NDR : pour Compaq, le pilote reseau peut etre 'net' -> 'tlan' et vous pouvez l'ajouter dans le noyau. 1.10. 'Configurez le reseau' => Choisissez DHCP ou Adressage statique. 1.11. 'Installez le systeme de base' => Utilisez le 'media' : 'CDROM'. => Utilisez le 'repertoire pour systeme de base' : 'instmnt'. 1.12. 'Rendez le systeme amorcable' => Installez dans le mbr. 1.13. 'Creez une disquette d'amorcage' => Ceci est optionnel. 1.14. Retirez la disquette et le CDROM et 'reamorcez le systeme'. ================================================================================ 2. CONFIGURATION INITIALE DU SYSTEME ==================================== NDR : Cette partie est relative a la configuration suivant le reboot de 1. 2.1. GMT : Oui. => Choisir 'Europe' puis 'Paris'. 2.2. Mots de passe : => 'Activation mots de passe MD5' : Oui => 'Activation mode shadow' : Oui => Entrez le mot de passe pour root 2.3. Creez un premier utilisateur. => Cet utilisateur sera par la suite utilise comme administrateur du systeme. 2.4. 'Retirer le package PCMCIA' => Oui, si vous ne l'avez pas deja supprime. 2.5. 'Connexion PPP pour installer le systeme' => Non 2.6. 'Configuration APT' => 'Cdrom' => Entrez le premier CD d'installation et validez '/dev/cdrom' => 'Scan another CD' : Oui pour tous les CD du set que vous possedez. => 'Ajouter une autre source APT' : Non => 'Use security update' : Non 2.7. 'Utiliser TaskSel' => Non 2.8. 'Utiliser Dselect' => Non 2.9. Si vous avez supprime le package PCMCIA en 2.4., repondez 'Oui' quand on vous demande de le retirer du systeme. 2.10. 'Supprimer les .deb' => Oui 2.11. 'Configuration des Mails' => '4. Local delivery only' => Entrez le nom de l'administrateur configure en 2.3. et confirmez. Le systeme doit maintenant vous donner un prompt. ================================================================================ 3. PREMIER ACCES AU SYSTEME ET SECURISATION MINIMALE ==================================================== Vous venez de finir la configuration initiale du systeme et votre station n'est normalement pas encore connectee au reseau. 3.1. Logguez vous sous votre utilisateur puis en root. => i.e. : connectez vous avec votre utilisateur en mode console, puis entrez la commande 'su -' pour obtenir l'identite super-utilisateur. 3.2. Lancez Dselect * 'Update' * 'Select' et selectionnez les packages que vous desirez a partir du CDROM (vim, gpm, emacs, etc...) * 'Install' NDR : Meme si vous ne selectionnez rien, passez quand meme par les etapes 'Update' et 'Install'. Ceci vous permettra d'avoir un systeme un peu plus "fourni" que le systeme minimal. NDR : Il est conseille de ne pas faire plusieurs choses a la fois : Installation minimale, puis installation des packages absolument necessaires, puis installation du serveur X par exemple. NDR : Il est FORTEMMENT conseille de n'installer que le STRICT necessaire. Finissez en lancant les commandes updatedb et mandb Man : dselect, apt, updatedb et mandb. 3.3. Script de securisation minimale Le script present en ANNEXE 15 - Script debian-secinst.sh (dont les fonctions sont succinctement commentees par la suite) est charge de cette securisation minimale. Placez ce script sur votre systeme via un support amovible ou executez chacune des etapes avec l'utilisateur root (un sftp est également envisageable). !!! N'oubliez pas de mettre a jour la configuration du script !!! Fichiers de configuration de l'environnement administrateur J'appelle environnement administrateur, l'environnement des utilisateurs qui auront la possibilite d'administrer la station. La fonction skel_env() est chargee de mettre en place les fichiers de configuration qui seront utilises lors de la creation d'un utilisateur. La fonction admin_env() est chargee de configurer l'environnement de l'utilisateur que vous avez cree en 2.3. Fichiers de configuration de l'environnement super-utilisateur La fonction root_env() est chargee du meme type de configuration que precedemment et prepare une arborescence /home/system. Securisation minimale La fonction sec_min() est chargee d'un certain nombre de taches : arret d'un certain nombre de services, mise a jour de la configuration syslog, ajout d'une banniere de login presentant les restrictions d'acces, etc... NDR : La restriction d'acces realisee sur le fichier /etc/securetty supprimera toute possibilite de connexion via l'utilisateur 'root' en mode console. Vous devrez par la suite vous connecter avec un utilisateur puis utiliser la commande 'su -'. La meme restriction sera effective des que vous aurez active (c'est a dire redemarre le serveur) 'PermitRootLogin no' dans le fichier /etc/ssh/sshd_config. Pensez a noter le fingerprint de votre demon SSH. Modifiez /etc/lilo.conf de facon a obtenir ces lignes : password=motdepasse delay=100 default=Linux image=/vmlinuz label=Linux read-only restricted Donnez les droits convenables au fichier 'chmod 640 /etc/lilo.conf' puis activez votre nouveau fichier de configuration avec 'lilo'. 3.4. Recompilation du noyau pour le support firewall ipchains NDR : Le noyau que nous configurons ici ne doit pas etre considere comme le noyau final. Une documentation abondante est presente sur Internet de meme que dans le repertoire Documentation figurant dans les sources du noyau. NOTE : Si vous utilisez le package de la version 2.2.20 comme presentee dans cette documentation, prenez garde a ne pas activer la fonctionnalite 'kernel loader' pour eviter la faille 'ptrace' ou pensez a patcher, securiser votre systeme. Lancez dselect et ajoutez le package relatif aux sources du noyau que vous desirez installer. L'installation suivante, relative au noyau 2.2.20 devrait cependant etre identique quelque soit le noyau 2.2.x dont vous installez les sources. cd /usr/src tar xjvf kernel-source-2.2.20.tar.bz2 mv kernel-source-2.2.20 kernel-source-2.2.20-fw ln -s kernel-source-2.2.20-fw linux && cd linux Au cas ou vous ne suivriez pas cette doc... : make clean && make mrproper Configurez le noyau : sed 's/^EXTRAVERSION\ =$/EXTRAVERSION\ =\ -fw/' Makefile > .fw cat .fw > Makefile && rm -f .fw make menuconfig Ajoutez les options suivantes au noyau installe : 'Networking Options -> Network firewalls' 'Networking Options -> Ip : Firewalling (NEW)' Dans 'Network Device Support', verifiez que votre pilote de carte reseau est selectionne. Quittez et sauvez la configuration Compilez le noyau : make dep && make modules && make bzImage Installez le nouveau noyau : cp arch/i386/boot/bzImage /boot/vmlinuz-2.2.20-fw cp System.map /boot/System.map-2.2.20-fw cd /boot/ ln -s vmlinuz-2.2.20-fw linux ln -s vmlinuz-2.2.20-compact linux_fst Installez les modules : cd /usr/src/linux && make modules_install Editer le fichier /etc/lilo.conf pour obtenir : default=linux22 image=/boot/linux label=linux22 read-only restricted image=/boot/linux_fst label=backup22 read-only Lancez la commande 'lilo' pour mettre ajour le systeme. Rebootez le systeme. Si tout c'est bien passe, sauvegardez la configuration : cp /usr/src/linux/.config /boot/config-2.2.20-fw 3.5. Configuration du firewall Ipchains Man : ipchains, sysctl, sysctl.conf Creez le repertoire pour le stockage des scripts du firewall : mkdir -p /home/system/scripts/fw chown -R root:adm /home/system chmod 4750 /home/system Creez les scripts d'activation/desactivation du firewall (voir ANNEXE 1 - Parametrage du firewall Ipchains) : /home/system/scripts/fw/rules_down_ipchains.sh /home/system/scripts/fw/rules_up_ipchains.sh Mettez les droits en place : 'chmod 750 /home/system/scripts/fw/*' Creez le script /etc/init.d/init_ipchains.sh (voir ANNEXE 1 - Parametrage du firewall Ipchains). Donnez les droits au script : 'chmod 750 /etc/init.d/init_ipchains.sh' Ajoutez le script pour le demarrage du system : update-rc.d init_ipchains.sh defaults Activez le firewall : /etc/init.d/init_ipchains.sh start 3.6. Mise a jour securite du systeme (super-utilisateur). Vous pouvez maintenant brancher la machine sur le reseau. Ajoutez le fichier /etc/apt/apt.conf contenant : DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt || true";}; Acquire::http::Proxy "http://@IP_PROXY:8080/"; Commentez toutes les lignes dans /etc/apt/sources.list Ajoutez dans /etc/apt/sources.list : #deb http://http.us.debian.org/debian stable main contrib non-free #deb-src http://http.us.debian.org/debian stable main contrib non-free #deb http://non-us.debian.org/debian-non-US stable/non-US main non-free #deb-src http://non-us.debian.org/debian-non-US stable/non-US main non-free deb http://ftp.fr.debian.org/debian/ stable main contrib non-free deb-src http://ftp.fr.debian.org/debian/ stable main contrib non-free deb http://ftp.fr.debian.org/debian-non-US/ stable/non-US main non-free deb-src http://ftp.fr.debian.org/debian-non-US/ stable/non-US main non-free deb http://security.debian.org/ stable/updates main contrib non-free apt-get update apt-get dist-upgrade ================================================================================ 4. SECURISATION MODEREE ======================= 4.1. Notes sur le boot du systeme et sur le noyau ------------------------------------------------- NDR : Il est futile d'indiquer qu'un individu avec un acces physique au serveur implique que le serveur est compromis. Un seul noyau doit etre chargeable lors de l'invite par defaut. Tout passage de parametre au noyau lors du boot doit etre interdit. Le chargement dynamique de modules devrait etre interdit. => Dans le cas ou cela est impossible, appliquez un patch permettant de bloquer le chargement des modules apres le boot. Il peut egalement etre interessant de modifier la sequence d'amorcage du BIOS de facon a debuter par le chargement du MBR du disque dur. 4.2. Securisation du systeme de fichiers ---------------------------------------- ATTENTION - ATTENTION - ATTENTION : Pour ces modifications, je vous reccomande d'avoir un disque bootable (le CD d'installation Debian fait bien sur l'affaire) avec un systeme de fichier root sous la main - Systeme de fichier contenant les binaires appropries bien entendu. NDR : Apres ces modifications, n'oubliez pas que certaines partitions sont montees en lecture seule. Vous pouvez remonter une partition en lecture/ ecriture avec (par exemple) : mount -o remount,rw /local Editez le fichier /etc/fstab de facon a monter les partitions presentees en 1.5 selon le principe suivante : /dev/sda1 / ext2 errors=remount-ro 0 1 /dev/sda2 none swap sw 0 0 proc /proc proc defaults 0 0 /dev/fd0 /floppy auto noauto,nosuid,nodev 0 0 /dev/cdrom /cdrom iso9660 ro,noauto,nosuid,nodev 0 0 /dev/sda3 /boot ext2 ro,noexec,nosuid,nodev 0 2 /dev/sda5 /root ext2 defaults 0 2 /dev/sda6 /var ext2 nodev 0 2 /dev/sda7 /var/log ext2 noexec,nosuid,nodev,sync 0 2 /dev/sda8 /tmp ext2 noexec,nosuid,nodev 0 2 /dev/sda9 /usr ext2 ro,nodev 0 2 /dev/sda10 /home ext2 nodev 0 2 /dev/sda11 /local ext2 ro,noexec,nosuid,nodev 0 2 Si vous avez procede a la preparation d'une partition pour un serveur web : /dev/sda11 /var/www ext2 rw,nosuid,nodev 0 2 /dev/sda12 /local ext2 ro,noexec,nosuid,nodev 0 2 Si vous avez procede a la preparation d'une partition pour un serveur was : /dev/sda11 /var/www ext2 rw,nosuid,nodev 0 2 /dev/sda12 /var/was ext2 rw,noexec,nosuid,nodev 0 2 /dev/sda13 /local ext2 ro,noexec,nosuid,nodev 0 2 Pour prendre en compte ces modifications, rebootez le systeme ou remontez les partitions. Man : fstab, mount. 4.3. Securisation des comptes ----------------------------- La securisation des comptes est realisee par la fonction sec_accounts() du script de l'annexe 15 - Script debian-secinst.sh. Cette fonction est chargee de supprimer/desactiver les utilisateurs et groupes inutiles, de recuperer sous l'identite root les fichiers non affectes et de mettre en place une politique succincte de gestion de comptes. Notez que tous les comptes utilisateurs doivent faire partie de groupes appropries. Nous nous basons dans ce documents sur deux groupes existant, mais cette declinaison est arbitraire. Le groupe adm est reserve aux administateurs (voir 4.4. Les administrateurs n'ont pas besoin de passer root) et le groupe users est reserve aux utilisateurs non administrateurs. 4.4. Les administrateurs n'ont pas besoin de passer root -------------------------------------------------------- Installation de sudo : mount -o remount,rw /usr/ dselect => Installez le package sudo mount -o remount,ro /usr/ Ajoutez les utilisateurs ADMINISTRATEURS requis {UserName} dans le groupe adm: usermod -g {UserName} -G adm,users {UserName} Configuration de sudo : Lancez visudo et editez le fichier de facon a ajouter (raccourcis vi) : # Cmnd alias specification Cmnd_Alias REBOOT=/sbin/reboot %adm ALL=NOPASSWD:REBOOT MAN : usermod, sudoers visudo, sudo 4.5. Synchronisation horaire avec un serveur NTP ------------------------------------------------ Installez les packages requis. mount -o remount,rw /usr dselect et installation des packages ntp, ntpdate, ntp-simple et ntp-doc : * Ne pas specifier de serveur NTP * Overwrite ntp.conf : Yes. mount -o remount,ro /usr Configurez le client ntp et le nouveau flux au niveau du firewall : Ajoutez l'adresse IP de votre serveur NTP dans /etc/default/ntp-servers Ajoutez l'adresse IP de votre serveur dans le fichier de configuration du firewall. /etc/init.d/init_ipchains.sh restart Stoppez le demon NTP et executez la synchronisation /etc/init.d/ntp stop update-rc.d -f ntp remove /etc/init.d/ntpdate start Ajoutez un appel au client ntp toutes les 6 heures dans /etc/crontab : # Met a jour la date et l'heure du systeme grace au serveur NTP 0 */6 * * * root /etc/init.d/ntpdate start > /dev/null MAN : ntpdate 4.6. Generation automatisee d'un rapport systeme ------------------------------------------------ Le script present en annexe 'ANNEXE 2 - Generation automatisee de rapport systeme' peut etre execute par la crontab a intervalles periodique. Il genere un rapport systeme succinct qui peut etre envoye par mail aux administrateurs ou stocke dans un repertoire. NDR : Attention a respecter l'indentation ! NDR : Je vous conseille de verifier le script de facon a ce qu'il n'execute que les commandes que vous desirez. Ainsi, le script recupere par exemple les fichiers de logs presentes en '4.8. Installation et premiers pas avec Modular-Syslog'. Installation du script (nous utilisons le script present en annexe qui envoie le rapport par mail) : mkdir /home/system/scripts/reports/ chmod 750 /home/system/scripts/reports/system_report.sh Configuration de /etc/crontab pour lancer le script tous les jours a 09H00 AM: # Genere le rapport system 0 9 * * * root /home/system/scripts/reports/system_report.sh chmod 640 /etc/crontab 4.7. Installation et premiers pas avec Modular-Syslog ----------------------------------------------------- Modular-Syslog est disponible a : http://sourceforge.net/projects/msyslog/ Compilation : cd /home/system/applis /usr/bin/md5sum /home/system/download/msyslog-v1_08e-src_tar.gz c3700571c675d8896c643c276f5e2dad /home/system/download/msyslog-v1_08e\ -src_tar.gz tar zxvf /home/system/download/msyslog-v1_08e-src_tar.gz find ./msyslog-v1.08e/ -type f \( -perm -004000 -o -perm -002000 \) -exec \ ls -la {} \; chown -R root:root msyslog-v1.08e/ cd msyslog-v1.08e/ ./configure make NDR : Vous pouvez tres bien decider, si vous en comprennez l'interet de modifier le chemin du fichier de configuration par defaut avant de compiler le demon modular-syslog. Installation : mount -o remount,rw /usr/ make install On sauvegarde l'ancien syslogd et son fichier de configuration : cp /etc/syslog.conf /etc/syslog.conf.orig2 cp /sbin/syslogd /sbin/syslogd.orig On remplace l'ancien syslogd par le notre : mv /usr/local/sbin/syslogd /sbin/syslogd chown root:root /sbin/syslogd && chmod 755 /sbin/syslogd On met a jour quelques permissions meritant de l'etre : cd /usr/share/man/man8 find . -type f -perm 640 -exec chmod 644 {} \; mount -o remount,ro /usr/ On modifie le script d'initialisation du demon /etc/init.d/sysklogd : SYSLOGD="-i linux -i unix" On stoppe le demon klogd dont nous nous passerons desormais : /etc/init.d/klogd stop On le supprime des runlevels correspondants : update-rc.d -f klogd remove On redemmare le nouveau demon syslogd : /etc/init.d/sysklogd start Correction du script syslogd-listfiles : Ce script permet de lister les fichiers de logs pour permettre leur rotation. Il se sert pour cela du fichier de configuration /etc/syslog.conf. Or, ce fichier de configuration peut desormais contenir des lignes au format modular-syslog, ce qui empeche une rotation correcte. Le patch est disponible en 'ANNEXE 3 - syslogd-listfiles.msyslog.patch' mount -o remount,rw /usr/ cp /usr/sbin/syslogd-listfiles /usr/sbin/syslogd-listfiles.orig cd /usr/sbin patch -l -p0 < /root/tmp/syslogd-listfiles.msyslog.patch mount -o remount,ro /usr/ MAN : syslogd, syslog.conf, im_* , om_* , syslogd-listfiles Premiers pas avec Modular-Syslog : NDR : Si vous ajoutez des fichiers de log dans la configuration, prenez garde a faire un touch du fichier destination dans le repertoire concerne. Nous ajoutons deux regles qui permettent de filtrer les messages envoyes par le firewall ipchains a /etc/syslog.conf ainsi que deux regles permettant : l'enregistrement des evenements lies aux demande de connexion et les evenements libsafe. # # Filtres Modular-Syslog # # Filtres sur les evenements du firewall kern.* %regex -m "Packet log.*LogDrop" %classic \ /var/log/fw_deny.log kern.* %regex -m "Packet log.*LogAcc" %classic \ /var/log/fw_accept.log # Filtres sur divers evenements securite auth,authpriv.* %regex -m "(sshd.*password)|(PAM.*ssh)|(PAM.*su)\ |(PAM.*failure)" %classic /var/log/securite.log auth,authpriv.* %regex -m "libsafe.so" %classic /var/log/securite.log auth.* %regex -m "not receive identification" %classic\ /var/log/securite.log kern.* %regex -m "Security" %classic /var/log/securite.log kern.* %regex -m "device.*promiscuous" %classic\ /var/log/securite.log Nous mettons en place les fichiers destination et redemarrons le serveur syslog : touch /var/log/{securite,fw_{deny,accept}}.log chown root:adm /var/log/{securite,fw_{deny,accept}}.log Et si votre umask n'est pas conforme a celui de cette doc : chmod 640 /var/log/{securite,fw_{deny,accept}}.log /etc/init.d/sysklogd restart Prise en compte des nouveaux fichiers pour la rotation des logs : Nous creons (s'il n'existe pas) un repertoire qui nous servira a stocker nos scripts appelles par la crontab et dont l'objectif est d'assurer la stabilite du systeme : mkdir /home/system/scripts/crond Nous editons un fichier /home/system/scripts/crond/sysklogd (a l'image de celui present dans /etc/cron.daily) : #! /bin/sh test -x /usr/sbin/syslogd-listfiles || exit 0 test -x /sbin/syslogd || exit 0 test -d /usr/share/doc/sysklogd || exit 0 set -e cd /var/log for SECU in `syslogd-listfiles -a | grep -E "fw|secu"` do if [ -s $SECU ] ; then savelog -g adm -m 640 -u root -c 7 $SECU > /dev/null fi done /etc/init.d/sysklogd reload-or-restart chmod 750 /home/system/scripts/crond/sysklogd Nous editons /etc/crontab pour ajouter ce script : # Tourne les logs securite chaque jour 5 0 * * * root /home/system/scripts/crond/sysklogd 4.8. Verification des empreintes des packages a installer --------------------------------------------------------- Consultez d'abord : 'I. INFORMATIONS SUR LA GESTION DE PACKAGES DEBIAN - Mise a jour du systeme avec apt' [ A completer ] mount -o remount,rw /usr dselect => installation de 'debsums' mount -o remount,ro /usr mkdir /home/system/debsums cd /home/system/debsums Obtenez la liste des packages ne possedant pas de signature : /usr/bin/debsums -l > nosig.txt NDR : Si vous voulez verifier les empreintes des fichiers d'un package : debsums -s package_name. MAN : debsums 4.9. Systeme de fichiers ext3 avec un noyau 2.4 : de ext2 a ext3 ----------------------------------------------------------------- Pour modifier le systeme de fichier d'une partition de facon a passer de ext2 a ext3, sans perte de donnees et sans reboot (si votre noyau est deja compile avec ce support bien sur), vous pouvez suivre la procedure suivante. Commencons par recompiler le noyau en ajoutant le support ext3 : * Ajoutez 'File systems -> Ext3 journalling file system support'. * Recompilez et installez le nouveau noyau. * Modifiez /etc/lilo.conf * Rebootez. Apres le reboot, n'oubliez pas de mettre a jour la configuration lilo et de sauvegarder la configuration du noyau. Prenons comme exemple la partition /backup du type (precise dans /etc/fstab) suivant : /dev/hda13 /backup ext2 ro,noexec,nosuid,nodev,sync 0 2 La procedure a suivre est la suivante : umount /dev/hda13 tune2fs -j /dev/hda13 Editez /etc/fstab pour remplacer l'ancienne ligne /dev/hda13 par : /dev/hda13 /backup auto ro,noexec,nosuid,nodev,sync 0 2 mount /dev/hda13 4.10. Backup du systeme sur une partition specifique ---------------------------------------------------- Nous presentons ici un moyen de sauvegarde des donnees systeme sur une partition reservee a cet usage. Le backup du systeme est realise par un script 'fait maison' permettant une sauvegarde complete ou incrementale des fichiers/repertoires a sauvegarder et autorisant le backup chiffre (avec openssl) des repertoires/fichiers parametres. Ne sont pas presentes ici : * La restauration du systeme a partir des donnees sauvegardees. Referez vous a la partie '4.12. Preparation d'une restauration du systeme en cas d'incident'. * L'acces a cette partition depuis un serveur distant pour un stockage de backup specialise. Vous pouvez vous referer a 'VII. INSTALLATION D'UN SERVEUR SAMBA POUR UNE GESTION DE BACKUP' pour un acces Netbios via Samba. Vous devez avoir une partition /dev/sda13 dans /etc/fstab du type : /dev/sda13 /backup ext2 ro,noexec,nosuid,nodev,sync 0 2 mkdir /home/system/scripts/backup Et installez le script /home/system/scripts/backup/system_backup.sh presente en 'ANNEXE 8 - Script de backup'. chmod 750 /home/system/scripts/backup/system_backup.sh Editez le script pour configurer les fichiers ou repertoires que vous desirez sauvegarder en modifiant la variable 'BACKUP_FROM' : Creez un fichier '/home/system/scripts/backup/include_but_ciphered' qui contiendra les fichiers ou repertoires que vous voulez ajouter dans l'archive chiffree. Ce fichier doit exister mais peut etre vide si vous ne voulez pas utiliser cette fonctionnalite : NDR : # Le backup chiffre est toujours en mode 'full'. # Le script de backup effectuant un 'cd /', configurez ce fichier en supprimant le premier '/' devant le chemin vers votre fichier/repertoire. J'ai personnellement renseigne ce fichier de la maniere suivante : /home/system/scripts/backup/include_but_ciphered : etc/gshadow etc/gshadow- etc/passwd etc/passwd- etc/samba/smbpasswd etc/shadow etc/shadow- var/backups NDR : Est il trivial d'indiquer que : # vous devriez noter le mot de passe de chiffrement que vous utilisez dans le script ? # le script ne doit etre accessible que par root ? Creez un fichier '/home/system/scripts/backup/exclude' qui contiendra les fichiers ou repertoires que vous ne desirez pas sauvegarder par rapport aux arborescences que vous aurez definies dans la variable 'BACKUP_FROM'. NDR : # Ce fichier doit exister mais peut etre vide si vous ne desirez rien exclure. # Le script de backup effectuant un 'cd /', configurez ce fichier en supprimant le premier '/' devant le chemin vers votre fichier/repertoire. J'ai personnellement renseigne ce fichier de la maniere suivante : usr/src var/lock var/run var/tmp Creez un fichier '/home/system/scripts/backup/cpioed' qui contiendra les repertoires dont vous souhaitez conserver les localisations et permissions grace a une archive cpio. # Ce fichier doit exister mais peut etre vide si vous ne desirez rien exclure. # Le script de backup effectuant un 'cd /', configurez ce fichier en supprimant le premier '/' devant le chemin vers votre fichier/repertoire. # SEULS LES REPERTOIRES INDIQUES SONT SAUVEGARDES ! J'ai personnellement renseigne ce fichier de la maniere suivante (je ne tiens pas a sauvegarder /usr/src) : backup cdrom floppy initrd local lost+found mnt opt proc tmp var/lock var/run var/tmp Lancez le script pour le premier backup : /home/system/scripts/backup/system_backup.sh Backup: Full backup Backup: Remounting rw /backup Backup: Backuping /backup/full_060503-144947/bin_060503-144947.tar.gz Backup: Hash : c8f1b2863146f03ef686fa04d1fd0da5\ /backup/full_060503-144947/bin_060503-144947.tar.gz Backup: Backuping /backup/full_060503-144947/boot_060503-144948.tar.gz Backup: Hash : 4bfd31759e05e14ed65b63dee26feb8d\ /backup/full_060503-144947/boot_060503-144948.tar.gz Backup: Backuping /backup/full_060503-144947/dev_060503-144950.tar.gz Backup: Hash : e5fd2dd7df68aba2f176faed07f44cd5\ /backup/full_060503-144947/dev_060503-144950.tar.gz Backup: Backuping /backup/full_060503-144947/etc_060503-144951.tar.gz Backup: Hash : 348d9dd3f309c23703a3c24c83dda609\ /backup/full_060503-144947/etc_060503-144951.tar.gz Backup: Backuping /backup/full_060503-144947/home_060503-144952.tar.gz Backup: Hash : 5495f04c230f7feaecb893f879297753\ /backup/full_060503-144947/home_060503-144952.tar.gz Backup: Backuping /backup/full_060503-144947/lib_060503-144954.tar.gz Backup: Hash : dce418f7fd12bd9621f5429141eaddbb\ /backup/full_060503-144947/lib_060503-144954.tar.gz Backup: Backuping /backup/full_060503-144947/root_060503-144957.tar.gz Backup: Hash : 012a1be6fb9686c6ca49c3edd8a94c38\ /backup/full_060503-144947/root_060503-144957.tar.gz Backup: Backuping /backup/full_060503-144947/sbin_060503-144958.tar.gz Backup: Hash : 0bf5b00b86826e195a9de88ef8d68a9f\ /backup/full_060503-144947/sbin_060503-144958.tar.gz Backup: Backuping /backup/full_060503-144947/usr_060503-144959.tar.gz Backup: Hash : f3ec8f659a17daa0cb318d0f687d632c\ /backup/full_060503-144947/usr_060503-144959.tar.gz Backup: Backuping /backup/full_060503-144947/var_060503-145357.tar.gz Backup: Hash : e200713da542da4c1bb0e8910b6aa76f\ /backup/full_060503-144947/var_060503-145357.tar.gz Backup: Backuping excluded files into a cpio archive Backup: Hash : a323d013c942bf30a6e0c76f5ae2ed2b\ /backup/full_060503-144947/excluded.cpio Backup: Backuping /home/system/scripts/backup/include_but_ciphered\ files Backup: Ciphering /backup/full_060503-144947/\ ciphered_060503-145357.tar.gz Backup: Removing /backup/full_060503-144947/\ ciphered_060503-145357.tar.gz Backup: Hash : 228dc72dd72ab99b2e58e3d083e72e5f\ /backup/full_060503-144947/\ ciphered_060503-145357.tar.gz.des3 Backup: Syncing disks Backup: Remounting ro /backup ll -R /backup/ /backup/: total 28 drwxr-x--- 2 root root 4096 May 6 14:54 full_060503-144947 -rw-r----- 1 root root 94 May 6 14:49 full_060503-144947.log -rw-r----- 1 root root 1023 May 6 14:54 full_060503-144947.md5 /backup/full_060503-144947: total 335096 -rw-r----- 1 root root 1016158 May 6 14:49 bin_060503-144947.tar.gz -rw-r----- 1 root root 4390293 May 6 14:49 boot_060503-144948.tar.gz -rw-r----- 1 root root 592280 May 6 14:54 ciphered_060503-145357\ .tar.gz.des3 -rw-r----- 1 root root 57067 May 6 14:49 dev_060503-144950.tar.gz -rw-r----- 1 root root 478588 May 6 14:49 etc_060503-144951.tar.gz -rw-r----- 1 root root 65024 May 6 14:54 excluded.cpio -rw-r----- 1 root root 1152206 May 6 14:49 home_060503-144952.tar.gz -rw-r----- 1 root root 2298150 May 6 14:49 lib_060503-144954.tar.gz -rw-r----- 1 root root 418679 May 6 14:49 root_060503-144957.tar.gz -rw-r----- 1 root root 1203847 May 6 14:49 sbin_060503-144958.tar.gz -rw-r----- 1 root root 285132220 May 6 14:53 usr_060503-144959.tar.gz -rw-r----- 1 root root 45928823 May 6 14:54 var_060503-145357.tar.gz du -ch /backup/ 328M /backup/full_060503-144947 328M /backup 328M total Vous avez desormais dans /backup : # Une sauvegarde 'full' des fichiers ou repertoires que vous avez specifie. # Un fichier de log contenant les erreurs rencontrees - vide si aucune erreur. # Un fichier d'empreinte md5 des archives creees pour chaque fichier/repertoire specifie. Dans /home/system/scripts/backup/.last_done (ou dans le fichier que vous avez vous meme specifie), vous avez la date de ce dernier backup. Note : Les 328M de sauvegarde full realisee precedemment l'ont ete en environ ~5 minutes sur un PIII 700 avec 160Mo de RAM. Vous pouvez desormais realiser un backup incremental des donnees sauvegardees precedemment. En appelant a nouveau le script : Backup: Incremental backup beginning : Tue May 6 14:49:47 CEST 2003 Backup: Remounting rw /backup Backup: Backuping /backup/incr_060503-152213/bin_060503-152213.tar.gz\ (incremental) Backup: Hash : 081a6113dd90eb892d01548cd7179b62\ /backup/incr_060503-152213/bin_060503-152213.tar.gz Backup: Backuping /backup/incr_060503-152213/\ boot_060503-152213.tar.gz (incremental) Backup: Hash : ae60b98501c0978f362e2f7826b671a5\ /backup/incr_060503-152213/boot_060503-152213.tar.gz Backup: Backuping /backup/incr_060503-152213/\ dev_060503-152213.tar.gz (incremental) Backup: Hash : 3dcc660a2a296b8356ffa29d4c52d8d1\ /backup/incr_060503-152213/dev_060503-152213.tar.gz Backup: Backuping /backup/incr_060503-152213/\ etc_060503-152214.tar.gz (incremental) Backup: Hash : b9649a2474ec6f8858841fa4eb3f1e5b\ /backup/incr_060503-152213/etc_060503-152214.tar.gz Backup: Backuping /backup/incr_060503-152213/\ home_060503-152214.tar.gz (incremental) Backup: Hash : b91a69fceb9d176050d69fd300850d26\ /backup/incr_060503-152213/home_060503-152214.tar.gz Backup: Backuping /backup/incr_060503-152213/\ lib_060503-152214.tar.gz (incremental) Backup: Hash : 718f76f85543429bbd32df86ce23e5b7\ /backup/incr_060503-152213/lib_060503-152214.tar.gz Backup: Backuping /backup/incr_060503-152213/\ root_060503-152214.tar.gz (incremental) Backup: Hash : d357d47b59e75595087ab7d8cba58fdb\ /backup/incr_060503-152213/root_060503-152214.tar.gz Backup: Backuping /backup/incr_060503-152213/\ sbin_060503-152214.tar.gz (incremental) Backup: Hash : 1688044981053d9e8e0d333509c54149\ /backup/incr_060503-152213/sbin_060503-152214.tar.gz Backup: Backuping /backup/incr_060503-152213/\ usr_060503-152214.tar.gz (incremental) Backup: Hash : 2f95fb3bb6b8d9a0ab247bde96611baf\ /backup/incr_060503-152213/usr_060503-152214.tar.gz Backup: Backuping /backup/incr_060503-152213/\ var_060503-152223.tar.gz (incremental) Backup: Hash : 668d117769137b003cf427394d65b1a3\ /backup/incr_060503-152213/var_060503-152223.tar.gz Backup: Backuping /home/system/scripts/backup/\ include_but_ciphered files Backup: Ciphering /backup/incr_060503-152213/\ ciphered_060503-152223.tar.gz Backup: Removing /backup/incr_060503-152213/\ ciphered_060503-152223.tar.gz Backup: Hash : 9d11b72e4bfa25cbf81b4295717133cf /backup/\ incr_060503-152213/ciphered_060503-152223.tar.gz.des3 Backup: Syncing disks Backup: Remounting ro /backup ll -R /backup/ /backup/: total 36 drwxr-x--- 2 root root 4096 May 6 15:22 incr_060503-152213 -rw-r----- 1 root root 0 May 6 15:22 incr_060503-152213.log -rw-r----- 1 root root 949 May 6 15:22 incr_060503-152213.md5 /backup/incr_060503-152213: total 656 -rw-r----- 1 root root 166 May 6 15:22 bin_060503-152213.tar.gz -rw-r----- 1 root root 196 May 6 15:22 boot_060503-152213.tar.gz -rw-r----- 1 root root 592280 May 6 15:22 \ ciphered_060503-152223.tar.gz.des3 -rw-r----- 1 root root 352 May 6 15:22 dev_060503-152213.tar.gz -rw-r----- 1 root root 2179 May 6 15:22 etc_060503-152214.tar.gz -rw-r----- 1 root root 1344 May 6 15:22 home_060503-152214.tar.gz -rw-r----- 1 root root 543 May 6 15:22 lib_060503-152214.tar.gz -rw-r----- 1 root root 275 May 6 15:22 root_060503-152214.tar.gz -rw-r----- 1 root root 167 May 6 15:22 sbin_060503-152214.tar.gz -rw-r----- 1 root root 29773 May 6 15:22 usr_060503-152214.tar.gz -rw-r----- 1 root root 7973 May 6 15:22 var_060503-152223.tar.gz Un simple 'tar ztvf {archive}.tar.gz | grep -v " 0 "' vous donnera la liste des fichiers qui ont ete modifies et pris en compte lors de cette sauvegarde incrementale. Vous pouvez appeler le script avec l'option '-f' : cela le forcera a suivre la procedure sauvegarde 'full' en ne tenant pas compte du contenu du fichier '.last_done'. Nous pouvons maintenant editer notre fichier /etc/crontab pour appeller notre script de backup : # Backup Full du systeme toutes les semaines a 00H30 30 0 * * 7 root /home/system/scripts/backup/system_backup.sh -f # Backup incremental du systeme toutes les 6 heures a xx:15 15 */6 * * * root /home/system/scripts/backup/system_backup.sh Nous modifions egalement /etc/syslog.conf pour que les messages de backup soient consignes dans notre fichier de log securite : syslog.notice %regex -m "Backup" %classic /var/log/securite.log Puis : /etc/init.d/sysklogd restart MAN : tar, gzip 4.11. Preparation d'une restauration du systeme en cas d'incident ----------------------------------------------------------------- Notre objectif est de preparer un moyen de restauration du systeme simple a mettre en place et rapide a mettre en oeuvre en cas d'incident. Nous allons pour ce faire creer une 'image' de notre systeme que nous graverons sur un un CD. Nous pourrons par la suite employer ce CD d'une part comme secours de boot sur notre dernier noyau stable (utile pour des tests sauvages de reboot sur un nouveau noyau sans ecran par exemple ;) et d'autre part comme support de sauvegarde nous permettant de restaurer le systeme. NDR : # La creation de cette image necessite l'installation du package mkisofs (n'installez pas le package cdrecord sauf si vous disposez d'un graveur sur la station) et l'ajout du support 'Block devices -> Loopback device support' au noyau. # Vous devriez dedier une station a cet usage et non installer ces fonctionnalites sur votre serveur de production. # L'espace disque requis est d'environ 1Go (~650Mo environ, mais il vaut mieux voir large :>). Nous allons tout d'abord creer un systeme de fichier root contenant les binaires necessaires a l'execution du CD puis ajouter nos archives dans un repertoire et pour finir utiliser un script qui executera la restauration du systeme. Pour ce faire, nous allons nous baser sur les fichiers fournis dans le jeu de CD Debian. Recuperation des fichiers necessaires au boot et d'un systeme de fichier root minimal : NDR : Je vais par la suite utiliser la partition /local comme partition de travail. Cette partition est, si vous avez suivi cette documentation, une partition Ext2 inutilisee et occupant l'espace disque restant apres installation du systeme. Inserez le CD numero 1 de votre jeu Debian et montez le cdrom (/cdrom dans notre exemple). mount -o remount,rw /local mkdir /local/Debian cp /cdrom/isolinux/isolinux* /local/Debian cp /cdrom/isolinux/idepci.bin /local/Debian mkdir /local/Debian/kernel cp /cdrom/install/linpci /local/Debian/kernel/ Ajoutez votre noyau courant : cp /boot/vmlinuz-2.4.26 /local/Debian/kernelbk cp /boot/System.map-2.4.26 /local/Debian/System.map cp /boot/config-2.4.26 /local/Debian/config-2.4.26 Editez le fichier isolinux.cfg : TIMEOUT 10 PROMPT 1 DISPLAY isolinux.txt DEFAULT kernelbk LABEL kernelbk kernel /kernelbk append root=/dev/hda1 hdc=ide-scsi LABEL restore kernel /kernel/linpci append root=/dev/ram ro initrd=idepci.bin ramdisk_size=16384 disksize=1.44 flavor=idepci Note : Verifiez que vous passez bien les parametres dont vous avez besoin. Editez le fichier isolinux.txt : Debian-Secinst v0.1.5 Boot CD Modification du systeme de fichier root original : Nous montons maintenant le systeme de fichier root original : cd /local cp Debian/idepci.bin . gunzip -S ".bin" idepci.bin mount -t ext2 idepci /mnt/ -o loop Modification de l'initialisation du CD pour executer notre script de restauration : cd /mnt/ Editez le fichier etc/inittab : # main setup program <::respawn:/sbin/udbootstrap >::respawn:-/restore.sh Clavier Francais et alias : cd /mnt/etc/ tar zxvf keymaps.tgz i386/azerty/fr-latin1.bmap echo "/sbin/loadkmap < /etc/i386/azerty/fr-latin1.bmap" > profile echo "alias l='ls'" >> profile echo "alias ll='l -l'" >> profile echo "alias la='ll -a'" >> profile echo "alias cp='cp -i'" >> profile echo "alias rm='rm -i'" >> profile echo "alias mv='mv -i'" >> profile Ajout du binaire cpio : cd /mnt cp /lib/libnsl.so.1 ./lib/ cp /bin/cpio ./bin/ Ajout d'un binaire tar compile en statique : Recuperez la version 1.13.25 sur l'un des miroirs de www.gnu.org. Compilez la en statique (avec le support uclibc par exemple) ou tout simplement avec : env LDFLAGS=-static ./configure make LDFLAGS=-static cd /mnt mv ./bin/tar ./bin/oldtar Copiez votre nouveau binaire dans /mnt/bin/tar chmod 755 /mnt/bin/tar Ajoutez le script de restauration present en 'ANNEXE 9 - Script de restauration' a la racine (/mnt/restore.sh) et donnez lui les droits 'chmod 755 /mnt/restore.sh'. Ajout des informations de backup : NDR : Ces informations sont evidemment celles du systeme a restaurer et non celles du systeme sur lequel vous creez ce CD ! mkdir /mnt/backup && chmod 755 /mnt/backup Editez le fichier '/mnt/backup/server_infos' (ou le fichier que vous avez configure dans le script de restauration) pour ajouter les informations que vous jugerez utile. Par exemple (/mnt/backup/server_infos) : This backup was created for {HOSTNAME} the 5 of May at 12:03. The server backuped is a Apache/Websphere server. Ajoutez les fichiers suivants dans '/mnt/backup' : * un fichier 'disk_name' contenant le nom de votre peripherique (ex : /dev/sda). * un fichier 'fdisk_script' contenant les instructions a suivre pour creer les partitions sur le disque (voir 'ANNEXE 10 - Exemple de script Fdisk') * un fichier 'fstab_file' du type de celui obtenu par la commande : grep -E "ext|swap" /etc/fstab | awk '{ print $1" "$2" "$3 }' => Les points de montage logique (fd0, cdrom et proc) ne sont pas obligatoires. => Seuls les supports ext2 et swap sont geres pour l'instant. * un fichier 'lilo_file' : copie de votre /etc/lilo.conf a restaurer => Attention au mot de passe en clair !!! * un fichier 'partitions_table' : resultat de la commande '/sbin/fdisk -l' Demontez le systeme de fichier et sauvegardez le : cd /local umount -d /mnt gzip -S ".bin" idepci mv idepci.bin Debian/ On ajoute maintenant le backup de notre systeme : Connectez vous au systeme a sauvegarder et lancez un backup full via le script de backup fourni en 'ANNEXE 8 - Script de backup' ou recuperez les archives de votre dernier backup full. Sur la station que vous utilisez pour creer le cdrom de backup, creez le repertoire '/local/Debian/archives' et copiez vos archives a sauvegarder a l'interieur (en respectant le nommage des archives en .tar.gz ou .cpio !). Une fois cette copie effectuee, creez un fichier /local/Debian/archives/infos.txt contenant les chemins vers les fichiers qui seront presents dans /mnt/archives/ (une fois le systeme de fichier monte par le script de restauration). Je vous reccomande de creer ce fichier a la main plutot que d'utiliser un find. J'ai personnellement renseigne ce fichier de la maniere suivante (Notez la presence de var_xxx avant usr_xxx) : /mnt/archives/infos.txt : /mnt/archives/bin_070503-153510.tar.gz /mnt/archives/boot_070503-153511.tar.gz /mnt/archives/dev_070503-153513.tar.gz /mnt/archives/etc_070503-153514.tar.gz /mnt/archives/home_070503-153515.tar.gz /mnt/archives/lib_070503-153517.tar.gz /mnt/archives/root_070503-153520.tar.gz /mnt/archives/sbin_070503-153520.tar.gz /mnt/archives/var_070503-153925.tar.gz /mnt/archives/usr_070503-153522.tar.gz /mnt/archives/deciphered_070503-153925.tar.gz /mnt/archives/excluded.cpio NDR : Je vous reccomande bien entendu de comparer le md5sum des fichiers generes par votre script de backup avec le md5sum des fichiers copies sur la station utilisee pour creer l'ISO et de renouveller cette operation pour les fichiers qui seront presents sur le CD grave. !!! Dans /local/Debian/archives, vous devez avoir un fichier protege par le mot de passe present dans votre script de backup. Deprotegez ce fichier avant de proceder a la creation de l'ISO !!! NDR : J'insiste sur le fait que ce CD de restauration contient une sauvegarde de fichiers critiques et doit etre protege physiquement !!! Preparation de l'ISO : Preparation de l'image iso a graver : cd /local mkisofs -o debian.iso -b isolinux.bin -c boot.cat -no-emul-boot\ -boot-load-size 4 -boot-info-table -l -r Debian/ Vous avez desormais une image 'debian.iso' que vous pouvez graver sur un CD. Ce CD sera bootable et vous donnera acces au menu suivant : Debian-Secinst v0.1.5 Restore script Enter alt-[F1-F4] to : have this menu, have a shell, look at the logs. To reboot : ctrl-alt-del ------- This backup was created for {HOSTNAME} the 25 of April at 16:52. The server backuped is a Apache/Websphere server. ------- Menu (1) : Show actual partition table. (2) : Show backuped partition table. (3) : Show backuped fstab file. ***** (4) : Write the backuped partition table to disk. (5) : Format disk using backuped fstab file. (6) : Mount disk partitions using backuped fstab file. (7) : Restore the system. (8) : Lilo the system using backuped lilo file. (9) : Syncing and unmounting restored system. ***** (A) : Automated script (4-5-6-7-8-9). What do you want ? NDR : La restauration du systeme pris comme en exemple en '4.11. Backup du systeme sur une partition specifique' m'a pris 15 minutes sur un PIII 500 avec 128 Mo de RAM. ================================================================================ 5. SECURISATION APPROFONDIE =========================== NDR : Vous devez savoir ce que vous faites dans les parties presentees ici. 5.1. Installation du patch OpenWall ----------------------------------- Le patch est telechargeable sur http://www.openwall.com/linux/ mount -o remount,rw /usr cd /usr/src cp -r kernel-2.2.20-fw kernel-2.2.20-fwow ln -s kernel-2.2.20-fwow linux-ow md5sum /home/system/download/linux-2_2_23-ow1_tar.gz cb51cfdd978eba987ca39d09960e17c3\ /home/system/download/linux-2_2_23-ow1_tar.gz cp /home/system/download/linux-2_2_23-ow1_tar.gz . tar zxvf linux-2_2_23-ow1_tar.gz cd linux-ow patch -p1 < ../linux-2.2.23-ow1/linux-2.2.23-ow1.diff Deux fichiers ne passent pas avec notre noyau 2.2.20 : find . -name *.rej ./fs/fat/inode.c.rej ./fs/select.c.rej => Mais les modifications manuelles sont triviales. On prepare la compilation du nouveau noyau : sed 's/^EXTRAVERSION\ =\ -fw$/EXTRAVERSION\ =\ -fw-ow/' Makefile > .fwow cat .fwow > Makefile && rm -f .fwow Si vous lancez make menuconfig a ce moment, vous trouverez un nouveau menu nomme 'Security options'. Deux options demeurent non-activees apres le passage du patch : * 'Restricted /proc' * 'Destroy shared memory segments not in use' => Vous pouvez activer 'Restricted /proc' mais il vous faudra une configuration supplementaire des comptes administrateurs avec un outil comme sudo pour eviter que les admins ne passent root a tout bout de champ: On compile : make dev && make modules && make bzImage On installe : mount -o remount,rw /boot cp arch/i386/boot/bzImage /boot/vmlinuz-2.2.20-fw-ow cp System.map /boot/System.map-2.2.20-fw-ow cd /boot/ ln -s vmlinuz-2.2.20-fw-ow linux-ow Installez les modules : cd - && make modules_install On modifie /etc/lilo.conf pour ajouter : image=/boot/linux-ow label=linux22ow read-only restricted Et on lance 'lilo'. On reboote et on passe sur le noyau avec OpenWall. Si tout s'est bien passe, vous pouvez changer le noyau charge par defaut par lilo en supprimant restricted de l'ancien noyau. 5.2. Installation du wrapper libsafe ------------------------------------ L'archive est disponible sur : http://www.research.avayalabs.com/project/libsafe/ cd /home/system/applis md5sum ../download/libsafe-2_0-16.tgz 6b7b6e6df84d4afb469ccc66d04fc24d ../download/libsafe-2_0-16.tgz tar zxvf ../download/libsafe-2_0-16.tgz find ./libsafe-2.0-16/ -type f \( -perm -004000 -o -perm -002000 \) -exec ls\ -la {} \; chown -R root:root libsafe-2.0-16/ chmod 750 libsafe-2.0-16/ cd libsafe-2.0-16/ make mount -o remount,rw /usr make install => Entrer Yes au prompt. mount -o remount,ro /usr Testez la librairie : export LD_PRELOAD=/home/system/applis/libsafe-2.0-16/src/libsafe.so Lancez les exploits dans /home/system/applis/libsafe-2.0-16/exploits. Installez la libsafe dans /etc/ld.so.preload si le fichier n'existe pas : ll /etc/ld.so.preload || echo /lib/libsafe.so.2 > /etc/ld.so.preload chmod 644 /etc/ld.so.preload Rebootez le systeme (?!). 5.3. Conserver une empreinte de verification d'integrite du systeme ------------------------------------------------------------------- Installez le package Debian : mount -o remount,rw /usr dselect => installation de 'aide' => La preconfiguration ne fonctionne pas, car elle tente d'executer un script dans /tmp => 'Initalize aide database ?' -> No mount -o remount,ro /usr Preparez le terrain : chmod 750 /etc/aide cp /etc/aide/aide.conf /etc/aide/aide.conf.orig chmod 640 /etc/aide/* mkdir /home/system/aide Editez /etc/aide/aide.conf et modifiez le de telle sorte que : [...] database=file:/home/system/aide/aide.db database_out=file:/home/system/aide/aide.db.new [...] # MD5 sum files - especially useful with debsums -g /var/lib/dpkg/info/([^\.]+).md5sums Databases [...] et a la fin du fichier [...] /etc ConfFiles /home/system Binlib !/home/system/aide [...] Initialisez la base de donnees : aide --init -V200 NDR : Est il trivial de vous reccomander de ne pas faire de modifications pendant l'initialisation ? Premiere sauvegarde de la base de donnees (la suite est donnee a titre d'exemple) : Inserez une disquette puis 'mke2fs /dev/fd0' mount /dev/fd0 /mnt cp /home/system/aide/aide.db.new /home/system/aide/aide.db /usr/bin/md5sum /home/system/aide/aide.db.new > /mnt/aide.db.md5 mv /home/system/aide/aide.db.new /mnt/aide.db cp /usr/bin/aide /mnt/ /usr/bin/md5sum /usr/bin/aide > /mnt/aide.md5 sed 's/file:\/home\/system\/aide\//file:.\//' /etc/aide/aide.conf >\ /mnt/aide.conf sync cd /mnt grep `/usr/bin/md5sum aide | cut -d ' ' -f 1` aide.md5 => Doit vous renvoyer le contenu du fichier aide.md5 grep `/usr/bin/md5sum aide.db | cut -d ' ' -f 1` aide.db.md5 => Doit vous renvoyer le contenu du fichier aide.db.md5 diff /etc/aide/aide.conf ./aide.conf 3,4c3,4 < database=file:/home/system/aide/aide.db < database_out=file:/home/system/aide/aide.db.new --- > database=file:./aide.db > database_out=file:./aide.db.new cd && umount /mnt Sortez la disquette et protegez la en ecriture. Verifier le systeme avec le support de sauvegarde : Inserez la disquette mount -o ro /dev/fd0 /mnt && cd /mnt ./aide -c ./aide.conf --check -V200 cd && umount /mnt Mise a jour de la base de donnee sauvegardee : aide --update -V200 cd /home/system/aide mv aide.db.new aide.db puis sauvegardez cette nouvelle base comme pour la creation. NDR : Ce qui precede est donne a titre d'exemple, Il serait plus approprie en cas de doute de booter le systeme sur un support amovible sur protege en ecriture et d'effectuer la verification d'integrite a partir de ce support. MAN : aide, aide.conf 5.4. Gestion des quotas ----------------------- NR : Vous devez commencer a connaitre le systeme donc je n'explique plus les details deja presentes plusieurs fois... Recompilation du noyau et installation du package : Compilez un nouveau noyau en activant 'Filesystems -> Quota support'. Rebootez, sauvez la configuration etc... Installez le package 'quota'. => 'Send daily reminders' -> No Configuration des partitions : Modifiez le fichier /etc/fstab pour ajouter les flags relatifs aux quotas : /dev/sda6 /var ext2 nodev,usrquota,grpquota 0 2 /dev/sda7 /var/log ext2 noexec,nosuid,nodev,sync,usrquota,grpquota 0 2 /dev/sda8 /tmp ext2 noexec,nosuid,nodev,usrquota,grpquota 0 2 [...] /dev/sda10 /home ext2 nodev,usrquota,grpquota 0 2 Ajoutez les fichiers de quotas : for i in `echo /var /var/log /tmp /home` ; do \ touch $i/quota.user && touch $i/quota.group ; done for i in `echo /var /var/log /tmp /home` ; do \ chmod 600 $i/quota.user && chmod 600 $i/quota.group ; done for i in `echo /var /var/log /tmp /home` ; do \ chown root:root $i/quota.user && chown root:root $i/quota.group ; done Remontez les partitions : for i in `echo /var /var/log /tmp /home` ; do \ mount -v -o remount $i ; done Suppression d'un service inutile pour nous : update-rc.d -f quotarpc remove Une premiere verification : /sbin/quotacheck -am Edition des quotas pour les groupes : Lancez 'edquota -g users' et editez les quotas pour le groupe users : /dev/sda8 0 20000 20000 0 5000 5000 /dev/sda10 17 100000 100000 9 10000 10000 Lancez 'edquota -g adm' et editez les quotas pour le groupe adm : /dev/sda8 0 5000 10000 0 10000 10000 /dev/sda10 17 200000 250000 9 50000 50000 NDR : Utilisez 'df -[h|i]' de facon a obtenir les informations sur l'ensemble du disque pour le choix des quotas precedents. Creez un utilisateur fictif qui servira de modele de mise en place de quotas : adduser --no-create-home --disabled-password --quiet --ingroup users quotauser Changing the user information for quotauser Enter the new value, or press return for the default Full Name []: Quota template user Room Number []: Work Phone []: Home Phone []: Other []: Disabled Is the information correct? [y/n] y passwd -l quotauser chsh -s /bin/false quotauser Mettez en place les quotas pour le modele d'utilisateur : Lancez 'edquota -u quotauser' et editez les quotas : /dev/sda8 0 2000 2000 0 500 500 /dev/sda10 0 10000 10000 0 1000 1000 Vous pouvez verifier les quotas mis en place avec : 'quota -vu quotauser' Pour un nouvel utilisateur {username}, vous pouvez associer ce modele de quotas avec 'edquota -p quotauser {username}'. Modifiez '/etc/adduser.conf' pour inclure ce modele dans la definition des quotas : QUOTAUSER="quotauser" Activation - Desactivation - Etat des quotas (quelques exemples) : Activation : /etc/init.d/quota start Desactivation : /etc/init.d/quota stop Etat (Active ou Desactive ? ) : quotaon -pa Statistiques : repquotas -ugva NDR : Le fichier d'initialisation des quotas au boot est place dans /etc/rcS.d et sera donc active a chaque redemarrage de la station. MAN : quotacheck, quotaon, quotaoff, quotastats, repquota, edquota, quota 5.5. Securisation PAM : Gestion des limites ------------------------------------------- Limites aux sessions : Verifiez avec 'grep pam_limits.so /etc/pam.d/ssh' que la librairie est activee (c'est le cas par defaut). Constatez avec 'grep pam_limits.so /etc/pam.d/login' que la librairie n'est pas activee par defaut : => Activez la en decommentant la ligne. => Faites de meme pour /etc/pam.d/su Editez /etc/security/limits.conf en ajoutant les parametres suivants (exemple pour le groupe administrateurs) : * hard core 0 * hard memlock 4096 * hard fsize 10000 * hard maxlogins 3 * hard cpu 10 @adm hard nofile 1024 @adm hard nproc 256 @adm hard maxlogins 5 @users hard nofile 256 @users hard nproc 32 NDR : Pour afficher les limites d'un utilisateurs, entrez 'ulimit -a' MAN : bash, ulimit 5.6. Disquette de secours avec Tomsrtbt --------------------------------------- La distribution tomsrtbt est telechargeable sur http://www.toms.net/rb/ cd /home/system/applis /usr/bin/md5sum /home/system/download/tomsrtbt-2.0.103.tar.gz d5ee50efb28986d564547d5da5de2483 \ /home/system/download/tomsrtbt-2.0.103.tar.gz tar zxvf /home/system/download/tomsrtbt-2.0.103.tar.gz cd tomsrtbt-2.0.103/ Inserez une disquette vierge. ./install.s Vous avez desormais une disquette de secours. En rebootant sur la disquette, deux choix vous sont proposes : * Resolution de l'ecran. * map du clavier. Et puis en fait, le mieux est que vous lisiez la FAQ... 5.7. Installation de Prelude-Lml pour une remontee de log securisee vers un serveur centralise ------------------------------------------------------------------------------ L'installation de Prelude-Lml est desormais presentee dans une autre documentation. Ne figurent ici que les aspects de configuration du moniteur Prelude qui sont specifique a l'installation de notre station securisee. La nouvelle documentation est intitulee "Centralized and secured remote logging solution with Prelude-Lml on Debian : How to securely install and set up the Prelude-Lml engine". Elle est disponible sur http://www.entreelibre.com/scastro/prelude/ . 5.7.1. Configuration initiale Nous abordons ici la remontee de certains des logs 'securite' generes par la configuration presentee dans cette documentation. NDR : Par la suite, nous emploierons le terme 'sonde' a la place de 'sensor'. NDR : Cette configuration est minimale, je vous conseille, de lire les documentations disponibles sur prelude et de proceder a votre propre parametrage. Il est par exemple possible, entre autres, de recompiler la libsafe pour qu'elle puisse se comporter en sonde prelude. Modifiez '/home/prelude/etc/prelude-sensors/sensors-default.conf' : > node-name = Test Secured Debian; > node-location = Salle serveur; Modifiez '/home/prelude/etc/prelude-lml/plugins.rules' : < Paxmod - .* PAX: .* > #Paxmod - .* PAX: .* Modifiez '/home/prelude/etc/prelude-lml/prelude-lml.conf' : Nos fichier a surveiller sont (voir '4.8. Installation et premiers pas avec Modular-Syslog') : /var/log/fw_deny.log, /var/log/fw_accept.log et /var/log/securite.log : < file = /var/log/auth.log < file = /var/log/messages > file = /var/log/securite.log > file = /var/log/fw_accept.log > file = /var/log/fw_deny.log Nous allons charger notre propre serie de regles : < ruleset=/home/prelude/etc/prelude-lml/ruleset/simple.rules; > #ruleset=/home/prelude/etc/prelude-lml/ruleset/simple.rules; > ruleset=/home/prelude/etc/prelude-lml/ruleset/debian-secinst.rules Creez '/home/prelude/etc/prelude-lml/ruleset/debian-secinst.rules' : # Customized prelude-lml rules file from debian-secinst v0.1.7 doc # Simon Castro # These one are from the simple.rules standard file. regex=PAM_unix\[([0-9]+)\][^(]+\(uid=([0-9]+)\) -> ([^ ]+);\ class.name=Authentication Failure; impact.completion = failed;\ impact.type = other; impact.severity = high;\ impact.description=Process $1 attempted to change UID from $2 to $3; regex=entered promiscuous mode; class.name=Promiscuous mode detected;\ impact.completion = succeeded; impact.type = other;\ impact.severity = medium; impact.description=A sniffer is probably\ running on this machine; # A few of rules only of this file will be used as we don't configure\ prelude-lml to look into auth.log include = ssh.rules; # These are personal rules... regex=left promiscuous mode; class.name=Promiscuous mode end detected;\ impact.completion = succeeded; impact.type = other;\ impact.severity = medium; impact.description=A sniffer is probably\ running on this machine; # Uncomment one of the two ruleset below #include = ipchains.rules; #include = netfilter.rules; Creez '/home/prelude/etc/prelude-lml/ruleset/ipchains.rules' a partir de 'ANNEXE 5 - Fichier de regles pour un support Ipchains avec Prelude-lml' si vous utilisez un firewall IpChains. Attribuez les permissions correctes aux fichiers crees : cd /home/prelude/etc/prelude-lml/ruleset/ chown prelude:prelude debian-secinst.rules ipchains.rules chmod 640 debian-secinst.rules ipchains.rules !!! ATTENTION Notez qu'avec cette version de Prelude, il n'est apparemment plus possible de donner des droits restreints aux fichiers de logs que vous monitorez. Par defaut, vos fichiers de logs (dans /var/log) securite.log et fw_[deny| accept].log doivent etre en 640 et appartenir a root:adm (si vous avez suivi cette procedure). Il se trouve que si vous ne configurez pas ces fichiers en 644 au minimum avec cette installation, le moniteur prelude ne sera pas capable de les consulter apres avoir perdu ses privileges super-utilisateur. ATTENTION !!! Et redemarrez la sonde prelude-lml : /etc/init.d/preludelogmonitor.sh restart 5.8. Securisation approfondie avec GrSecurity --------------------------------------------- GrSecurity est constitue d'un patch pour le noyau Linux et d'un utilitaire destine a etre utilise en espace utilisateur. Le patch accroit la securite du systeme en apportant des restrictions aux systemes de fichiers /proc et /tmp, aux actions realisables par des processus 'chrootes', en creant un espace de stockage d'ACLs (Access Control Lists) permettant d'implementer un systeme base sur le modele MAC (Mandatory Access Control) pour tous les utilisateurs et y compris pour le super-utilisateur (la liste n'est pas exhaustive :) ). La suite GrSecurity inclut egalement Pax : une protection du noyau permettant l'implementation de pages memoire non executables et un espace d'adressage aleatoire. Nous allons tout d'abord commencer par patcher le noyau du systeme puis nous aborderons l'integration des listes de controle d'acces. Notez que vous devez choisir entre cette procédure et celle présentée en '5.1. Installation du patch OpenWall'. Le patch noyau GrSecurity et l'outil d'administration GrAdm sont tous deux disponibles sur www.grsecurity.net et l'utilitaire chpax est disponible sur pageexec.virtualave.net. Je ne peux que vous indiquer de lire consciencieusement la documentation presente sur le site avant de proceder aux manipulations decrites ci-apres... Avant de commencer, sachez enfin que cette documentation s'applique pour un noyay 2.4.22 (noyau non disponible dans la branche stable des packages Debian) donc a vous de choisir... 5.8.1. Patch du noyau : Compilation et installation Recuperez le patch du noyau ainsi que chpax, verifiez les MD5 et stockez les dans /home/system/download/. Recuperez les sources du noyau 2.4.22, verifiez le md5 puis : mount -o remount,rw /usr mount -o remount,exec /tmp cd /usr/src mv /home/system/download/linux-2.4.22.tar.bz2 . tar jxvf linux-2.4.22.tar.bz2 chown -R root:root linux-2.4.22 chmod 750 linux-2.4.22 mv linux-2.4.22 kernel-source-2.4.22 ln -s kernel-source-2.4.22 linux-2.4.22 Patchez les sources du noyau : cd /usr/src patch -p0 < /home/system/download/grsecurity-1.9.12-2.4.22.patch Editez le flag EXTRAVERSION du fichier linux-2.4.22/Makefile pour ajouter un commentaire du type '-grsec'. Si vous utilisiez le noyau 2.4.18 de Debian, recuperez le fichier de config que vous avez du sauvegarder dans /boot et placez le dans /usr/src/linux-2.4 .22/.config puis 'make oldconfig' - sinon 'make menuconfig' et configurez votre nouveau noyau. Choisissez les options GrSecurity que vous voulez activer - celles qui ont ete utilisees lors de la redaction de cette documentation sont presentees dans 'ANNEXE 11 - Parametres de configuration d'un noyau GrSecurity' - puis compilez et installez votre nouveau noyau en suivant la procedure presentee dans 'II. COMPILATION DU NOYAU'. Notes sur le choix des options : * Si vous activez l'option 'Deny writing to /dev/kmem, /dev/mem, and /dev/port' dans le menu 'Address Space Protection' et que votre systeme est un guest VmWare (tm), il ne bootera plus... * J'utilise le gid 4 pour l'option 'CONFIG_GRKERNSEC_PROC_GID', ce qui permet aux membres du groupe 'adm' d'obtenir des permissions que je juge appropriees pour les administrateurs non-root du serveur. * J'active l'option 'CONFIG_GRKERNSEC_CHROOT_SYSCTL' car je prefere creer un script d'initialisation charge de positionner les bonnes valeurs lors du boot. Si vous preferez securiser "encore plus" votre installation, desactivez cette option, mais faites attention que les gids que vous utiliserez dans les options 'CONFIG_GRKERNSEC_AUDIT_GID' , 'CONFIG_ GRKERNSEC_TPE_GID', 'CONFIG_GRKERNSEC_SOCKET_ALL_GID', 'CONFIG_GRKERNSEC _SOCKET_CLIENT_GID' et 'CONFIG_GRKERNSEC_SOCKET_SERVER_GID' ne soient pas deja utilises sur votre systeme. Une fois votre nouveau noyau installe, rebootez le systeme. 5.8.2. Configuration du systeme Creez les groupes suivants : for i in `echo grsec_tpe grsec_sockall grsec_sock_cl grsec_sock_srv grsec\ _audit`; do groupadd $i; done Creez le fichier /etc/sysctl.conf.grsecurity a partir du fichier present en 'ANNEXE 12 - Configuration Sysctl de GrSecurity' et parametrez ce fichier selon vos besoins en mettant a jour les gid avec les groupes que vous venez de creer. !!! Attention !!! La suite peut rendre votre systeme instable. Testez cette configuration avec la commande : /sbin/sysctl -p /etc/sysctl.conf.grsecurity Si tout se passe bien et que le comportement du serveur repond a vos attentes, positionnez la variable 'grsec_lock' de sysctl.conf.grsecurity a '1' puis creez le fichier '/home/system/security/apply_grsec.sh' : #!/bin/sh /sbin/sysctl -p /etc/sysctl.conf.grsecurity Configurez le systeme pour que ce script soit appelle au boot : cd /etc/rc2.d ln -s /home/system/security/apply_grsec.sh S{XX}apply_grsec ou {XX} correspond a votre priorite de lancement par rapport aux autres scripts executes lors du boot du systeme. Modifiez votre fichier de configuration syslog pour stocker les alertes dans le fichier de log securite grace aux entrees suivantes : kern.* %regex -m "PAX" %classic /var/log/securite.log kern.* %regex -m "grsec" %classic /var/log/securite.log La configuration initiale est terminee... Voici la politique que j'applique personnellement (elle est fonction de l'usage final du serveur) : * Tous les operateurs du systeme sont dans grsec_sock_srv; * Les serveurs Apache et Websphere sont dans grsec_audit et dans grsec_tpe; * Si Apache n'a pas besoin d'etablir de connexions distantes (Attention, c'est le cas pour le module WAS), je place Apache dans grsec_sock_cl; * Les eventuels utilisateurs guests sont places dans grsec_sockall et dans grsec_tpe. Une derniere note relative a l'interaction de notre noyau avec une installation Websphere telle que presentee dans 'V. INSTALLATION ET SECURISATION D'UN SERVEUR D'APPLICATION WEBSPHERE' : Si vous avez suivi la procedure d'installation de ce document le serveur d'application ne pourra plus demarrer et vous obtiendrez un message d'erreur du type : [...] kernel: grsec: From a.b.c.d: Proc handler: being fed garbage 2 bytes\ sent 208 required [...] kernel: PAX: From a.b.c.d: terminating task: /usr/local/websphere500/\ appserver/java/jre/bin/exe/java(java):4773, uid/euid: [...] [...] kernel:grsec: From a.b.c.d: attempted resource overstep by requesting\ 4096 for RLIMIT_CORE against limit 0 by (java:4773) [...], parent (start\ Server.sh:19644) [...] Vous pouvez corriger ce probleme via : cd /home/system/applis/chpax-0.5/ ./chpax -s /usr/local/websphere500/appserver/java/jre/bin/exe/java Et verifiez que vous obtenez ceci avec chpax -v : * Paging based PAGE_EXEC : enabled * Trampolines : not emulated * mprotect() : restricted * mmap() base : randomized * ET_EXEC base : not randomized * Segmentation based PAGE_EXEC : disabled Pour finir, le positionnement de l'utilisateur WAS dans le groupe d'audit genere une quantite quelque peu importante de logs lors des stop/start du serveur d'application, ceux-ci sont cependant facilement tracables par le critere "parent (stopServer.sh:17515)" par exemple. 5.8.3. Installation et configuration de Gradm et des ACLs Avant de commencer, sachez que cette installation va fortement diminuer les droits de l'utilisateur root. Pour effectuer des taches d'administration telles que la mise a jour des packages ou un reboot du serveur, vous devrez utiliser la commande 'gradm -a' de facon a passer en mode administration. Lors de l'installation de Gradm, vous aurez a saisir un mot de passe pour la commande Gradm (passage en mode administration ou desactivation des ACLs), il parait donc judicieux de saisir un mot de passe complexe ?! Recuperez l'archive gradm-1.9.12.tar.gz sur le site de GrSecurity et stockez la dans /home/system/download puis verifiez le MD5. On installe : cd /home/system/applis/ tar zxvf ../download/gradm-1.9.12.tar.gz chown -R root:root gradm/ find . -type f -exec chmod 640 {} \; find . -type d -exec chmod 750 {} \; make && make install => Le mot de passe vous est demande et est stocke dans /etc/grsec/pw. Une configuration initiale est desormais positionnee dans /etc/grsec/acl et sera utilisee si vous activez la securite - ce que vous ne faites pas bien evidemment ! Nous recuperons les acls fournies pour debian et les utilisons : cd /etc/grsec/ cp -r /home/system/applis/gradm/debian_secure_acls . chmod 700 debian_secure_acls/ chmod 600 debian_secure_acls/* mv acl acl.orig mv debian_secure_acls/default acl Conformement a cette documentation, nous n'avons pas besoin des acls suivantes (certaines sont disponibles en annexe) donc : cd debian_secure_acls/ rm -f apache cron inetd ipop3d klogd mysqld postfix syslogd tcpd xfree86 Creez un repertoire /etc/grsec/debian-secinst, ajoutez y les fichiers presentes en 'ANNEXE 13 - ACLs GrSecurity pour Debian-secinst' puis : cd /etc/grsec chmod 700 debian-secinst chmod 600 debian-secinst/* Note : Ne prenez que les fichiers d'ACL dont vous avez besoin pour votre propre systeme et configurez les selon vos besoins ! Modifiez le fichier /etc/grsec/acl avec le patch present en 'ANNEXE 13' : cd /etc/grsec patch < patch => File to patch ? entrez acl puis supprimez le patch Si vous avez installe un serveur Web, n'oubliez pas d'editer le fichier /etc/grsec/debian_secinst/Dmn_apache pour definir les ports sur lesquels le serveur Apache est autorise a se positionner en ecoute. Si vous avez modifie les ports d'ecoute du demon SSH, faites de meme avec le fichier /etc/grsec/debian_secure_acls/sshd. Si vous avez configure d'autre device de logging pour le syslogd (comme par exemple en suivant les explications de '5.7. Installation de Prelude-Lml.'), editez /etc/grsec/debian_secure_acls/syslogd pour les configurer. Vous pouvez maintenant croiser les doigts et activer les acls avec la commande 'gradm -E'. Si tout se passe bien, vous pouvez maintenant modifier le script /home\ /system/security/apply_grsec.sh pour ajouter la commande 'gradm -E' de facon a ce que les ACLs soient mises en place au boot du systeme. ================================================================================ I. INFORMATIONS SUR LA GESTION DE PACKAGES DEBIAN ================================================= La gestion des packages Debian peut s'effectuer par le biais de plusieurs commandes. => Consultez les man suivants : dselect , apt-get , dpkg Nous nous contentons de presenter ici quelques d'aide-memoires. NDR: Attention aux permissions systeme de fichiers associees a vos partitions. Mise a jour du systeme avec apt : * apt-get update * apt-get dist-upgrade -d * cd /var/cache/apt/archives * Verifier l'empreinte md5 du(des) package(s) telecharge(s). * dpkg-deb -I {nom_du_package}.deb md5sums => Verifiez que les md5 sont corrects (?) * apt-get dist-upgrade Quelques utilisations de dpkg : * dpkg -i package => Installer un .deb * dpkg -I package => Informations sur le .deb * dpkg -c package => Liste les fichiers d'un .deb * dpkg -x package toto => Extrait les fichiers du .deb dans le repertoire 'toto'. * dpkg -l => Tous les packages installes. * dpkg -l '*pattern*' => Tous les packages installes relatifs a 'pattern'. * dpkg -L package => Liste des fichiers d'un package installe. * dpkg -s package => Statut d'un package Repertoires relatifs a la gestion de package Debian : /var/cache/apt/archives => contient la liste des packages telecharges s'ils ne sont pas effaces. /var/lib/dpkg/info/* => contient les informations relatives aux packages installes. I.a. Creation d'un package Debian --------------------------------- AVERTISSEMENT : Cette creation de package est plus artisanale qu'autre chose. Je vous conseille la lecture de www.debian.org/doc/manuals/maint-guide/ pour la creation de package .deb standards. NDR : Nous nous servons de l'utilitaire 'fakeroot' dont je ne vous reccomande pas l'installation sur un serveur de production. On cree l'arborescence : mkdir ~/tmp/debian-secinst-doc-0.0.1 cd ~/tmp/debian-secinst-doc-0.0.1 mkdir -p usr/local/doc cp ~/debian-secinst.txt ./usr/local/doc/ mkdir DEBIAN On cree les fichiers de controle : cat > ./DEBIAN/control << EOF Package: debian-secinst-doc Version: 0.0.1 Section: doc Priority: optional Architecture: all Depends: Maintainer: Simon Castro Description: Installation et securisation d'une station Debian Woody\ stable Installation et securisation d'une station sous Linux Debian 3.0 stable. EOF cat > ./DEBIAN/copyright << EOF debian-secinst-doc Copyright (c) 2003 - Simon Castro This package may be downloaded from http://www.entreelibre.com/scastro You are free to distribute this software under the terms of the GNU General Public License. On Debian systems, the complete text of the GNU General Public License can be found in the file '/usr/share/common/common-licenses/GPL' EOF cat > ./DEBIAN/changelog << EOF debian-secinst-doc (0.0.1) * Initial release - Simon Castro -- Simon Castro 2003-03-17 EOF On genere les empreintes MD5 : find usr/ -type f -exec /usr/bin/md5sum {} >> ./DEBIAN/md5sums \; On compresse ce qui doit l'etre et on positionne les droits : gzip --best ./DEBIAN/changelog find . -type d | xargs chmod 755 find . -type f | xargs chmod 644 On cree le package : fakeroot dpkg-deb --build ./debian-secinst-doc-0.0.1/\ debian-secinst-doc-0.0.1.deb ================================================================================ II. COMPILATION DU NOYAU ======================== II.a. Compilation d'un noyau personnalise ----------------------------------------- NDR : exemple avec une recuperation pour la premiere fois des sources du noyau 2.2.20. Dans le cas contraire, sauvegardez votre fichier de configuration puis make clean, make mrproper et verifiez EXTRAVERSION dans ./Makefile. Recuperez les sources puis allez dans /usr/src. ln -s kernel-source-2.2.20 linux_perso cd linux_perso sed 's/^EXTRAVERSION\ =$/EXTRAVERSION\ =\ -perso/' Makefile > .perso cat .perso > Makefile && rm -f .perso make menuconfig => Choisissez vos options et quittez en sauvant make dep make modules make bzImage make modules_install II.b. Installation du noyau --------------------------- L'exemple pris ici est relatif a la premiere installation d'un nouveau noyau sur le systeme. cp archi/i386/boot/bzImage /boot/vmlinuz-2.2.20-perso cp System.map /boot/System.map-2.2.20-perso cd /boot/ ln -s vmlinuz-2.2.20-perso linux_perso Editer le fichier /etc/lilo.conf pour ajouter l'entree suivante : image=/boot/linux_perso label=perso read-only restricted Lancez la commande 'lilo' pour mettre a jour le systeme. Rebootez le systeme et si tout est correct : cp /usr/src/linux_perso/.config /boot/config-2.2.20-perso puis modifiez le noyau a lancer par defaut ? ================================================================================ III. ADMINISTRATION : QUELQUES CONSEILS ======================================= Sont presentes ici quelques conseils relatifs a l'administration de la station installee. III.a. J'ai oublie de preparer une partition ... ------------------------------------------------ Vous voulez installer une partition supplementaire que vous n'aviez pas prevue auparavant (ex: /var/www ou /var/mysql ...). Il doit vous rester de la place sur la derniere partition que vous aviez cree en '1.5. Partitionnez le disque dur'. Nous allons nous servir de cet espace pour ajouter une nouvelle partition. NDR: Faites bien ATTENTION a ce que vous allez faire ensuite... Commencez par sauvegarder ce que vous aviez installe sur cette partition. umount /local fdisk /dev/sda * Entrez 'p' pour afficher la table de partitions. => Notre partition (dans cet exemple !) est /dev/sda11 * Entrez 'd' puis '11' pour effacer cette partition. * Entrez 'n' puis puis '+64M' => Nous ajoutons une nouvelle partition de 64M. * Entrez 'n' puis puis => Nous ajoutons une nouvelle partition pour l'espace disque restant. * Entrez 'w' pour ecrire la nouvelle table de partition sur le disque et quitter. Editez /etc/fstab pour supprimer la reference a l'ancienne partition /dev/sda11. Rebootez. Formattez les deux nouvelles partitions : mke2fs /dev/sda11 mke2fs /dev/sda12 Verifiez les deux nouvelles partitions : e2fsck /dev/hda11 e2fsck /dev/hda12 Editez /etc/fstab pour refleter le changement : /dev/sda11 /var/www ext2 rw,nosuid,nodev 0 2 /dev/sda12 /local ext2 ro,noexec,nosuid,nodev 0 2 Creez le point d'entree /var/www et remontez les partitions : mkdir /var/www chmod 755 /var/www mount /var/www mount /local mount -o remount,rw /local Copiez a nouveau votre backup de donnees. mount -o remount,ro /local III.b. Dselect ne parvient pas a configurer les packages a cause des permissions de /tmp ------------------------------------------------------------------------------ Apres avoir verifie que le package que vous voulez installez/configurer est correct. mount -o remount,exec /tmp Configurez votre package mount -o remount,defaults /tmp III.c. SmartHost Exim --------------------- Exim doit normalement etre configure pour gerer vos Mails en local si vous avez utilise cette documentation pour l'installation. Nous configurons maintenant exim pour qu'il soit en mesure de transmettre les mails a destination d'un domaine x.yyy vers un serveur SMTP externe smtp.x.yyy qui se chargera de l'acheminement. Sauvegardez votre configuration : cp /etc/exim/exim.conf /etc/exim/exim.conf.orig Editez la configuration Exim (/etc/exim/exim.conf) : * Entrez le domaine pour qui vous autorisez le relais : relay_domains = x.yyy * Commentez (si vous le voulez) : host_lookup = * Ajoutez dans "TRANSPORTS CONFIGURATION" : remote_smtp: driver = smtp Ajoutez dans "ROUTERS CONFIGURATION" : smarthost: driver = domainlist transport = remote_smtp route_list = "* smtp.x.yyy bydns_a" III.d. Client Samba ------------------- Votre noyau doit etre compile avec l'option : CONFIG_SMB_FS=y Installez le package smbfs : apt-get install smbfs -d md5sum smbfs_2.2.3a-12.3_i386.deb e63c92036a14f97a818616160bf9515d smbfs_2.2.3a-12.3_i386.deb mount -o remount,rw /usr/ apt-get install smbfs mount -o remount /usr/ Montage de partition avec mount : mount -t smbfs -o username={USER} //{WIN32_HOSTNAME}/{SHARE_NAME}\ /{MOUNT_POINT} (Si vous le voulez.) Installez les packages pour SmbClient : apt-get install smbclient libcupsys2 samba-common -d md5sum smbclient_2.2.3a-12.3_i386.deb libcupsys2_1.1.14-5_i386.deb\ samba-common_2.2.3a-12.3_i386.deb aa9589efcb9639a18eefb85ad90554ca smbclient_2.2.3a-12.3_i386.deb f9ecb4934ee098f2ffa9f4939effb328 libcupsys2_1.1.14-5_i386.deb 1a36ef5c7b682d913d22bb933d890793 samba-common_2.2.3a-12.3_i386.deb mount -o remount,rw /usr/ mount -o remount,exec /tmp/ apt-get install smbclient libcupsys2 samba-common Yes Entrez le workgroup Password encryption : yes mount -o remount /usr/ mount -o remount /tmp/ Test de connexion avec smbclient : smbclient //{WIN32_HOSTNAME}/{SHARE_NAME} -I {IP_ADDRESS} -U {USER} III.e. Graver CD et DVD ----------------------- Je ne saurais que trop recommander d'utiliser un serveur dedie a cet usage. On me l'a demande donc : o effacer un CD : cdrecord blank=fast dev=0,0 o graver un CD : cdrecord dev=0,0 nom.iso o graver un DVD : growisofs -Z /dev/scd0=image.iso ou o graver un DVD : growisofs -dvd-compat -Z /dev/scd0 -r -l /repertoire/ III.f. Accents dans le shell ---------------------------- Il vous suffit de renseigner votre fichier .inputrc avec les directives suivantes : set meta-flag on set convert-meta off set output-meta on ================================================================================ IV. INSTALLATION ET SECURISATION D'UN SERVEUR APACHE MODSSL =========================================================== Les actions realisees ici ont ete realises apres avoir suivi les etapes suivantes de la procedure generale : 1. INSTALLATION DU SYSTEME 2. CONFIGURATION INITIALE DU SYSTEME 3. PREMIER ACCES AU SYSTEME ET SECURISATION MINIMALE 4. SECURISATION MODEREE 5.4. Gestion des quotas 5.5. Securisation PAM : Gestion des limites IV.a. Installation ------------------ Vous devez avoir une partition /dev/sda11 dans /etc/fstab du type : /dev/sda11 /var/www ext2 rw,nosuid,nodev 0 2 apt-get update apt-get install apache apache-doc libapache-mod-ssl libapache-mod-ssl-doc -d => Acceptez les packages: 'apache apache-common apache-doc libapache-mod-ssl libapache-mod-ssl-doc libexpat1 openssl'. cd /var/cache/apt/archives/ for i in `echo *.deb` ; do md5sum $i;done 98146bac67cff4cf252e4ff2bbbb6560 apache-common_1.3.26-0woody3_i386.deb a13fce3a93f137ef243bc743e7b5a57d apache-doc_1.3.26-0woody3_all.deb 95d81b2239554383c56c7d193c476ddb apache_1.3.26-0woody3_i386.deb 7c5f6a20d23ec97bd7d0f8ec5bd14172 libapache-mod-ssl-doc_2.8.9-2.1_all.deb 9756a3701103f8779c65455c968898c3 libapache-mod-ssl_2.8.9-2.1_i386.deb 95f921ff15b8bf124ec9e9e6a3230774 libexpat1_1.95.2-6_i386.deb 8af019bb8fc566504db03d88f75b782a openssl_0.9.6c-2.woody.2_i386.deb mount -o remount,rw /usr/ mount -o remount,exec /tmp/ apt-get install apache apache-doc libapache-mod-ssl libapache-mod-ssl-doc mount -o remount,ro /usr/ mount -o remount,noexec /tmp/ /etc/init.d/apache stop IV.b. Configuration initiale ---------------------------- Ajoutez les regles suivantes a votre firewall et rechargez le : # Allow anyone to reach us on HTTP/HTTPS tcp ports $IPCH -A input -p tcp --sport 1024: --dport 80 -j ACCEPT $IPCH -A output -p tcp --sport 80 --dport 1024: -j ACCEPT Creez une arborescence : mkdir /var/www/htdocs chmod 750 /var/www/htdocs && chown root:www-data /var/www/htdocs Positionnez des permissions restrictives sur la configuration : chmod 750 /etc/apache /etc/apache/ssl* chmod 640 /etc/apache/*.conf Preparez le certificat (ou recuperez le votre) : mkdir /etc/apache/ssl cd /etc/apache/ssl openssl genrsa -out {HOSTNAME}.key 2048 openssl req -new -x509 -days 365 -key {HOSTNAME}.key -out {HOSTNAME}.crt Mettez en place un fichier de configuration minimal : cd /etc/apache cp httpd.conf httpd.conf.orig Remplacez /etc/apache/httpd.conf par le fichier de configuration present en 'ANNEXE 6 - Fichier de configuration Apache minimal'. Creez le groupe webadm: groupadd webadm Preparez le repertoire de logs : mkdir /var/log/apache chown root:webadm /var/log/apache && chmod 3750 /var/log/apache Preparez la rotation des logs en modifiant le fichier /etc/logrotate.d/apache sur les lignes suivantes (Vous devriez adapter cette configuration a votre environnement en creant un script d'archivage dans un repertoire distinct) : daily rotate 365 create 640 root webadm Demarrez et testez Apache : /etc/init.d/apache start Ajoutez vos utilisateurs/administrateurs dans un groupe webadm qui aura des droits sur l'arborescence web : groupadd webadm Pour les administrateurs: usermod -g {UserName} -G adm,users,webadm,www-data {UserName} Pour les utilisateurs : usermod -g users -G webadm,www-data {UserName} Avec 'visudo', ajoutez les entrees suivantes dans /etc/sudoers pour permettre a vos administrateurs web d'administrer le serveur Apache : # Cmnd alias specification [...] Cmnd_Alias APACHECTL=/usr/sbin/apachectl [...] # User privilege specification [...] %webadm ALL=NOPASSWD:APACHECTL L'arborescence des sous-repertoires de 'htdocs' peut etre du type : mkdir /var/www/htdocs/{directory_name} chown root:webadm /var/www/htdocs/{directory_name} chmod 3775 /var/www/htdocs/{directory_name} Vos administrateurs web (groupes webadm et www-data) peuvent desormais acceder a cette arborescence et poser les fichiers necessaires au site des facons suivantes : * {UserName}:webadm => Par defaut * {UserName}:www-data => Avec un chown. => Attention, dans les deux cas aux permissions affectees aux fichiers, elles doivent au moins etre en 644 pour le premier cas et en 640 pour le second cas. IV.c. Integration des quotas ---------------------------- Groupe Partition Place Soft Hard Inodes Soft Hard adm /tmp 185M 50M 60M 49K 15K 20K adm /home 465M 100M 125M 122K 20K 30K adm /var/www 279M 1 1 1 1 1 users /tmp 185M 50M 60M 49K 15K 20K users /home 465M 100M 125M 122K 10K 15K users /var/www 279M 1 1 1 1 1 webadm /tmp 185M 1 1 49K 1 1 webadm /home 465M 100M 125M 122K 10K 15K webadm /var/www 279M 200M 225M 73K 50K 60K www-data /tmp 185M 1 1 49K 1 1 www-data /home 465M 1 1 122K 1 1 www-data /var/www 279M 40M 50M 73K 1K 10K Utilisateur Partition Place Soft Hard Inodes Soft Hard quotauser /tmp 185M 5M 10M 49K 1,5K 5K quotauser /home 465M 15M 20M 122K 3K 5K quotauser /var/www 279M 5M 10M 73K 1K 2K IV.d. Empreinte du systeme -------------------------- Suivez la procedure presentee en '5.3. Conserver une empreinte de verification d'integrite du systeme.' IV.e. Sauvegarde du systeme --------------------------- Referez vous a '4.11. Backup du systeme sur une partition specifique'. IV.f. Etapes de configuration supplementaires --------------------------------------------- Si vous desirez activer les extensions CGI et SSI pour votre configuration Apache, ajoutez a votre fichier httpd.conf : ------------------------------------------ ################### ### Scripts CGI ### ################### LoadModule cgi_module /usr/lib/apache/1.3/mod_cgi.so LoadModule includes_module /usr/lib/apache/1.3/mod_include.so ScriptAlias /cgi-bin/ /var/www/cgi-bin/ AddHandler cgi-script .cgi AddType text/html .shtml AddHandler server-parsed .shtml AllowOverride All Options ExecCGI Includes Order allow,deny Allow from all ------------------------------------------ Notez que le "AllowOverride All" pourrait etre affine. Tout depend des droits que vous souhaitez accorder a vos administrateurs Web (i.e : s'ils ont acces au fichier de configuration apache ou non). Notez que vous devrez egalement parametrer les directives " Verifiez que Apache tourne correctement. => Si vous rencontrez des erreurs, editez '/usr/local/websphere500/\ appserver/config/cells/plugin-cfg.xml' et au niveau de la ligne\ ' Consultez ensuite le fichier '/usr/local/websphere500/appserver/\ logs/http_plugin.log' apres avoir essaye de relancer Apache. Testez votre installation : cd /usr/local/websphere500/appserver/bin/ ./ivt.sh NDR : Patientez ... Le message '>ADMU3200I: Server launched. Waiting for\ initialization status.' dure longtemps ! => Les messages de succes que vous devez obtenir sont IVTL0070I et IVTL0080I. => Le test d'installation via 'ivt' lance egalement le serveur d'application par defaut (server1) et celui-ci reste lance a la fin du test. Vous pouvez donc tester que WAS est bien installe en entrant par exemple http://{@IP}/snoop dans un navigateur. V.b. Configuration initiale : Restauration du 'read-only' sur /usr, deplacement vers /var/was, attribution de permissions restreintes et execution du service WAS sous une identite restreinte ----------------------------------------------------------------------------- Stoppez le service Websphere si celui-ci est demarre : cd /usr/local/websphere500/appserver/bin/ ./stopServer.sh server1 Stoppez le serveur Apache si celui-ci est demarre : /etc/init.d/apache stop Creation d'un nouvel utilisateur : Creez un utilisateur pour le service Was et un groupe pour les administrateurs was : groupadd wasadm groupadd was adduser --no-create-home --disabled-password --quiet --ingroup was was Changing the user information for was Enter the new value, or press return for the default Full Name []: Ibm Websphere user Room Number []: Work Phone []: Home Phone []: Other []: Disabled Is the information correct? [y/n] y passwd -l was && chsh -s /bin/false was Creez des limites specifiques a cet utilisateur was dans le fichier /etc/security/limits.conf : was hard memlock 128000 was hard nofile 32000 was hard cpu 100 Deplacement vers /var/was et restauration du 'read-only' sur /usr : Vous devez avoir une partition /dev/sda12 dans /etc/fstab du type : /dev/sda12 /var/was ext2 rw,noexec,nosuid,nodev 0 2 Verifiez que la partition est montee, puis : chown root:was /var/was chmod 3770 /var/was Creez les repertoires dans /var/was : cd /var/was cp -r /usr/local/websphere500/appserver/config/ . cp -r /usr/local/websphere500/appserver/etc/ . cp -r /usr/local/websphere500/appserver/installableApps/ . cp -r /usr/local/websphere500/appserver/installedApps/ . cp -r /usr/local/websphere500/appserver/logs/ . cp -r /usr/local/websphere500/appserver/properties/ . cp -r /usr/local/websphere500/appserver/temp/ . cp -r /usr/local/websphere500/appserver/tranlog/ . cp -r /usr/local/websphere500/appserver/wstemp/ . Supprimez les repertoires dans /usr/local et creez les liens vers la partition Was : cd /usr/local/websphere500/appserver/ rm -rf config && ln -s /var/was/config/ config rm -rf etc && ln -s /var/was/etc/ etc rm -rf installableApps && ln -s /var/was/installableApps/ installableApps rm -rf installedApps && ln -s /var/was/installedApps/ installedApps rm -rf logs && ln -s /var/was/logs/ logs rm -rf properties && ln -s /var/was/properties/ properties rm -rf temp && ln -s /var/was/temp/ temp rm -rf tranlog && ln -s /var/was/tranlog/ tranlog rm -rf wstemp && ln -s /var/was/wstemp/ wstemp Positionnez les permissions appropriees sur le repertoire /var/was : cd /var/was chown -R root:was * find . -type d -perm -750 -exec chmod 2770 \{\} \; find . -type f -perm -640 -exec chmod 660 \{\} \; Positionnez les permissions appropriees sur le repertoire /usr/local/websphere500 : chown root:was /usr/local/websphere500 /usr/local/websphere500/appserver\ && chmod 750 /usr/local/websphere500 /usr/local/websphere500/appserver cd /usr/local/websphere500/appserver chown -R root:was * Execution de Was sous une identite restreinte : Modifiez les parametres de la JVM pour une adaptation a VOTRE (Mon serveur de test possede 156M de Ram et 300M de Swap) serveur dans '/var/was/config/\ cells/{HOSTNAME}/nodes/{HOSTNAME}/servers/server1/server.xml' : Modifiez le fichier /var/was/config/cells/{HOSTNAME}/nodes/{HOSTNAME}/\ servers/server1/server.xml de facon a obtenir : a la place de : Configuration des comptes administrateurs Was : mount -o remount,ro /usr Redemarrez Apache, Websphere et inscrivez les futurs administrateurs dans les groupes was et wasadm : Pour les administrateurs : usermod -g {UserName} -G adm,users,webadm,www-data,wasadm,was {UserName} Pour les utilisateurs : usermod -g users -G [webadm,www-data],wasadm,was {UserName} Avec 'visudo', ajoutez les entrees suivantes dans '/etc/sudoers' pour permettre a vos administrateurs was d'administrer le serveur Websphere : # Cmnd alias specification [...] Cmnd_Alias WASCTL=/usr/local/websphere500/appserver/bin/startServer.sh ,\ /usr/local/websphere500/appserver/bin/stopServer.sh [...] # User privilege specification [...] %wasadm ALL=(was) NOPASSWD: WASCTL NDR: Il est, bien entendu, trivial d'indiquer que les scripts que vous inscrivez dans le fichier d'autorisation sudo ne doivent etre en disponibles en ecriture que pour le super-utilisateur ou les administrateur. Vos administrateurs Was peuvent desormais administrer le serveur : > sudo -l User simon may run the following commands on this host: (was) NOPASSWD: /usr/local/websphere500/appserver/bin/startServer.sh,\ /usr/local/websphere500/appserver/bin/stopServer.sh > sudo -u was /usr/local/websphere500/appserver/bin/startServer.sh server1 V.c. Recommandations -------------------- L'arborescence /var/was est desormais en 3770. N'oubliez pas que les administrateurs ou le serveur Was peuvent modifier les fichiers appartenant a root. => Presumez desormais que tous les fichiers appartenant a root dans cette arborscence peuvent contenir des donnees malicieuses !!! Cette documentation n'a pas pour objectif de vous presenter une securisation approfondie de Websphere Application Server, voici donc quelques recommandations sur les etapes que vous pourriez suivre apres l'installation : * Supprimer toutes les webapp installees. * N'installer que les webapps relatives aux services que vous desirez offrir. * Privilegier les acces Ssh pour l'administration (l'emploi de wsadmin.sh devrait convenir pour la majeure partie des taches d'administration). * Si vous devez conserver l'interface web de la console d'administrateur : ** Activez la securite. ** Mettez en place des restrictions d'acces pour les utilisateurs autorises. * Restreignez au maximum la configuration du pare-feu (Idealement, seuls les administrateurs devraient avoir acces aux ports de la console d'administration et aux ports des transports HTTP) de facon a ce que le seul acces autorise passe par le plugin charge par Apache. * "Et mes ports SOAP RMI ?" => "Et les tunnels SSH ?". Ok, une restriction sur des adresses IP statiques devrait convenir, y compris si vous employez la version ND pour le deploiement des applications ou la repartition de charge. Si vous souhaitez modifier les ressources memoires attribuees aux processus Java, editez le fichier '/etc/security/limits.conf' pour les entrees 'nofile', 'cpu' et 'memlock' puis modifier les fichiers de configuration des serveurs dans /var/was/config/cells/{SERVER}/nodes/{SERVER}/servers/server{SERVER_NUM}\ /server.xml. V.d. Empreinte du systeme ------------------------- Editez /etc/aide/aide.conf et ajoutez : '/usr/local/websphere500/appserver/bin Binlib' a la fin du fichier. Suivez ensuite la procedure presentee en '5.3. Conserver une empreinte de verification d'integrite du systeme.' V.e. Sauvegarde du systeme -------------------------- Referez vous a '4.11. Backup du systeme sur une partition specifique' et editez le fichier '/home/system/scripts/backup/exclude' pour qu'il contienne cette ligne supplementaire : /var/was/logs ================================================================================ VI. INTEGRATION DE NETFILTER / IPTABLES ======================================= L'integration de NetFilter / Iptables a ete realisee sur le noyau stable 2.4.18 et la version 1.2.6a d'Iptables presents dans les packages Debian. VI.a. Compilation du noyau -------------------------- Compilez votre noyau avec les options desirees et celles qui suivent : CONFIG_PACKET=y CONFIG_NETFILTER=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_LIMIT=y CONFIG_IP_NF_MATCH_MAC=y CONFIG_IP_NF_MATCH_MULTIPORT=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_MANGLE=y CONFIG_IP_NF_TARGET_LOG=y Installez le nouveau noyau et rebootez. VI.b. Scripts d'initialisation ------------------------------ Installez les scripts presents dans 'ANNEXE 7 - Parametrage du firewall NetFilter' et donnez leurs les droits appropries. Ajoutez le script init_iptables.sh pour qu'il soit pris en compte au boot du systeme update-rc.d init_iptables.sh defaults Demarrez le firewall : /etc/init.d/init_iptables.sh start ================================================================================ VII. INSTALLATION D'UN SERVEUR SAMBA POUR UNE GESTION DE BACKUP =============================================================== L'objectif de cette installation est de permettre a un serveur Win32 d'acceder a la station Debian en Netbios de facon a ce qu'il puisse recuperer les donnees sauvegardees que nous mettons a sa disposition. La gestion du backup du systeme en lui meme est presente dans la partie '4.11. Backup du systeme sur une partition specifique' de ce document. NDR : Pour realiser notre objectif, il n'est pas necessaire de proceder a l'installation de l'ensemble des packages relatifs a Samba. Pour la meme raison, nous n'abordons pas l'utilisation d'un client Samba ou de systemes de fichiers de type Samba dans cette partie. VII.a. Installation ------------------- On recupere les packages : apt-get update apt-get install samba samba-doc -d => Acceptez les packages : 'libcupsys2 samba samba-common samba-doc'. On verifie leur signature : cd /var/cache/apt/archives/ for i in `echo *.deb` ; do md5sum $i;done 86ece906e4f6bf1607758894a217c9bd libcupsys2_1.1.14-4.4_i386.deb 1a36ef5c7b682d913d22bb933d890793 samba-common_2.2.3a-12.3_i386.deb dcb1367dbed6335737462ce37df18f0e samba-doc_2.2.3a-12.3_all.deb d7daf3069c37042246f785bdc4f1f1d2 samba_2.2.3a-12.3_i386.deb On installe les packages : mount -o remount,rw /usr/ mount -o remount,exec /tmp/ apt-get install samba samba-doc => 'Configurer smb.conf avec debconf ?' : No => 'Executer Samba en mode demon ou via inetd ?' : Demon => 'Creer le fichier de mot de passe Samba ?' : Oui On remonte les partitions, on arrete le serveur, on restreint les droits sur le repertoire de configuration : mount -o remount,ro /usr/ mount -o remount,noexec /tmp/ /etc/init.d/samba stop update-rc.d -f samba remove chmod 750 /etc/samba chmod 640 /etc/samba/smb.conf VII.b. Configuration -------------------- On sauvegarde la configuration originale : cp /etc/samba/smb.conf /etc/samba/smb.conf.orig Ajoutez un utilisateur Samba : groupadd samba adduser --no-create-home --disabled-password --quiet --ingroup samba smbuser Changing the user information for smbuser Enter the new value, or press return for the default Full Name []: Samba Backup User Room Number []: Work Phone []: Home Phone []: Other []: Disabled Is the information correct? [y/n] y passwd -l smbuser && chsh -s /bin/false smbuser Preparez l'utilisateur pour une utilisation avec Samba : cat /etc/passwd | grep smbuser | mksmbpasswd > /etc/samba/smbpasswd smbpasswd smbuser => Et entrez le mot de passe Samba de cet utilisateur. Vous devez avoir une partition /dev/sda13 dans /etc/fstab du type (voir '4.11. Backup du systeme sur une partition specifique') : /dev/sda13 /backup ext2 ro,noexec,nosuid,nodev,sync 0 2 Montez la partition backup et donnez lui les permissions appropriees : mount -o remount,rw /backup/ chown root:samba /backup chmod 3750 /backup mount -o remount,ro /backup/ Creez le fichier /etc/samba/smb.conf suivant : [global] # Local NetBios informations workgroup = {YOUR_DOMAIN} netbios name = {YOUR_NETBIOS_NAME} netbios aliases = {YOUR_NETBIOS_ALIAS} server string = %h server # Netbios Network settings local master = no dns proxy = no wins server = {@IP_OF_YOUR_WINS_SERVER} # Network settings name resolve order = host wins bcast socket options = TCP_NODELAY # Do not forget to add here a correct subnet for the wins server ! hosts allow = 127., {YOUR_ALLOWED_SUBNET/YOUR_ALLOWED_SUBNET_MASK} # Passwords and security invalid users = root encrypt passwords = yes smb passwd file = /etc/samba/smbpasswd unix password sync = false security = user # Logging settings log file = /var/log/samba/samba.log max log size = 1000 syslog = 0 log level = 1 [Backup] comment = Backup for %h path = /backup valid users = smbuser read only = yes public = no browseable = yes Ajoutez les informations sur votre station dans un fichier de resolution NetBios : cat > /etc/samba/lmhosts << EOF > {@IP} {NETBIOS_NAME} > {@IP} {NETBIOS_ALIAS} EOF Autorisez les flux Netbios au niveau de votre firewall (referez vous a 'ANNEXE 1 - Parametrage du firewall Ipchains' ou a 'ANNEXE 7 - Parametrage du firewall NetFilter' selon votre firewall). Demarrez le serveur Samba : /etc/init.d/samba start Ajoutez le serveur Samba dans votre configuration de demarrage : update-rc.d samba defaults => Le serveur de backup Win32 est desormais capable de mapper le partage \\{NETBIOS_NAME}\backup de notre station pour recuperer les fichiers que nous y deposerons. Pour finir, nous modifions l'appel periodique au script de backup par la crontab pour que le serveur Samba soit stoppe au moment ou la partition est remontee en lecture/ecriture : cat > /home/system/scripts/backup/samba_backup.sh << EOF > #!/bin/sh > /etc/init.d/samba stop > if [ $1 ] && [ $1 == "-f" ] > then > /home/system/scripts/backup/system_backup.sh -f > else > /home/system/scripts/backup/system_backup.sh > fi > /etc/init.d/samba start > EOF chmod 750 /home/system/scripts/backup/samba_backup.sh Et on remplace les appels dans '/etc/crontab' : # Backup Full du systeme toutes les semaines a 00H30 < 30 0 * * 7 root /home/system/scripts/backup/system_backup.sh -f > 30 0 * * 7 root /home/system/scripts/backup/samba_backup.sh -f # Backup incremental du systeme toutes les 6 heures a xx:15 < 15 */6 * * * root /home/system/scripts/backup/system_backup.sh > 15 */6 * * * root /home/system/scripts/backup/samba_backup.sh MAN : testparms, smb.conf, smbd, nmbd, smbpasswd, mksmbpasswd, smbstatus, nmblookup ================================================================================ VIII. INSTALLATION D'UN DEMON NAGIOS ==================================== Objectifs : * Installer un serveur de supervision Nagios accessible en HTTPS. * Securiser un minimum l'arborescence systeme. * Utiliser sudo pour l'administration Nagios. Note : Pour cette installation, certains repertoires sont crees dans /var/nagios/, je vous conseille donc d'utiliser une partition dediee montee par exemple en rw,sync. VIII.a Archives --------------- On recupere les sources a partir de www.nagios.org cd /home/system/download/nagios/ md5sum * 35b75ece533dfdf4963a67ce4e77fc4a imagepak-base.tar.gz 3ed26d8b49379e0dc14f448d5c2a70c3 imagepak-satrapa.tar.gz 5f48ecd9bad2c4d7c9d88d0b6f347ecf nagios-1.1.tar.gz 0078c9c8137694181a4cdf596fdbd74f nagios-plugins-1.3.1.tar.gz On met a jour le systeme pour les packages necessaires apt-get install libgd-dev libfreetype6-dev libjpeg62-dev libpng2-dev\ xlibs-dev zlib1g-dev -d cd /var/cache/apt/archives/ /usr/bin/md5sum libgd-dev_1.8.4-17.woody2_i386.deb libfreetype6-dev_2.0.9-1_i386.deb\ libjpeg62-dev_6b-5_i386.deb libpng2-dev_1.0.12-3.woody.3_i386.deb\ xlibs-dev_4.1.0-16woody1_i386.deb zlib1g-dev_1%3a1.1.4-1.0woody0_i386.deb 5b6160127cb2dcd2f63fee1811647ada libgd-dev_1.8.4-17.woody2_i386.deb 3e378f406f3c192cdfb8b4a82774203c libfreetype6-dev_2.0.9-1_i386.deb 194c37acd4eefb512c2a006cb13bd86d libjpeg62-dev_6b-5_i386.deb 3e30f2832304f64467801e966df1a764 libpng2-dev_1.0.12-3.woody.3_i386.deb 28a3ead8c6cbcaa064f05daff4c1dd9f xlibs-dev_4.1.0-16woody1_i386.deb 38b5554abc9c9521451f408230df0e8c zlib1g-dev_1%3a1.1.4-1.0woody0_i386.deb On installe les packages : mount -o remount,rw /usr apt-get install libgd-dev libfreetype6-dev libjpeg62-dev libpng2-dev\ xlibs-dev zlib1g-dev mount -o remount /usr VIII.b Creation des groupes/utilisateurs ---------------------------------------- Creation de l'utilisateur restreint destine a ex