Astuces, FAQ, remarques... §

À propos de l'apu2 §

L'apu2 est une carte très économe en termes d'énergie très bien supportée par OpenBSD.

Toutefois, elle ne peut se configurer que via le port série, pas avec un écran, ce qui peut représenter en fait un avantage.

En effet, il suffit alors d'un ordinateur portable pour administrer le serveur, nul besoin d'y brancher un clavier et un écran. Ici, on parlera donc de quelques astuces concernant l'apu2 et OpenBSD.

Bien que l'apu2 ne soit plus fabriqué, vous trouverez ici des conseils valables pour les autres machines accessibles via le port série.

Pour l'anecdote, cette documentation est hébergée sur un apu2d0 😎.

Accéder à la console de l'apu §

Reliez l'apu2 à un ordinateur via le port série. Si ce dernier est démarré sous OpenBSD, accédez à la console avec la commande suivante :

cu -s 115200 -l /dev/cuaU0

Cette commande est à exécuter en tant que root ou bien après vous être ajouté au groupe "dialer" :

doas usermod -G dialer $(whoami)

Installer OpenBSD sur l'apu §

Procédez comme d'habitude en branchant une clé USB d'installation sur l'APU2 puis en le mettant sous tension. Dans la console, avant de démarrer l'installation vous procéderez aux réglages suivants afin que l'installateur sache que l'on est sur la console série :

boot> 
stty com0 115200
set tty com0

Il ne sera pas nécessaire de le refaire ensuite.

Mettre le bios de l'apu à jour §

Vous pouvez flasher le firmware avec l'outil flashrom :

# pkg_add flashrom

Vous aurez sans doute lu le fichier /usr/local/share/doc/pkg-readmes/flashrom qui précise la procédure pour mettre à jour le BIOS.

Voici pas à pas comment faire.

Tout d'abord, récupérez la dernière version du firmware:

https://pcengines.github.io/

Souvenez-vous bien où elle est enregistrée. Pour l'exemple, on va considérer qu'elle est stockée dans /home/batman.

Ensuite, il faut redémarrer en mode "single user". C'est tout simple, il faut juste indiquer l'option -s au prompt de démarrage:

boot> boot -s

Vous verrez apparaître le message suivant:

Enter pathname of shell or RETURN for sh: 

Validez avec entrée pour pouvoir obtenir l'invite de commandes. Montez les systèmes de fichiers dont vous aurez besoin.

mount /usr
mount /usr/local
mount /var
mount /usr/X11R6 # si ldconfig rale sans
mount /home

Il faut ensuite faire appel à ldconfig pour que flashrom puisse accéder à des bibliothèques dont il a besoin.

ldconfig -m /usr/local/lib

Vous pouvez alors flasher le bios :

# flashrom -p internal:boardmismatch=force -w /home/batman/apu2_*.rom

flashrom v1.1 on OpenBSD 6.6 (amd64)
flashrom is free software, get the source code at https://flashrom.org

Calibrating delay loop... delay loop is unreliable, trying to continue OK.
coreboot table found at 0x7eed0000.
Found chipset "AMD FCH".
Enabling flash write... OK.
Found Winbond flash chip "W25Q64.V" (8192 kB, SPI) mapped at physical address 0.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.

Redémarrez avec reboot.

Ainsi, le BIOS est mis à jour 😉

Vérifier une somme de contrôle §

Lorsqu'un fichier est transféré, c'est plus prudent de s'assurer que tous les octets ont bien été copiés. De cette façon, les données sont bien authentiques et ça vous évite des tracas.

Le plus pratique est de vérifier la somme de contrôle du fichier d'origine puis du fichier copié. Pour cela, la commande sha256 est bien pratique. Il suffit de lui donner le fichier à "manger" :

$ sha256 debian-9.6.0-amd64.qcow2.gz
SHA256 (debian-9.6.0-amd64.qcow2.gz) = 91831ba15446f3ab418ae8a5c2a8ac0d852dc5d43bd595a70b88bd6ea4ded397

Reproduisez la même manipulation sur le fichier copié puis comparez cette série de chiffres et lettres : ils doivent être identiques. 😉

Notez que sous GNU/Linux, la commande sha256 n'existe pas. Son équivalent est sha256sum.

Si la somme de contrôle ne vous convainc pas, et si vos données sont particulièrement sensibles, vous pouvez pousser le vice plus loin avec l'outil signify.

Comment changer le mot de passe ? §

Vous pouvez changer le mot de passe de n'importe quel utilisateur avec la commande passwd. Exemple :

# passwd toto

Pour changer le mot de passe du superutilisateur, c'est un poil plus délicat. Il faut absolument être entièrement identifié en tant que root (dans un shell placé dans le dossier de root avec les bonnes variables d'environnement...). Pour cela, utilisez l'option "-l" :

# su -l
# passwd root

Tâches périodiques (cron) §

Tout est prévu dans OpenBSD pour vous permettre d'exécuter des commandes régulièrement. Il vous suffit d'éditer un des scripts suivant :

Il faut seulement faire attention à mettre le chemin complet vers les commandes à exécuter à l'intérieur de ces fichiers. Par exemple, pour envoyer un message à l'administrateur, on ne notera pas :

echo "Tu es le plus beau" | mail -s "Coucou" root

mais :

echo "Tu es le plus beau" | /usr/bin/mail -s "Coucou" root

Vous trouverez le chemin absolu de vos commandes en utilisant which commande.

Pour une configuration plus précise des périodes entre chaque lancement des commandes, il faut utiliser cron. Entrez crontab -e (pas besoin des droits superutilisateur) puis ajoutez par exemple pour démarrer une commande toutes les heures (à chaque fois que l'horloge indique "0" minutes) :

0 * * * * /chemin/vers/la/commande

Avec l'exemple ci-dessous, la commande est lancée toutes les 5 minutes :

*/5 * * * * /chemin/vers/la/commande

Pour en apprendre plus, lisez la page de manuel appropriée avec man 5 crontab.

Voici un site qui vous aidera à bien comprendre la syntaxe cron.

Les crontabs, c'est vraiment pratique 😃.

Partitionnement d'un disque §

Pour une sauvegarde ou un espace de stockage supplémentaire, vous pourriez vouloir ajouter un disque dur externe. Nous allons décrire ci-dessous pour l'exemple la création de deux parties sur disque.

⚠ Notez que tout ceci peut se réaliser après avoir chiffré le disque et créé un RAID identifié par exemple par "sd1" ensuite.

Identifier le périphérique §

Branchez le disque dur au serveur. Si vous lancez la commande dmesg, vous verrez apparaître quelque chose comme ça :

umass0 at uhub0 port 1 configuration 1 interface 0 "Western Digital Ext HDD 1021" rev 2.00/20.21 addr 2
umass0: using SCSI over Bulk-Only
scsibus2 at umass0: 2 targets, initiator 0
sd1 at scsibus2 targ 1 lun 0: <WD, Ext HDD 1021, 2021> SCSI2 0/direct fixed serial.10581021383235373034
sd1: 1907727MB, 512 bytes/sector, 3907024896 sectors

Ces messages nous apprennent que le disque branché sera identifié par "sd1". Modifiez la suite selon votre cas.

Partitionnement §

On crée des "slices" avec disklabel en mode édition :

# disklabel -E sd1

Maintenant, on peut créer les partitions l'une après l'autre. En cas de doute, entrez "p" pour afficher l'état actuel du disque.

Pour créer la première partition, on saisit a a. Cela signifie "ajouter une partition a".

Laissez l'offset par défaut. Réglez la taille de la partition selon vos besoins. Notez que vous pouvez définir une taille avec :

Choisissez le système de fichier "4.2BSD".

Créez d'autres partitions de la même façon avec cette fois-ci la combinaison a d, a e, a f...

⚠ Notez qu'on ne peut pas créer une partition "c", cette lettre étant réservée pour désigner le disque entier. De même, je préfère ne pas utiliser "b" ici, car c'est souvent (mais pas obligatoirement) utilisé pour une partition d'échange "swap". Toutes les autres lettres de l'alphabet restent valables.

Une fois terminé, entrez q pour quitter et appliquer les changements.

Regardons maintenant l'état du disque en entrant # disklabel sd1 :

# /dev/rsd1c:
type: SCSI
disk: SCSI disk
label: Ext HDD 1021
duid: 782f1ddb783cdd13
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 255
sectors/cylinder: 16065
cylinders: 243201
total sectors: 3907024896
boundstart: 64
boundend: 3907024065
drivedata: 0

16 partitions:
#            size       offset  fstype [fsize bsize  cpg]
  a:    629153472           64  4.2BSD   4096 32768    1
  d:   3277870464    629153536  4.2BSD   8192 65536    1 
  c:   3907024896            0  unused

Au secours, c'est quoi tout ça ???

Pas de panique, tout n'est pas très important. Commençons pour une fois par les dernières lignes. Chaque partie décrit une caractéristique de la partition.

Partition   Taille      Début       Système de fichier  Divers
a:          629153472   64          4.2BSD              4096 3...
d:          3277870464  629153536   4.2BSD              8192 6...

L'autre point important (parce qu'il faut l'avouer, il y a beaucoup d'informations qui ne nous serviront pas), c'est le "duid".

duid: 782f1ddb783cdd13

Cet élément nous permettra d'identifier le disque lorsqu'on voudra le monter. Si vous voulez le retrouver, vous pouvez aussi entrer :

# sysctl hw.disknames
hw.disknames=wd0:bfb4775bb8397569,cd0:,wd1:56845c8da732ee7b,wd2:f18e359c8fa2522b

Nous avons presque terminé, il faut maintenant formater les deux partitions créées (a et d) :

# newfs /dev/rsd1a
# newfs /dev/rsd1d

N'oubliez pas le "r" 😉

Vous pouvez désormais ajouter dans le fichier /etc/fstab un nouveau point de montage pour chacune de ces partitions. Remarquez l'utilisation du duid précédent :

...
782f1ddb783cdd13.a /home/prx/musique/ ffs rw,noatime,nodev,nosuid,noauto 0 0
782f1ddb783cdd13.d /mnt/backup/ ffs rw,noatime,nodev,nosuid 1 2

Cela fait beaucoup d'options, je vous l'accorde. Lisez le man de fstab(5) pour bien comprendre.

Dans cet exemple :

Pour monter chaque point listé dans /etc/fstab, vous entrerez :

# mount -a

Comment trouver mon interface réseau ? §

Afin de trouver le nom de votre interface réseau (le câble ethernet par exemple), on saisit la commande ifconfig. Prenez le temps de lire le retour de cette commande, votre interface doit avoir une adresse attribuée que vous pouvez lire après le mot "inet", et appartient certainement au groupe "egress".

Par exemple :

$ ifconfig                                                   
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 32768
        priority: 0
        groups: lo
        inet 127.0.0.1 netmask 0xff000000
re0: flags=218843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,MPSAFE,AUTOCONF6> mtu 1500
        lladdr fc:aa:14:65:5f:86
        priority: 0
        groups: egress
        media: Ethernet autoselect (100baseTX full-duplex,rxpause,txpause)
        status: active
        inet 192.168.1.2 netmask 0xffffff00 broadcast 192.168.1.255
enc0: flags=0<>
        priority: 0
        groups: enc
        status: active
pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33144
        priority: 0
        groups: pflog

Ici, "lo0" ne nous intéresse pas. C'est l'interface dite "locale", utilisée par certains programmes pour communiquer entre eux au sein du serveur. "enc0" et "pflog0" ne nous intéressent pas non plus ici, car correspondent respectivement à une interface pour monter un VPN et pour récupérer les journaux du pare-feu.

Il vous reste "re0", votre interface Ethernet (c'est écrit dans la section "media" 😉)

Les journaux (logs) §

Votre serveur garde des enregistrements de son activité. Le tout est rassemblé dans des fichiers texte appelés journaux ou plus souvent "logs". On les trouve dans le dossier /var/log pour les journaux système et dans /var/www/logs pour tout ce qui concerne la partie serveur web.

On regardera notamment :

Évidemment, il y en a beaucoup d'autre.

Je vous conseille de les consulter de temps en temps afin de vérifier que tout fonctionne comme prévu. Vous pouvez les afficher en temps réel avec la commande :

tail -f /var/log/messages /var/log/daemon /var/log/maillogs /var/log/authlog

Vous remarquerez bien vite l'apparition de fichiers se terminant par .0.gz, .1.gz. Ce sont les archives des journaux. Afin d'éviter qu'ils ne prennent trop de place, OpenBSD se charge chaque jour de lancer la commande newsyslog. Cet outil compresse les archives si besoin.

Pour le configurer, jetez un œil au fichier /etc/newsyslog.conf. C'est dans ce dernier que vous devrez ajouter des lignes si une de vos applications crée ses journaux dans un fichier qui n'est pas listé ci-dessus. Il se décompose ainsi :

...
/var/log/messages                       644  5     300  *     Z
/var/log/authlog        root:wheel      640  7     *    168   Z
...

Avec dans l'ordre :

On peut préciser ensuite si besoin :

Pour d'autres informations, regardez les pages man de newsyslog et newsyslog.conf.

$ man newsyslog

Suggestions d'améliorations avec lynis §

Lynis est un outil qui va analyser votre système pour y détecter d'éventuelles erreurs de configuration pouvant entacher la sécurité de votre serveur.

De plus, il peut vous proposer des idées d'amélioration.

Afin de l'utiliser, installez-le puis lancez le premier scan :

# pkg_add lynis
# lynis audit system

Vous pourrez voir de nombreux messages apparaître. Consultez le fichier /var/log/lynis-report.dat afin de lire le rapport calmement :

# less /var/log/lynis-report.dat

On pourra lire par exemple comme suggestions :

suggestion[]=SSH-7408|Consider hardening SSH configuration|AllowTcpForwarding (YES --> NO)|-|
suggestion[]=SSH-7408|Consider hardening SSH configuration|ClientAliveCountMax (3 --> 2)|-|
suggestion[]=SSH-7408|Consider hardening SSH configuration|Compression (YES --> NO)|-|

Pour voir uniquement les suggestions, utilisez :

# grep suggestion /var/log/lynis-report.dat

Que faire face aux coupures de courant ? Où vont mes mails dans ce cas? §

Les coupures de courant, ça peut arriver...

Vous pouvez utiliser un onduleur. C'est une sorte de batterie de secours en cas de coupure de courant. On y branche dessus le serveur et le routeur qui donne accès à Internet. Mais bon, puisque les mails sont ré-envoyés en cas de pépin, ce n'est peut-être pas utile.

Dans le cas où l'interruption du serveur est due à un bug quelconque, sachez que tous les jours, OpenBSD génère un rapport de sécurité qui peut dire : "ce service devrait être en route mais ne l'est pas". Ainsi, vous pouvez aller vérifier assez rapidement quel est le problème.

Quand on héberge ses mails, que se passe-t-il quand le serveur de mail est, pour une raison quelconque, inaccessible ?

Le protocole SMTP est prévu pour s'assurer que les messages soient tout de même délivrés.

Voilà une question qu'on se pose forcément à un moment donné. Lorsque le serveur est inaccessible, il se passe à peu près la même chose que lorsque le facteur doit délivrer un recommandé : le serveur expéditeur essaie une première fois et échoue. Il va repasser une fois suivante un peu plus tard. En cas de second échec, il réessaie à nouveau plus tard.

Bien évidemment, après plusieurs échecs, il abandonne. SMTP est toutefois nettement plus tenace que votre facteur 👼.

Vous devez vous demander combien d'essais et quels intervalles entre chaque essai ? À cela je n'ai pas de réponse précise, car ça dépend de la configuration du serveur expéditeur. On peut toutefois raisonnablement considérer que les essais peuvent se poursuivre pendant une dizaine de jours.

Pour pallier à la pire des situations, vous devriez penser à mettre en place un backup, c'est-à-dire un autre serveur qui gardera vos mails le temps que votre serveur redevienne disponible. Ce serveur secondaire fait "poste restante". Un ami disposant de son propre serveur peut s'en charger 😎. C'est décrit dans la partie sur les mails.

Que faire en cas de problème ? §

Un service ne veut plus démarrer ? Votre site web n'est plus accessible ? Voici quelques astuces :

Dépanner le service en panne §

Un service ne démarre plus : vous pouvez démarrer ce service manuellement et voir les messages d'erreurs qu'il retourne. Par exemple, avec httpd, vous pouvez saisir cette commande pour avoir plus d'informations :

rcctl -d start http

Lire les manuels §

Vérifiez le manuel de programme problématique avec man.

Aller voir aussi dans le dossier /usr/local/share/doc/pkg-readmes s'il y a des précisions sur le programme posant problème.

Réparer l'installation de ports §

Si c'est un paquet qui ne veut pas correctement s'installer, utilisez la commande pkg_check qui va vérifier votre installation.

Vérifier les journaux §

Consultez les journaux du système avec la commande tail :

# tail -f /var/log/messages /var/log/daemon

Pour un site web :

# tail -f /var/www/logs/*

Pour un problème d'identification :

# tail -f /var/log/authlog

Lancez la commande dmesg qui peut vous donner une information sur un périphérique.

Éplucher le Pare-feu §

Si c'est le pare-feu qui pose problème, vous pouvez analyser le trafic avec tcpdump : # tcpdump -n -e -ttt -i pflog0

Réparer un système de fichier corrompu ou des redémarrages intempestifs §

Vous pouvez essayer de démarrer sur un noyau chargé en mémoire (ramdisk) : le bsd.rd, ceci afin de réinstaller les sets en choisissant "U: Upgrade" ou bien en accédant au système de fichier corrompu pour le réparer.

Pour cela, juste avant le démarrage, entrez bsd.rd à l'invite suivante :

boot> bsd.rd

Sinon, préparez une clé USB à partir d'une image "minirootXX.img" et démarrez sur cette clé.

Ensuite, choisissez d'accéder au Shell en sélectionnant S. Vous pouvez alors changer le mappage du clavier en français avec la commande kbd fr.

Pour accéder à votre disque, vérifiez qu'il est bien identifié avec la commande dmesg. Dans l'exemple, on considérera que ce disque est sd1.

Ensuite, assurez-vous que le périphérique est prêt à être utilisé avec :

cd /dev && sh MAKEDEV sd1

Vous pourrez vérifier le système de fichier avec la commande fsck :

fsck -y sd1a
fsck -y sd1d

Faites-le pour chaque morceau (slice ou "partition") dans le disque. Pour toutes les retrouver, entrez disklabel sd1.

Demander de l'aide §

Vous pouvez :

Discuter sur le salon XMPP francophone.

Discuter sur le salon XMPP.

Demander de l'aide sur la liste de diffusion officielle.

Générer de bons mots de passe aléatoires §

Faire des pieds et des mains pour sécuriser son système ne sert à rien si on choisit des mots de passe de 5 lettres. En effet, pour les mots de passe, il n'y a qu'une chose à retenir 😋 :

Plus c'est long, plus c'est bon !

Ce n'est qu'une question de mathématique : un pirate va tenter toutes les combinaisons possibles de mots de passe. Pour l'exemple, imaginons qu'il y ait 26 caractères possibles (on simplifie en oubliant les chiffres, les majuscules et les caractères spéciaux).

Jusque là, un ordinateur fini par trouver le bon mot de passe par essais successifs en quelques secondes voire quelques minutes. Mais si on allonge encore un peu le mot de passe :

Ça commence à faire beaucoup ! 😎 Ajoutez les majuscules et les chiffres, on passe de 26 à 62 possibilités par caractères. Cela donne un peu plus de 800 000 000 000 000 000 combinaisons possibles pour un mot de passe de 10 caractères! Finalement, il faut tellement de temps pour tenter toutes les possibilités que cela n'arrive jamais. Et qui plus est, vous aurez certainement ajouté des règles anti-bruteforce dans votre pare-feu.

Oubliez donc les histoires de symboles spéciaux à inclure absolument, ce n'est pas utile de torturer vos méninges.

Quelques idées :

Ou alors, si vous aimez avoir mal à la tête, vous pouvez utiliser une des commandes suivantes pour générer des mots de passe aléatoires (Remplacez le "15" par le nombre de caractères souhaités):

$ openssl rand 15 -base64

ou plus classique mais plus long :

$ dd if=/dev/urandom count=128 bs=1M 2>&1 | md5 | cut -b-15

ou encore avec jot :

$ jot -rcs  20 32 126

ou enfin avec "/dev/random" :

$ tr -cd ' -~' < /dev/urandom 
# ou pour n'avoir que des caractères alphanumériques
$ tr -cd '[:alnum:]' < /dev/urandom

Pour rire, cette petite BD en provenance d'xkcd explique très bien cette partie avec humour 😊.

https://m.xkcd.com/936/

password strength xkcd

Découper et rassembler des fichiers §

Peut-être aurez-vous besoin de découper de gros fichiers pour les transférer sur votre serveur. Voici comment faire :

$ gzip -c gros_fichier | split -b 100m - gros_fichier.gz

Cela vous donne plusieurs fichiers d'une taille maximale de 100M rangés par ordre alphabétique:

$ ls -l
-rw-r--r--  1 xavier  xavier  104857600 Dec 12 16:52 gros_fichier.gzaa
-rw-r--r--  1 xavier  xavier  104857600 Dec 12 16:52 gros_fichier.gzab
-rw-r--r--  1 xavier  xavier   88204071 Dec 12 16:52 gros_fichier.gzac

Afin de les rassembler, utilisez la commande suivante :

cat gros_fichier.gz_* | gunzip -c > gros_fichier

Avouez-le, c'est plutôt cool non? 😎

Comment créer/supprimer un utilisateur ? §

Créer un utilisateur §

Créer des utilisateurs peut vous servir à plusieurs choses, notamment :

Selon les cas, vous ne configurerez pas l'utilisateur de la même façon. On notera :

Pour ajouter un utilisateur, utilisez la commande adduser. Cette dernière est interactive et pose des questions petit à petit pour ne rien oublier au contraire d'useradd (oui, la différence est mince...).

Voici à quoi ressemblera la création d'un utilisateur, qui n'a pas le droit de lancer de commandes :

root@votreserveur[~] # adduser
Use option '-silent' if you don't want to see all warnings and questions.

Reading /etc/shells
Check /etc/master.passwd
Check /etc/group

Ok, let's go.
Don't worry about mistakes. There will be a chance later to correct any input.
Enter username []: toto
Enter full name []: Jean-Eudes
Enter shell csh ksh nologin sh [nologin]: nologin
Uid [1005]:
Login group toto [toto]:
Login group is toto. Invite toto into other groups: guest no
[no]:
Login class authpf bgpd daemon default dovecot pbuild staff unwind
[default]:
Enter password []:
Enter password again []:

Name:        toto
Password:    ***************
Fullname:    Jean-Eudes
Uid:         1005
Gid:         1005 (toto)
Groups:      toto
Login Class: default
HOME:        /home/toto
Shell:       /sbin/nologin
OK? (y/n) [y]: y
Added user toto
Add another user? (y/n) [y]: n
Goodbye!

Bien sûr, vous aurez choisi un mot de passe de qualité.

Supprimer un utilisateur §

Pour supprimer un utilisateur, c'est très rapide :

# userdel toto
# groupdel toto

Et voilà ! 😊


Table des matières

Donate