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.
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 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.
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
# 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
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.
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.
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 [...]
# cd/mnt chroot .
Dans le chroot, on peut apporter d'autres modifications au système, par exemple :
passwd
/etc/login.conf
tzsetup
freebsd-update
adduser
À la fin de toutes ces étapes, notre système est prêt on peut redémarrer le serveur.
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 :
[...] pf_enable="YES" pf_rules="/etc/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)
max-src-con
)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.
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