cd /
;
apropos
;
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 😎.
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)
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.
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:
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 😉
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.
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
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 😃.
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.
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.
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
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" 😉)
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
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
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.
Un service ne veut plus démarrer ? Votre site web n'est plus accessible ? Voici quelques astuces :
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
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.
Si c'est un paquet qui ne veut pas correctement s'installer, utilisez la commande pkg_check qui va vérifier votre installation.
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.
Si c'est le pare-feu qui pose problème, vous pouvez analyser le trafic avec tcpdump : # tcpdump -n -e -ttt -i pflog0
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.
Vous pouvez :
Discuter sur le salon XMPP francophone.
Demander de l'aide sur la liste de diffusion officielle.
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/
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? 😎
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é.
Pour supprimer un utilisateur, c'est très rapide :
# userdel toto # groupdel toto
Et voilà ! 😊