====== Installer et configurer Vserver sur Slackware ======
Par [[wiki:contributeurs:yttrium]]
===== Qu'est-ce que vserver ? =====
Un //vserver// est un //patch// appliqué au //noyau// linux qui permet de faire fonctionner sur une seule machine plusieurs systèmes d'exploitation de type GNU/linux grâce à un isolateur de contexte également appelé « zone d'exécution ». Pour résumer, les //processus// partagent les //ressources// du noyau mais sont exécutés dans un //contexte isolé// duquel il ne leur est pas possible de s'échapper.
===== A quoi est-ce que cela sert ? =====
Cela sert à plusieurs choses, notamment
* isoler le serveur hôte du réseau (celui qui héberge les vservers) afin de lui assurer une sécurité maximale
* les serveurs virtuels exécutent des « démons » (''samba'', ''apache'', ''ftpd'', etc...) à la place de l'hôte ;
* en cas d'attaque, les vservers peuvent éventuellement être cassés mais pas l'hôte qui les héberge ;
* il est possible de créer une passerelle qui donne accès à l'hôte par le client ''ssh'', le risque de se voir pirater est alors extrêmement faible. Personnellement, les //logs// de ma machine hôte sont pratiquement vides désormais =).
* installer un bac à sable pour s'entraîner à installer des applications ;
* héberger plusieurs sites internet et/ou bases de données ;
* sauvegarder des données via ''scp'' et les récupérer depuis l'hôte par ''crontab''.
===== Procédure d'installation sur une Slackware 12.0 =====
Il est tout d'abord indispensable de télécharger les [[http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.19.tar.gz|sources du noyau 2.6.22.19]] sur kernel.org. Sources qu'on décompressera dans ''/usr/src/''
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.19.tar.gz
tar -zxvf linux-2.6.22.19.tar.gz -C /usr/src
Ensuite, on télécharge le //patch// //vserver// pour le noyau 2.6.22.19 et on l'applique sur le code source du noyau grâce à la commande ''patch'', notre noyau sera alors capable de prendre en charge les vservers
wget http://ftp.linux-vserver.org/pub/kernel/vs2.2/patch-2.6.22.19-vs2.2.0.7.diff
cp patch-2.6.22.19-vs2.2.0.7.diff /usr/src
ln -s /usr/src/linuc /usr/src/linux-2.6.22.19
cd /usr/src/linux
patch -p1 < ../patch-2.6.22.19-vs2.2.0.7.diff
Après quoi on configure le noyau grâce à la commande ''make menuconfig''
make menuconfig
On se rend dans le sous-menu //Linux VServer// et on configure comme suit
Linux VServer --->
[*] Enable Legacy Kernel API
[ ] Show a Legacy Version ID
[*] Enable dynamic context IDs
[*] Enable Legacy Networking Kernel API
[ ] Remap Source IP Address
[*] Enable COW Immutable Link Breaking
[ ] Enable Virtualized Guest Time
[*] Enable Proc Security
[*] Enable Hard CPU Limits
[*] Avoid idle CPUs by skipping Time
[ ] Limit the IDLE task
Persistent Inode Tagging (UID24/GID24) --->
[ ] Tag NFSD User Auth and Files
[ ] Enable Inode Tag Propagation
[*] Honor Privacy Aspects of Guests
[*] VServer Warnings
[ ] VServer Debugging Code
On n'oublie pas non plus de configurer en dur le //Virtual Root device support// qui est indispensable pour le fonctionnement des vservers :
Device Drivers --->
Block Devices --->
<*> Virtual Root device support
Je vous conseille également de mettre en module la fonction //dummy//, elle vous permettra d'émuler une carte réseau pour chacun de vos vservers en attachant un module dummy à chaque interface virtuelle.
Device Drivers --->
Network device support --->
Dummy net driver support
Après cela, configurez le noyau pour votre machine, je vous conseille de vous aider des sites internet [[http://hardware4linux.info|hardware4linux.info]] et [[http://www.linuxcompatible.org|www.linuxcompatible.org]] pour valider votre configuration matérielle.
Maintenant, nous pouvons passer à la compilation du nouveau noyau grâce aux commandes habituelles :
make clean bzImage modules modules install
Au bout de laquelle on pourra démouler le magnifique gâteau aux pépites de chocolat qu'on découpera sur assiette pour le service (salut Cyril) ;-). En bref, on va copier notre nouveau noyau dans le répertoire système ''/boot'' :
cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.22.19
cp System.map /boot/System.map-2.6.22.19
cp .config /boot/config-2.6.22.19
Après quoi on modifiera le fichier ''lilo.conf'' en conséquence afin de demander au système de démarrer sur notre nouveau noyau et de conserver l'ancien en cas de problème :
# lignes précédentes
default = Linux-2.6.22.19
image = /boot/vmlinuz
root = /dev/hda #remplacez /dev/hda par /dev/md0 si vous utilisez du raid logiciel
label = Linux
read-only
image = /boot/vmlinuz-2.6.22.19
root = /dev/hda
label = Linux-2.6.22.19
read-only
On valide le changement en appelant la commande ''lilo'' en étant administrateur du système (//root//) :
lilo
Maintenant on n'a plus qu'à tester le bébé en redémarrant le système :
reboot
Dès que tout fonctionne parfaitement bien (vidéo, son, pci, usb, disque(s) dur(s), etc...) vous pouvez enlever l'ancien noyau ainsi que ses sources :
removepkg /var/log/packages/kernel-*tgz
On enlèvera également du fichier de configuration ''lilo.conf'' les références à l'ancien noyau :
vi /etc/lilo.conf
# lignes précédentes
default = Linux
image = /boot/vmlinuz-2.6.22.19
root = /dev/hda (ou /dev/md0)
label = Linux
read-only
lilo
Pour information, il est préférable de ne pas mettre à jour le noyau de manière automatique si vous utilisez un logiciel du genre ''swaret'' ou ''slackpkg''. Ci-dessous, on va donc proscrire les mises à jour du noyau dans le fichier de configuration de ''slackpkg'' :
vi /etc/blacklist
# lignes précédentes
kernel-ide
kernel-modules
kernel-source
kernel-headers
kernel-generic
kernel-huge
kernel-generic-smp
kernel-huge-smp
# lignes suivantes
===== Préparation du terrain =====
Avant de pouvoir créer nos premiers //vservers//, on va commencer par télécharger les outils //vservers// et leurs dépendances :
wget http://www2.linuxpackages.net/packages/Slackware-12.0/Console/util-vserver/util-vserver-0.30.214-i486-5tfx.tgz
wget http://www2.linuxpackages.net/packages/Slackware-12.0/Library/BeeCrypt/beecrypt-4.1.2-i486-1tfx.tgz
wget http://www2.linuxpackages.net/packages/Slackware-12.0/Library/dietlibc/dietlibc-0.31-i486-3tfx.tgz
On crée ensuite un répertoire ''vservers'' à la racine du système. Essayez dans la mesure du possible de créer le répertoire ''vservers'' sur une nouvelle partition afin d'éviter tout problème en cas de saturation de la partition à cause d'un problème sur l'un des ''vservers'' :
mkdir /vservers
===== Création de la liste et des scripts nécessaires =====
On va maintenant définir une liste minimale de paquets à installer pour nos //vservers//, ci-dessous vous trouverez la liste des paquets indispensables à reporter dans le fichier ''liste_packages'' :
cd /root
vi liste_packages
extra/libsafe-2.0-16/libsafe-2.0.16-i386-1.tgz
patches/packages/openssh-5.0p1-i486-1_slack12.0.tgz
patches/packages/glibc-zoneinfo-2.5-noarch-7_slack12.0.tgz
patches/packages/m4-1.4.11-i486-1_slack12.0.tgz
patches/packages/bzip2-1.0.5-i486-1_slack12.0.tgz
patches/packages/tcpdump-3.9.7-i486-1_slack12.0.tgz
slackware/a/aaa_base-12.0.0-noarch-1.tgz
slackware/a/aaa_elflibs-12.0.0-i486-3.tgz
slackware/a/aaa_terminfo-5.6-noarch-1.tgz
slackware/a/acl-2.2.39_1-i486-2.tgz
slackware/a/attr-2.4.32_1-i486-2.tgz
slackware/a/bash-3.1.017-i486-2.tgz
slackware/a/bin-11.1-i486-1.tgz
slackware/a/coreutils-6.9-i486-1.tgz
slackware/a/cpio-2.5-i486-3.tgz
slackware/a/cryptsetup-1.0.5-i486-2.tgz
slackware/a/cxxlibs-6.0.8-i486-4.tgz
slackware/a/dcron-2.3.3-i486-6.tgz
slackware/a/devs-2.3.1-noarch-25.tgz
slackware/a/dialog-1.1_20070528-i486-1.tgz
slackware/a/e2fsprogs-1.39-i486-1.tgz
slackware/a/elvis-2.2_0-i486-2.tgz
slackware/a/etc-11.1-noarch-6.tgz
slackware/a/file-4.21-i486-1.tgz
slackware/a/findutils-4.2.31-i486-1.tgz
slackware/a/gawk-3.1.5-i486-3.tgz
slackware/a/gettext-0.16.1-i486-3.tgz
slackware/a/glibc-solibs-2.5-i486-4.tgz
slackware/a/grep-2.5-i486-3.tgz
slackware/a/gzip-1.3.12-i486-1.tgz
slackware/a/infozip-5.52-i486-2.tgz
slackware/a/kbd-1.12-i486-2.tgz
slackware/a/less-394-i486-1.tgz
slackware/a/logrotate-3.7.4-i486-1.tgz
slackware/a/module-init-tools-3.2.2-i486-3.tgz
slackware/a/openssl-solibs-0.9.8e-i486-3.tgz
slackware/a/patch-2.5.4-i486-1.tgz
slackware/a/pkgtools-12.0.0-noarch-4.tgz
slackware/a/procps-3.2.7-i486-2.tgz
slackware/a/rpm2tgz-1.0-i486-1.tgz
slackware/a/sed-4.1.5-i486-1.tgz
slackware/a/shadow-4.0.3-i486-14.tgz
slackware/a/slocate-3.1-i486-1.tgz
slackware/a/sysfsutils-2.1.0-i486-1.tgz
slackware/a/sysklogd-1.4.1-i486-10.tgz
slackware/a/sysvinit-2.86-i486-5.tgz
slackware/a/sysvinit-functions-8.53-i486-2.tgz
slackware/a/sysvinit-scripts-1.2-noarch-13.tgz
slackware/a/tar-1.16.1-i486-1.tgz
slackware/a/time-1.7-i486-1.tgz
slackware/a/tree-1.5.0-i486-1.tgz
slackware/a/udev-111-i486-5.tgz
slackware/a/utempter-1.1.4-i486-1.tgz
slackware/a/util-linux-2.12r-i486-6.tgz
slackware/a/which-2.16-i486-1.tgz
slackware/ap/at-3.1.10-i486-1.tgz
slackware/ap/diffutils-2.8.1-i486-3.tgz
slackware/ap/groff-1.19.2-i486-1.tgz
slackware/ap/lsof-4.78-i486-1.tgz
slackware/ap/man-1.6c-i486-2.tgz
slackware/ap/man-pages-2.55-noarch-1.tgz
slackware/ap/mc-4.6.1_20070309-i486-2.tgz
slackware/ap/most-4.10.2-i486-2.tgz
slackware/ap/rpm-4.2.1-i486-3.tgz
slackware/ap/screen-4.0.3-i486-1.tgz
slackware/ap/sudo-1.6.8p12-i486-1.tgz
slackware/ap/sysstat-7.0.0-i486-1.tgz
slackware/ap/texinfo-4.8-i486-1.tgz
slackware/ap/vim-7.1.012-i486-1.tgz
slackware/d/binutils-2.17.50.0.17-i486-1.tgz
slackware/d/bison-2.3-i486-1.tgz
slackware/d/flex-2.5.33-i486-3.tgz
slackware/d/libtool-1.5.24-i486-1.tgz
slackware/d/perl-5.8.8-i486-4.tgz
slackware/l/db42-4.2.52-i486-3.tgz
slackware/l/db44-4.4.20-i486-2.tgz
slackware/l/glibc-2.5-i486-4.tgz
slackware/l/glibc-i18n-2.5-noarch-4.tgz
slackware/l/lzo-2.02-i486-1.tgz
slackware/l/ncurses-5.6-i486-2.tgz
slackware/l/pcre-7.0-i486-1.tgz
slackware/l/popt-1.7-i486-2.tgz
slackware/l/readline-5.2-i486-2.tgz
slackware/l/zlib-1.2.3-i486-2.tgz
slackware/n/inetd-1.79s-i486-8.tgz
slackware/n/iproute2-2.6.16_060323-i486-1.tgz
slackware/n/iputils-s20070202-i486-2.tgz
slackware/n/lftp-3.5.10-i486-1.tgz
slackware/n/links-2.1pre28-i486-1.tgz
slackware/n/lynx-2.8.6rel.5-i486-1.tgz
slackware/n/mtr-0.72-i486-1.tgz
slackware/n/net-tools-1.60-i486-1.tgz
slackware/n/network-scripts-12.0-noarch-4.tgz
slackware/n/ntp-4.2.4p0-i486-1.tgz
slackware/n/openssl-0.9.8e-i486-3.tgz
slackware/n/tcp_wrappers-7.6-i486-1.tgz
slackware/n/traceroute-1.4a12-i386-2.tgz
slackware/n/wget-1.10.2-i486-2.tgz
slackware/n/whois-4.7.21-i486-1.tgz
Après quoi nous allons créer un script bash appelé ''slackget.sh'' pour télécharger automatiquement ces paquets :
vi slackget.sh
#/bin/sh
SERVER=http://ftp.belnet.be
REP=/mirror/ftp.slackware.com/slackware-12.0
mkdir slacktgz
cd slacktgz
for i in `cat ../liste_packages`
do
if ! wget $SERVER$REP/$i; then
echo "Erreur de téléchargement"
exit
fi
done
On va alors créer un autre script appelé ''slackinst.sh'' pour installer automatiquement les paquets dans un modèle de ''vserver'' stocké dans la partition ''/vservers'' :
vi slackinst.sh
#/bin/sh
PKG=liste_packages
VSR=modele
if [ ! -f /vservers/$VSR ]
then
mkdir -p /vservers/$VSR
fi
if [ ! -f $PKG ]
then
echo "Il manque la liste des packages !!"
exit
fi
if [ $(whoami) != "root" ]
then
echo "Vous n'etes pas admin !!"
exit
fi
for i in $(cat $PKG | awk -F '/' '{print $3}')
do
if ! installpkg -root /vservers/$VSR/ slacktgz/$i; then
echo "Probleme lors de l'installation !!"
exit
fi
done
Nous allons maintenant créer les scripts de démarrage fonctionnels pour nos //vservers//.
On commence par créer un répertoire ''rc.d'' et à l'intérieur de celui-ci le fichier ''rc.0'' :
mkdir rc.d
cd rc.d
vi rc.0
#! /bin/sh
#
PATH=/sbin:/etc:/bin:/usr/bin
if [ -x /etc/rc.d/rc.sysvinit ]; then
. /etc/rc.d/rc.sysvinit
fi
/bin/stty onlcr
echo "Running shutdown script $0:"
case "$0" in
*0)
command="halt"
;;
*6)
command=reboot
;;
*)
echo "$0: call me as \"rc.0\" or \"rc.6\" please!"
exit 1
;;
esac
if [ -x /etc/rc.d/rc.local_shutdown ]; then
/etc/rc.d/rc.local_shutdown stop
fi
if [ -x /etc/rc.d/rc.httpd ]; then
/etc/rc.d/rc.httpd stop
fi
if [ -r /var/run/mysql/mysql.pid ]; then
. /etc/rc.d/rc.mysqld stop
fi
if [ -x /etc/rc.d/rc.samba ]; then
. /etc/rc.d/rc.samba stop
fi
if [ -x /etc/rc.d/rc.nfsd ]; then
/etc/rc.d/rc.nfsd stop
fi
if [ -x /etc/rc.d/rc.sshd ]; then
/etc/rc.d/rc.sshd stop
fi
if [ -x /etc/rc.d/rc.saslauthd ]; then
/etc/rc.d/rc.saslauthd stop
fi
if [ -x /etc/rc.d/rc.openldap ]; then
/etc/rc.d/rc.openldap stop
fi
if [ -x /etc/rc.d/rc.messagebus ]; then
sh /etc/rc.d/rc.messagebus stop
fi
if ! /bin/mount | /bin/grep -q 'on / type nfs' ; then
if [ -x /etc/rc.d/rc.inet1 ]; then
. /etc/rc.d/rc.inet1 stop
fi
fi
if /bin/ls /etc/dhcpc/*.pid 1> /dev/null 2> /dev/null ; then
/sbin/dhcpcd -k 1> /dev/null 2> /dev/null
sleep 2
fi
if [ -x /sbin/accton -a -r /var/log/pacct ]; then
echo "Turning off process accounting."
/sbin/accton
fi
if [ ! "$1" = "fast" ]; then # shutdown did not already kill all processes
/sbin/killall5 -15
/bin/sleep 5
/sbin/killall5 -9
fi
echo "Saving random seed from /dev/urandom in /etc/random-seed."
if [ -r /proc/sys/kernel/random/poolsize ]; then
/bin/dd if=/dev/urandom of=/etc/random-seed count=1 bs=$(cat /proc/sys/kernel/random/poolsize) 2> /dev/null
else
/bin/dd if=/dev/urandom of=/etc/random-seed count=1 bs=512 2> /dev/null
fi
/bin/chmod 600 /etc/random-seed
$command -w
if [ -d /var/lock/subsys ]; then
rm -f /var/lock/subsys/*
fi
/bin/sync
if [ -f /etc/crypttab -a -x /sbin/cryptsetup.static ]; then
cat /etc/crypttab | grep -v "^#" | grep -v "^$" | while read line; do
LUKS=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f1 -d' ')
DEV=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f2 -d' ')
OPTS=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f4 -d' ')
if /sbin/cryptsetup.static isLuks $DEV 2>/dev/null ; then
echo "Locking LUKS crypt volume '${LUKS}':"
/sbin/cryptsetup.static luksClose ${LUKS}
elif echo $OPTS | grep -wq swap ; then
echo "Erasing encrypted swap '${LUKS}' and restoring normal swap on ${DEV}:"
/sbin/cryptsetup.static remove ${LUKS}
mkswap $DEV
fi
done
fi
/bin/sync
/bin/sleep 3
wait
Le fichier ''rc.6'' qui sert au redémarrage des vservers est identique à ''rc.0'', on se contente donc de le dupliquer :
cp -a rc.0 rc.6
Il est alors temps de créer le fichier''rc.K'' qui est chargé de l'arrêt des processus de nos //vservers// :
vi rc.K
#! /bin/sh
#
PATH=/sbin:/bin:/usr/bin:/usr/sbin
if [ -x /etc/rc.d/rc.keymap ]; then
. /etc/rc.d/rc.keymap
fi
if [ -x /etc/rc.d/rc.sysvinit ]; then
. /etc/rc.d/rc.sysvinit
fi
if [ -x /sbin/accton -a -r /var/log/pacct ]; then
echo "Turning off accounting."
/sbin/accton
fi
if [ -x /etc/rc.d/rc.local_shutdown ]; then
/etc/rc.d/rc.local_shutdown stop
fi
if [ -x /etc/rc.d/rc.httpd ]; then
/etc/rc.d/rc.httpd stop
fi
if [ -x /etc/rc.d/rc.samba ]; then
. /etc/rc.d/rc.samba stop
fi
if [ -x /etc/rc.d/rc.nfsd ]; then
/etc/rc.d/rc.nfsd stop
fi
echo "Unmounting remote filesystems."
umount -a -r -t nfs,smbfs,cifs
if [ -x /etc/rc.d/rc.pcmcia ] ; then
. /etc/rc.d/rc.pcmcia stop
sleep 5
fi
echo
echo "Sending all processes the SIGHUP signal."
killall5 -1
echo -n "Waiting for processes to hang up"
for loop in 0 1 2 3 4 5 ; do
sleep 1
echo -n "."
done
echo
echo "Sending all processes the SIGTERM signal."
killall5 -15
echo -n "Waiting for processes to terminate"
for loop in 0 1 2 3 4 5 ; do
sleep 1
echo -n "."
done
echo
echo "Sending all processes the SIGKILL signal."
killall5 -9
echo -n "Waiting for processes to exit"
for loop in 0 1 2 3 4 5 ; do
sleep 1
echo -n "."
done
echo
echo "Going to single user mode..."
telinit -t 1 1
Puis on crée le fichier ''rc.M'' qui va lancer les processus de nos //vservers// au démarrage de ceux-ci :
vi rc.M
#!/bin/sh
#
echo "Going multiuser..."
if [ -x /sbin/ldconfig ]; then
echo "Updating shared library links: /sbin/ldconfig &"
/sbin/ldconfig &
fi
if [ -r /etc/HOSTNAME ]; then
/bin/hostname $(cat /etc/HOSTNAME | cut -f1 -d .)
else
echo "darkstar.example.net" > /etc/HOSTNAME
/bin/hostname darkstar
fi
/bin/dmesg -s 65536 > /var/log/dmesg
if [ -x /etc/rc.d/rc.syslog -a -x /usr/sbin/syslogd -a -d /var/log ]; then
. /etc/rc.d/rc.syslog start
fi
if [ -x /usr/bin/fc-cache ]; then
echo "Updating X font indexes: /usr/bin/fc-cache -f &"
/usr/bin/fc-cache -f &
fi
if [ -x /etc/rc.d/rc.inet1 ]; then
. /etc/rc.d/rc.inet1
fi
if [ -x /etc/rc.d/rc.inet2 ]; then
. /etc/rc.d/rc.inet2
fi
if [ -x /etc/rc.d/rc.ntpd ]; then
sh /etc/rc.d/rc.ntpd start
fi
/bin/rm -f /var/lock/* /var/spool/uucp/LCK..* /tmp/.X*lock /tmp/core /core 2> /dev/null
if [ -r /tmp/hunt -o -r /tmp/hunt.stats ]; then
echo "Removing your stale hunt sockets from /tmp."
/bin/rm -f /tmp/hunt*
fi
chmod 755 / 2> /dev/null
chmod 1777 /tmp /var/tmp
if [ -x /etc/rc.d/rc.messagebus ]; then
sh /etc/rc.d/rc.messagebus start
fi
if [ -x /etc/rc.d/rc.hald ]; then
sh /etc/rc.d/rc.hald start
fi
if [ -x /etc/rc.d/rc.dnsmasq ]; then
/etc/rc.d/rc.dnsmasq start
fi
if [ -x /etc/rc.d/rc.cups ]; then
if [ -x /etc/rc.d/rc.hplip ]; then
/etc/rc.d/rc.hplip start
fi
/etc/rc.d/rc.cups start
elif [ -x /etc/rc.d/rc.lprng ]; then
. /etc/rc.d/rc.lprng start
fi
if [ -x /etc/rc.d/rc.atalk ]; then
/etc/rc.d/rc.atalk
fi
if [ -x /sbin/accton -a -r /var/log/pacct ]; then
/sbin/accton /var/log/pacct
chmod 640 /var/log/pacct
echo "Process accounting turned on."
fi
if [ -x /usr/sbin/crond ]; then
/usr/sbin/crond -l10 >>/var/log/cron 2>&1
fi
if [ -x /usr/sbin/atd ]; then
/usr/sbin/atd -b 15 -l 1
fi
if [ -x /etc/rc.d/rc.saslauthd ]; then
. /etc/rc.d/rc.saslauthd start
fi
if [ -x /etc/rc.d/rc.sendmail ]; then
. /etc/rc.d/rc.sendmail start
fi
if [ -x /etc/rc.d/rc.font ]; then
. /etc/rc.d/rc.font
fi
if [ -x /etc/rc.d/rc.keymap ]; then
. /etc/rc.d/rc.keymap
fi
if [ -x /etc/rc.d/rc.mysqld ]; then
. /etc/rc.d/rc.mysqld start
fi
if [ -x /etc/rc.d/rc.httpd ]; then
. /etc/rc.d/rc.httpd start
fi
if [ -x /etc/rc.d/rc.openldap ]; then
. /etc/rc.d/rc.openldap start
fi
if [ -x /etc/rc.d/rc.samba ]; then
. /etc/rc.d/rc.samba start
fi
if [ -x /etc/rc.d/rc.sysvinit ]; then
. /etc/rc.d/rc.sysvinit
fi
if [ -x /etc/rc.d/rc.local ]; then
. /etc/rc.d/rc.local
fi
On crée le fichier ''rc.inet2'' afin de lancer des processus indispensables :
vi rc.inet2
#!/bin/sh
#
if [ -x /etc/rc.d/rc.rpc ]; then
sh /etc/rc.d/rc.rpc start
fi
if [ -x /etc/rc.d/rc.syslog -a -d /var/log -a ! -r /var/run/syslogd.pid ]; then
. /etc/rc.d/rc.syslog start
fi
if [ -x /etc/rc.d/rc.firewall ]; then
/etc/rc.d/rc.firewall start
fi
if [ -x /etc/rc.d/rc.ip_forward ]; then
. /etc/rc.d/rc.ip_forward start
fi
if [ -x /etc/rc.d/rc.inetd ]; then
/etc/rc.d/rc.inetd start
fi
if [ -x /etc/rc.d/rc.sshd ]; then
echo "Starting OpenSSH SSH daemon: /usr/sbin/sshd"
/etc/rc.d/rc.sshd start
fi
if [ -x /etc/rc.d/rc.bind ]; then
/etc/rc.d/rc.bind start
fi
if [ -x /etc/rc.d/rc.yp ]; then
. /etc/rc.d/rc.yp start
fi
if [ -x /etc/rc.d/rc.nfsd ]; then
/etc/rc.d/rc.nfsd start
fi
On va créer le script de démarrage indispensable au bon lancement de nos //vservers// appelé ''rc''
cd ..
vi rc
if [ $1 -eq 3 ]; then
echo "entering runlevel 3: multi";
/etc/rc.d/rc.M
fi
if [ $1 -eq 6 ]; then
echo "entering runlevel 6: reboot";
/etc/rc.d/rc.6
fi
if [ $1 -eq 0 ]; then
echo "entering runlevel 0: shutdown";
/etc/rc.d/rc.0
fi
if [ $1 -eq 4 ]; then
echo "entering runlevel 4";
fi
if [ $1 -eq 5 ]; then
echo "entering runlevel 5";
fi
if [ $1 -eq 1 ]; then
echo "entering runlevel 1:single";
/etc/rc.d/rc.K
fi
if [ $1 -eq 2 ]; then
echo "entering runlevel 2:multi";
/etc/rc.d/rc.M
fi
On va à présent créer un script pour copier automatiquement nos scripts de démarrage dans notre modèle de //vserver// :
vi slackrcd.sh
#/bin/sh
VSR=modele
if [ ! -f /vservers/$VSR ]
then
mkdir -p /vservers/$VSR
fi
if [ $(whoami) != "root" ]
then
echo "Vous n'etes pas admin !!"
exit
fi
cp -a rc /vservers/$VSR/etc/init.d
chmod 755 /vservers/$VSR/etc/init.d/rc
rm -rf /vservers/$VSR/dev/*
chmod 444 /vservers/$VSR/etc/rc.d/rc.inet1
cp -a rc.d /vservers/$VSR/etc
On va créer un script chargé de créer nos futurs //vservers// :
vi newvserver.sh
#!/bin/sh
VSR=modele
NAME=nom_vserver # remplacez nom_vserver par le nom de votre vserver
CONTEXT=1000
vserver ${NAME} build -m skeleton --context ${CONTEXT} --flags lock,virt_mem,virt_uptime,virt_cpu,virt_load,sched_hard,hide_netif
cp -a /vservers/$VSR /vservers/$NAME
On va créer un script pour attribuer une //interface réseau virtuelle// ainsi qu'une interface //loopback// (127.0.0.1) à notre //vserver// :
vi create_eth.sh
#!/bin/sh
NAME=nom_vserver # remplacez nom_vserver par le nom de votre vserver
INET=dummy0 # remplacez dummy0 par l'interface réseau virtuelle de votre vserver
ADIP=192.168.1.1 # remplacez 192.168.1.1 par l'adresse ip de votre vserver
MASK=24 # remplacez 24 par le masque de sous-réseau de votre vserver
mkdir /etc/vservers/$NAME/interfaces/0
echo $INET > /etc/vservers/$NAME/interfaces/0/dev
echo $ADIP > /etc/vservers/$NAME/interfaces/0/ip
echo $MASK > /etc/vservers/$NAME/interfaces/0/prefix
mkdir /etc/vservers/$NAME/interfaces/1
echo lo > /etc/vservers/$NAME/interfaces/1/dev
echo 127.0.0.1 > /etc/vservers/$NAME/interfaces/1/ip
echo 32 > /etc/vservers/$NAME/interfaces/1/prefix
===== Utilisation des scripts =====
Nous allons créer un modèle également appelé //squelette// pour nos futurs //vservers//.
On commence par télécharger nos paquets définis dans le fichier ''liste_packages'' en exécutant le script ''slackget.sh'' :
chmod 755 slackget.sh
./slackget.sh
On installe les paquets dans notre répertoire ''/vservers/modele'' qui va contenir le futur squelette en exécutant le script ''slackinst.sh'' :
chmod 755 slackinst.sh
./slackinst.sh
On copie nos scripts de démarrage dans notre modèle de //vservers// grâce au script ''slackrcd.sh'' :
chmod 755 slackrcd.sh
./slackrcd.sh
Notre squelette est maintenant correctement configuré. On va pouvoir créer notre premier véritable vserver grâce aux scripts ''newvserver.sh'' et ''create_eth'' :
chmod 755 newvserver.sh
./newvserver.sh
chmod 755 create_eth.sh
./create_eth.sh
===== Derniers paramétrages système =====
On va demander au système de lancer automatiquement notre //vserver// à chaque démarrage en ajoutant des lignes au fichier ''rc.local'', vous noterez que l'on demande au système de pouvoir utiliser les //vservers// grâce à la commande ''vprocunhide''
vi /etc/rc.d/rc.local
# lignes précédentes
/usr/lib/util-vserver/vprocunhide
vserver nom_vserver start
On va demander au système de créer nos modules //dummy// pour l'interface virtuelle réseau de nos vservers en modifiant le fichier ''rc.modules'' :
vi /etc/rc.d/rc.modules
On recherche la ligne ''modprobe dummy'' dans le fichier ''rc.modules'' :
/modproble dummy
Puis on la décommente et on rajoute les lignes suivantes dans le fichier :
# lignes précédentes
/sbin/modprobe dummy # interface réseau virtuelle du premier vserver
/sbin/modprobe dummy -o dummy1 # interface réseau virtuelle du second vserver
/sbin/modprobe dummy -o dummy2 # interface réseau virtuelle du troisième vserver
/sbin/modprobe dummy -o dummy3 # interface réseau virtuelle du quatrième vserver
# lignes suivantes
La commande ''dummy -o dummyX'' permet de créer une nouvelle interface réseau virtuelle pour chacun de nos //vservers//.
===== Lancement de la fusée dans l'espace =====
On va lancer notre premier //vserver//, attachez votre ceinture :-P On demande au système de pouvoir utiliser les //vservers// en appelant la commande ''vprocunhide'' et on démarre notre //vserver// grâce à la commande ''start'' :
/usr/lib/util-vserver/vprocunhide
vserver nom_vserver start
On va entrer dans notre //vserver// grâce à la commande ''enter'' :
vserver nom_vserver enter
On ressort de notre //vserver// grâce à la commande ''exit'' :
exit
Voici les commandes indispensables pour avoir les informations sur vos //vservers// et sur leur prise en charge par votre noyau :
vserver-copy --> permet de dupliquer un vserver
vserver-info --> affiche des infos sur le système
vserver-stat --> affiche les infos sur les vservers en cours d'exécution
===== Sécurisation de l'hôte =====
Notre vserver est opérationnel et sera désormais lancé automatiquement à chaque démarrage par le système.
Par défaut, le //daemon// sshd est lancé automatiquement en écoute sur le port 22.
Que se passe-t-il si le serveur hôte exécute également un //daemon// sshd sur le port 22 ?
Il y aura un conflit entre les deux services //ssh// et le //daemon// du //vserver// ne pourra pas s'exécuter.
Il est donc nécessaire de reconfigurer le fichier //sshd_config// sur l'hôte en lui spécifiant le port d'écoute (23 de préférence car //telnet// n'est plus couramment utilisé) et en lui spécifiant l'adresse de l'interface réseau //physique// à écouter :
vi /etc/ssh/sshd_config
# lignes précédentes
Port 23
ListenAddress 192.168.1.254 # Adresse IP du serveur hôte
Protocol 2
# lignes suivantes
On redémarre le service ''sshd'' sur l'hôte
/./etc/rc.d/sshd restart
On va configurer le //daemon// ''sshd'' sur le //vserver// en éditant le fichier ''sshd_config'' afin de lui spécifier le port à écouter (22 pour ssh) et en lui spécifiant l'adresse de l'interface réseau //virtuelle// à écouter :
vi /vserver/nom_vserver/etc/ssh/sshd_config
# lignes précédentes
Port 22
ListenAddress 192.168.1.1 # Adresse IP du vserver
Protocol 2
# lignes suivantes
On redémarre le service ''sshd'' sur le //vserver// :
vserver nom_vserver enter
/./etc/rc.d/rc.sshd restart
logout
Est-ce que l'on est sûr que notre hôte est sécurisé ?
Pour le savoir, il faut lancer la commande ''netstat'' sur l'hôte en premier lieu :
netstat -aelptu
Exemple de résultat de la commande sur un hôte mal configuré et ayant donc un risque accru de se voir piraté. En effet, la majorité des services écoutent sur toutes les interfaces (''amavisd'', ''postfix'', ''spamassassin''). On peut le voir grâce à la ligne //*:XXX// située sous //Local Address//.\\ Ici, seul le service ''sshd'' est bien configuré car il écoute sur son interface réseau (192.168.1.254 port 23)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 *:10024 *:* LISTEN root 25424 2698/amavisd (ch16-
tcp 0 0 *:10025 *:* LISTEN root 25839 4967/master
tcp 0 0 *:3306 *:* LISTEN root 19327 3724/mysqld
tcp 0 0 *:netbios-ssn *:* LISTEN root 19805 3743/smbd
tcp 0 0 *:netbios-ssn *:* LISTEN root 19803 3743/smbd
tcp 0 0 *:783 *:* LISTEN root 24110 4580/spamd.pid
tcp 0 0 192.168.1.254:telnet *:* LISTEN root 17337 3569/sshd
tcp 0 0 *:x11 *:* LISTEN root 28888 5713/X
tcp 0 0 *:8080 *:* LISTEN root 26009 5038/havp
tcp 0 0 *:http *:* LISTEN root 19360 3736/httpd
tcp 0 0 *:smtp *:* LISTEN root 25666 4967/master
tcp 0 0 *:smtp *:* LISTEN root 25665 4967/master
tcp 0 0 *:microsoft-ds *:* LISTEN root 19804 3743/smbd
tcp 0 0 *:microsoft-ds *:* LISTEN root 19802 3743/smbd
Comme notre hôte ci-dessus n'est pas bien configuré, il faut demander à tous les services d'écouter sur leur interface réseau. Pour ce faire, il faut modifier leur fichier de configuration respectif en rajoutant la commande qui permet d'écouter sur une seule interface. Vous pourrez trouver ces infos sur le net ou par la commande ''man''. Voici ci-dessous quelques exemples de configuration basique.
//mysql// --> fichier de conf ''/etc/my.cnf'' --> //bind-address = 127.0.0.1//\\
//samba// --> fichier de conf ''/etc/samba/smb.conf'' --> //interfaces = eth0 192.168.1. 127.0.0.//\\
//samba// --> fichier de conf ''/etc/samba/smb.conf'' --> //bind interfaces only = true//\\
Lançons maintenant la commande ''netstat'' sur un hôte bien configuré pour voir ce que cela donne. On peut voir que les services écoutent sur leur interface réseau respective (''localhost:XXX'', ''serveur.example.net:XXX'', etc...). Cela signifie que les services ne seront plus accessibles sur les //vservers// mais uniquement à partir du réseau interne géré par l'hôte. Je suppose ici que l'hôte est un routeur pare-feu.
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 localhost:10024 *:* LISTEN root 25424 2698/amavisd (ch16-
tcp 0 0 localhost:10025 *:* LISTEN root 25839 4967/master
tcp 0 0 localhost:svn *:* LISTEN root 21595 4149/svnserve
tcp 0 0 localhost:3306 *:* LISTEN root 19327 3724/mysqld
tcp 0 0 serveur.exa:netbios-ssn *:* LISTEN root 19805 3743/smbd
tcp 0 0 localhost:netbios-ssn *:* LISTEN root 19803 3743/smbd
tcp 0 0 localhost:783 *:* LISTEN root 24110 4580/spamd.pid
tcp 0 0 serveur.example.ne:8080 *:* LISTEN root 26009 5038/havp
tcp 0 0 localhost:http *:* LISTEN root 19360 3736/httpd
tcp 0 0 serveur.example.net:ipp *:* LISTEN root 19039 3650/cupsd
tcp 0 0 localhost:ipp *:* LISTEN root 19038 3650/cupsd
tcp 0 0 serveur.example.:telnet *:* LISTEN root 17337 3569/sshd
tcp 0 0 serveur.example.ne:smtp *:* LISTEN root 25666 4967/master
tcp 0 0 localhost:smtp *:* LISTEN root 25665 4967/master
tcp 0 0 localhost:https *:* LISTEN root 19359 3736/httpd
tcp 0 0 serveur.ex:microsoft-ds *:* LISTEN root 19804 3743/smbd
tcp 0 0 localhost:microsoft-ds *:* LISTEN root 19802 3743/smbd
tcp 0 0 localhost:2207 *:* LISTEN root 18901 3637/python
Vérification de la sécurité sur mon //vserver// personnel appelé « yttrium » (j'ai craqué sur cet élément chimique faisant partie des métaux dits « terres rares », allez donc savoir pourquoi) ;-) :
vserver yttrium enter
netstat -aelptu
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 yttrium.example.net:ssh *:* LISTEN root 1414021 27474/sshd
Mon vserver est sécurisé, le daemon ''sshd'' écoute sur le port 22 sur son interface ''yttrium.example.net''. A savoir que le //vserver// yttrium est connecté en frontal à l'internet et c'est lui qui gère les accès ssh. J'ai combiné le service ssh avec denyhost qui permet de //blacklister// dans le fichier ''/etc/hosts.deny'' les adresses ip qui tentent de se connecter à mon système sur le port 22 avec une mauvaise authentification par brute force.
Pour accéder à mon serveur, il faut donc arriver à rentrer dans yttrium et se connecter sur le port 23 à mon hôte en sachant que j'ai également couplé denyhost au service ssh. Sur yttrium, j'ai désinstallé les commandes ''lynx'', ''links'', ''wget'', ''telnet'', etc. Le pirate potentiel peut toujours tenter de rapatrier ses outils avec ''scp'' mais il devra faire vite car l'hôte veille et enregistre l'activité du //vserver// yttrium ;-)
++++ Tags | {{tag>administration articles installation noyau patch virtualisation }} ++++