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 :

# 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 :

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 :

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

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