Installation et sécurisation d'une station Debian 3.0 stable

Simon Castro

Ce document présente l'installation et la sécurisation d'une station GNU Linux Debian 3.0 stable.

- Titre : Installation et sécurisation d'une station Debian 3.0 stable

- Auteur : Simon Castro

- Parution : 15 mai 2004

- Public visé :

- Licence : Copyright (c) 2003 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 présent 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.

Sommaire

- Avant-propos

- I. Installation du système

- I-A. Booter sur le CD

- I-B. Menu d'installation

- I-C. Choisir la langue 'Français (fr)' puis 'Français (France)'

- I-D. Configurer le clavier avec le mode 'azerty/fr latin1

- I-E. Partitionnez le disque dur

- I-F. Initialisez une partition d'échange

- I-G. Initialisez les partitions Linux' créées en I.E

- I-H. Installez le noyau et les modules

- I-I. Configurez les modules et pilotes matériel

- I-J. Configurez le réseau

- I-K. Installez le système de base

- I-L. Rendez le système amorcable

- I-M. Créez une disquette d'amorçage

- I-N. Retirez la disquette et le CDROM et 'réamorcez le système

- II. Configuration initiale du système

- II-A. GMT : Oui

- II-B. Mots de passe

- II-C. Créer un premier utilisateur

- II-D. Retirer le package PCMCIA => Oui, si vous ne l'avez pas déja supprimé

- II-E. Connexion PPP pour installer le système

- II-F. Configuration APT

- II-G. Utiliser TaskSel

- II-H. Utiliser Dselect

- II-I. Si vous avez supprimé le package PCMCIA en 2.4., répondez 'Oui' quand on vous demande de le retirer du système.

- II-J. Supprimer les .deb

- II-K. Configuration des Mails

- III. Premier accès au système et sécurisation minimale

- III-A. Loguez vous sous votre utilisateur puis en root.

- III-B. Lancez Dselect

- III-C. Fichiers de configuration de l'environnement administrateur.

- III-D. Fichiers de configuration de l'environnement super-utilisateur.

- III-E. Sécurisation minimale (en mode super-utilisateur)

- III-F. Recompilation du noyau pour le support firewall ipchains

- III-G. Configuration du firewall Ipchains

- III-H. Mise à jour sécurité du système (super-utilisateur)

- IV. Sécurisation modérée

- IV-A. Notes sur le boot du système et sur le noyau

- IV-B. Sécurisation du système de fichiers

- IV-C. Sécurisation des comptes

- IV-D. Recherche et modifications de droits de fichiers

- IV-E. Les administrateurs n'ont pas besoin de passer root

- IV-F. Synchronisation horaire avec un serveur NTP

- IV-G. Génération automatisé d'un rapport système

- IV-H. Installation et premiers pas avec Modular-Syslog

- IV-I. Vérification des empreintes des packages à installer

- IV-J. Système de fichiers ext3 avec un noyau 2.4 : de ext2 à ext3

- IV-K. Backup du système sur une partition spécifique

- IV-L. Préparation d'une restauration du système en cas d'incident

- V. Sécurisation approfondie

- V-A. Installation du patch OpenWall

- V-B. Installation du wrapper libsafe

- V-C. Conserver une empreinte de vérification d'intégrité du système

- V-D. Gestion des quotas

- V-E. Sécurisation PAM : Gestion des limites

- V-F. Disquette de secours avec Tomsrtbt

- V-G. Installation de Prelude-Lml pour une remontee de log securisée vers un serveur centralisé

- V-G-1. Configuration initiale

- V-H. Sécurisation approfondie avec GrSecurity

- V-H-1. Patch du noyau : Compilation et installation

- V-H-2. Configuration du système

- V-H-3. Installation et configuration de Gradm et des ACLs

- VI. Informations sur la gestion de packages Debian

- VII. Compilation du noyau

- VII-A. Compilation d'un noyau personnalise

- VII-B. Installation du noyau

- VIII. Administration : quelques conseils

- VIII-A. J'ai oublié de préparer une partition …

- VIII-B. Dselect ne parvient pas à configurer les packages à cause des permissions de /tmp

- VIII-C. SmartHost Exim

- VIII-D. Client Samba

- IX. Installation et sécurisation d'un serveur Apache MODSSL

- IX-A. Installation

- IX-B. Configuration initiale

- IX-C. Intégration des quotas

- IX-D. Empreinte du système

- IX-E. Sauvegarde du système

- X. Installation et sécurisation d'un serveur d'application Websphere

- X-A. Installation

- X-B. Configuration initiale

- X-C. Reccomandations

- X-D. Empreinte du système

- X-E. Sauvegarde du système

- XI. Intégration de netfilter / iptables

- XI-A. Compilation du noyau

- XI-B. Scripts d'initialisation

- XII. Installation d'un serveur Samba pour une gestion de backup

- XII-A. Installation

- XII-B. Configuration

- XIII. Installation d'un demon nagios

- XIII-A. Archives

- XIII-B. Création des groupes/utilisateurs

- XIII-C. Compilation/Installation de Nagios

- XIII-D. Déplacement des répertoires et attribution de permissions spécifiques

- XIII-E. Configuration d'Apache

- XIII-F. Configuration des autorisations d'accès

- XIII-G. Script d'initialisation et administrateurs Nagios

- XIII-H. Et pour finir

- XIV. Graphiques mrtg pour le server-status Apache

- XIV-A. Archives

- XIV-B. Configuration

- Webographie

- Documentations

- Liens divers

- Outils

- Remerciements

- Annexe 1. Paramétrage du firewall Ipchains

- Annexe 2. Génération automatisée de rapport système

- Annexe 3. syslogd-listfiles.msyslog.patch

- Annexe 4. Script d'arret/demarrage de prelude-lml

- Annexe 5. Fichier de règles pour un support Ipchains avec Prelude-lml

- Annexe 6. Fichier de configuration Apache minimal

- Annexe 7. Paramétrage du firewall NetFilter

- Annexe 8. Script de backup

- Annexe 9. Script de restauration

- Annexe 10. Exemple de script Fdisk

- Annexe 11. Paramètres 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

Avant-propos

- La première partie commence au moment où vous bootez sur le CD d'installation jusqu'au premier reboot. Rien de bien difficile.

- La seconde partie commence après le premier reboot jusqu'au moment ou le système vous propose le prompt. Toujours rien de bien compliqué.

- La troisième partie vous permet de procéder à la configuration initiale du système, à sa sécurisation minimale et à sa mise à jour. Vous obtenez en résultat une station stable avec le minimum de services actifs et le firewall Ipchains active.

- La quatrième partie aborde une série de procédures à suivre pour obtenir une sécurisation « modérée » de la station. Vous pouvez choisir d'ignorer des étapes.

- La cinquième partie présente diverses actions que vous pouvez suivre pour obtenir une sécurisation « approfondie » de la station. Libre à vous de vous y intéresser ou non.

Les parties finales du document numérotées de I à VII présentent des aide-mémoire ou des procédures à suivre pour ajouter des éléments sur la station. Quand des ajouts d'éléments sont présentés, ils ont toujours été effectués sur une station installée suivant les étapes décrites dans les parties I à V.
Et pour finir, n'hésitez pas à me faire part de vos commentaires et/ou idées, surtout si : vous n'avez rien compris à ce que j'ai écris :) ou si vous avez suivi une procédure qui n'a pas donné le résultat escompté.

I - Installation du système

- Si le système est 'critique' ou l'environnement 'dangereux' et que l'adressage est statique, ne branchez pas la station sur le réseau.

- Si l'adressage est dynamique 'DHCP' et que vous êtes dans le cas précédent, branchez la station pour l'étape I.J. uniquement.

- Si vous effectuez une installation par VmWare (tm) (ou tout autre outil du même genre, je suppose que vous devez avoir confiance dans votre système hôte. Faites cependant attention à ce que votre système cible ne soit pas up sur le réseau avant d'être sécurisé un minimum ?

I-A - Booter sur le CD

I-B - Menu d'installation

Si le disque dur ou des périphériques sont SCSI
entrer compact puis 'enter'
Sinon,
entrer 'enter'

I-C - Choisir la langue 'Français (fr)' puis 'Français (France)'

I-D - Configurer le clavier avec le mode 'azerty/fr latin1

I-E - Partitionnez le disque dur

Effacez toutes les partitions présentes.
Créez les partitions suivantes :
Les lignes suivantes sont bâties sur le modèle
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 première partition doit être marquée comme bootable.

- Toutes les partitions doivent être de type 'Linux' sauf la deuxième partition qui doit être de type 'Linux Swap.

- La dernière partition est d'une taille relative à l'espace disque restant après création des partitions principales.

Note sur le partitionnement relatif à l'installation d'un serveur Web :

[...]
Logique  - /sda10 - 500  - /home
Logique  - /sda11 - 300  - /var/www
Logique  - /sda12 - ?    - /local

La taille 300M est arbitraire, prévoyez une allocation relative à
VOTRE installation.
N'oubliez pas de consulter Installation et sécurisation d'un serveur apache MODSSL
Note sur le partitionnement relatif à 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, prévoyez une allocation relative à VOTRE installation.
N'oubliez pas de consulter Installation et sécurisation d'un serveur d'application Websphere
Note sur le partitionnement relatif à la création 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, prévoyez une allocation relative à
VOTRE installation. Personnellement, 500 Mo pour une sauvegarde full
mensuelle + les sauvegardes incrémentales journalières me conviennent
en faisant du ménage tous les mois, mais je préfère voir large.
N'oubliez pas de consulter Installation d'un serveur Samba pour une gestion de backup

=> Terminer en écrivant les partitions sur le disque 'Write' puis en
sortant du menu 'Quit'.

I-F - Initialisez une partition d'échange

Pour se faire, acceptez de l'initialiser sur /dev/sda2 et recherchez les blocs défectueux.

I-G - Initialisez les partitions Linux' créées en I.E

'Suivant' pour la première, 'Autre choix' pour les suivantes. Recherchez les blocs défectueux pour chacune des partitions Entrez les points de montage précises dans I.E.

I-H - Installez le noyau et les modules

'CDROM Debian trouve ?', répondez 'Oui'.

I-I - Configurez les modules et pilotes matériel

Choisissez des pilotes à ajouter au système. NDR : pour Compaq, le pilote réseau peut être 'net' -> 'tlan' et vous pouvez l'ajouter dans le noyau.

I-J - Configurez le réseau

Choisissez DHCP ou Adressage statique.

I-K - Installez le système de base

Utilisez le 'media' : 'CDROM'. Utilisez le 'répertoire pour système de base' : 'instmnt'.

I-L - Rendez le système amorcable

Installez dans le mbr

I-M - Créez une disquette d'amorçage

Ceci est optionnel

I-N - Retirez la disquette et le CDROM et 'réamorcez le système

II - Configuration initiale du système

Cette partie est relative à la configuration suivant le reboot de 1

II-A - GMT : Oui

=> Choisir 'Europe' puis 'Paris'.

II-B - Mots de passe

'Activation mots de passe MD5' : Oui => 'Activation mode shadow' : Oui => Entrez le mot de passe pour root

II-C - Créer un premier utilisateur

Cet utilisateur sera par la suite utilisé comme administrateur du système

II-D - Retirer le package PCMCIA => Oui, si vous ne l'avez pas déja supprimé

II-E - Connexion PPP pour installer le système

Non

II-F - 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 possédez.
'Ajouter une autre source APT' : Non
'Use security update' : Non

II-G - Utiliser TaskSel

Non

II-H - Utiliser Dselect

Non

II-I - Si vous avez supprimé le package PCMCIA en 2.4., répondez 'Oui' quand on vous demande de le retirer du système.

II-J - Supprimer les .deb

Oui

II-K - Configuration des Mails

4. Local delivery only'
Entrez le nom de l'administrateur configuré en II.C. et confirmez.
Le système doit maintenant vous donner un prompt.

III - Premier accès au système et sécurisation minimale

Vous venez de finir la configuration initiale du système et votre station n'est normalement pas encore connectée au réseau.

III-A - Loguez 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'identité super-utilisateur.

III-B - Lancez Dselect

- Update

- 'Select' et sélectionnez les packages que vous désirez à partir du CD-ROM (vim, gpm, emacs, etc…)

- 'Install'

NDR : Même si vous ne sélectionnez rien, passez quand même par les étapes 'Update' et 'Install'.
NDR : Il est conseillé de ne pas faire plusieurs choses à la fois : Installation minimale, puis installation des packages absolument nécessaires, puis installation du serveur X par exemple.
NDR : Il FORTEMMENT conseille de n'installer que le STRICT necessaire.
Finissez en lancant les commandes updatedb et mandb
Man : dselect, apt, updatedb et mandb.
Sécurisez un minimum le système :

III-C - Fichiers de configuration de l'environnement administrateur.

NDR : J'appelle environnement administrateur, l'environnement des utilisateurs qui auront la possibilité d'administrer la station.
Ajoutez un fichier ~/.bash_logout contenant :

case "`tty`" in
/dev/tty[0-9]) clear
esac

Ajoutez un fichier ~/.bash_profile contenant :

umask 027
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi

Modifiez le fichier ~/.bashrc pour y faire figurer :

export TMOUT=300
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias ll='ls -l'
alias la='ll -A'
alias l='ll -CF'
alias do_term='eval `tset -s -Q vt100`'
alias show_process='ps ax -o user,pid,command'
# Décommentez ici si vous souhaitez ce type de prompt
# export PS1='\e[1;34m\u\e[0m@\h:[\e[1;31m\t\e[0m]:\e[1;32m\w\e[0m\$ '

Ajoutez un fichier ~/.inputrc contenant :

set bell-style none
"\C-a": beginning-of-line
"\C-e": end-of-line
"\C-b": backward-word
"\C-f": forward-word
"\C-k": kill-line
"\C-j": backward-kill-line
"\C-x": kill-word
"\C-w": backward-kill-word
"\C-r": reverse-search-history
"\C-t": forward-search-history
"\C-space": set-mark
"\C-h": kill-region
"\C-y": yank
"\C-u": undo

source ~/.bashrc => pour utiliser les paramètres du fichier modifié.
chmod 750 /home/username => gestion de droits.
chmod 640 ~/.bash* => gestion de droits.
chmod 640 ~/.inputrc

Man : bash, chmod, chown

III-D - Fichiers de configuration de l'environnement super-utilisateur.

Loguez-vous en root et mettez en place les fichiers de configuration suivants :

~/.bashrc
umask 027
export TMOUT=300
export PS1='!!!ROOT!!!@\h:\w\$ '
export HISTFILE=/dev/null
alias l='ls'
alias ll='l -l'
alias la='ll -a'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias userdel='echo "Why not deluser ?"'
alias useradd='echo "Why not adduser ?"'

~/.bash_logout
case "`tty`" in
/dev/tty[0-9]) clear
esac

Ajoutez un fichier ~/.inputrc contenant :

set bell-style none
chmod 750 /root
chmod 640 ~/.bash* ~/.profile
chmod 640 ~/.inputrc

III-E - Sécurisation minimale (en mode super-utilisateur)

Man : init, update-rc.d
Inetd :
Commentez l'intégralité du fichier /etc/inetd.conf.

/etc/init.d/inetd stop # Arrêt du service
update-rc.d -f inetd remove # Suppression des services demarrés au boot.

Man : inetd, inetd.conf Dans /etc/rc2.d, supprimez tous les services non obligatoires : lpd, nfs-common, portmap Sshd : Dans /etc/ssh/sshd_config

PermitRootLogin no
RSAAuthentication no
PubkeyAuthentication no
Banner /etc/issue.net
ChallengeResponseAuthentication no
ClientAliveInterval 20
ClientAliveCountMax 3
GatewayPorts no
LoginGraceTime 60

Dans /etc/ssh/ssh_config :

ForwardAgent no
ForwardX11 no
RhostsAuthentication no
StrictHostKeyChecking ask
Finissez par /etc/init.d/ssh restart

Et notez le fingerprint SSH.
Man : sshd, sshd_config
Bannière de login :
Dans /etc/issue.net et /etc/issue, entrez une bannière légale présentant les restrictions d'accès au système.
Vous pouvez par exemple utiliser un message du type :

**********************************************************
***                  Serveur {HOSTNAME}                ***
***                        (@IP)                       ***
**********************************************************
***                                                    ***
***   Consultez les articles 323.1 a 323.3  du Nouveau ***
*** Code Pénal relatifs aux autorisations d'accès à ce ***
*** système.                                           ***
**********************************************************
***   Toutes les connexions et accès à ce système font ***
*** l'objet d'un enregistrement.                       ***
**********************************************************

Dans /etc/securetty, commentez toutes les lignes commencant par tty.
NDR : L'action précédente supprimera toute possibilité de vous connecter avec l'utilisateur 'root' en mode console. Vous devrez désormais vous connecter avec un utilisateur puis entrer la commande 'su'.
Man : login, issue, securetty
Modifiez /etc/lilo.conf de façon à obtenir ces lignes :

password=motdepasse
delay=100
default=Linux
image=/vmlinuz
label=Linux
read-only
restricted

Puis :

lilo
chmod 640 /etc/lilo.conf

Man : lilo, lilo.conf
Syslogd :

cp /etc/syslog.conf /etc/syslog.conf.orig
chmod 640 /etc/syslog.conf

Éditez /etc/syslog.conf pour supprimer les lignes :

# Logging for INN news system
#
news.crit                       /var/log/news/news.crit
news.err                        /var/log/news/news.err
news.notice                     -/var/log/news/news.notice
daemon.*;mail.*;\
news.crit;news.err;news.notice;\
*.=debug;*.=info;\
*.=notice;*.=warn       |/dev/xconsole
lpr.*                           -/var/log/lpr.log
uucp.*                          /var/log/uucp.log
#
# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info                       -/var/log/mail.info
mail.warn                       -/var/log/mail.warn
mail.err                        /var/log/mail.err

Supprimez tous les '-' devant les noms de fichiers.
Supprimez tous les commentaires restant après *.emerg.
Décommentez la ligne

cron.*                          /var/log/cron.log

Redémarrez le démon syslogd :

/etc/init.d/sysklogd restart

Effacez les fichiers de log superflus :

cd /var/log && rm -rf mail.err mail.info mail.warn lp* news/ uucp.log

Man : syslogd, syslog.conf
Dans le répertoire '/etc/cron.weekly', commentez toutes les lignes du fichier 'lpr'.

III-F - Recompilation du noyau pour le support firewall ipchains

NDR : Le noyau que nous configurons ici ne doit pas être considéré comme le noyau final. Une documentation abondante est présente sur Internet de même que dans le répertoire Documentation figurant dans les sources du noyau.
NOTE : Si vous utilisez le package de la version 2.2.20 comme présenté dans cette documentation, prenez garde à ne pas activer la fonctionnalité 'kernel loader' pour éviter la faille 'ptrace' ou pensez à patcher, sécuriser votre système.
Lancez dselect et ajoutez le package relatif aux sources du noyau que vous désirez installer. L'installation suivante, relative au noyau 2.2.20 devrait cependant être 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 où 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', vérifiez que votre pilote de carte réseau est sélectionné.
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

Éditez 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 à jour le système.
Rebootez le système.

Si tout c'est bien passé, sauvegardez la configuration :

cp /usr/src/linux/.config /boot/config-2.2.20-fw

III-G - Configuration du firewall Ipchains

Man : ipchains, sysctl, sysctl.conf
Créez le répertoire pour le stockage des scripts du firewall :

mkdir -p /home/system/scripts/fw
chown -R root:adm /home/system
chmod 4750 /home/system

Créez les scripts d'activation/désactivation du firewall (voir Annexe 1 - Paramètrage 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/*

Créez le script /etc/init.d/init_ipchains.sh (voir Annexe 1 - Paramétrage du firewall Ipchains).
Donnez les droits au script : 'chmod 750 /etc/init.d/init_ipchains.sh'
Ajoutez le script pour le démarrage du système :

update-rc.d init_ipchains.sh defaults

Activez le firewall : /etc/init.d/init_ipchains.sh start

/etc/init.d/init_ipchains.sh start

III-H - Mise à jour sécurité du système (super-utilisateur)

Vous pouvez maintenant brancher la machine sur le réseau.
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 http://non-us.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

IV - Sécurisation modérée

IV-A - Notes sur le boot du système et sur le noyau

NDR : Il est futile d'indiquer qu'un individu avec un accès physique au serveur implique que le serveur est compromis.
Un seul noyau doit être chargeable lors de l'invite par défaut.
Tout passage de paramètre au noyau lors du boot doit être interdit.
Le chargement dynamique de modules devrait être interdit.
Dans le cas ou cela est impossible, appliquez un patch permettant de bloquer le chargement des modules après le boot.

Il peut également être intéressant de modifier la séquence d'amorçage du BIOS de façon à débuter par le chargement du MBR du disque dur.

IV-B - Sécurisation du système de fichiers

NDR : Après ces modifications, n'oubliez pas que certaines partitions sont montées en lecture seule. Vous pouvez remonter une partition en lecture/ écriture avec (par exemple) :

mount -o remount,rw /local

Éditez le fichier /etc/fstab de facon à monter les partitions présentées en I.E 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 procédé à la préparation 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 procédé à la préparation 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 système ou remontez les partitions.
Man : fstab, mount.

IV-C - Sécurisation des comptes

Durcissement de la politique de mots de passe :
Modifiez le fichier /etc/login.defs de la façon suivante :

LOG_OK_LOGINS yes
SULOG_FILE /var/log/sulog
ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin
UMASK 027
PASS_MAX_DAYS 30
DEFAULT_HOME no

MAN : login.defs
Suppression des utilisateurs et groupes inutiles :

unalias userdel
for i in `echo games sync sys irc` ; do (echo -n "Removing user $i : " &&  \
userdel $i 2> /dev/null && echo "done.") || echo "failed."; done
for i in `echo irc dialout fax  voice  audio  dip  video` ;  do  (echo  -n \
"Removing group $i : " && groupdel $i 2>  /dev/null &&  echo "done.") || \
echo "failed."; done
source ~/.bashrc

Désactivation des comptes inutiles :

for i in `echo lp list uucp news proxy postgres www-data nobody` ; do (echo\
-n "Falsing $i : " && chsh -s /bin/false  $i &&  echo  "done.")  ||  echo\
"failed."; done

MAN : userdel, chsh, false
Réappropriation des fichiers non affectés (N'oubliez pas les permissions du système de fichier /usr !) :

for i in `find / -nouser -o -nogroup` ; do echo  "Giving  $i  to  root" && \
chown root:root $i && chmod 600 $i; done

Déconnexion des comptes en inactivité :
Ajoutez/Modifiez les lignes suivantes dans le fichier /etc/profile :

export TMOUT=300
umask 027

Agrégation des comptes dans des groupes :

Tous les comptes utilisateurs doivent faire partie de groupes appropriés. Nous nous basons dans ce document sur deux groupes existant, mais cette déclinaison est arbitraire.

Le groupe adm est réservé aux administrateurs (voir Les administrateurs n'ont pas besoin de passer root).
Le groupe users est réservé aux utilisateurs non administrateurs.

Modifiez /etc/adduser.conf pour faire figurer :

USERGROUPS=no
DIR_MODE=0700

Modification des squelettes de création de compte :

/etc/skel/.bash_profile :
umask 027
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
if [ -f ~/.alias ]; then
source ~/.alias
fi

/etc/skel/.alias :
alias   ls='ls --color=auto'
alias   md='mkdir'
alias   rd='rmdir'
alias   l='ls'
alias   ll='l -l'
alias   la='ll -a'
alias   rm='rm -i'
alias   cp='cp -i'
alias   mv='mv -i'

Ajoutez les fichiers suivants :

/etc/skel/.bash_logout :
case "`tty`" in
/dev/tty[0-9]) clear
esac

/etc/skel/.inputrc :
set bell-style none

Donnez les droits :

chmod 640 /etc/skel/.bash_logout /etc/skel/.inputrc'

Mettez en place la méthode de suppression de comptes :
Modifiez /etc/deluser.conf pour faire figurer :

REMOVE_HOME = 1
BACKUP = 1

Créez le répertoire de backup des comptes supprimés :

mkdir /home/system/deleted_accounts
chown root:adm /home/system/deleted_accounts
chmod 1750 /home/system/deleted_accounts

Créez le fichier suivant :

mount -o remount,rw /usr

/usr/local/sbin/deluser.local :

#!/bin/sh
if [ -d /home/system/deleted_accounts ] && [ $1 ]
then

echo "  deluser.local :"
echo "  Moving $1.tar.bz2 to /home/system/deleted_accounts..."

if  [ $PWD ]   &&  [ $PWD != "/home/system/deleted_accounts" ]  && \
[ -f $1.tar.bz2 ]
then
mv $1.tar.bz2 /home/system/deleted_accounts/$1.tar.bz2
fi

if [ -f /home/system/deleted_accounts/$1.tar.bz2 ]
then
echo  "    Giving  admins  permissions  to  /home/system/deleted_\
accounts/$1.tar.bz2"
chown root:adm /home/system/deleted_accounts/$1.tar.bz2
else
echo "  Error : $1.tar.bz2 is no regular file !?!?!"
fi

else

echo "deluser.local error:"
if [ $1 ]
then
echo "No backup directory to store $1.tar.bz2."
else
echo "Error in arguments !?!?!"
fi
fi

Puis :

chmod 700 /usr/local/sbin/deluser.local
mount -o remount,ro /usr

IV-D - Recherche et modifications de droits de fichiers

Recherche de tous les fichiers sgid et suid :

cd /root/tmp
find / -type f \( -perm -004000 -o -perm -002000 \) -exec ls -la {} \;  2> \
/dev/null > sguid_original_list.txt

Suppression du flag suid/sgid quand cela n'est pas indispensable :

mount -o remount,rw /usr/
for i in `echo /bin/ping /bin/mount /bin/umount /usr/bin/at /usr/bin/newgrp\
/usr/bin/chfn   /usr/bin/chsh   /usr/bin/gpg   /usr/bin/lpq  /usr/bin/lpr\
/usr/bin/lprm /usr/bin/mtr`; do  echo "Removing  sguid bit  from  $i." &&\
chmod -s $i ; done
mount -o remount,ro /usr/

Attention à ces suppressions de privilèges si vos démons en ont besoin.

Restreignez l'usage de l'utilitaire cron en créant un fichier /etc/cron.allow:

touch /etc/cron.allow
chmod 640 /etc/cron.allow

=> Pour qu'un utilisateur soit autorisé à utiliser l'utilitaire cron et ses dérives, vous devrez l'enregistrer dans ce fichier.

MAN : cron, crontab

IV-E - 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 éditez le fichier de façon à ajouter (raccourcis vi) :

# Cmnd alias specification
Cmnd_Alias REBOOT=/sbin/reboot
%adm ALL=NOPASSWD:REBOOT

MAN : usermod, sudoers visudo, sudo

IV-F - 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 démon NTP et exécutez 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 système grâce au serveur NTP
0 */6 * * * root /etc/init.d/ntpdate start > /dev/null

MAN : ntpdate

IV-G - Génération automatisé d'un rapport système

Le script présent en annexe 'Annexe 2 - Génération automatisée de rapport système' peut être éxécute par la crontab à intervalles périodique. Il génère un rapport système succinct qui peut être envoyé par mail aux administrateurs ou stocké dans un répertoire.

Attention à respecter l'indentation !

Je vous conseille de vérifier le script de façon à ce qu'il n'exécute que les commandes que vous désirez. Ainsi, le script récupère par exemple les fichiers de logs présentés en Installation et premiers pas avec Modular-Syslog.

Installation du script (nous utilisons le script présent 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 à 09H00 AM:

# Genere le rapport system
0 9 * * * root /home/system/scripts/reports/system_report.sh
chmod 640 /etc/crontab

IV-H - Installation et premiers pas avec Modular-Syslog

Modular-Syslog est disponible à : 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

Vous pouvez très bien décider, si vous en comprennez l'intérèt de modifier le chemin du fichier de configuration par défaut avant de compiler le démon 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
mount -o remount,ro /usr/

On modifie le script d'initialisation du démon /etc/init.d/sysklogd :

SYSLOGD="-i linux -i unix"

On stoppe le démon klogd dont nous nous passerons désormais :

/etc/init.d/klogd stop

On le supprime des runlevels correspondants :

update-rc.d -f klogd remove

On redémarre le nouveau démon 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 désormais contenir des lignes au format modular-syslog, ce qui empêche 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 :

Si vous ajoutez des fichiers de log dans la configuration, prenez garde à faire un touch du fichier destination dans le répertoire concerné. Nous ajoutons deux règles qui permettent de filtrer les messages envoyés par le firewall ipchains à /etc/syslog.conf ainsi que deux règles permettant : l'enregistrement des événements liés aux demandes de connexion et les événements 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 sécurité
auth,authpriv.*  %regex -m "(sshd.*password)|(PAM.*ssh)|(PAM.*su)\
|(PAM.*failure)" %classic /var/log/sécurité.log
auth,authpriv.*  %regex -m "libsafe.so" %classic /var/log/sécurité.log
auth.*          %regex -m "not receive identification" %classic\
/var/log/sécurité.log
kern.*           %regex -m "Security" %classic /var/log/sécurité.log
kern.*           %regex -m "device.*promiscuous" %classic\
/var/log/sécurité.log

Nous mettons en place les fichiers destination et redémarrons le serveur syslog :

touch /var/log/{sécurité,fw_{deny,accept}}.log
chown root:adm /var/log/{sécurité,fw_{deny,accept}}.log

Et si votre umask n'est pas conforme à celui de cette doc :

chmod 640 /var/log/{sécurité,fw_{deny,accept}}.log
/etc/init.d/sysklogd restart

Prise en compte des nouveaux fichiers pour la rotation des logs :

Nous créons (s'il n'existe pas) un répertoire qui nous servira à stocker nos scripts appelés par la crontab et dont l'objectif est d'assurer la stabilité du système :

mkdir /home/system/scripts/crond

Nous éditons un fichier /home/system/scripts/crond/sysklogd (à l'image de celui présent 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 éditons /etc/crontab pour ajouter ce script :

# Tourne les logs sécurité chaque jour
5 0 * * * root /home/system/scripts/crond/sysklogd

IV-I - Vérification des empreintes des packages à installer

Consultez d'abord : 'Informations sur la gestion de packages Debian - Mise à jour du système avec apt'

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 possédant pas de signature :

/usr/bin/debsums -l > nosig.txt

Si vous voulez vérifier les empreintes des fichiers d'un package :

debsums -s package_name.

MAN : debsums

IV-J - Système de fichiers ext3 avec un noyau 2.4 : de ext2 à ext3

Pour modifier le système de fichier d'une partition de façon à passer de ext2 à ext3, sans perte de données et sans reboot (si votre noyau est déjà compilé avec ce support bien sur), vous pouvez suivre la procédure suivante.

Commençons 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. Après le reboot, n'oubliez pas de mettre à jour la configuration lilo et de sauvegarder la configuration du noyau.

Prenons comme exemple la partition /backup du type (précisé dans /etc/fstab) suivant :

/dev/hda13 /backup ext2 ro,noexec,nosuid,nodev,sync 0 2

La procédure à 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

IV-K - Backup du système sur une partition spécifique

Nous présentons ici un moyen de sauvegarde des données système sur une partition réservée à cet usage.
Le backup du système est réalisé par un script 'fait maison' permettant une sauvegarde complète ou incrémentale des fichiers/répertoires à sauvegarder et autorisant le backup chiffre (avec openssl) des répertoires/fichiers paramétrés.

Ne sont pas présentes ici : La restauration du système à partir des données sauvegardées. Référez-vous à la partie Préparation d'une restauration du système en cas d'incident. L'accès à cette partition depuis un serveur distant pour un stockage de backup spécialisé. Vous pouvez vous référer à Installation d'un serveur Samba pour une gestion de backup pour un accès 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  présente
en 'ANNEXE 8 - Script de backup'.
chmod 750 /home/system/scripts/backup/system_backup.sh

Éditez le script pour configurer les fichiers ou répertoires que vous désirez sauvegarder en modifiant la variable 'BACKUP_FROM' :

Créez un fichier '/home/system/scripts/backup/include_but_ciphered' qui contiendra les fichiers ou répertoires que vous voulez ajouter dans l'archive chiffrée. Ce fichier doit exister mais peut être vide si vous ne voulez pas utiliser cette fonctionnalité :
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/répertoire. J'ai personnellement renseigné ce fichier de la manière 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 être accessible que par root ? Créez un fichier '/home/system/scripts/backup/exclude' qui contiendra les fichiers ou répertoires que vous ne désirez pas sauvegarder par rapport aux arborescences que vous aurez définies dans la variable 'BACKUP_FROM'.
NDR : Ce fichier doit exister mais peut être vide si vous ne désirez rien exclure. Le script de backup effectuant un 'cd /', configurez ce fichier en supprimant le premier '/' devant le chemin vers votre fichier/répertoire. J'ai personnellement renseigné ce fichier de la manière suivante :

usr/src
var/lock
var/run
var/tmp

Créez un fichier '/home/system/scripts/backup/cpioed' qui contiendra les répertoires dont vous souhaitez conserver les localisations et permissions grâce à une archive cpio. Ce fichier doit exister mais peut être vide si vous ne désirez rien exclure. Le script de backup effectuant un 'cd /', configurez ce fichier en supprimant le premier '/' devant le chemin vers votre fichier/répertoire. SEULS LES REPERTOIRES INDIQUES SONT SAUVEGARDES ! J'ai personnellement renseigné ce fichier de la manière suivante (je ne tiens pas à 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 désormais dans /backup : Une sauvegarde 'full' des fichiers ou répertoires que vous avez spécifiés. Un fichier de log contenant les erreurs rencontrées - vide si aucune erreur. Un fichier d'empreinte md5 des archives créées pour chaque fichier/répertoire spécifié. Dans /home/system/scripts/backup/.last_done (ou dans le fichier que vous avez-vous-même spécifié), vous avez la date de ce dernier backup.

Note : Les 328M de sauvegarde full réalisée précédemment l'ont été en environ ~5 minutes sur un PIII 700 avec 160Mo de RAM.

Vous pouvez désormais réaliser un backup incrémental des données sauvegardées précédemment.

En appelant à 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 été modifiés et pris en compte lors de cette sauvegarde incrémentale.

Vous pouvez appeler le script avec l'option '-f' : cela le forcera à suivre la procédure de sauvegarde 'full' en ne tenant pas compte du contenu du fichier '.last_done'.

Nous pouvons maintenant éditer notre fichier /etc/crontab pour appeler notre script de backup :

# Backup Full du système toutes les semaines à 00H30
30 0 * * 7 root /home/system/scripts/backup/system_backup.sh -f

# Backup incrémental du système toutes les 6 heures a xx:15
15 */6 * * * root /home/system/scripts/backup/system_backup.sh

Nous modifions également /etc/syslog.conf pour que les messages de backup soient consignés dans notre fichier de log sécurité :

syslog.notice        %regex -m "Backup" %classic /var/log/sécurité.log

Puis :

/etc/init.d/sysklogd restart

MAN : tar, gzip

IV-L - Préparation d'une restauration du système en cas d'incident

Notre objectif est de préparer un moyen de restauration du système simple à mettre en place et rapide à mettre en œuvre en cas d'incident. Nous allons pour ce faire créer une 'image' de notre système que nous graverons sur un CD. Dans le cas d'un crash, il sera possible de booter sur le CD et de restaurer le système.

NDR : La création de cette image nécessite 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 dédier une station à cet usage et non installer ces fonctionnalités 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 créer un système de fichier root contenant les binaires nécessaires à l'exécution du CD puis ajouter nos archives dans un répertoire et pour finir utiliser un script qui exécutera la restauration du système.
Pour ce faire, nous allons nous baser sur les fichiers fournis dans le jeu de CD Debian.

Récupération des fichiers nécessaires au boot et d'un système 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 inutilisée et occupant l'espace disque restant après installation du système.

Insérez le CD numéro 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/

Éditez le fichier isolinux.cfg :

TIMEOUT 0
PROMPT 1
DEFAULT /kernel/linpci
APPEND root=/dev/ram ro initrd=idepci.bin ramdisk_size=16384\
disksize=1.44 flavor=idepci
LABEL linux
kernel /kernel/linpci
DISPLAY isolinux.txt

Éditez le fichier isolinux.txt :
Debian-Secinst v0.1.5 Boot CD

Modification du système de fichier root original :

Nous montons maintenant le système 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 exécuter notre script de restauration :

cd /mnt/

Éditez le fichier etc/inittab :

# main setup program
<::respawn:/sbin/udbootstrap
>::respawn:-/restore.sh

Clavier Français 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 compilé en statique :
Récupérez 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 présent en Annexe 9 - Script de restauration à la racine (/mnt/restore.sh) et donnez-lui les droits

chmod 755 /mnt/restore.sh'.

Ajout des informations de backup :

NDR : Ces informations sont évidemment celles du système à restaurer et non celles du système sur lequel vous créez ce CD !

mkdir /mnt/backup && chmod 755 /mnt/backup

Éditez le fichier '/mnt/backup/server_infos' (ou le fichier que vous avez configuré 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 périphérique (ex : /dev/sda). un fichier 'fdisk_script' contenant les instructions à suivre pour créer 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 gérés 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' : résultat de la commande '/sbin/fdisk -l' démontez le système 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 système :
Connectez vous au système à sauvegarder et lancez un backup full via le script de backup fourni en 'Annexe 8 - Script de backup' ou récupérez les archives de votre dernier backup full. Sur la station que vous utilisez pour créer le cdrom de backup, créez le répertoire '/local/Debian/archives' et copiez vos archives à sauvegarder à l'intérieur (en respectant le nommage des archives en .tar.gz ou .cpio !). Une fois cette copie effectuée, créez un fichier /local/Debian/archives/infos.txt contenant les chemins vers les fichiers qui seront présents dans /mnt/archives/ (une fois le système de fichier monté par le script de restauration). Je vous recommande de créer ce fichier à la main plutôt que d'utiliser un find. J'ai personnellement renseigné ce fichier de la manière suivante (Notez la présence 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 recommande bien entendu de comparer le md5sum des fichiers générés par votre script de backup avec le md5sum des fichiers copiés sur la station utilisée pour créer l'ISO et de renouveler cette opération pour les fichiers qui seront présents sur le CD gravé.

Dans /local/Debian/archives, vous devez avoir un fichier protégé par le mot de passe présent dans votre script de backup. Déprotégez ce fichier avant de procéder à la création de l'ISO

NDR : J'insiste sur le fait que ce CD de restauration contient une sauvegarde de fichiers critiques et doit être protégé physiquement !!!

Préparation de l'ISO :
Préparation de l'image iso à 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 désormais une image 'debian.iso' que vous pouvez graver sur un CD.

Ce CD sera bootable et vous donnera accès 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 système pris comme en exemple en Backup du système sur une partition spécifique m'a pris 15 minutes sur un PIII 500 avec 128 Mo de RAM.

V - Sécurisation approfondie

NDR : Vous devez savoir ce que vous faites dans les parties présentées ici.

V-A - Installation du patch OpenWall

Le patch est téléchargeable 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 prépare 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 à ce moment, vous trouverez un nouveau menu nomme 'Security options'. Deux options demeurent non-activées après le passage du patch : 'Restricted /proc' 'Destroy shared memory segments not in use' => Vous pouvez activer 'Restricted /proc' mais il vous faudra une configuration supplémentaire des comptes administrateurs avec un outil comme sudo pour éviter que les admins ne passent root à 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 défaut par lilo en supprimant restricted de l'ancien noyau.

V-B - 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 système (?!).

V-C - Conserver une empreinte de vérification d'intégrité du système

Installez le package Debian :

mount -o remount,rw /usr

dselect => installation de 'aide'
=> La préconfiguration ne fonctionne pas, car elle tente d'exécuter un script dans /tmp
=> 'Initalize aide database ?' -> No

mount -o remount,ro /usr

Préparez 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 données : aide --init -V200

NDR : Est-il trivial de vous reccomander de ne pas faire de modifications pendant l'initialisation ?

Première sauvegarde de la base de données (la suite est donnée à titre d'exemple) :
Insérez 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 protégez-la en écriture.

Vérifier le système avec le support de sauvegarde :
Insérez la disquette

mount -o ro /dev/fd0 /mnt && cd /mnt
./aide -c ./aide.conf --check -V200
cd && umount /mnt

Mise à jour de la base de données sauvegardée :

aide --update -V200
cd /home/system/aide
mv aide.db.new aide.db
puis sauvegardez cette nouvelle base comme pour la création.

NDR : Ce qui précède est donné à titre d'exemple, Il serait plus approprié en cas de doute de booter le système sur un support amovible sur protégé en écriture et d'effectuer la vérification d'intégrité à partir de ce support.

MAN : aide, aide.conf

V-D - Gestion des quotas

NDR : Vous devez commencer a connaitre le système donc je n'explique plus les détails déjà présentés 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 première 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 à obtenir les informations sur l'ensemble du disque pour le choix des quotas précédents.

Créez un utilisateur fictif qui servira de modèle 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 modèle d'utilisateur :
Lancez 'edquota -u quotauser' et éditez les quotas :

/dev/sda8          0       2000       2000          0      500      500
/dev/sda10         0      10000      10000          0     1000     1000

Vous pouvez vérifier les quotas mis en place avec : 'quota -vu quotauser'

Pour un nouvel utilisateur {username}, vous pouvez associer ce modèle de quotas avec 'edquota -p quotauser {username}'.

Modifiez '/etc/adduser.conf' pour inclure ce modàle dans la définition des quotas :

QUOTAUSER="quotauser"

Activation - Désactivation - Etat des quotas (quelques exemples) :
Activation : /etc/init.d/quota start
Désactivation : /etc/init.d/quota stop
Etat (Active ou Desactive ? ) : quotaon -pa
Statistiques : repquotas -ugva

NDR : Le fichier d'initialisation des quotas au boot est placé dans /etc/rcS.d et sera donc active à chaque redémarrage de la station.

MAN : quotacheck, quotaon, quotaoff, quotastats, repquota, edquota, quota

V-E - Sécurisation PAM : Gestion des limites

Limites aux sessions :

Vérifiez avec 'grep pam_limits.so /etc/pam.d/ssh' que la librairie est activee (c'est le cas par défaut).
Constatez avec 'grep pam_limits.so /etc/pam.d/login' que la librairie n'est pas activée par défaut : => Activez la en décommentant la ligne. => Faites de même 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 utilisateur, entrez 'ulimit -a'

MAN : bash, ulimit

V-F - Disquette de secours avec Tomsrtbt

La distribution tomsrtbt est téléchargeable 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/

Insérez une disquette vierge.

./install.s

Vous avez désormais une disquette de secours.
En rebootant sur la disquette, deux choix vous sont proposés :

* Resolution de l'ecran.
* map du clavier.

Et puis en fait, le mieux est que vous lisiez la FAQ…

V-G - Installation de Prelude-Lml pour une remontee de log securisée vers un serveur centralisé

L'installation de Prelude-Lml est désormais présentée dans une autre documentation. Ne figurent ici que les aspects de configuration du moniteur Prelude qui sont spécifique à l'installation de notre station sécurisée.

La nouvelle documentation est intitulée « 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/ .

V-G-1 - Configuration initiale

Nous abordons ici la remontée de certains des logs 'sécurité' générés par la configuration présentée dans cette documentation.

NDR : Par la suite, nous emploierons le terme 'sonde' à la place de 'sensor'.
NDR : Cette configuration est minimale, je vous conseille, de lire les documentations disponibles sur prelude et de procéder à votre propre paramétrage. 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 à surveiller sont (voir Installation et premiers pas avec Modular-Syslog) : /var/log/fw_deny.log, /var/log/fw_accept.log et /var/log/sécurité.log :

< file = /var/log/auth.log
< file = /var/log/messages
> file = /var/log/sécurité.log
> file = /var/log/fw_accept.log
> file = /var/log/fw_deny.log

Nous allons charger notre propre série de règles :

< 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

Créez '/home/prelude/etc/prelude-lml/ruleset/debian-secinst.rules' :

# Customized prelude-lml rules file from debian-secinst v0.1.7 doc
# Simon Castro <scastro [at] entreelibre.com>
# 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;

Créez '/home/prelude/etc/prelude-lml/ruleset/ipchains.rules' a partir de 'Annexe 5 - Fichier de règles pour un support Ipchains avec Prelude-lml' si vous utilisez un firewall IpChains.

Attribuez les permissions correctes aux fichiers crées :

cd /home/prelude/etc/prelude-lml/ruleset/
chown prelude:prelude debian-secinst.rules ipchains.rules
chmod 640 debian-secinst.rules ipchains.rules

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 défaut, vos fichiers de logs (dans /var/log) sécurité.log et fw_[deny| accept].log doivent être en 640 et appartenir a root:adm (si vous avez suivi cette procédure). 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 après avoir perdu ses privilèges super-utilisateur.

Et redémarrez la sonde prelude-lml :

/etc/init.d/preludelogmonitor.sh restart

V-H - Sécurisation approfondie avec GrSecurity

GrSecurity est constitue d'un patch pour le noyau Linux et d'un utilitaire destine à être utilisé en espace utilisateur. Le patch accroît la sécurité du système en apportant des restrictions aux systèmes de fichiers /proc et /tmp, aux actions réalisables par des processus 'chrootes', en créant un espace de stockage d'ACLs (Access Control Lists) permettant d'implémenter un système base sur le modèle 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 également Pax : une protection du noyau permettant l'implémentation de pages mémoire non exécutables et un espace d'adressage aléatoire.

Nous allons tout d'abord commencer par patcher le noyau du système puis nous aborderons l'intégration des listes de contrôle d'accès. 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 présente sur le site avant de procéder aux manipulations décrites ci-après…
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 à vous de choisir…

V-H-1 - Patch du noyau : Compilation et installation

Récupérez le patch du noyau ainsi que chpax, vérifiez les MD5 et stockez les dans /home/system/download/.

Récupérez les sources du noyau 2.4.22, vérifiez 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, récuperez 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 été utilisees lors de la rédaction de cette documentation sont présentées dans 'Annexe 11 - Parametres de configuration d'un noyau GrSecurity' - puis compilez et installez votre nouveau noyau en suivant la procédure présentée 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 système 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 appropriées pour les administrateurs non-root du serveur. J'active l'option 'CONFIG_GRKERNSEC_CHROOT_SYSCTL' car je préfère créer un script d'initialisation chargé de positionner les bonnes valeurs lors du boot. Si vous préférez sécuriser « encore plus » votre installation, désactivez 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 déjà utilisés sur votre système. Une fois votre nouveau noyau installe, rebootez le système.

V-H-2 - Configuration du système

Créez les groupes suivants :

for i in `echo grsec_tpe grsec_sockall grsec_sock_cl grsec_sock_srv grsec\
_audit`; do groupadd $i; done

Créez le fichier /etc/sysctl.conf.grsecurity à partir du fichier présent en 'Annexe 12 - Configuration Sysctl de GrSecurity' et parametrez ce fichier selon vos besoins en mettant à jour les gid avec les groupes que vous venez de créer.

!!! Attention !!! La suite peut rendre votre système 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 répond à vos attentes, positionnez la variable 'grsec_lock' de sysctl.conf.grsecurity à '1' puis créez le fichier '/home/system/security/apply_grsec.sh' :

#!/bin/sh
/sbin/sysctl -p /etc/sysctl.conf.grsecurity

Configurez le système pour que ce script soit appellé au boot :

cd /etc/rc2.d
ln -s /home/system/security/apply_grsec.sh S{XX}apply_grsec

où {XX} correspond à votre priorité de lancement par rapport aux autres scripts exécutés lors du boot du système.

Modifiez votre fichier de configuration syslog pour stocker les alertes dans le fichier de log sécurité grâce aux entrées suivantes :

kern.* %regex -m "PAX" %classic /var/log/sécurité.log
kern.* %regex -m "grsec" %classic /var/log/sécurité.log

La configuration initiale est terminée… Voici la politique que j'applique personnellement (elle est fonction de l'usage final du serveur) : Tous les operateurs du système 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'établir de connexions distantes (Attention, c'est le cas pour le module WAS), je place Apache dans grsec_sock_cl; Les éventuels utilisateurs guests sont placés dans grsec_sockall et dans grsec_tpe. Une dernière note relative à l'interaction de notre noyau avec une installation Websphere telle que présentée dans Installation et sécurisation d'un serveur d'application Websphere : Si vous avez suivi la procédure d'installation de ce document le serveur d'application ne pourra plus démarrer 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 require
[...] 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 vérifiez 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 génère une quantité quelque peu importante de logs lors des stop/start du serveur d'applications, ceux-ci sont cependant facilement traçables par le critère « parent (stopServer.sh:17515)" par exemple.

V-H-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 tâches d'administration telles que la mise à jour des packages ou un reboot du serveur, vous devrez utiliser la commande 'gradm -a' de facon à passer en mode administration.

Lors de l'installation de Gradm, vous aurez à saisir un mot de passe pour la commande Gradm (passage en mode administration ou désactivation des ACLs), il paraît donc judicieux de saisir un mot de passe complexe ?!

Récupérez l'archive gradm-1.9.12.tar.gz sur le site de GrSecurity et stockez la dans /home/system/download puis vérifiez 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 désormais positionnée dans /etc/grsec/acl et sera utilisée si vous activez la sécurité - ce que vous ne faites pas bien évidemment !

Nous récupérons 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 à 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

Créez un répertoire /etc/grsec/debian-secinst, ajoutez y les fichiers présentés 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 système et configurez les selon vos besoins !

Modifiez le fichier /etc/grsec/acl avec le patch présent en 'Annexe 13' :

cd /etc/grsec
patch < patch
=> File to patch ? entrez acl puis supprimez le patch

Si vous avez installé un serveur Web, n'oubliez pas d'éditer le fichier /etc/grsec/debian_secinst/Dmn_apache pour définir les ports sur lesquels le serveur Apache est autorisé à se positionner en écoute.

Si vous avez modifie les ports d'écoute du démon SSH, faites de même avec le fichier /etc/grsec/debian_secure_acls/sshd.

Si vous avez configuré 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 à ce que les ACLs soient mises en place au boot du système.

VI - 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 présenter ici quelques d'aide-mémoires.

NDR: Attention aux permissions système de fichiers associées à vos partitions.

Mise à jour du système avec apt : apt-get update apt-get dist-upgrade -d cd /var/cache/apt/archives Vérifier l'empreinte md5 du(des) package(s) telecharge(s). dpkg-deb -I {nom_du_package}.deb md5sums
=> Vérifiez 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 répertoire 'toto'. dpkg -l => Tous les packages installes. dpkg -l '*pattern*' => Tous les packages installes relatifs à '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 téléchargés s'ils ne sont pas effacés. /var/lib/dpkg/info/* => contient les informations relatives aux packages installes.

I.a. Création d'un package Debian

Cette création de package est plus artisanale qu'autre chose. Je vous conseille la lecture de www.debian.org/doc/manuals/maint-guide/ pour la création de package .deb standards. NDR : Nous nous servons de l'utilitaire 'fakeroot' dont je ne vous recomande pas l'installation sur un serveur de production.

On crée 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 crée les fichiers de contrôle :

cat > ./DEBIAN/control << EOF
Package: debian-secinst-doc
Version: 0.0.1
Section: doc
Priority: optional
Architecture: all
Depends:
Maintainer: Simon Castro <scastro@entreelibre.com>
Description: Installation et  sécurisation  d'une  station  Debian  Woody\
stable
Installation et sécurisation d'une station sous Linux Debian 3.0 stable.
EOF

cat > ./DEBIAN/copyright << EOF
debian-secinst-doc
Copyright (c) 2003 - Simon Castro <scastro [at] entreelibre.com>

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 <scastro [at] entreelibre.com>

-- Simon Castro <scastro [at] entreelibre.com> 2003-03-17
EOF

On génère les empreintes MD5 :

find usr/ -type f -exec /usr/bin/md5sum {} >> ./DEBIAN/md5sums \;

On compresse ce qui doit l'être et on positionne les droits :

gzip --best ./DEBIAN/changelog
find . -type d | xargs chmod 755
find . -type f | xargs chmod 644

On crée le package :

fakeroot dpkg-deb --build ./debian-secinst-doc-0.0.1/\
debian-secinst-doc-0.0.1.deb

VII - Compilation du noyau

VII-A - Compilation d'un noyau personnalise

NDR : exemple avec une recuperation pour la première fois des sources du noyau 2.2.20. Dans le cas contraire, sauvegardez votre fichier de configuration puis make clean, make mrproper et vérifiez EXTRAVERSION dans ./Makefile.

Récupérez 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

VII-B - Installation du noyau

L'exemple pris ici est relatif à la première installation d'un nouveau noyau sur le système.

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'entrée suivante :

image=/boot/linux_perso
label=perso
read-only
restricted

VIII - Administration : quelques conseils

Sont présentés ici quelques conseils relatifs à l'administration de la station installée.

VIII-A - J'ai oublié de préparer une partition …

Vous voulez installer une partition supplémentaire que vous n'aviez pas prevue auparavant (ex: /var/www ou /var/mysql …).

Il doit vous rester de la place sur la dernière partition que vous aviez crée en '1.5. Partitionnez le disque dur'.
Nous allons nous servir de cet espace pour ajouter une nouvelle partition.

Faites bien ATTENTION à ce que vous allez faire ensuite…

Commencez par sauvegarder ce que vous aviez installé 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 <enter> puis '+64M' => Nous ajoutons une nouvelle partition de 64M. Entrez 'n' puis <enter> puis <enter> => Nous ajoutons une nouvelle partition pour l'espace disque restant. Entrez 'w' pour écrire la nouvelle table de partition sur le disque et quitter. Editez /etc/fstab pour supprimer la référence à l'ancienne partition /dev/sda11.

Rebootez.

Formattez les deux nouvelles partitions :

mke2fs /dev/sda11
mke2fs /dev/sda12

Vérifiez les deux nouvelles partitions :

e2fsck /dev/hda11
e2fsck /dev/hda12

Editez /etc/fstab pour refléter le changement :

/dev/sda11  /var/www ext2   rw,nosuid,nodev        0       2
/dev/sda12  /local   ext2   ro,noexec,nosuid,nodev  0       2

Créez le point d'entrée /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 données.
mount -o remount,ro /local

VIII-B - Dselect ne parvient pas à configurer les packages à cause des permissions de /tmp

Après avoir vérifié que le package que vous voulez installez/configurer est correct.

mount -o remount,exec /tmp

Configurez votre package

mount -o remount,defaults /tmp

VIII-C - SmartHost Exim

Exim doit normalement être configuré pour gérer vos Mails en local si vous avez utilisé cette documentation pour l'installation.

Nous configurons maintenant exim pour qu'il soit en mesure de transmettre les mails à 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"

VIII-D - Client Samba

Votre noyau doit être compilé 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}

IX - Installation et sécurisation d'un serveur Apache MODSSL

Les actions réalisées ici ont été réalisées après avoir suivi les étapes suivantes de la procédure générale :

- Installation du système

- Configuration initiale du système

- Premier accès au système et sécurisation minimale

- Sécurisation modérée

- Gestion des quotas

- Sécurisation PAM : Gestion des limites

IX-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

IX-B - Configuration initiale

Ajoutez les règles suivantes à 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

Créez 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

Préparez le certificat (ou récuperez le votre) :

mkdir /etc/apache/ssl
cd /etc/apache/ssl
openssl genrsa -out {HOSTNAME}.key 2048
openssl req -new -x509 -days 365 -key m18412.key -out m18412.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 présent en 'Annexe 6 - Fichier de configuration Apache minimal'.

Créez le groupe webadm: groupadd webadm

Préparez le répertoire de logs :

mkdir /var/log/apache
chown root:webadm /var/log/apache && chmod 3750 /var/log/apache

Préparez la rotation des logs en modifiant le fichier /etc/logrotate.d/apache sur les lignes suivantes (Vous devriez adapter cette configuration à votre environnement en créant un script d'archivage dans un répertoire distinct) :

daily
rotate 365
create 640 root webadm

Démarrez 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 entrées suivantes dans /etc/sudoers pour permettre à 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-répertoires de 'htdocs' peut être 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 désormais accéder à cette arborescence et poser les fichiers nécessaires au site des facons suivantes : {UserName}:webadm => Par défaut {UserName}:www-data => Avec un chown. => Attention, dans les deux cas aux permissions affectées aux fichiers, elles doivent au moins être en 644 pour le premier cas et en 640 pour le second cas.

IX-C - Intégration 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

IX-D - Empreinte du système

Suivez la procédure présentée en Conserver une empreinte de vérification d'intégrité du système

IX-E - Sauvegarde du système

Référez vous à Backup du système sur une partition spécifique.

X - Installation et sécurisation d'un serveur d'application Websphere

Ce que nous abordons ici a été réalisé après le suivi de la partie Installation et sécurisation d'un serveur Apache MODSSL'.

Le CD d'installation utilise de Websphere contient la version 5.0 pour Linux et je rappelle qu'IBM Websphere est un logiciel payant et que le piratage est interdit.

Pour commencer, récupérez le fichier 'doc/InstallGuide_fr.PDF' et lisez le :)

Et pour finir, je n'aborde pas ici la configuration/administration du serveur d'application en lui-même.

L'installation du wrapper libsafe (presentee en Installation du wrapper libsafe) a été réalisée avec succès une fois l'installation de Websphere terminée.

X-A - Installation

Cette partie présente la procédure à suivre pour une installation 'standard' d'IBM Websphere Application Server.

mount -o remount,rw /usr

/etc/init.d/apache stop
cp /etc/apache/httpd.conf /etc/apache/httpd_before_was.conf

mkdir /usr/local/websphere500
chown root:root /usr/local/websphere500
chmod 755 /usr/local/websphere500
mkdir /usr/local/websphere500/install

mount /dev/cdrom /mnt
cd /usr/local/websphere500/install
cp /mnt/linuxi386/responsefile.txt .

Éditez responsefile.txt de telle sorte que :

[...]
< -P wasBean.installLocation="C:\Program Files\WebSphere\AppServer"
> -P wasBean.installLocation="/usr/local/websphere500/appserver"
[...]
< -P mqSeriesBean.active="true"
< -P mqSeriesServerBean.active="true"
< -P mqSeriesSamplesBean.active="true"
> -P mqSeriesBean.active="false"
> -P mqSeriesServerBean.active="false"
> -P mqSeriesSamplesBean.active="false"
[...]
< -P ihsFeatureBean.active="true"
< -P ihsPluginBean.active="true"
< -P apachePluginBean.active="false"
> -P ihsFeatureBean.active="false"
> -P ihsPluginBean.active="false"
> -P apachePluginBean.active="true"
[...]
< -W nodeNameBean.nodeName="DefaultNode"
< -W nodeNameBean.hostName="127.0.0.1"
> -W nodeNameBean.nodeName="{YOUR_NODE_NAME}"
> -W nodeNameBean.hostName="{YOUR_IP_ADDRESS}"
[...]
< -W serviceSettingsWizardBean.active="true"
< -W serviceSettingsWizardBean.ihsChoice="true"
< -W serviceSettingsWizardBean.wasChoice="true"
< -W serviceSettingsWizardBean.userName="YOUR_USER_NAME"
< -W serviceSettingsWizardBean.password="YOUR_PASSWORD"
> #-W serviceSettingsWizardBean.active="true"
> #-W serviceSettingsWizardBean.ihsChoice="true"
> #-W serviceSettingsWizardBean.wasChoice="true"
> #-W serviceSettingsWizardBean.userName="YOUR_USER_NAME"
> #-W serviceSettingsWizardBean.password="YOUR_PASSWORD"
[...]
< -W defaultApacheConfigFileLocationBean.value=
> -W defaultApacheConfigFileLocationBean.value=/etc/apache/httpd.conf
[...]

cd /mnt/linuxi386/
./install -options /usr/local/websphere500/install/responsefile.txt

Des fichiers de log sont crées dans /tmp : vous pouvez suivre le processus d'installation en les consultant.

Quand l'installation est terminée :

umount /mnt
mv /etc/apache/httpd_before_was.conf /etc/apache/httpd.conf
Ajoutez ce qui suit au fichier /etc/apache/httpd.conf  avant les  directives
VirtualHost
########################
### Plugin WebSphere ###
########################
LoadModule app_server_http_module\
/usr/local/websphere500/appserver/bin/mod_app_server_http.so
WebSpherePluginConfig\
/usr/local/websphere500/appserver/config/cells/plugin-cfg.xml
#Alias /WSsamples /usr/local/websphere500/appserver/WSsamples
#Alias /IBMWebAS/ /usr/local/websphere500/appserver/web/

cd /usr/local/websphere500/appserver/config/cells/
cp plugin-cfg.xml plugin-cfg.xml.orig
cd /usr/local/websphere500/appserver/bin
./GenPluginCfg.sh
/etc/init.d/apache start

=> Vérifiez qu'Apache tourne correctement. => Si vous rencontrez des erreurs, editez '/usr/local/websphere500/appserver/config/cells/plugin-cfg.xml' et au niveau de la ligne '<Log LogLevel="Error" Name="/usr/local/websphere500/appserver/logs/http_plugin.log"/', remplacez 'Error' par 'Trace'. => Consultez ensuite le fichier '/usr/local/websphere500/appserver/logs/http_plugin.log' après avoir essayé 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 !
=> Le test d'installation via 'ivt' lance également le serveur d'applications par défaut (server1) et celui-ci reste lance à la fin du test.
=> Vous pouvez donc tester que WAS est bien installé en entrant http://{@IP}/snoop dans un navigateur.

X-B - Configuration initiale

Restauration du 'read-only' sur /usr, déplacement vers /var/was, attribution de permissions restreintes et exécution du service WAS sous une identitée restreinteb

Stoppez le service Websphere si celui-ci est démarré :

cd /usr/local/websphere500/appserver/bin/
./stopServer.sh server1

Stoppez le serveur Apache si celui-ci est démarré :

/etc/init.d/apache stop

Création d'un nouvel utilisateur :

Créez 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

Créez des limites spécifiques à cet utilisateur was dans le fichier

/etc/security/limits.conf :
was         hard    memlock 128000
was         hard    nofile  32000
was         hard    cpu     100

Déplacement 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

Vérifiez que la partition est montée, puis :

chown root:was /var/was
chmod 3770 /var/was

Créez les répertoires 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 répertoires dans /usr/local et créez 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 appropriées sur le répertoire /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 appropriées sur le répertoire

/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 *
find . -type d -exec chmod 750 \{\} \;
--- NOTE --- NDR : La j'ai fait cette connerie :( => 'find . -type f -exec chmod 640 \{\} \;'

… Correction à la prochaine install pour quelque chose de meilleur que :

find . -type f -name "*sh" -exec chmod 750 \{\} \;
find ./java/bin -type f -exec chmod 750 \{\} \;
find ./java/jre/bin -type f -exec chmod 750 \{\} \;
--- NOTE ---

Exécution de Was sous une identité restreinte :

Modifiez les paramètres de la JVM pour une adaptation à VOTRE (Mon serveur de test possède 156M de Ram et 300M de Swap) serveur dans '/var/was/config/cells/{HOSTNAME}/nodes/{HOSTNAME}/servers/server1/server.xml' :

<jvmEntries xmi:id="JavaVirtualMachine_1" verboseModeClass="false"\
verboseModeGarbageCollection="false" verboseModeJNI="false"\
initialHeapSize="96" maximumHeapSize="96" runHProf="false"\
debugMode="false" debugArgs="-Djava.compiler=NONE -Xdebug -Xnoagent\
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7777"\
disableJIT="false"/>

Modifiez le fichier /var/was/config/cells/{HOSTNAME}/nodes/{HOSTNAME}/servers/server1/server.xml de facon à obtenir :

<exécution xmi:id="ProcessExecution_1" processPriority="20" umask="007"\
runAsUser="was" runAsGroup="was"/>

à la place de :

<exécution xmi:id="ProcessExecution_1" processPriority="20" runAsUser=""\
runAsGroup=""/>

Configuration des comptes administrateurs Was :

mount -o remount,ro /usr

Redémarrez 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 entrées suivantes dans '/etc/sudoers' pour permettre à 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 être en disponibles en écriture que pour le super-utilisateur ou les administrateurs.

Vos administrateurs Was peuvent désormais 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

X-C - Reccomandations

L'arborescence /var/was est désormais en 3770. N'oubliez pas que les administrateurs ou le serveur Was peuvent modifier les fichiers appartenant à root.
=> Présumez désormais que tous les fichiers appartenant à root dans cette arborscence peuvent contenir des données malicieuses !!!

Cette documentation n'a pas pour objectif de vous présenter une sécurisation approfondie de Websphere Application Server, voici donc quelques reccomandations sur les etapes que vous pourriez suivre après l'installation : Supprimer toutes les webapp installées. N'installer que les webapps relatives aux services que vous désirez offrir. Privilégier les accès Ssh pour l'administration. Si vous devez conserver l'interface web de la console d'administrateur : Positionnez l'application console derrière un vhost apache SSL. Mettez en place des restrictions d'accès réseau pour l'utilisation de la console. Mettez en place des restrictions d'accès utilisateur pour l'utilisation de la console. Si vous souhaitez placer l'accès à la console d'administration Web en aval du serveur Web Apache, vous pourrez bénéficier de la fonctionnalité SSL (par exemple). Pour ce faire, éditez le fichier '/etc/apache/httpd.conf' :

Configuration des modules :

> LoadModule proxy_module /usr/lib/apache/1.3/libproxy.so
> LoadModule rewrite_module /usr/lib/apache/1.3/mod_rewrite.so

Configuration des vhosts :

> RewriteEngine On
> RewriteRule ^/admin/(.*)$ http://127.0.0.1:9090/admin/$1 [P,L]

=> Si vous avez suivi la procédure '5.8. Sécurisation approfondie avec GrSecurity', n'oubliez pas d'éditer le fichier /etc/grsec/debian-secinst/Dmn_apache pour ajouter une ligne du type '127.0.0.1:9090 stream tcp' dans la directive 'connect'.

Si vous souhaitez modifier les ressources mémoires attribuées aux processus Java, editez le fichier '/etc/security/limits.conf' pour les entrées '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.

X-D - Empreinte du système

Editez /etc/aide/aide.conf et ajoutez : '/usr/local/websphere500/appserver/bin Binlib' a la fin du fichier.

Suivez ensuite la procédure présentée en Conserver une empreinte de vérification d'intégrite du système.

X-E - Sauvegarde du système

Réferez vous à Backup du système sur une partition spécifique et editez le fichier '/home/system/scripts/backup/exclude' pour qu'il contienne cette ligne supplémentaire :

/var/was/logs

XI - Intégration de netfilter / iptables

L'integration de NetFilter / Iptables a été realisee sur le noyau stable 2.4.18 et la version 1.2.6a d'Iptables presents dans les packages Debian.

XI-A - Compilation du noyau

Compilez votre noyau avec les options désirées 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.

XI-B - Scripts d'initialisation

Installez les scripts presents dans Annexe 7 - Paramètrage 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 système

update-rc.d init_iptables.sh defaults

Demarrez le firewall :

/etc/init.d/init_iptables.sh start

XII - Installation d'un serveur Samba pour une gestion de backup

L'objectif de cette installation est de permettre à un serveur Win32 d'accéder à la station Debian en Netbios de façon à ce qu'il puisse récupérer les données sauvegardées que nous mettons à sa disposition.

La gestion du backup du système en lui même est présentée dans la partie Backup du système sur une partition spécifique de ce document.

Pour réaliser notre objectif, il n'est pas nécessaire de procéder à l'installation de l'ensemble des packages relatifs à Samba. Pour la même raison, nous n'abordons pas l'utilisation d'un client Samba ou de systèmes de fichiers de type Samba dans cette partie.

XII-A - Installation

On récupère les packages :

apt-get update
apt-get install samba samba-doc -d

=> Acceptez les packages : 'libcupsys2 samba samba-common samba-doc'.
On vérifie 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 'Exécuter Samba en mode démon ou via inetd ?' : demon 'Créer le fichier de mot de passe Samba ?' : Oui On remonte les partitions, on arrête le serveur, on restreint les droits sur le répertoire 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

XII-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

Préparez 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 Backup du système sur une partition specifique) :

/dev/sda13  /backup ext2   ro,noexec,nosuid,nodev,sync  0  2

Montez la partition backup et donnez-lui les permissions appropriées :

mount -o remount,rw /backup/
chown root:samba /backup
chmod 3750 /backup
mount -o remount,ro /backup/

Créez 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 (référez vous à 'Annexe 1 - Paramètrage du firewall Ipchains' ou à 'Annexe 7 - Paramétrage du firewall NetFilter' selon votre firewall).

Démarrez le serveur Samba :

/etc/init.d/samba start

Ajoutez le serveur Samba dans votre configuration de démarrage :

update-rc.d
samba defaults

=> Le serveur de backup Win32 est désormais capable de mapper le partage \\{NETBIOS_NAME}\backup de notre station pour récupérer les fichiers que nous y déposerons.

Pour finir, nous modifions l'appel périodique au script de backup par la crontab pour que le serveur Samba soit stoppe au moment ou la partition est remontée 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 système toutes les semaines à 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 système 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

XIII - Installation d'un demon nagios

Objectifs : Installer un serveur de supervision Nagios accessible en HTTPS. Sécuriser un minimum l'arborescence système. Utiliser sudo pour l'administration Nagios. Note : Pour cette installation, certains répertoires sont crées dans /var/nagios/, je vous conseille donc d'utiliser une partition dédiée montée par exemple en rw,sync.

XIII-A - Archives

On récupère les sources à 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 à jour le système pour les packages nécessaires

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

XIII-B - Création des groupes/utilisateurs

Création de l'utilisateur restreint destiné à exécuter le démon :

groupadd nagios
adduser --no-create-home --disabled-password --quiet --ingroup nagios\
--home /usr/local/nagios nagios
Changing the user information for nagios
Full Name []: Nagios Restricted User
Other []: Used by the Nagios Daemon
Is the information correct? [y/n] y

Préparez l'administration nagios (installez sudo !) :

groupadd nagiosadm
adduser --no-create-home --disabled-password --quiet --home\
/var/nagios/etc/ --ingroup nagiosadm nagiosadm
Full Name []: Nagios Administrator
Other []: Restricted via sudo login
passwd -l nagiosadm && chsh -s /bin/false nagiosadm

Que vous comptiez autoriser l'exécution de commandes externes ou non, créez un groupe dans lequel se trouveront nagios et le serveur web :

groupadd nagioscmd
usermod -G nagioscmd www-data
usermod -G nagioscmd nagios

Puis redémarrez Apache :

apachectl restart'

XIII-C - Compilation/Installation de Nagios

cd /home/system/download/nagios/
tar zxvf nagios-1.1.tar.gz
chown -R root:root nagios-1.1
chmod 700 nagios-1.1/ && cd nagios-1.1
./configure --prefix=/usr/local/nagios --with-cgiurl=/cgi-bin\
--with-htmlurl=/var/www/htdocs/nagios  --with-nagios-user=nagios\
--with-nagios-grp=nagios --with-gd-lib=/usr/local/lib\
--with-gd-inc=/usr/local/include
make all

cd /home/system/download/nagios/
tar zxvf nagios-plugins-1.3.1.tar.gz
chown root:root nagios-plugins-1.3.1
chmod 700 nagios-plugins-1.3.1 && cd nagios-plugins-1.3.1
./configure --prefix=/usr/local/nagios --with-nagios-user=nagios\
--with-nagios-group=nagios --with-cgiurl=/cgi-bin
make all

On y va pour l'installation :

mount -o remount,rw /usr
mkdir /usr/local/nagios
cd /home/system/download/nagios/nagios-1.1
make install
cd /home/system/download/nagios/nagios-plugins-1.3.1
make install
chmod 3755 /usr/local/nagios

XIII-D - Déplacement des répertoires et attribution de permissions spécifiques

On déplace l'arborescence Web :

cd /usr/local/nagios
mv share /var/www/htdocs/nagios
ln -s /var/www/htdocs/nagios share
cd /var/www/htdocs/
chown -R root:webadm nagios
cd nagios
find . -type d -exec chmod 3775 {} \;
find . -type f -exec chmod 1664 {} \;

On prépare l'arborescence variable + configuration :

mkdir -p /var/nagios/{var,etc}
chown nagiosadm:nagioscmd /var/nagios /var/nagios/etc
chown nagios:nagioscmd /var/nagios/var
chmod 3755 /var/nagios /var/nagios/etc
chmod 3750 /var/nagios/var

On déplace l'arborescence var :

cd /usr/local/nagios
mv var/* /var/nagios/var/
rmdir var && ln -s /var/nagios/var var

On crée le fichier de transfert de commande :

mkdir /var/nagios/var/rw
chown nagios:nagioscmd /var/nagios/rw
chmod 3770 /var/nagios/var/rw

On donne des permissions convenables aux cgis :

cd /usr/local/nagios
chown -R nagios:www-data sbin
chmod 750 sbin/*

On restreint les droits sur les binaires Nagios :

cd /usr/local/nagios
chown -R root:nagios bin
chmod 750 bin bin/nagios
chown -R nagios:nagios libexec
chmod 755 libexec
chmod 750 libexec/* && chmod 755 libexec/check_nagios

On prépare le répertoire de stockage de la configuration :

cd /usr/local/nagios
mv etc/* /var/nagios/etc/
rmdir etc && ln -s /var/nagios/etc etc
cd /var/nagios/etc
chown nagiosadm:nagioscmd *
chmod 1640 *

On a fini avec /usr, on remonte en lecture seule :

mount -o remount /usr

XIII-E - Configuration d'Apache

Editez /etc/apache/httpd.conf pour ajouter :

LoadModule cgi_module /usr/lib/apache/1.3/mod_cgi.so

############################
### Configuration Nagios ###
############################

ScriptAlias /cgi-bin/ "/usr/local/nagios/sbin/"

<Directory "/var/www/htdocs/nagios">
Options SymLinksIfOwnerMatch
AllowOverride AuthConfig
Order allow,deny
Allow from all
</Directory>

<Directory "/usr/local/nagios/sbin/">
AllowOverride AuthConfig
Options ExecCGI
Order allow,deny
Allow from all
</Directory>

puis redémarrez Apache.

Note : En ce qui me concerne, je place la configuration Nagios dans un virtualhost activant la fonctionnalité SSL.

XIII-F - Configuration des autorisations d'accès

Les autorisations d'accès au site statique :

cd /var/www/htdocs/nagios
cat > .htaccess << EOF
> AuthName "Nagios"
> AuthType Basic
> AuthUserFile "/usr/local/nagios/etc/htpasswd.users"
> require valid-user
> EOF
chown root:webadm .htaccess
chmod 1664 .htaccess

Récupération du fichier d'autorisation htaccess pour les cgis :

cp /var/www/htdocs/nagios/.htaccess sbin/
chown nagios:www-data sbin/.htaccess
chmod 440 sbin/.htaccess

Créez votre fichier de mot de passe /var/nagios/etc/htpasswd.users avec htpasswd et :

chown nagiosadm:nagioscmd htpasswd.users
chmod 1640 htpasswd.users

XIII-G - Script d'initialisation et administrateurs Nagios

Créez votre script d'initialisation dans /etc/init.d/init_nagios.sh à partir de l'annexe 'Annexe 14 - Script d'initialisation Nagios' puis :

chmod 750 init_nagios.sh
update-rc.d init_nagios.sh defaults

Ajoutez les utilisateurs que vous voulez dans le groupe nagiosadm puis visudo et :

Cmnd_Alias EDIT_NAGIOS_CONF=/usr/bin/vim
Cmnd_Alias INIT_NAGIOS=/etc/init.d/init_nagios.sh [A-z]*

%nagiosadm ALL=(nagiosadm)NOPASSWD:EDIT_NAGIOS_CONF
%nagiosadm ALL=NOPASSWD:INIT_NAGIOS

Note : Je sais que ce n'est pas la panacée (=> man vi{m})

XIII-H - Et pour finir

Si vous décidez d'ajouter des logos :

cd /var/www/htdocs/nagios/images/logos
tar zxvf /home/system/download/nagios/imagepak-base.tar.gz
tar zxvf /home/system/download/nagios/imagepak-satrapa.tar.gz
chown -R root:webadm *

XIV - Graphiques mrtg pour le server-status Apache

Si le titre de cette partie n'evoque rien pour vous, consultez la documentation relative au module server-status d'Apache et la page d'accueil de l'archive à télécharger.

XIV-A - Archives

Téléchargez les sources : http://howto.aphroland.de/HOWTO/MRTG/ApacheWithMRTG/

cd /home/system/download/
md5sum apache.mrtg.tgz
ffa0cc1750998975f07fff8f70baeb9c  apache.mrtg.tgz
tar zxvf apache.mrtg.tgz
chmod 750 apache.mrtg-v0.1/

apt-get install mrtg libgd1 libsnmp-session-perl libdigest-md5-perl\
libhtml-parser-perl libhtml-tagset-perl libhtml-tree-perl\
libmime-base64-perl libnet-perl liburi-perl libwww-perl -d
cd /var/cache/apt/archives/
/usr/bin/md5sum mrtg_2.9.17-4_i386.deb libgd1_1.8.4-17.woody2_i386.deb\
libsnmp-session-perl_0.90-1_all.deb libdigest-md5-perl_2.13-2_i386.deb\
libhtml-parser-perl_3.25-1_i386.deb libhtml-tagset-perl_3.03-1_all.deb\
libhtml-tree-perl_3.11-2_all.deb libmime-base64-perl_2.12-4_i386.deb\
libnet-perl_1%3a1.09.01-1_all.deb liburi-perl_1.18-1_all.deb\
libwww-perl_5.64-1_all.deb

b7aced31ac2bd53afb5e3a41fe09a571  mrtg_2.9.17-4_i386.deb
e47f36577bc77ca1ac1334a65a382ecd  libgd1_1.8.4-17.woody2_i386.deb
09861e46c5bca03bec4f0db92f5e96a6  libsnmp-session-perl_0.90-1_all.deb
c53a87f7e5f413f09becab2d4ef568a0  libdigest-md5-perl_2.13-2_i386.deb
1292ae35b502239aa238bbf72579a074  libhtml-parser-perl_3.25-1_i386.deb
4c64c498e99144f7ebcd65a5ba301991  libhtml-tagset-perl_3.03-1_all.deb
da8da0d786b29f92254e7ed74f970515  libhtml-tree-perl_3.11-2_all.deb
f309d4b7f60e94c41e554ebe4d22aee6  libmime-base64-perl_2.12-4_i386.deb
f0947fc68a8b1ef13929c540efacdb2e  libnet-perl_1%3a1.09.01-1_all.deb
c8964c82978f10ca0657013ffd037c0e  liburi-perl_1.18-1_all.deb
6a3f908c2fd7654201319d2d4b83e028  libwww-perl_5.64-1_all.deb

Remontez votre système de fichier en lecture/écriture.

apt-get install mrtg libgd1 libsnmp-session-perl libdigest-md5-perl\
libhtml-parser-perl libhtml-tagset-perl libhtml-tree-perl\
libmime-base64-perl libnet-perl liburi-perl libwww-perl
=> Make mrtg owned and readable only by mrtg user ? YES

Remontez votre système de fichier en lecture.

XIV-B - Configuration

mkdir /var/www/apache-mrtg
cd /var/www/apache-mrtg
mkdir confs etc
cd /home/system/download/apache.mrtg-v0.1
cp apache.html apache.mrtg.cfg apache.mrtg.pl mkapachemrtg.sh\
/var/www/apache-mrtg/etc/
cd /var/www/apache-mrtg/etc/

Si le serveur Web monitore est un serveur Apache tournant sur une plate-forme Windows, appliquez le patch suivant :

--- apache.mrtg.pl.orig Thu Nov  6 13:09:33 2003
+++ apache.mrtg.pl      Thu Nov  6 13:09:33 2003
@@ -78,7 +78,12 @@
alarm 30; # have 30 seconds to get the INFO ...
my $content = getcache($url); # get info status
alarm 0;
-  my ($Taccess, $TkBytes, $CPULoad, $Uptime, $ReqPerSec, $BytesPerSec,\
$BytesPerReq, $BusyServers, $IdleServers, $null) = split(/\n/, $content);\
# split content
+
+  if ($content !~ /CPULoad/) {
+    $content =~ s/Uptime: /CPULoad: 0\nUptime: /;
+  }
+
+  my ($Taccess, $TkBytes, $CPULoad, $Uptime, $ReqPerSec, $BytesPerSec,\
$BytesPerReq, $BusyServers, $IdleServers, $null) = split(/\n/, $content);

# strip some info - YES, UGLY CODE!
$Taccess     =~ s/Total Accesses: //;

Editez le fichier mkapachemrtg.sh pour les variables suivantes :

[...]
HTMLHOME="/var/www/htdocs/status-mrtg/" # mrtg output dir
SCRIPTHOME="/var/www/apache-mrtg/etc" # where is the apache.mrtg.pl
URLHOME="http://{WEBSERVER_MONITOR_IP}/status-mrtg" # url ...
CONFHOME="/var/www/apache-mrtg/confs" # where the apache.mrtg.cfg files go
MRTGBIN="/usr/bin/mrtg" # mrtg bin
[...]

chmod 750 /var/www/mrtg
cd /var/www/htdocs
mkdir status-mrtg
chown root:webadm status-mrtg/
chmod 3775 status-mrtg/

Créez une configuration pour un serveur :

cd /var/www/apache-mrtg/etc
./mkapachemrtg.sh {SERVER_NAME} "-url http://{SERVER_IP}/server-status?auto"

Vous avez dans /var/www/apache-mrtg/confs le fichier de configuration relatif à cette nouvelle entree.
Vous avez dans /var/www/htdocs/status-mrtg un répertoire servant de dépose pour les fichiers garphs.

cd /var/www/htdocs/status-mrtg
chmod 3775 {SERVER_NAME}
chmod 1664 {SERVER_NAME}/*

Testez maintenant la configuration :

/usr/bin/mrtg /var/www/apache-mrtg/confs/{SERVER_NAME}.apache.mrtg.cfg

Finissez en créant un script d'appel aux statistiques :

cd /var/www/apache-mrtg
cat > monitor_servers.sh
#!/bin/sh
/usr/bin/mrtg /var/www/apache-mrtg/confs/{SERVER_NAME1}.apache.mrtg.cfg
/usr/bin/mrtg /var/www/apache-mrtg/confs/{SERVER_NAMEX}.apache.mrtg.cfg
^C
chmod 1750 monitor_servers.sh

Et rajoutez une entrée dans la crontab :

*/5 * * * * root /var/www/apache-mrtg/monitor_servers.sh

Webographie

Figurent ici quelques liens que j'ai consultés lors de la rédaction de cette documentation ainsi que les liens vers les outils utilisés.

Documentations

Guide du nouveau responsable Debian :
http://www.debian.org/doc/manuals/maint-guide/ (francais)

Guide de sécurité Gentoo Linux :
http://www.gentoo.org/doc/en/gentoo-security.xml (anglais)
http://www.gentoo.org/doc/fr/gentoo-security.xml (francais)
Making Bootable Linux CDs : http://www.geocities.com/potato.geo/bootlinuxcd.html (anglais)

Securing Debian Manual :
http://www.debian.org/doc/manuals/securing-debian-howto/index.html (anglais)

Liens divers

Debian : http://www.debian.org/
FSF : http://www.fsf.org/
GNU : http://www.gnu.org/
Kernel : http://www.kernel.org/

Outils

AIDE : http://www.cs.tut.fi/~rammer/aide.html
Apache : http://www.apache.org/
GrSecurity : http://www.grsecurity.net/
Ibm Websphere : http://www-3.ibm.com/software/webservers/appserv/
LibSafe : http://www.research.avayalabs.com/project/libsafe/
Mod_SSL : http://www.modssl.org/
Modular-Syslog : http://sourceforge.net/projects/msyslog/
NetFilter : http://www.netfilter.org/
OpenSSL : http://www.openssl.org/
OpenWall : http://www.openwall.com/linux/
Pax : http://pageexec.virtualave.net
Prelude : http://www.prelude-ids.org/
Samba : http://www.samba.org/
TomSrtBt : http://www.toms.net/rb/

Remerciements

Cedric B. <cedric [at] entreelibre.com> pour ses remarques.

Annexe 1. Paramétrage du firewall Ipchains

/home/system/scripts/fw/custom_net.sh :

#!/bin/sh

#
# Debian-secinst v0.1.3 : ANNEXE 1 - Paramètrage du firewall Ipchains
# Simon Castro
#

### NETWORK CUSTOMIZATION

echo "0" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo "60" > /proc/sys/net/ipv4/ip_default_ttl
echo "0" > /proc/sys/net/ipv4/ip_forward

ZERO_FLAGS="accept_redirects accept_source_route forwarding proxy_arp send_redirects";
ONE_FLAGS="rp_filter log_martians";
CHEMIN="/proc/sys/net/ipv4/conf";

for repert in `ls "$CHEMIN"` ; do
for fichier in `echo "$ZERO_FLAGS"`; do
if [ -e "$CHEMIN/$repert/$fichier" ]
then echo "0" > "$CHEMIN/$repert/$fichier"; fi
done
for fichier in `echo "$ONE_FLAGS"`; do
if [ -e "$CHEMIN/$repert/$fichier" ]
then echo "1" > "$CHEMIN/$repert/$fichier"; fi
done
done

/etc/init.d/init_ipchains.sh :

#!/bin/sh

#
# Debian-secinst v0.1.3 : ANNEXE 1 - Paramètrage du firewall Ipchains
# Simon Castro
#

RULES_UP=/home/system/scripts/fw/rules_up_ipchains.sh
RULES_DOWN=/home/system/scripts/fw/rules_down_ipchains.sh

case "$1" in
start)
if [ -f $RULES_UP ] && [ -x $RULES_UP ]
then
$RULES_UP
else
echo "$0 : Cannot execute $RULES_UP !!!"
exit 0
fi
;;
stop)
if [ -f $RULES_DOWN ] && [ -x $RULES_DOWN ]
then
$RULES_DOWN
else
echo "$0 : Cannot execute $RULES_DOWN !!!"
exit 0
fi
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac

exit 0

/home/system/scripts/fw/rules_down_ipchains.sh :

#!/bin/sh

#
# Debian-secinst v0.1.3 : ANNEXE 1 - Paramètrage du firewall Ipchains
# Simon Castro
#

IPCH=/sbin/ipchains # IpChains binary

### CHECK KERNEL VERSION AND BINARY PRESENCE

if [ ! -f $IPCH ] && [ ! -x $IPCH ] ; then exit 0 ; fi
CHECK=`$IPCH -L -n 2>&1 > /dev/null || echo "bad"`
if [ "$CHECK" ]
then
echo "$0 : Not with this kernel"
exit 0
fi

### VARIABLES

DEFAULT_POL="input output forward" # Default policies

### BEGIN

# Flush and remove all chains then default the policies to ACCEPT
$IPCH -F
$IPCH -X
for i in $DEFAULT_POL
do
$IPCH -P $i ACCEPT
done

echo "$0 done"

/home/system/scripts/fw/rules_up_ipchains.sh :

#!/bin/sh

#
# Debian-secinst v0.1.4 : ANNEXE 1 - Paramétrage du firewall Ipchains
# Simon Castro
#

IPCH=/sbin/ipchains # IpChains binary

### CHECK KERNEL VERSION AND BINARY PRESENCE

if [ ! -f $IPCH ] && [ ! -x $IPCH ] ; then exit 0 ; fi
CHECK=`$IPCH -L -n 2>&1 > /dev/null || echo "bad"`
if [ "$CHECK" ]
then
echo "$0 : Not with this kernel"
exit 0
fi

### Set OUR value to the printk variable
echo "6 4 1 7" > /proc/sys/kernel/printk

### NETWORK CUSTOMIZATION

test -f /home/system/scripts/fw/custom_net.sh && test -x /home/system/scripts/fw/custom_net.sh && /home/system/scripts/fw/custom_net.sh

### VARIABLES

# Addresses
LOCAL_IP=`ifconfig eth0 | awk 'BEGIN { FS=":" ; RS=" " } /addr:/ { print $2 }'` # Get local Eth0 IP Address
BROADCAST_IP=`ifconfig eth0 | awk 'BEGIN { FS=":" ; RS=" " } /Bcast:/ { print $2 }'` # Get local Eth0 Broadcast IP Address

ADM_IP="@IPS_OF_ADMINISTRATION_HOSTS"

DNS_IP="@IP_OF_DNS_SERVERS""
PROXY_IP="@IPS_OF_HTTP_PROXYS"
#NTP_IP="@IPS_OF_NTP_SERVERS"
#ICMP_IP="@IPS_OF_ALLOWED_ICMP_REQUESTER_HOSTS"
#WINS_IP="@IPS_OF_WINS_AND_DOMAIN_SERVERS"
#NETBIOS_IP="@IP_OF_ALLOWED_NETBIOS_REMOTE_HOSTS"

# Policies
DEFAULT_POL="input output forward"
LOG_ACCEPT="LogAcc"
LOG_DROP="LogDrop"

# Various
RPORTS=":1024"
NRPORTS="1024:"

### BEGIN

# Flush and remove all chains then default the policies to DROP
$IPCH -F
$IPCH -X
for i in $DEFAULT_POL
do
$IPCH -P $i DENY
done

### Create and set personnal chains

# Log and deny chain
$IPCH -N $LOG_DROP # Create a new one
$IPCH -A $LOG_DROP -j DENY -l # Log and deny

# Log and accept chain
$IPCH -N $LOG_ACCEPT # Create a new one
$IPCH -A $LOG_ACCEPT -j ACCEPT -l # Log and accept

### LOOPBACK AND REMOTE MANAGEMENT

# Allow whatever on loopback
$IPCH -A output -i lo -j ACCEPT
$IPCH -A input -i lo -j ACCEPT

# Allow SSH remote management and log connections
for i in $ADM_IP
do
$IPCH -A input -p tcp -s $ADM_IP $NRPORTS -d $LOCAL_IP 22 -y -j $LOG_ACCEPT
$IPCH -A input -p tcp -s $ADM_IP $NRPORTS -d $LOCAL_IP 22 -j ACCEPT
$IPCH -A output -p tcp -s $LOCAL_IP 22 -d $ADM_IP $NRPORTS -j ACCEPT
done

### ALLOW THESE TCP CONNECTIONS

# Allow HTTP/HTTPS to HTTP proxy servers and log Syn Scan profit port
for i in $PROXY_IP
do
$IPCH -A output -p tcp --sport $NRPORTS -d $i 8080 -j ACCEPT
$IPCH -A input -p tcp -s $i 8080 -y -j $LOG_DROP
$IPCH -A input -p tcp -s $i 8080 --dport $NRPORTS -j ACCEPT
done

### Uncomment if you want to use Prelude communications.
## Allow Prelude communications to Prelude server and log syn scan profit port
#  $IPCH -A output -p tcp --sport $NRPORTS -d {PRELUDE_SRV_IP} 5553:5554 -j ACCEPT
#  $IPCH -A input  -p tcp -s {PRELUDE_SRV_IP} 5553:5554 -y -j $LOG_DROP
#  $IPCH -A input  -p tcp -s {PRELUDE_SRV_IP} 5553:5554 --dport $NRPORTS -j ACCEPT

### ALLOW THESE UDP CONNECTIONS

# Allow DNS Protocol to DNS Servers
for i in $DNS_IP
do
$IPCH -A output -p udp --sport $NRPORTS -d $i 53 -j ACCEPT
$IPCH -A input -p udp -s $i 53 --dport $NRPORTS -j ACCEPT
done

### Uncomment if you want to use communications to NTP servers.
###  => Also uncomment and set NTP_IP at the beginning of the script.
## Allow NTP Protocol to NTP Servers
#  for i in $NTP_IP
#    do
#    $IPCH -A output -p udp --sport $NRPORTS -d $i 123 -j ACCEPT
#    $IPCH -A input -p udp -s $i 123 --dport $NRPORTS -j ACCEPT
#  done

### ALLOW THESE ICMP REQUESTS AND RESPONSES

### Uncomment if you want to certain hosts to send us icmp requests
###  => Also uncomment and set ICMP_IP at the beginning of the script
## Allow some host's icmp requests
#for i in $ICMP_IP
#  do
#    $IPCH -A input  -p icmp --icmp-type echo-request -s $i -j ACCEPT
#    $IPCH -A input  -p icmp --icmp-type destination-unreachable -s $i -j ACCEPT
#    $IPCH -A input  -p icmp --icmp-type time-exceeded -s $i -j ACCEPT
#    $IPCH -A output -p icmp --icmp-type echo-reply -d $i -j ACCEPT
#done

### ALLOW SPECIFIC PROTOCOLS

### Uncomment if you want to allow NetBios networks streams
###  => Also uncomment and set WINS_IP and NETBIOS_IP at the beginning of the script
## Allow NetBios protocol with certains hosts
#$IPCH -A output -p udp --sport 137:138 -d $BROADCAST_IP 137:138 -j ACCEPT
#for i in $WINS_IP
#  do
#    $IPCH -A output -p udp --sport 137 -d $i 137 -j ACCEPT
#    $IPCH -A input  -p udp -s $i --dport 137 -j ACCEPT
#done
## Allow but log incoming syn connections on the 139 port number.
#for i in $NETBIOS_IP
#  do
#  $IPCH -A input  -p udp -s $i 137 --dport 137 -j ACCEPT
#  $IPCH -A output -p udp --sport 137 -d $i 137 -j ACCEPT
#  $IPCH -A input  -p tcp -s $i $NRPORTS --dport 139 -y -j $LOG_ACCEPT
#  $IPCH -A input  -p tcp -s $i $NRPORTS --dport 139 -j ACCEPT
#  $IPCH -A output -p tcp --sport 139 -d $i $NRPORTS -j ACCEPT
#done

### AND LAST : LOG AND DENY

for i in $DEFAULT_POL
do
$IPCH -A $i -j $LOG_DROP
done

echo "$0 done"

Annexe 2. Génération automatisée de rapport système

#!/bin/sh

#
# Debian-secinst v0.1.2 : ANNEXE 2 - Génération automatisée de rapport système
# Simon Castro
#

### VARIABLES

# Do we also mail the report ?
OK_TO_MAIL=1

# Report variables
CURRENT_DATE=`/bin/date "+%d%m%y-%H%M%S"`
REPORT_NAME=`/bin/hostname`

# mail variables
MAIL_ADDR="root"

# File to store variables
REPORT_DIR=/home/system/scripts/reports/
REPORT_FILE=$REPORT_DIR$REPORT_NAME"_"$CURRENT_DATE"_report.log"

# Logger variables
SYSLOGGED_NAME="System"
LOGGER_FILE="/usr/bin/logger -p local7.info -t $SYSLOGGED_NAME -i -- $REPORT_NAME system report : $REPORT_FILE"
LOGGER_MAIL="/usr/bin/logger -p local7.info -t $SYSLOGGED_NAME -i -- $REPORT_NAME system report : mailing to $MAIL_ADDR"

# Formatage du rapport
INDENT_IT='s/\(.*\)/\ \ \ \ \1/g'

### MAIN

# Tell syslog we are going to run the system report script
$LOGGER_FILE

# Get the report values

DISK_SPACE=`/bin/df -lh | /bin/sed "$INDENT_IT"`
PROCESS_LIST=`/bin/ps aux | /bin/sed "$INDENT_IT"`
INTERFACES_LIST=`/sbin/ifconfig | /bin/sed "$INDENT_IT"`
INTERFACES2_LIST=`/bin/netstat -in | /bin/sed "$INDENT_IT"`
ROUTAGE_LIST=`/bin/netstat -rn | /bin/sed "$INDENT_IT"`
CONNECTIONS_LIST=`/bin/netstat -tunap | /bin/sed "$INDENT_IT"`
STRANGE_FILES=`/usr/bin/find / \( -nouser -o -nogroup -o \( -type f \( -perm -004000 -o -perm -002000 \) \) \) -exec ls -la {} \; 2> /dev/null | /bin/sed "$INDENT_IT"`
LOG_FW_ACCEPT=`/bin/cat /var/log/fw_accept.log | /bin/sed "$INDENT_IT"`
LOG_FW_DENY=`/bin/cat /var/log/fw_deny.log | /bin/sed "$INDENT_IT"`
LOG_SECURITE=`/bin/cat /var/log/sécurité.log | /bin/sed "$INDENT_IT"`

### Warning : the next two lines are only one command line
QUOTAS_GROUP_LIST=`/usr/sbin/repquota -gva | /bin/sed 's/\*\*\*/\\
\*\*\*/' | /bin/sed "$INDENT_IT"`

### Warning : the next two lines are only one command line
QUOTAS_USER_LIST=`/usr/sbin/repquota -uva | /bin/sed 's/\*\*\*/\\
\*\*\*/' | /bin/sed "$INDENT_IT"`

# Create the report

{

/bin/cat <<EOF
Rapport système $REPORT_NAME - `/bin/date`

SystÃ¨me :
---------

Espace disque :
---------------
$DISK_SPACE

Quotas groupes :
----------------
$QUOTAS_GROUP_LIST

Quotas utilisateurs :
---------------------
$QUOTAS_USER_LIST

Processus :
-----------
$PROCESS_LIST

Réseau :
--------

Interfaces (/sbin/ifconfig) :
-----------------------------
$INTERFACES_LIST

Interfaces (/bin/netstat) :
---------------------------
$INTERFACES2_LIST

Routage :
---------
$ROUTAGE_LIST

Connexions :
------------
$CONNECTIONS_LIST

Test du système :
-----------------

Vérification des permissions fichiers (nouser/nogroup/suid/sgid) :
------------------------------------------------------------------
$STRANGE_FILES

Fichier de log sécurité :
-------------------------
$LOG_SECURITE

Fichier de log des connexions refusées par le firewall :
--------------------------------------------------------
$LOG_FW_DENY

Fichier de log des connexions acceptées par le firewall :
---------------------------------------------------------
$LOG_FW_ACCEPT

done -- - `/bin/date`
EOF

} > $REPORT_FILE

if [ $OK_TO_MAIL ] && [ $OK_TO_MAIL == 1 ]
then
$LOGGER_MAIL
/bin/cat $REPORT_FILE | /usr/bin/mail -s "$REPORT_NAME system report" $MAIL_ADDR
fi

Annexe 3. syslogd-listfiles.msyslog.patch

syslogd-listfiles.msyslog.patch :

--- syslogd-listfiles.orig      Fri Mar 14 17:25:30 2003
+++ syslogd-listfiles   Wed Mar 19 11:56:52 2003
@@ -14,6 +14,12 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.

+### 19/03/03
+#
+# Gestion d'un fichier de configuration syslog.conf à la fois au format
+#   syslog standard et au format modular-syslog
+#
+
$conf = "/etc/syslog.conf";
$opt_daily = 1;
$opt_all = 0;
@@ -109,8 +115,9 @@
$line .= $_;
chop ($line) if (/\\$/);
if (!/\\$/) {
-       $line =~ s/\s+/\t/;
-       $line =~ s/\t-/\t/;
+       $line =~ s/\s+/\t/g;
+       $line =~ s/\t-/\t/g;
+       if ($line =~ /\t%/ ) { $line =~ s/%.*\t(\/)/$1/; }
push (@lines, $line) if ($line =~ /\t\/(?!dev\/)/);
$line = "";
}

Annexe 4. Script d'arret/demarrage de prelude-lml

/etc/init.d/preludelogmonitor.sh :

Ce script est désormais disponible dans une documentation specifique a Prelude et disponible sur : http://www.entreelibre.com/scastro/prelude/

Annexe 5. Fichier de règles pour un support Ipchains avec Prelude-lml

/home/prelude/etc/prelude-lml/ruleset/ipchains.rules :

Ce fichier de règles est désormais disponible dans une documentation specifique a Prelude et disponible sur : http://www.entreelibre.com/scastro/prelude/ .

Annexe 6. Fichier de configuration Apache minimal

#
# Debian-secinst v0.1.2 : ANNEXE 6 - Fichier de configuration Apache minimal
# Simon Castro
#

####################################
# Section 1 : Environnement Global #
####################################

ServerType standalone
ServerRoot /etc/apache
LockFile /var/lock/apache.lock
PidFile /var/run/apache.pid
ScoreBoardFile /var/run/apache.scoreboard

MinSpareServers 2
MaxSpareServers 5
StartServers 2

User www-data
Group www-data

Timeout 60
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MaxClients 15
MaxRequestsPerChild 100

#
# Support des modules
#

LoadModule config_log_module /usr/lib/apache/1.3/mod_log_config.so
LoadModule mime_module /usr/lib/apache/1.3/mod_mime.so
LoadModule negotiation_module /usr/lib/apache/1.3/mod_negotiation.so
LoadModule autoindex_module /usr/lib/apache/1.3/mod_autoindex.so
LoadModule dir_module /usr/lib/apache/1.3/mod_dir.so
LoadModule alias_module /usr/lib/apache/1.3/mod_alias.so
LoadModule access_module /usr/lib/apache/1.3/mod_access.so
LoadModule auth_module /usr/lib/apache/1.3/mod_auth.so
LoadModule expires_module /usr/lib/apache/1.3/mod_expires.so
LoadModule unique_id_module /usr/lib/apache/1.3/mod_unique_id.so
LoadModule setenvif_module /usr/lib/apache/1.3/mod_setenvif.so
LoadModule ssl_module /usr/lib/apache/1.3/mod_ssl.so

#
# Configuration générale du serveur
#

Port 80
Listen 80
Listen 443

#
# Repertoires et permissions
#

DocumentRoot /var/www/htdocs

<Directory />
Options SymLinksIfOwnerMatch
AllowOverride None
</Directory>

<Directory "/var/www/htdocs">
Options SymLinksIfOwnerMatch
AllowOverride None
Order allow,deny
Allow from all
</Directory>

Alias /icons/ /usr/share/apache/icons/
<Directory /usr/share/apache/icons>
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

#
# Configurations specifiques aux modules
#

<IfModule mod_dir.c>
DirectoryIndex index.html index.htm index.shtml index.cgi
</IfModule>

<IfModule mod_autoindex.c>
IndexOptions FancyIndexing NameWidth=*
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/deb.gif .deb
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
DefaultIcon /icons/unknown.gif
ReadmeName README
HeaderName HEADER
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
</IfModule>

TypesConfig /etc/mime.types
DefaultType text/plain
AddDefaultCharset on

<IfModule mod_mime.c>
AddEncoding x-compress Z
AddEncoding x-gzip gz tgz
AddLanguage da .dk
AddLanguage nl .nl
AddLanguage en .en
AddLanguage et .ee
AddLanguage fr .fr
AddLanguage de .de
AddLanguage el .el
AddLanguage it .it
AddLanguage ja .ja
AddCharset ISO-2022-JP .jis
AddLanguage pl .po
AddCharset ISO-8859-2 .iso-pl
AddLanguage pt .pt
AddLanguage pt-br .pt-br
AddLanguage ltz .lu
AddLanguage ca .ca
AddLanguage es .es
AddLanguage sv .se
AddLanguage cz .cz
<IfModule mod_negotiation.c>
LanguagePriority en da nl et fr de el it ja pl pt pt-br ltz ca es sv
</IfModule>
AddType application/x-tar .tgz
AddType image/bmp .bmp
AddType text/x-hdml .hdml
</IfModule>

<IfModule mod_setenvif.c>
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0
</IfModule>

##############################################
### Securite : Protection .htaccess etc... ###
##############################################

UseCanonicalName Off
ServerSignature Off
ServerAdmin nobody@noone.com

AccessFileName .htaccess
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>

#############################################
### Gestion des logs : Format et fichiers ###
#############################################

HostnameLookups Off

LogLevel warn
SSLLogLevel warn

LogFormat "%h %l %u %v %A:%p %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" common
LogFormat "%h %l %u %v %A:%p %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x %{SSL_CIPHER_USEKEYSIZE}x/%{SSL_CIPHER_ALGKEYSIZE}x" commonssl

CustomLog /var/log/apache/access.log common
ErrorLog /var/log/apache/error.log
SSLLog /var/log/apache/ssl.log

###################
### Gestion SSL ###
###################

SSLSessionCache none
SSLMutex sem
SSLRandomSeed startup builtin

########################
### Plugin WebSphere ###
########################

LoadModule app_server_http_module /usr/local/websphere500/appserver/bin/mod_app_server_http.so
WebSpherePluginConfig /usr/local/websphere500/appserver/config/cells/plugin-cfg.xml

####################
### VirtualHosts ###
####################

<VirtualHost {@IP}>
DocumentRoot /var/www/htdocs
ServerName {@IP}

CustomLog /var/log/apache/access.log common
ErrorLog /var/log/apache/error.log
</VirtualHost>

<VirtualHost {@IP ou HOSTNAME}:443>
DocumentRoot /var/www/htdocs
ServerName {@IP ou HOSTNAME}

SSLEngine On
SSLCertificateFile /etc/apache/ssl/{HOSTNAME}.crt
SSLCertificateKeyFile /etc/apache/ssl/{HOSTNAME}.key

CustomLog /var/log/apache/access_ssl.log commonssl
ErrorLog /var/log/apache/error.log
</VirtualHost>

Annexe 7. Paramétrage du firewall NetFilter

/home/system/scripts/fw/custom_net.sh : voir Annexe 1 - Paramétrage du firewall Ipchains

/etc/init.d/init_iptables.sh :

#!/bin/sh

#
# Debian-secinst v0.1.3 : ANNEXE 7 - Paramètrage du firewall NetFilter
# Simon Castro
#

RULES_UP=/home/system/scripts/fw/rules_up_iptables.sh
RULES_DOWN=/home/system/scripts/fw/rules_down_iptables.sh

case "$1" in
start)
if [ -f $RULES_UP ] && [ -x $RULES_UP ]
then
$RULES_UP
else
echo "$0 : Cannot execute $RULES_UP !!!"
exit 0
fi
;;
stop)
if [ -f $RULES_DOWN ] && [ -x $RULES_DOWN ]
then
$RULES_DOWN
else
echo "$0 : Cannot execute $RULES_DOWN !!!"
exit 0
fi
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac

exit 0

/home/system/scripts/fw/rules_down_iptables.sh :

#!/bin/sh

#
# Debian-secinst v0.1.3 : ANNEXE 7 - Paramètrage du firewall NetFilter
# Simon Castro
#

IPT=/sbin/iptables

### CHECK KERNEL VERSION AND BINARY PRESENCE

if [ ! -f $IPT ] && [ ! -x $IPT ] ; then exit 0 ; fi
CHECK=`$IPT -L -n 2>&1 > /dev/null || echo "bad"`
if [ "$CHECK" ]
then
echo "$0 : Not with this kernel"
exit 0
fi

### VARIABLES

DEFAULT_POL="INPUT OUTPUT FORWARD" # Default policies

### BEGIN

# Flush and remove all chains then default the policies to ACCEPT
$IPT -F
$IPT -X
for i in $DEFAULT_POL
do
$IPT -P $i ACCEPT
done

echo "$0 done"

/home/system/scripts/fw/rules_up_iptables.sh :

#!/bin/sh

#
# Debian-secinst v0.1.4 : ANNEXE 7 - Paramètrage du firewall NetFilter
# Simon Castro
#

IPT=/sbin/iptables

### CHECK KERNEL VERSION AND BINARY PRESENCE

if [ ! -f $IPT ] && [ ! -x $IPT ] ; then exit 0 ; fi
CHECK=`$IPT -L -n 2>&1 > /dev/null || echo "bad"`
if [ "$CHECK" ]
then
echo "$0 : Not with this kernel"
exit 0
fi

### Set OUR value to the printk variable
echo "6 4 1 7" > /proc/sys/kernel/printk

### NETWORK CUSTOMIZATION

test -f /home/system/scripts/fw/custom_net.sh && test -x /home/system/scripts/fw/custom_net.sh && /home/system/scripts/fw/custom_net.sh

### VARIABLES

INT=eth0

# Addresses
LOCAL_IP=`ifconfig $INT | awk 'BEGIN { FS=":" ; RS=" " } /addr:/ { print $2 }'` # Get local Eth0 IP Address
BROADCAST_IP=`ifconfig eth0 | awk 'BEGIN { FS=":" ; RS=" " } /Bcast:/ { print $2 }'` # Get local Eth0 Broadcast IP Address

ADM_IP="@IP_ADM1 @IP_ADMx" # Ip Address of the remote allowed administration stations

DNS_IP="@IP_DNS1 @IP_DNSx"
PROXY_IP="@IP_PROXY1 @IP_PROXYx"
#NTP_IP="@IP_NTPSERVERS"
#ICMP_IP="@IPS_OF_ALLOWED_ICMP_REQUESTER_HOSTS"
#WINS_IP="@IPS_OF_WINS_AND_DOMAIN_SERVERS"
#NETBIOS_IP="@IP_OF_ALLOWED_NETBIOS_REMOTE_HOSTS"

# Personal Chains and default policie
DEFAULT_POL="INPUT OUTPUT FORWARD"
LOG_ACCEPT="LogAccept"
LOG_DROP="LogDrop"
LOOPBACK="DLoopBack"
CHECK_TCP="DCheckTcp"

# Various
RPORTS=":1024"
NRPORTS="1024:"

### BEGIN

# Flush and remove all chains then default the policies to DROP
$IPT -F
$IPT -X
for i in $DEFAULT_POL
do
$IPT -P $i DROP
done

### Create and set personnal chains
#
# NDR : (the log-prefix is used in the syslog.conf)
#

# Log and accept chain
$IPT -N $LOG_ACCEPT # Create a new one
$IPT -A $LOG_ACCEPT -j LOG --log-prefix 'Packet log '$LOG_ACCEPT' ' --log-tcp-options --log-ip-options --log-level 7 # Log and accept
$IPT -A $LOG_ACCEPT -j ACCEPT

# Log and drop chain
$IPT -N $LOG_DROP # Create a new one
$IPT -A $LOG_DROP -j LOG --log-prefix 'Packet log '$LOG_DROP' ' --log-tcp-options --log-ip-options --log-level 7 # Log and drop
$IPT -A $LOG_DROP -j DROP

# Check valid tcp connections chain
$IPT -N $CHECK_TCP
$IPT -A $CHECK_TCP -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -m state --state NEW -j RETURN
$IPT -A $CHECK_TCP -p tcp ! --syn -m state --state ESTABLISHED -j RETURN
$IPT -A $CHECK_TCP -j LOG --log-prefix 'Packet log '$LOG_DROP'/Invalid ' --log-tcp-options --log-ip-options --log-level 7 # Log and drop
$IPT -A $CHECK_TCP -j DROP

# Accept chain on loopback (to get a cleaver 'iptables -L -n')
$IPT -N $LOOPBACK
$IPT -A $LOOPBACK -j ACCEPT

### LOOPBACK, TCP DEFAULT CHECK AND REMOTE MANAGEMENT

# Allow whatever on loopback
$IPT -A INPUT -i lo -j $LOOPBACK
$IPT -A OUTPUT -o lo -j $LOOPBACK

# Check TCP flags on related connections
$IPT -A INPUT  -i eth0 -p tcp -j $CHECK_TCP
$IPT -A OUTPUT -o eth0 -p tcp -j $CHECK_TCP

# Allow SSH remote management and log Syn connections
for i in $ADM_IP
do
$IPT -A INPUT  -i $INT -p tcp -s $i --sport $NRPORTS  -d $LOCAL_IP --dport 22 -m state --state NEW         -j $LOG_ACCEPT
$IPT -A INPUT  -i $INT -p tcp -s $i --sport $NRPORTS  -d $LOCAL_IP --dport 22 -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o $INT -p tcp -s $LOCAL_IP --sport 22 -d $i --dport $NRPORTS  -m state --state ESTABLISHED -j ACCEPT
done

### ALLOW THESE TCP CONNECTIONS

# Allow HTTP/HTTPS to HTTP proxy servers
for i in $PROXY_IP
do
$IPT -A OUTPUT -o $INT -p tcp --sport $NRPORTS   -d $i --dport 8080 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT  -i $INT -p tcp -s $i --sport 8080 --dport $NRPORTS   -m state --state ESTABLISHED     -j ACCEPT
done

### Uncomment if you want to use Prelude communications.
## Allow Prelude communications to Prelude server
#  $IPT -A OUTPUT -o $INT -p tcp --sport $NRPORTS -d {PRELUDE_SRV_IP} --dport 5553:5554 -m state --state NEW,ESTABLISHED -j ACCEPT
#  $IPT -A INPUT  -i $INT -p tcp -s {PRELUDE_SRV_IP} --sport 5553:5554 --dport $NRPORTS -m state --state ESTABLISHED -j ACCEPT

### ALLOW THESE UDP CONNECTIONS

# Allow DNS Protocol to DNS Servers
for i in $DNS_IP
do
$IPT -A OUTPUT -o $INT -p udp --sport $NRPORTS -d $i --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPT -A INPUT  -i $INT -p udp -s $i --sport 53 --dport $NRPORTS -m state --state ESTABLISHED -j ACCEPT
done

### Uncomment if you want to allow communications to NTP servers
###  => Also uncomment and set NTP_IP at the beginning of the script.
## Allow NTP Protocol to NTP Servers
#  for i in $NTP_IP
#    do
#      $IPT -A OUTPUT -o $INT -p udp --sport $NRPORTS -d $i --dport 123 -m state --state NEW,ESTABLISHED -j ACCEPT
#      $IPT -A INPUT  -i $INT -p udp -s $i --sport 123 --dport $NRPORTS -m state --state ESTABLISHED -j ACCEPT
#  done

### ALLOW THESE ICMP REQUESTS AND RESPONSES

### Uncomment if you want to certain hosts to send us icmp requests
###  => Also uncomment and set ICMP_IP at the beginning of the script
# Allow some host's icmp requests
#for i in $ICMP_IP
#  do
#    $IPT -A INPUT  -i $INT -p icmp --icmp-type echo-request -s $i -m state --state NEW -j ACCEPT
#    $IPT -A INPUT  -i $INT -p icmp --fragment -j DROP
#    $IPT -A INPUT  -i $INT -p icmp --icmp-type destination-unreachable -s $i -j ACCEPT
#    $IPT -A INPUT  -i $INT -p icmp --icmp-type time-exceeded -s $i -m state --state RELATED -j ACCEPT
#    $IPT -A OUTPUT -o $INT -p icmp --icmp-type echo-reply -d $i -m state --state ESTABLISHED,RELATED -j ACCEPT
#done

### ALLOW SPECIFIC PROTOCOLS

### Uncomment if you want to allow NetBios networks streams
###  => Also uncomment and set WINS_IP and NETBIOS_IP at the beginning of the script
## Allow NetBios protocol with certains hosts
#$IPT -A OUTPUT -o $INT -p udp --sport 137:138 -d $BROADCAST_IP --dport 137:138 -m state --state NEW,ESTABLISHED -j ACCEPT
#for i in $WINS_IP
#  do
#    $IPT -A OUTPUT -o $INT -p udp --sport 137 -d $i --dport 137 -m state --state NEW,ESTABLISHED -j ACCEPT
#    $IPT -A INPUT  -i $INT -p udp -s $i --sport 137 --dport 137 -m state --state ESTABLISHED -j ACCEPT
#done
## Allow but log incoming syn connections on the 139 port number.
#for i in $NETBIOS_IP
#  do
#    $IPT -A INPUT  -i $INT -p udp -s $i --sport 137 --dport 137 -m state --state NEW,ESTABLISHED -j ACCEPT
#    $IPT -A OUTPUT -o $INT -p udp --sport 137 -d $i --dport 137 -m state --state ESTABLISHED -j ACCEPT
#    $IPT -A INPUT  -i $INT -p tcp -s $i --sport $NRPORTS --dport 139 -m state --state NEW -j $LOG_ACCEPT
#    $IPT -A INPUT  -i $INT -p tcp -s $i --sport $NRPORTS --dport 139 -m state --state ESTABLISHED -j ACCEPT
#    $IPT -A OUTPUT -o $INT -p tcp --sport 139 -d $i --dport $NRPORTS -m state --state ESTABLISHED -j ACCEPT
#done

### AND LAST : LOG AND DENY

for i in $DEFAULT_POL
do $IPT -A $i -j $LOG_DROP ; done

echo "$0 done"

Annexe 8. Script de backup

/home/system/scripts/backup/system_backup.sh

#!/bin/sh

#
# Debian-secinst v0.1.5 : ANNEXE 8 - Script de backup
# Simon Castro
#

#################
# CONFIGURATION #
#################

### Set these values to run backup.sh

# Location of the last backup date file : The one used to get the 'from date' in incremental mode
LAST_DONE_FILE=/home/system/scripts/backup/.last_done

# The backup partition : it can be unmounted or mounted read-only.
BACKUP_PARTITION=/backup

# Set here the directories or files you want to backup (absolute location from /)
BACKUP_FROM="/bin /boot /dev /etc /home /lib /root /sbin /usr /var"

# Set here the filename containing the file/directories you want to exclude from the backup archive
# This file must exist but may be empty
EXCLUDE="/home/system/scripts/backup/exclude"

# Logger phrase : Used to send the message to syslog but also displays error on stderr
SYSLOG_THIS="-s -p syslog.notice -t Backup"

### Set these values for the ciphering mode

# This file contains the filenames to backup separately - encoding them with the password
# This file must exist but may be empty
CIPHERED="/home/system/scripts/backup/include_but_ciphered"

# This is the password used to encode the archive
PASSWORD="toto"

# This is the command used to cipher the archive
CIPHER="/usr/bin/openssl enc -des3 -e -k $PASSWORD "

### Set these values if you really need to

# Binaries location
CAT=/bin/cat
CPIO=/bin/cpio
DATE=/bin/date
FIND=/usr/bin/find
GREP=/bin/grep
LOGGER=/usr/bin/logger
MD5SUM=/usr/bin/md5sum
MOUNT=/bin/mount
SED=/bin/sed
SYNC=/bin/sync
UMOUNT=/bin/umount

#############################################
# SYSTEM CONFIGURATION AND INITIAL CHECKING #
#############################################

# Check the $CIPHERED file exists
if [ ! $CIPHERED ] || [ ! -f $CIPHERED ]
then
$LOGGER $SYSLOG_THIS "Error : The 'ciphered' file is not set or does not exist"
exit -1
fi

# Check the $EXCLUDE file exists
if [ ! $EXCLUDE ] || [ ! -f $EXCLUDE ]
then
$LOGGER $SYSLOG_THIS "Error : The 'exclude' file is not set or does not exist"
exit -1
fi

# Check if user forced the full mode

FORCED=0
if [ $1 ] && [ $1 == "-f" ]
then
$LOGGER $SYSLOG_THIS "User forced the full backup mode"
FORCED=1
fi

# Remove first '/' from $BACKUP_FROM directories and go to '/'
BACKUP_FROM=`echo "$BACKUP_FROM" | $SED 's/\(^\/\)\|\(\ \/\)/ /g'`
cd /

# Check if last_done file exist and is set
LAST_DONE_DATE=
if [ $FORCED == 0 ] && [ -f $LAST_DONE_FILE ] && [ -s $LAST_DONE_FILE ]
then
LAST_DONE_DATE=`$CAT $LAST_DONE_FILE`
$LOGGER $SYSLOG_THIS "Incremental backup beginning : $LAST_DONE_DATE"
else
$LOGGER $SYSLOG_THIS "Full backup"
fi

# Check the backup partition and mount it read-write
IS_RO=
ISNT_MOUNTED="mounted" # Remember to always set this value to anything you want but not null
if [ -d $BACKUP_PARTITION ]
then
IS_R0=`$MOUNT | $GREP -E "$BACKUP_PARTITION.*ro"`
ISNT_MOUNTED=`$MOUNT | $GREP -E "$BACKUP_PARTITION"`
if [ "$IS_R0" ]
then
$LOGGER $SYSLOG_THIS "  Remounting rw $BACKUP_PARTITION"
$MOUNT -o remount,rw $BACKUP_PARTITION
fi
if [ ! "$ISNT_MOUNTED" ]
then
$LOGGER $SYSLOG_THIS "  Mounting rw $BACKUP_PARTITION"
$MOUNT -o rw $BACKUP_PARTITION
fi

else
$LOGGER $SYSLOG_THIS "Error : Won't be able to write backup on $BACKUP_PARTITION"
exit -1
fi

####################
# DO A FULL BACKUP #
####################

if [ ! "$LAST_DONE_DATE" ]
then

# Set the last_done file
$DATE > $LAST_DONE_FILE

# Create the backup directory
DESTDATE=`date "+%d%m%y-%H%M%S"`
DESTDIR=$BACKUP_PARTITION"/"full_$DESTDATE
mkdir $DESTDIR

# Begin the backup in the previously created directory
for i in $BACKUP_FROM
do
# Get the date of THIS file backuping process begin and set the destination backup filename
DESTDATE=`date "+%d%m%y-%H%M%S"`
# Set the dest file name from its real name but move '/' to '_'
DESTFILE=`echo $i | $SED 's/\//_/g'`
DESTFILE=$DESTDIR"/"$DESTFILE"_"$DESTDATE".tar.gz"

# Time to backup the file
$LOGGER $SYSLOG_THIS "    Backuping $DESTFILE"
tar zcvfp $DESTFILE -X $CIPHERED -X $EXCLUDE $i > /dev/null 2>> $DESTDIR".log"

# Time to check if errors occurred
if [ -f $DESTDIR".log" ] && [ -s $DESTDIR".log" ] && $GREP "Error" $DESTDIR".log" > /dev/null
then
$LOGGER $SYSLOG_THIS "Error while backuping $i"
else
HASH=`$MD5SUM $DESTFILE 2>> $DESTDIR".log"`
$LOGGER $SYSLOG_THIS "      Hash : $HASH"
echo $HASH >> $DESTDIR.md5
HASH=
fi
done

# Begin the backup of the excluded directories in a cpio archive and don't forget quotas configuration files if any...
cd / # First : Go to /
$LOGGER $SYSLOG_THIS "    Backuping excluded files into a cpio archive"
DESTFILE=$DESTDIR"/excluded.cpio"
for i in `$CAT $EXCLUDE`
do
if [ ! -f $DESTFILE ]
then
# First call to cpio => Create the cpio archive
echo $i | $CPIO -o --quiet > $DESTFILE 2>> $DESTDIR".log"
else
# The Cpio archive exists => Appends data
echo $i | $CPIO -o --quiet -O $DESTFILE -A > /dev/null 2>> $DESTDIR".log"
# Don't forget the quotas files...
$FIND $i -name "quota*.[gu]*" | $CPIO -o --quiet -O $DESTFILE -A > /dev/null 2>> $DESTDIR".log"
fi
done
cd - # Last : go to previous directory

# Time to check if errors occurred
if [ -f $DESTDIR".log" ] && [ -s $DESTDIR".log" ] && $GREP "Error" $DESTDIR".log" > /dev/null
then
$LOGGER $SYSLOG_THIS "Error while backuping $DESTFILE"
else
HASH=`$MD5SUM $DESTFILE 2>> $DESTDIR".log"`
$LOGGER $SYSLOG_THIS "      Hash : $HASH"
echo $HASH >> $DESTDIR.md5
HASH=
fi

fi

############################
# DO AN INCREMENTAL BACKUP #
############################

if [ "$LAST_DONE_DATE" ]
then

# Get the last_done date
LAST_DONE_DATE=`$CAT $LAST_DONE_FILE`
# Save the new date
# What kind of incremental backup do we want ?
#  1. A 'full' incremental backup from the last full backup ?
#  2. A incremental backup with the day to day changes from the last full backup ?
#
# If you choice the 2. solution, uncomment the next line.
# $DATE > $LAST_DONE_FILE

# Create the backup directory
DESTDATE=`date "+%d%m%y-%H%M%S"`
DESTDIR=$BACKUP_PARTITION"/"incr_$DESTDATE
mkdir $DESTDIR

# Begin the backup
for i in $BACKUP_FROM
do
# Get the date of THIS file backuping process begin and set the destination backup filename
DESTDATE=`date "+%d%m%y-%H%M%S"`
# Set the dest file name from its real name but move '/' to '_'
DESTFILE=`echo $i | $SED 's/\//_/g'`
DESTFILE=$DESTDIR"/"$DESTFILE"_"$DESTDATE".tar.gz"

# Time to backup the file
$LOGGER $SYSLOG_THIS "    Backuping $DESTFILE (incremental)"
tar zcvfp $DESTFILE -X $CIPHERED -X $EXCLUDE "$DESTFILE" --after-date "$LAST_DONE_DATE" $i 2>> $DESTDIR".log" > /dev/null

# Time to check if errors occurred
if [ -f $DESTDIR".log" ] && [ -s $DESTDIR".log" ] && $GREP "Error" $DESTDIR".log" > /dev/null
then
$LOGGER $SYSLOG_THIS "Error while backuping $i"
else
HASH=`$MD5SUM $DESTFILE 2>> $DESTDIR".log"`
$LOGGER $SYSLOG_THIS "      Hash : $HASH"
echo $HASH >> $DESTDIR.md5
HASH=
fi
done
fi

##########################################
# DO A CIPHERED BACKUP OF SPECIFIC FILES #
##########################################

if [ -f $CIPHERED ] && [ -s $CIPHERED ]
then
# Time to backup the files
$LOGGER $SYSLOG_THIS "    Backuping $CIPHERED files"
DESTFILE=$DESTDIR"/ciphered_"$DESTDATE".tar.gz"
tar zcvfp $DESTFILE -T $CIPHERED 2>> $DESTDIR".log" > /dev/null

# Time to cipher the tarball
$LOGGER $SYSLOG_THIS "      Ciphering $DESTFILE"
$CIPHER -in $DESTFILE -out $DESTFILE.des3 2>> $DESTDIR".log" > /dev/null

# Time to remove the original
$LOGGER $SYSLOG_THIS "      Removing $DESTFILE"
rm -f $DESTFILE 2>> $DESTDIR".log" > /dev/null

# Time to get the hash
if [ -f $DESTDIR".log" ] && [ -s $DESTDIR".log" ] && $GREP "Error" $DESTDIR".log" > /dev/null
then
$LOGGER $SYSLOG_THIS "Error while backuping $DESTFILE"
else
HASH=`$MD5SUM $DESTFILE.des3 2>> $DESTDIR".log"`
$LOGGER $SYSLOG_THIS "      Hash : $HASH"
echo $HASH >> $DESTDIR.md5
HASH=
fi
fi

#################################################################
# END : Sync and : remount read-only or umount Backup partition #
#################################################################

$LOGGER $SYSLOG_THIS "  Syncing disks"
$SYNC

if [ "$IS_R0" ]
then
$LOGGER $SYSLOG_THIS "  Remounting ro $BACKUP_PARTITION"
$MOUNT -o remount,ro $BACKUP_PARTITION
fi

if [ ! "$ISNT_MOUNTED" ]
then
$LOGGER $SYSLOG_THIS "  Unmounting $BACKUP_PARTITION"
$UMOUNT $BACKUP_PARTITION
Fi

Annexe 9. Script de restauration

#!/bin/sh
#
# Debian-secinst v0.1.6 : ANNEXE 9 - Script de restauration
# Simon Castro
#
# NDR : Beware of the command syntax, the script will be executed by ash.
#

#############
# VARIABLES #
#############

# The disk to use ...
DISK=`cat /backup/disk_name`

# Informations about the system this restore disk was created for
SERVER_INFOS="/backup/server_infos"

### Backuped configuration files used to restore the system
# The backuped partition table
BACKUPED="/backup/partitions_table"
# The backuped /etc/fstab file
FSTABED="/backup/fstab_file"
# The textfile with the fdisk script : fdisk /dev/xda < $FDISK_SCRIPT
FDISK_SCRIPT="/backup/fdisk_script"
# The backuped lilo configuration file to use to lilo the system.
LILO="/backup/lilo_file"

### Backuped system files
# Path to the file with the system archives information file (the cdrom is mounted on the /mnt mountpoint of the root filesystem)
ARCHIVES="/mnt/archives/infos.txt"

#####################
# DISPLAY FUNCTIONS #
#####################

display_menu()
{
/bin/cat <<EOF
Debian-Secinst v0.1.6 Restore script

Enter alt-[F1-F4] to : have this menu, have a shell, look at the logs.
To reboot : ctrl-alt-del

/bin/cat $SERVER_INFOS

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).

EOF

}

wait_user()
{
/usr/bin/test $AUTOMATED = 0 &&
{
echo "Press enter when you're done with this"
read waituser
}
}

clear_and_title()
{
/usr/bin/clear
echo "Debian-Secinst v0.1.6 Restore script"
echo
}

##########################
# NON CONSEQUENT ACTIONS #
##########################

show_actual()
{
clear_and_title
echo "Actual partition table is :"
/sbin/fdisk -lu $DISK
echo
wait_user
}

show_backuped()
{
clear_and_title
echo "Backuped partition table is ($BACKUPED) :"
echo
/bin/cat $BACKUPED
echo
wait_user
}

show_fstabed()
{
clear_and_title
echo "Backuped fstab file is ($FSTABED) :"
echo
/bin/cat $FSTABED
echo
wait_user
}

######################
# CONSEQUENT ACTIONS #
######################

write_backuped()
{
/usr/bin/test $AUTOMATED = 0 && clear_and_title
echo "You're about to write a new partitions table..."
echo "This will delete any data présent on the disk."
echo -n "Are you sure you want to do that (N/y) ? "
/usr/bin/test $AUTOMATED = 0 && read userissure
/usr/bin/test $AUTOMATED = 1 || /usr/bin/test "$userissure" = "y" &&
{
echo
echo
echo "  I am deleting the actual partitions table..."
/bin/dd if=/dev/zero of=$DISK bs=512 count=1 > /dev/null
/bin/sync
echo "  I'm creating the new partitions table..."
fdisk $DISK < $FDISK_SCRIPT > /dev/null
echo "  Done..."
echo
/usr/bin/test $AUTOMATED = 0 && wait_user
}
}

#
# NDR : The search command for labels on ext partitions is really bad...
#      Couldn't find another way to get the label if fstab file contains /dev/xdaX with X > 9
#

format_disk()
{
/usr/bin/test $AUTOMATED = 0 && clear_and_title
echo "You're about to format the disk using the backuped fstab file..."
echo "This will delete any data présent on the disk."
echo -n "Are you sure you want to do that (N/y) ? "
/usr/bin/test $AUTOMATED = 0 && read userissure
/usr/bin/test $AUTOMATED = 1 || /usr/bin/test "$userissure" = "y" &&
{
echo
echo
echo "Formatting Swap partition(s) : "
for i in `/bin/grep swap $FSTABED | /usr/bin/tr '\t' ' ' | /usr/bin/cut -d ' ' -f 1`
do
echo "  $i"
/sbin/mkswap $i > /dev/null
done
echo
echo "Formatting Ext2 partition(s) : "
for i in `/bin/grep ext2 $FSTABED | /usr/bin/cut -d ' ' -f 1`
do
LABEL=`/bin/grep "$i " $FSTABED | /usr/bin/cut -d ' ' -f 2`
echo "  $i on $LABEL"
/sbin/mke2fs -L $LABEL $i > /dev/null
done
echo

/bin/sync

echo "  Done..."
echo
/usr/bin/test $AUTOMATED = 0 && wait_user
}
}

mount_partitions()
{
/usr/bin/test $AUTOMATED = 0 && clear_and_title
echo "You're about to mount the backuped's fstab file partition on the current disk..."
echo -n "Are you sure you want to do that (N/y) ? "
/usr/bin/test $AUTOMATED = 0 && read userissure
/usr/bin/test $AUTOMATED = 1 || /usr/bin/test "$userissure" = "y" &&
{
echo

echo "Mounting / partition on /target : "
echo
SLASH=`/bin/grep " / " $FSTABED | /usr/bin/cut -d ' ' -f 1`
MOUNTED=0
/bin/mount $SLASH /target && MOUNTED=1

/usr/bin/test $MOUNTED = 0 && {
echo
echo "FAILED ... Waiting for user action ..."
AUTOMATED=0
read useraction
}

/usr/bin/test $MOUNTED = 1 &&  {
echo "  $SLASH / partition is now on /target..."
echo
for i in `/bin/grep ext2 $FSTABED | /bin/grep -v " / " | /usr/bin/cut -d ' ' -f 1`
do
LABEL=`/bin/grep "$i " $FSTABED | /usr/bin/cut -d ' ' -f 2`
echo -n "  Creating /target$LABEL mountpoint ... "
/bin/mkdir "/target$LABEL"
echo "Mounting $i on /target$LABEL"
/bin/mount -t ext2 $i "/target$LABEL"
done
echo
echo "  Done..."
echo
/usr/bin/test $AUTOMATED = 0 && wait_user
}

}
}

restore_system()
{
/usr/bin/test $AUTOMATED = 0 && clear_and_title
echo "You're about to restore the system files on the current disk..."
echo -n "Are you sure you want to do that (N/y) ? "
/usr/bin/test $AUTOMATED = 0 && read userissure
/usr/bin/test $AUTOMATED = 1 || /usr/bin/test "$userissure" = "y" &&
{
echo

echo "  Mounting cdrom on /mnt"
/bin/mount /dev/hdc /mnt -t iso9660 && MOUNTED=1

/usr/bin/test $MOUNTED = 0 && {
echo
echo "FAILED ... Waiting for user action ..."
AUTOMATED=0
read useraction
}

/usr/bin/test $MOUNTED = 1 &&  {
echo "  Cdrom is now on /mnt..."
echo

echo "Going to /target"
cd /target

echo
echo "Restoring the system with .tar.gz archives : "
for archive in `cat $ARCHIVES | /bin/grep "tar.gz"`
do
echo "  Restoring $archive..."
/bin/tar zxvfp $archive > /dev/null
done

/bin/sync

echo
echo "Restoring the system with .cpio archives : "
for archive in `cat $ARCHIVES | /bin/grep ".cpio"`
do
echo "  Restoring $archive..."
/bin/cpio -id < $archive > /dev/null
done

/bin/sync

echo
echo "Unmounting cdrom..."
/bin/umount /dev/hdc

echo
echo "  Done..."
echo
/usr/bin/test $AUTOMATED = 0 && wait_user
}
}
}

lilo_system()
{
/usr/bin/test $AUTOMATED = 0 && clear_and_title
echo "You're about to lilo the current disk with the backuped lilo file..."
echo -n "Are you sure you want to do that (N/y) ? "
/usr/bin/test $AUTOMATED = 0 && read userissure
/usr/bin/test $AUTOMATED = 1 || /usr/bin/test "$userissure" = "y" &&
{
echo
echo "Lilo-ing current disk..."
/sbin/lilo -C $LILO

echo "  Done..."
echo
/usr/bin/test $AUTOMATED = 0 && wait_user
}
}

sync_system()
{
/usr/bin/test $AUTOMATED = 0 && clear_and_title
echo "You're about to sync the current disk and umount /target restored file system..."
echo -n "Are you sure you want to do that (N/y) ? "
/usr/bin/test $AUTOMATED = 0 && read userissure
/usr/bin/test $AUTOMATED = 1 || /usr/bin/test "$userissure" = "y" &&
{
echo
echo
echo "Syncing..."
/bin/sync

echo
echo "Umounting partitions : "
CPT=1
while /usr/bin/test $CPT -le `/bin/cat $FSTABED | /bin/grep -v " / " | /usr/bin/wc -l`
do
LABEL=`/usr/bin/tail -n $CPT $FSTABED | /usr/bin/head -n 1 | /usr/bin/cut -d ' ' -f 1`
echo "  Unmounting $LABEL"
/bin/umount $LABEL
CPT=$(($CPT+1))
done

echo
echo "Unmounting '/' partition... "
/bin/umount /target

echo
echo "  Done..."
echo
/usr/bin/test $AUTOMATED = 0 && wait_user
}
}

##################
# AUTOMATED CALL #
##################

automated()
{
AUTOMATED=1
clear_and_title
write_backuped
format_disk
mount_partitions
restore_system
lilo_system
sync_system

echo "Automated script done..."
echo
echo "You can now check the restored system with a shell or reboot the system..."
read waituser
AUTOMATED=0
}

########
# MAIN #
########

while [ 1 ]
do
/usr/bin/clear
AUTOMATED=0
display_menu
echo -n "What do you want ? "
read userinput
case $userinput in
1) show_actual ;;
2) show_backuped ;;
3) show_fstabed ;;
4) write_backuped ;;
5) format_disk ;;
6) mount_partitions ;;
7) restore_system ;;
8) lilo_system ;;
9) sync_system ;;
A) automated ;;
esac
/usr/bin/clear
done

Annexe 10. Exemple de script Fdisk

Ce script est fourni à titre d'exemple et vous NE DEVRIEZ PAS L'UTILISER !

Notes :

- Sur chaque ligne figure une commande suivie d'un '# commentaires'

- Le '# commentaires' ne doit pas apparaitre dans votre script

- Chaque commande est suivie d'un retour chariot.

- Les \n doivent etre remplacés par des retours chariot.

Ce script est relatif au partitionnement presente en '1.5 Partitionnez le disque dur' avec l'ajout de partitions pour un serveur Web, pour un serveur Was et pour une gestion de backup.

n      # Cree une nouvelle partition
p      # Cette partition est primaire
1      # Cette partition porte le numero 1
\n     # Cette partition debute au premier cylindre libre par defaut
+100M  # Cette partition occupe 100 Mega d'espace disque
a      # Nous voulons activer une partition comme etant bootable
1      # La partition bootable est la partition 1
n      # Cree une nouvelle partition, etc...
p
2
\n
+300M
t      # Nous voulons specifier le type d'une partition
2      # Nous specifions le type de la partition 2
82     # Cette partition 2 doit etre du type 82 (linux swap)
n
p
3
\n
+20M
n      # Créé une nouvelle partition
e      # Cette partition est etendue
4      # Cette partition porte le numero 4
\n     # Cette partition debute au premier cylindre libre par defaut
\n     # Cette partition finit au dernier cylindre par defaut
n      # Créé une nouvelle partition
\n     # Cette partition est etendue, elle debute au premier cylindre libre par défaut
+50M   # Cette partition occupe 50 Mega d'espace disque
n      # Créé une nouvelle partition etc...
\n
+120M
n
\n
+50M
n
\n
+200M
n
\n
+2000M
n
\n
+500M
n
\n
+300M
n
\n
+200M
n
\n
+300M
n      # Créé la dernière partition
\n     # Cette partition debute au premier cylindre libre par defaut
\n     # Cette partition occupe tout l'espace restant
w      # Ecrit la table de partitions sur le disque et quitte

Annexe 11. Paramètres de configuration d'un noyau GrSecurity

#
# Grsecurity
#
CONFIG_GRKERNSEC=y
CONFIG_CRYPTO=y
CONFIG_CRYPTO_SHA256=y
# CONFIG_GRKERNSEC_LOW is not set
# CONFIG_GRKERNSEC_MID is not set
# CONFIG_GRKERNSEC_HI is not set
CONFIG_GRKERNSEC_CUSTOM=y
#
# Address Space Protection
#
CONFIG_GRKERNSEC_PAX_NOEXEC=y
# CONFIG_GRKERNSEC_PAX_PAGEEXEC is not set
CONFIG_GRKERNSEC_PAX_SEGMEXEC=y
# CONFIG_GRKERNSEC_PAX_EMUTRAMP is not set
CONFIG_GRKERNSEC_PAX_MPROTECT=y
# CONFIG_GRKERNSEC_PAX_NOELFRELOCS is not set
CONFIG_GRKERNSEC_PAX_ASLR=y
CONFIG_GRKERNSEC_PAX_RANDKSTACK=y
CONFIG_GRKERNSEC_PAX_RANDUSTACK=y
CONFIG_GRKERNSEC_PAX_RANDMMAP=y
# CONFIG_GRKERNSEC_PAX_RANDEXEC is not set
# CONFIG_GRKERNSEC_KMEM is not set
# CONFIG_GRKERNSEC_IO is not set
CONFIG_GRKERNSEC_PROC_MEMMAP=y
CONFIG_GRKERNSEC_HIDESYM=y
#
# ACL options
#
CONFIG_GRKERNSEC_ACL_HIDEKERN=y
CONFIG_GRKERNSEC_ACL_MAXTRIES=3
CONFIG_GRKERNSEC_ACL_TIMEOUT=30
#
# Filesystem Protections
#
CONFIG_GRKERNSEC_PROC=y
# CONFIG_GRKERNSEC_PROC_USER is not set
CONFIG_GRKERNSEC_PROC_USERGROUP=y
CONFIG_GRKERNSEC_PROC_GID=4
CONFIG_GRKERNSEC_PROC_ADD=y
CONFIG_GRKERNSEC_LINK=y
CONFIG_GRKERNSEC_FIFO=y
CONFIG_GRKERNSEC_CHROOT=y
CONFIG_GRKERNSEC_CHROOT_MOUNT=y
CONFIG_GRKERNSEC_CHROOT_DOUBLE=y
CONFIG_GRKERNSEC_CHROOT_PIVOT=y
CONFIG_GRKERNSEC_CHROOT_CHDIR=y
CONFIG_GRKERNSEC_CHROOT_CHMOD=y
CONFIG_GRKERNSEC_CHROOT_FCHDIR=y
CONFIG_GRKERNSEC_CHROOT_MKNOD=y
CONFIG_GRKERNSEC_CHROOT_SHMAT=y
CONFIG_GRKERNSEC_CHROOT_UNIX=y
CONFIG_GRKERNSEC_CHROOT_FINDTASK=y
CONFIG_GRKERNSEC_CHROOT_NICE=y
CONFIG_GRKERNSEC_CHROOT_SYSCTL=y
CONFIG_GRKERNSEC_CHROOT_CAPS=y
#
# Kernel Auditing
#
CONFIG_GRKERNSEC_AUDIT_GROUP=y
CONFIG_GRKERNSEC_AUDIT_GID=1007
CONFIG_GRKERNSEC_EXECLOG=y
CONFIG_GRKERNSEC_RESLOG=y
CONFIG_GRKERNSEC_CHROOT_EXECLOG=y
CONFIG_GRKERNSEC_AUDIT_CHDIR=y
CONFIG_GRKERNSEC_AUDIT_MOUNT=y
CONFIG_GRKERNSEC_AUDIT_IPC=y
CONFIG_GRKERNSEC_SIGNAL=y
CONFIG_GRKERNSEC_FORKFAIL=y
CONFIG_GRKERNSEC_TIME=y
#
# Executable Protections
#
CONFIG_GRKERNSEC_EXECVE=y
CONFIG_GRKERNSEC_DMESG=y
CONFIG_GRKERNSEC_RANDPID=y
CONFIG_GRKERNSEC_TPE=y
CONFIG_GRKERNSEC_TPE_ALL=y
CONFIG_GRKERNSEC_TPE_GID=1005
#
# Network Protections
#
CONFIG_GRKERNSEC_RANDNET=y
CONFIG_GRKERNSEC_RANDISN=y
CONFIG_GRKERNSEC_RANDID=y
CONFIG_GRKERNSEC_RANDSRC=y
CONFIG_GRKERNSEC_RANDRPC=y
CONFIG_GRKERNSEC_SOCKET=y
CONFIG_GRKERNSEC_SOCKET_ALL=y
CONFIG_GRKERNSEC_SOCKET_ALL_GID=1004
CONFIG_GRKERNSEC_SOCKET_CLIENT=y
CONFIG_GRKERNSEC_SOCKET_CLIENT_GID=1003
CONFIG_GRKERNSEC_SOCKET_SERVER=y
CONFIG_GRKERNSEC_SOCKET_SERVER_GID=1002
#
# Sysctl support
#
CONFIG_GRKERNSEC_SYSCTL=y
#
# Logging options
#
CONFIG_GRKERNSEC_FLOODTIME=10
CONFIG_GRKERNSEC_FLOODBURST=4

Annexe 12. Configuration Sysctl de GrSecurity

/etc/sysctl.conf.grsecurity :

### Restrictions Grsecurity
# Mettez a jour ce script selon vos besoins (au moins pour les gids) puis testez
# le avec sysctl -p /etc/sysctl.conf.grsecurity

# Protection du systeme de fichiers

kernel/grsecurity/chroot_caps=1
kernel/grsecurity/chroot_deny_chmod=1
kernel/grsecurity/chroot_deny_chroot=1
kernel/grsecurity/chroot_deny_fchdir=1
kernel/grsecurity/chroot_deny_mknod=1
kernel/grsecurity/chroot_deny_mount=1
kernel/grsecurity/chroot_deny_pivot=1
kernel/grsecurity/chroot_deny_shmat=1
kernel/grsecurity/chroot_deny_sysctl=1
kernel/grsecurity/chroot_deny_unix=1
kernel/grsecurity/chroot_enforce_chdir=1
kernel/grsecurity/chroot_findtask=1
kernel/grsecurity/chroot_restrict_nice=1

kernel/grsecurity/fifo_restrictions=1
kernel/grsecurity/linking_restrictions=1

# Protection des executables

kernel/grsecurity/dmesg=1

kernel/grsecurity/execve_limiting=1

# Execution dans des repertoires WR_ONLY_FOR_ROOT ?
kernel/grsecurity/tpe=1
# Pour ce groupe
kernel/grsecurity/tpe_gid=1006
# Pour tous les autres : non WR groupe/tlm et WR_ONLY_FOR_ROOT ?
kernel/grsecurity/tpe_restrict_all=0

kernel/grsecurity/rand_pids=1

# Protection reseau

kernel/grsecurity/rand_ip_ids=1
kernel/grsecurity/rand_isns=1
kernel/grsecurity/rand_rpc=1
kernel/grsecurity/rand_tcp_src_ports=1

kernel/grsecurity/socket_all=1        # Pas de serveur / Pas de connect ?
kernel/grsecurity/socket_all_gid=1007 # Pour ce groupe

kernel/grsecurity/socket_client=1        # Pas de connect ?
kernel/grsecurity/socket_client_gid=1008 # Pour ce groupe

kernel/grsecurity/socket_server=1        # Pas de serveur ?
kernel/grsecurity/socket_server_gid=1009 # Pour ce groupe

# Remontee d'informations via les logs du kernel

kernel/grsecurity/audit_group=1  # Activation ?
kernel/grsecurity/audit_gid=1010 # Pour ce groupe
kernel/grsecurity/exec_logging=1
kernel/grsecurity/audit_chdir=1
kernel/grsecurity/audit_mount=1
kernel/grsecurity/audit_ipc=1

kernel/grsecurity/signal_logging=0
kernel/grsecurity/forkfail_logging=1
kernel/grsecurity/timechange_logging=1
kernel/grsecurity/chroot_execlog=1

# Activations des listes de controle d'acces

kernel/grsecurity/acl=1

# Activation de la securite (Attention a ce que vous faites !!!)

kernel/grsecurity/grsec_lock=0

Annexe 13. ACLs GrSecurity pour Debian-secinst

Patch pour le fichier /etc/grsec/acl :

4c4,5
<       /home   rwx
---
>       /home   rx
>       /mnt    r
14a16,17
>       /dev/dsp        rw
>       /dev/mixer      rw
24a28
>         /etc/postfix    r
31c35
<         /root           rx
---
>         /root           r
35a40
>         /var/spool/postfix/lib rx
38c43
<       /var/log        r
---
>       /var/log
42,48d46
<       /home/system    rx
<
<       # If you use WAS and if you want to set next for admins ?
<       /var/was/installableApps        rw
<       # Same for this one if you use a webserver ?
<       /var/www/htdocs                 rw
<
53d50
< include </etc/grsec/debian-secinst>

/etc/grsec/debian-secinst/Adm_addons :

# Debian-secinst v0.1.11 : ANNEXE 13 - ACLs GrSecurity pour Debian-secinst
# Simon Castro - http://www.entreelibre.com/scastro/debian-secinst/
#
#   These acls are addons for the default  security  restrictions  applied  with
# /etc/grsec/acl. They are used to lower the security level so that  admins  can
# work on the server without having to get root or gradm -a permissions.
#
#   The first acls allow user to administrate the  server  while  the last  ones
# are related to specific daemons administration such as Apache or Ibm Websphere
# Application Server.
#
#   Un-securing the server is way is something you  should  think  about  before
# doing anything :)
#
# Note that most of next Acls inherit default permissions from the / parent.
#

### Allowing /bin/su

/bin/su {
/etc/shadow     r
/dev/log        rw
/var/log/sulog  rw

+CAP_SYS_TTY_CONFIG
+CAP_SETGID
+CAP_SETUID
+CAP_SYS_RESOURCE
}

/usr/bin/mesg {
+CAP_FOWNER
+CAP_FSETID
}

### Allowing /usr/bin/sudo

/usr/bin/sudo {
/dev/log rw
/etc/shadow r
/usr/bin/sudo x

+CAP_SETGID
+CAP_SETUID
}

### Allowing /bin/ps without logfiles errors ?

/bin/ps {
+CAP_DAC_OVERRIDE
+CAP_SYS_PTRACE
}

### Allowing Mail on the server (does not inherit from / parent)

/usr/bin/mail do {
/etc                    r
/etc/grsec              h
/lib                    rx
/usr/lib                rx
/usr/share/zoneinfo     r
/proc                   r

/tmp                    rw
/var/mail               rw

/bin/bash               x
/usr/sbin/exim          x
/usr/bin/dotlockfile    ix

/usr/bin/mail x
/ h

-CAP_ALL
+CAP_DAC_OVERRIDE
+CAP_DAC_READ_SEARCH
+CAP_SETUID
+CAP_SETGID

connect { disabled }
bind    { disabled }
}

### Allowing Reboot via shutdown

/sbin/shutdown {
/etc
/etc/ld.so.preload      r
/etc/ld.so.cache        r
/etc/nsswitch.conf      r
/etc/passwd             r
/dev/initctl            rw

+CAP_DAC_OVERRIDE
+CAP_SETUID
+CAP_SYS_TTY_CONFIG
}

/sbin/reboot {
/var/log/wtmp   a
+CAP_SYS_BOOT
}

### Do we use an Apache webserver ?

/usr/sbin/apachectl {
+CAP_DAC_OVERRIDE
}

### Allow the system backup script to do what is right...

/home/system/scripts/backup/system_backup.sh o {
/               r
/bin            rx
/usr/bin        rx
/lib            rx
/usr/lib        rx
/home           r
/proc           r
/etc            r

/dev/log        rw
/dev/tty        rw
/dev/pts        rw
/dev/null       rw

/backup         rw

/bin/mount      ix
+CAP_SYS_ADMIN

/usr/bin/logger ix
/bin/mkdir      ix
/bin/tar        ix
/usr/bin/md5sum ix
/bin/grep       ix
/bin/rm         ix
/usr/bin/openssl        ix

+CAP_DAC_READ_SEARCH
+CAP_DAC_OVERRIDE
}

### Allow the samba_backup script to do what's right (including stop/starting samba)

/home/system/scripts/backup/samba_backup.sh o {
/
/bin            rx
/usr/bin        rx
/lib            rx
/usr/lib        rx

/dev/tty        rw
/dev/pts        rw

/etc/ld.so.preload      r
/etc/ld.so.cache        r
/etc/fstab              r
/etc/mtab               r
/proc                   r

/etc/default/samba      r
/etc/init.d/samba       irx
/sbin/start-stop-daemon ix
/var/run/samba/         rw
/usr/sbin/nmbd          ix
/usr/sbin/smbd          ix
/usr/share/zoneinfo     r
/var/log/samba          a
/etc/samba              r
/dev/log                rw
/dev/urandom            r
/dev/null               rw
/usr/share/samba        r

# If ran from cron
/var/lib/samba          rw
/var/cache/samba        rw

/home/system/scripts/backup/system_backup.sh rx
+CAP_DAC_OVERRIDE
}

# If Samba_backup.sh is ran from cron
/usr/sbin/smbd  {
+CAP_SETGID
+CAP_SETUID
}

### Allow the system_report script to do what's right

/home/system/scripts/reports/system_report.sh o {

/bin                    rx
/sbin                   rx
/usr/bin                rx
/usr/sbin               rx
/lib                    rx
/usr/lib                rx
/etc/ld.so.cache        r
/etc/ld.so.preload      r
/etc/mtab               r
/etc/mail.rc            r
/proc                   r
/usr/share/zoneinfo     r

/dev/null               rw
/dev/tty                rw
/dev/pts                rw
/dev/log                rw
/tmp                    rw
/

/usr/bin/logger ix
/bin/netstat    ix
/usr/bin/mail   ix

+CAP_DAC_OVERRIDE
+CAP_DAC_READ_SEARCH
+CAP_SETGID
+CAP_SETUID

/home/system/scripts/reports/system_report.sh   rx
/home/system/scripts/reports                    rw
}
/etc/grsec/debian-secinst/Dmn_apache :

# Debian-secinst v0.1.11 : ANNEXE 11 - Configuration des ACLs GrSecurity
# Simon Castro - http://www.entreelibre.com/scastro/debian-secinst/
#
#   Update of the apache acl configuration file provided with the Gradm  toolset
# version 1.9.12.
#

/usr/sbin/apache oXA {
/usr/share r
/etc r
/etc/grsec h
/etc/ld.so.cache r
/tmp rwx
/lib rx
/usr/lib rx
/var/log/apache a
/var/run/apache.pid w
/var/www rx
/dev/null rw
/bin/bash x
/usr/sbin/apache x

# These one remove errors related to a debian-secinst setup
/proc/sys/kernel/version r
/dev/urandom r

# Uncomment here if you use a Websphere Application Server
/usr/local/websphere500/appserver/bin/mod_app_server_http.so rx
/var/was/config/cells/plugin-cfg.xml r
/var/was/logs   ra
/lockTrace      rw

/

-CAP_ALL
+CAP_DAC_OVERRIDE
+CAP_KILL
+CAP_SETGID
+CAP_SETUID
+CAP_NET_BIND_SERVICE

RES_CRASH 3 10m

connect {
0.0.0.0/0:53 dgram udp
# If you use a Websphere Application Server, set the destination
# tcp ports one by one or use that kind of range...
#{Application_server_IP_address}:9080-9099 stream tcp
# Uncomment here if the Websphere Application Server is located
# behind Apache (reverse-proxy mode).
#127.0.0.1:9090 stream tcp
}

bind {
0.0.0.0/0:80 stream tcp
# Add here the few more listenning ports of your Apache setup...
#0.0.0.0/0:443 stream tcp
}
}

/etc/grsec/debian-secinst/Dmn_cron :

# Debian-secinst v0.1.11 : ANNEXE 11 - Configuration des ACLs GrSecurity
# Simon Castro - http://www.entreelibre.com/scastro/debian-secinst/
#
#   Update of the cron acl configuration file provided with the Gradm  toolset
# version 1.9.12.
#

/usr/sbin/cron oX {
/etc/environment
/var/spool/cron/crontabs
/var/mail
/usr/sbin/sendmail x
/root
/lib rx
/etc r
/etc/grsec h
/dev/log rw
/bin/bash x
/usr/sbin/cron x
/ h

-CAP_ALL
+CAP_SETGID
+CAP_SETUID

RES_CRASH 1 10m

connect {
disabled
}

bind {
disabled
}
}

### Cron.daily

/etc/cron.daily/exim    {
+CAP_DAC_OVERRIDE
+CAP_DAC_READ_SEARCH
}

/etc/cron.daily/aide    o {
/bin                    x
/usr/bin                x
/lib                    rx
/etc/mtab               r
/etc/ld.so.preload      r
/etc/ld.so.cache        r
/proc                   r

/dev/null       w
/dev/tty        rw
/tmp            rw

/var/log/aide           rw

/etc/cron.daily/aide    x
/

-CAP_ALL
}

/etc/cron.daily/find    {
/                       r
/var/lib/locate/        rw
/usr/bin/updatedb       irx
/bin/rm                 ix
/bin/mv                 ix
/bin/chmod              ix
}

/etc/cron.daily/logrotate       {
/bin/sh                         ix
/etc/init.d/apache              irx

/usr/sbin/logrotate             ix
/var/lib/logrotate/status       rw
}

/etc/cron.daily/man-db          {
/                       r

/sbin/start-stop-daemon ix
/bin/sh                 ix
/usr/bin/find           ix

+CAP_SETUID
+CAP_SETGID
}

/etc/cron.daily/modutils        {
/var/log/ksymoops               rw
/sbin/insmod_ksymoops_clean     irx
/bin/cp                         ix
/bin/rm                         ix
/usr/bin/find                   ix
+CAP_CHOWN
+CAP_FSETID
}

/etc/cron.daily/standard        {
/etc/shadow     r
/etc/gshadow    r
/var/log        rw
/usr/bin/cmp    ix
}

/etc/cron.daily/sysklogd        {
/var/log        rw
/bin/chmod      ix

/etc/init.d/sysklogd    irx
+CAP_FSETID
}

/usr/sbin/checksecurity {
/               r
/var/log        rw

/usr/bin/find   ix
/bin/mv         ix
/bin/chmod      ix
/bin/chown      ix
/bin/rm         ix

+CAP_DAC_READ_SEARCH
+CAP_DAC_OVERRIDE
+CAP_FSETID
+CAP_CHOWN
}

### Cron.weekly

/etc/cron.weekly/man-db {
/                       r

/sbin/start-stop-daemon ix
/bin/sh                 ix
/usr/bin/find           ix

+CAP_SETUID
+CAP_SETGID
}

/etc/cron.weekly/sysklogd       {
/var/log        rw
/bin/chmod      ix

/etc/init.d/sysklogd    irx
+CAP_FSETID
}

### Cron.monthly

### Script to rotate debian-secinst specific logfiles

/home/system/scripts/crond/sysklogd     {
/var/log        rw
/etc/init.d/sysklogd    irx
}

### Last acl often called

/sbin/start-stop-daemon k {
+CAP_SETUID
+CAP_KILL
/sbin/syslogd   x
}

/etc/grsec/debian-secinst/Dmn_syslogd :

# Debian-secinst v0.1.11 : ANNEXE 11 - Configuration des ACLs GrSecurity
# Simon Castro - http://www.entreelibre.com/scastro/debian-secinst/
#
#   Update of the syslogd acl configuration file provided with the Gradm toolset
# version 1.9.12.
#
#   In this file are presented all of the logs related management acls.
#

/sbin/syslogd poX {
/etc/syslog.conf r
/dev/console rw
/etc/services r
/lib rx
/dev
/dev/log rw
/var/run rw
/var/log rw
/sbin/syslogd x
/ h

# Setup debian-secinst
/usr/bin/savelog        ix

-CAP_ALL

RES_CRASH 1 10m

connect {
disabled
}

bind {
disabled
}
}

/usr/bin/savelog        {

/var/log        rw

/bin/gzip       ix
/bin/chgrp      ix
/bin/mv         ix
/bin/chmod      ix
/bin/chown      ix
/usr/bin/touch  ix
/bin/ln         ix
/bin/rm         ix
/usr/bin/aide   ix

+CAP_CHOWN
+CAP_FOWNER
+CAP_FSETID
+CAP_DAC_READ_SEARCH
+CAP_DAC_OVERRIDE
}

/etc/grsec/debian-secinst/Dmn_websphere :

# Debian-secinst v0.1.11 : ANNEXE 11 - Configuration des ACLs GrSecurity
# Simon Castro - http://www.entreelibre.com/scastro/debian-secinst/
#
#   Allow a Websphere Application server to run and to be  remotely  managed  by
# HTTP administration console (i.e.  :  Adding/Removing  new  web  applications,
# starting/stopping web applications, etc...).
#
#   You can use this generic acl but you'd better use the learning  mode  to  be
# much closer to your own environment.
#

/usr/local/websphere500/appserver/java/jre/bin/exe/java do {

/bin                            rx
/dev
/dev/pts                        rw
/dev/tty                        rw
/dev/null                       rw
/etc                            r
/etc/grsec                      h
/etc/ld.so.cache                r
/etc/ld.so.preload              r
/home
/lib                            rx
/opt
/proc                           r
/usr
/usr/bin                        rx
/usr/lib/                       rx
/usr/local
/usr/share/zoneinfo             r
/tmp                            rw
/var

/usr/local/websphere500                         r
/usr/local/websphere500/appserver/bin           rx
/usr/local/websphere500/appserver/java/jre/bin  rx

/var/was/logs/                  rw
/var/was/temp/                  rw
/var/was/tranlog/               rw
/var/was/wstemp/                rw
# On production servers, you maybe should use read-only
/var/was/config/                rw
/var/was/installedApps/         rw
/var/was/installableApps        r
/var/was/properties             r

/usr/local/websphere500/appserver/java/jre/bin/java irx

/usr/local/websphere500/appserver/java/jre/bin/exe/java rx
/ h

-CAP_ALL
}

/etc/grsec/debian-secinst/Sys_aide :

# Debian-secinst v0.1.11 : ANNEXE 11 - Configuration des ACLs GrSecurity
# Simon Castro - http://www.entreelibre.com/scastro/debian-secinst/
#
#   Acls for an AIDE configuration.
#

/usr/bin/aide   o {

/bin            rx
/sbin           r
/etc            r
/home/system    r
/lib            rx
/usr            r

/var/log/aide   rw

/usr/bin/aide   rx
/

-CAP_ALL
+CAP_DAC_READ_SEARCH
+CAP_DAC_OVERRIDE
}

/etc/grsec/debian-secinst/Sys_exim :

# Debian-secinst v0.1.11 : ANNEXE 11 - Configuration des ACLs GrSecurity
# Simon Castro - http://www.entreelibre.com/scastro/debian-secinst/
#
# Allow exim to run (used by cron jobs and by users Mail actions)
#
# Note : /usr/sbin/sendmail is a symlink to this one...
#

/usr/sbin/exim_tidydb   {
+CAP_DAC_OVERRIDE
+CAP_DAC_READ_SEARCH
}

/usr/sbin/exim doX {
/etc                    r
/etc/grsec              h
/lib                    rx
/usr/lib                rx
/usr/share/zoneinfo     r

/home
/proc   r

/dev/null               rw
/var/spool/exim         rw
/var/log/exim/mainlog   a
/var/log/exim/paniclog  a
/var/mail               rw

/usr/sbin/exim x
/

-CAP_ALL
+CAP_SETGID
+CAP_SETUID
+CAP_DAC_OVERRIDE
+CAP_DAC_READ_SEARCH

RES_CRASH 1 10m
}

Annexe 14. Script d'initialisation Nagios

#!/bin/sh

NAGIOS_BIN=/usr/local/nagios/bin/nagios
NAGIOS_CFG=/usr/local/nagios/etc/nagios.cfg
NAGIOS_FLG=" -d "
NAGIOS_CHK=" -v "
NAGIOS_LCK=/var/nagios/var/nagios.lock
NAGIOS_CMD=/var/nagios/var/rw/nagios.cmd

# Check we have required binaries and variables
if [ ! $NAGIOS_BIN ] || [ ! $NAGIOS_CFG ] || [ ! $NAGIOS_CHK ] || [ ! $NAGIOS_FLG ] || [ ! $NAGIOS_FLG ] || [ ! $NAGIOS_CMD ]
then
echo "init_nagios.sh configuration error"
exit 0
fi

test -f $NAGIOS_BIN || exit 0
test -f $NAGIOS_CFG || exit 0

case "$1" in

start)
if [ -f $NAGIOS_LCK ] && kill -0 `cat $NAGIOS_LCK` 2> /dev/null
then
echo "Nagios already started..."
exit 1
else
if [ ! -f $NAGIOS_LCK ] && pidof nagios > /dev/null 2&>1
then
echo "Nagios already started but no lockfile..."
exit 0
else
if pidof nagios > /dev/null 2&>1
then
echo "Nagios lockfile exist but no daemon is started..."
echo "Deleting lockfile and starting Nagios..."
rm -f $NAGIOS_LCK $NAGIOS_CMD
$NAGIOS_BIN $NAGIOS_FLG $NAGIOS_CFG
exit 1
fi
fi
fi
echo "Starting Nagios..."
$NAGIOS_BIN $NAGIOS_FLG $NAGIOS_CFG
exit 1
;;

stop)
if [ -f $NAGIOS_LCK ] && kill -0 `cat $NAGIOS_LCK` 2> /dev/null
then
echo "Stopping Nagios..."
kill -9 `cat $NAGIOS_LCK` > /dev/null
rm -f $NAGIOS_LCK
rm -f $NAGIOS_CMD
exit 1
else
if [ ! -f $NAGIOS_LCK ] && pidof nagios > /dev/null 2&>1
then
echo "Nagios seems to be running but no lockfile exists... stopping..."
killall nagios
rm -f $NAGIOS_LCK
rm -f $NAGIOS_CMD
exit 0
else
if [ -f $NAGIOS_LCK ]
then
echo "Nagios isn't running but lockfile exists... removing..."
rm -f $NAGIOS_LCK
rm -f $NAGIOS_CMD
exit 0
fi
fi
fi
echo "Nagios is not running ..."
;;

restart)
$0 stop
$0 start
exit 1
;;

configtest)
$NAGIOS_BIN $NAGIOS_CHK $NAGIOS_CFG
exit 1
;;

*)
echo "Usage : /etc/init.d/init_nagios.sh {start|stop|restart|configtest}"
exit 1
;;

esac

exit 0