Table des matières
Gestion d'un serveur dédidé chez EUserv
J'ai choisi la gamme « Misurfi LC10 », avec comme système d'exploitation FreeBSD.
Cette page récapitule toutes les manipulations faites sur ce type de serveur.
Modification du partitionnement
Par défaut, c'est ce schéma :
gpart show ada0 => 34 1953525101 ada0 GPT (932G) 34 2014 - free - (1.0M) 2048 128 1 freebsd-boot (64K) 2176 8388608 2 freebsd-swap (4.0G) 8390784 1945134344 3 freebsd-ufs (928G) 1953525128 7 - free - (3.5K)
J'aime bien avoir une partition /home
séparée. Donc après connexion au panel de gestion, j'active le système de secours (rescue-mode).
On supprime toutes les partitions :
# gpart destroy -F ada0
On part sur une table de partitions avec le schéma GPT.
# gpart create -s gpt ada0 ada0 created # gpart show => 34 1953525101 ada0 GPT (931G) 34 1953525101 - free - (931G)
On va créer la partition qui contiendra le boot loader (c'est particulier à GPT).
# gpart add -t freebsd-boot -l boot -s 64K ada0 ada0p1 added
Puis on active l'amorce (pour démarrer le serveur) sur la nouvelle partition.
# gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada0 bootcode written to ada0
Dans certains cas, il faut activer la partition de boot, grâce à ces deux commandes.
# gpart set -a active /dev/ada0 # gpart set -a bootme -i 1 /dev/ada0
On peut maintenant s'occuper des autres partitions :
swap
/usr
/home
# gpart add -t freebsd-swap -l swap -s 2G ada0 ada0p2 added # gpart add -t freebsd-ufs -l usr -s 872G ada0 ada0p3 added # gpart add -t freebsd-ufs -l home ada0 ada0p4 added
Ce qui nous donne au final :
# gpart show ada0 => 34 1953525101 ada0 GPT (931G) 34 6 - free - (3.0k) 40 128 1 freebsd-boot (64k) 168 4194304 2 freebsd-swap (2.0G) 4194472 1828716544 3 freebsd-ufs (872G) 1832911016 120614112 4 freebsd-ufs (57G) 1953525128 7 - free - (3.5k)
On formate
On active la swap
:
# swapon /dev/ada0p2
Pour les autres partitions on utilisera le système de fichiers UFS 2.
# newfs -U -O 2 /dev/ada0p3 # newfs -U -O 2 /dev/ada0p4
À ce stade le disque peut recevoir le système.
Installation du système de base
Nous allons faire une installation manuelle.
Tout d'abord on monte la partition ada0p3
.
# mount /dev/ada0p3 /mnt # cd /mnt
<note tip>À la place du nom des partition (ada0p3
, etc.), on peut utiliser les étiquettes (label
) pour plus de clarter. Elles sont accessibles dans le répertoire /dev/gpt/
.</note>
On télécharge les composants, nous avons uniquement besoin de :
base.txz
kernel.txz
J'ai utilisé ce miroir, ftp://ftp.fr.freebsd.org/pub/FreeBSD/releases/
<note warning>À partir de ce stade nous sommes dans le répertoire /mnt
(celui qui correspond à la partition ada0p3
).</note>
fetch ftp://ftp.fr.freebsd.org/pub/FreeBSD/releases/amd64/amd64/10.2-RELEASE/base.txz tar -xJpf base.txz fetch ftp://ftp.fr.freebsd.org/pub/FreeBSD/releases/amd64/amd64/10.2-RELEASE/kernel.txz tar -xJpf kernel.txz mkdir home
Configuration
/etc/fstab
- fstab
# Device Mountpoint FStype Options Dump Pass# /dev/ada0p3 / ufs rw 1 1 /dev/ada0p2 none swap sw 0 0 /dev/ada0p4 /home ufs rw 2 2
/etc/rc.conf
La commande ifconfig -a
nous donne les informations concernant la carte réseau. Nous allons en avoir besoin dans le fichier /etc/rc.conf
.
Dans mon cas, il s'agit de re0, c'est une RealTek.
- rc.conf
font8x14="iso15-8x14" font8x16="iso15-8x16" font8x8="iso15-8x8" keymap="fr.iso.acc.kbd" ifconfig_re0="inet xxx.xxx.xxx.xxx netmask 255.255.255.0" defaultrouter="xxx.xxx.xxx.xxx" hostname="" sshd_enable="YES" cron_enable="YES" # Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable dumpdev="NO" cleanvar_enable="YES" clear_tmp_enable="YES" fsck_y_enable="YES" background_fsck="NO"
On prendra le soin de définir un nom pour le serveur, et de remplacer l'adresse IP ainsi que la passerelle.
SSH
Nous allons temporairement permettre à l'utilisateur root de se connecter au serveur SSH. Dans etc/ssh/sshd_config
, on change cette ligne :
[...] PermitRootLogin no [...]
en
[...] PermitRootLogin yes [...]
Chroot
# cd/mnt chroot .
Dans le chroot, on peut apporter d'autres modifications au système, par exemple :
- Changement du mot de passe,
passwd
- Définition des locales via
/etc/login.conf
- Mettre son système à l'heure,
tzsetup
- Faire les mises à jour de sécurité,
freebsd-update
- Ajouter un nouvel utilisateur,
adduser
À la fin de toutes ces étapes, notre système est prêt on peut redémarrer le serveur.
Le pare-feu
FreeBSD en supporte plusieurs, j'ai décidé d'utilisé PacketFilter (pf). Voici le fichier de configuration pf.conf
afin d'avoir accès uniquement au serveur en SSH.
Dans /etc/rc.conf
on rajoute ces lignes :
- rc.conf
[...] pf_enable="YES" pf_rules="/etc/pf.conf"
- pf.conf
iface = "re0" # Taken from /etc/services tcp_services = "{ ssh, domain, http, https }" udp_services = "{ domain }" reserved_addr = "{ 10.0.0.0/8, 172.16.0.0/12, \ 192.168.0.0/16, 255.255.255.255/32 }" icmp_types = "{ echoreq, unreach }" set skip on lo scrub in all antispoof quick for $iface block all # Block incoming packets from reserved addresses block in quick on $iface from $reserved_addr to any table <ssh-bruteforce> persist block quick from <ssh-bruteforce> pass in inet proto tcp from any to $iface port ssh keep state \ (max-src-conn 5, max-src-conn-rate 5/15, \ overload <ssh-bruteforce> flush global) # Allow ping pass inet proto icmp all icmp-type $icmp_types keep state # Allow traceroute pass out on $iface inet proto udp from any to any port 33433 >< 33626 keep state # Allow some outcoming packets pass out inet proto tcp from $iface to any port $tcp_services keep state pass out inet proto udp from $iface to any port $udp_services keep state
Je n'enregistre rien (log), par contre j'ai mis en place un mécanisme contre les attaques force brute avec SSH.
table <ssh-bruteforce> persist block quick from <ssh-bruteforce> pass in inet proto tcp from any to $iface port ssh keep state \ (max-src-conn 5, max-src-conn-rate 5/15, \ overload <ssh-bruteforce> flush global)
- 5 tentatives de connexion maximum pour un même client (
max-src-con
) - on autorise les connexions, si il y a moins de 5 connexions en 15 secondes (
max-src-conn-rate 5/15
)
Pour vider la table ssh-bruteforce, j'ai mis en place une tâche récurrente chaque semaine, chargée de vider totalement la liste enregistrée.
- clear-table-cron
SHELL=/bin/sh PATH=/bin:/sbin/usr/bin:/usr/sbin # Clear the table 'ssh-bruteforce' each week @weekly /sbin/pfctl -t ssh-bruteforce -T flush