Ce document propose des explications permettant d'héberger chez soi certains services malheureusement trop souvent confiés à des tiers.

À la fin de la lecture, vous serez en mesure :

Notez que les procédures détaillées ici peuvent aussi être déployées sur des serveurs dédiés.

Cet ouvrage est publié sous licence CC-BY-SA à l'aide de txt2tags.

Les sources sont disponibles à cette adresse :

http://git.yeuxdelibad.net/auto-hebergement_openbsd_facile_securise.

Si vous souhaitez une version papier, vous pouvez en profiter pour encourager l'auteur en achetant une version imprimée :

Couverture du livre sur l'auto-hébergement

Sinon, le code css de la page a été optimisé pour l'impression. Utilisez un navigateur récent comme firefox pour en profiter.

Ce document est libre, tout comme son prix. Vos dons sont donc les bienvenus. Vous pouvez si vous le souhaitez utiliser le service Liberapay qui ne prend aucune commission :

Pour contacter l'auteur, l'encourager, lui jeter des cailloux ou lui dire merci, c'est par ici : https://yeuxdelibad.net/Divers/Contact.html.

  1. Introduction
  2. Surveiller son serveur
  3. Le Pare–feu
  4. SSH
  5. Un site web
  6. Maintenir le système à jour
  7. Les bases de données
  8. Courrier électronique
  9. Sauvegardes
  10. Serveur de noms
  11. Travaux pratiques
  12. Gopher
  13. Seedbox
  14. Serveur d'impression
  15. TOR
  16. Serveur de stockage
  17. Proxy VPN (OpenVPN)
  18. Radio Web
  19. Annexes

1. Introduction

1.1. Avant-propos

Vous êtes sur le point de plonger dans l'univers de l'auto-hébergement. Il existe déjà de nombreuses explications sur le web pour réussir cette aventure. Cependant, il me semble qu'un ouvrage cohérent est plus pratique, surtout lorsqu'on découvre ces notions. Afin que ce voyage soit le plus confortable possible, nous utiliserons le système OpenBSD. Ce dernier est réputé pour être le plus sûr (rien que ça ! ). Qui plus est, il est aussi, à mon avis, nettement plus simple à configurer que d'autres systèmes basés sur Linux. Souhaitant rendre plus accessible la démarche d'auto-hébergement, c'est un avantage non négligeable.

Toutefois, bien que les développeurs d'OpenBSD fournissent de nombreux efforts pour vérifier le code source et assurer un système fiable et sécurisé, il faut rester vigilant. Pas de panique, nous verrons quelques éléments de rigueur pour configurer votre serveur, cela demande juste du bon sens.

Je vais donc présenter dans ce document la configuration d'un serveur pour une utilisation qui devrait convenir à la plupart des lecteurs. L'objectif principal est de vulgariser l'auto-hébergement, c'est pourquoi les plus aguerris chercheront certainement à approfondir le soin apporté à leur installation.

Quel que soit votre niveau, vous trouverez en fin d'ouvrage diverses astuces, quelques digressions, ainsi que des exemples de fichiers de configuration. Puisque le document peut se lire dans le désordre, n'hésitez pas à faire un tour par la FAQ ou jeter un oeil aux astuces.

Vous verrez que s'auto-héberger n'est finalement pas si difficile et consiste en grande partie à modifier du texte dans des fichiers. Cette démarche devrait donc être accessible à tous.

Alors, prêt à plonger? Bonne lecture!

1.2. L'auto-hébergement : C'est quoi? Des avantages? Des inconvénients?

La plupart des sites web que vous avez l'habitude de consulter (vos courriels, les réseaux sociaux...) sont hébergés sur des serveurs, quelque part dans le monde. Un serveur n'est ni plus ni moins qu'un ordinateur, qui va proposer des services et du contenu à d'autres ordinateurs. La seule différence notable, c'est que cet ordinateur n'est en général pas relié à un écran.

Lorsque vous voulez consulter vos e-mails, votre navigateur va chercher sur un serveur quelque part dans le monde tous vos messages, qui sont alors téléchargés vers votre ordinateur. C’est comme si pour lire votre courrier postal, vous deviez aller à la poste pour demander au facteur :

Y a-t-il du courrier pour moi?

Ce dernier va vérifier, puis récupérer votre courrier pour vous le donner. C’est le bureau de poste qui l'avait, jusqu'à ce que vous le releviez. Le principe n'est pas si différent lorsque vous allez consultez vos mails.

Ce procédé n'est pas sans inconvénients. En effet, la centralisation des services permet aux sociétés qui façonnent l'internet selon leurs souhaits de contrôler les données, pas toujours dans l'intérêt des utilisateurs. Qui n'a pas râlé parce qu'il n'obtenait pas ce qu'il espérait d'un service postal? C'est la même chose pour Google qui met en avant certains contenus choisis, comme par exemple leurs services commerciaux.

De plus, si l'un de ces fournisseurs tombe en panne, c'est tout une partie de l'internet qui est inaccessible aux dépens des utilisateurs. Cela va à l'encontre de l'idée originale du web où chacun devrait pouvoir constituer un nouveau noeud à sa toile.

Héberger chez soi les services que l'on utilise présente plusieurs avantages :

« Prétendre que votre droit à une sphère privée n'est pas important parce que vous n'avez rien à cacher n'est rien d'autre que dire que la liberté d'expression n'est pas essentielle car vous n'avez rien à dire. » -- E. Snowden

Cependant, cette démarche n'est pas sans inconvénients :

1.3. Pré-requis

Dans ce document, on supposera que :

1.4. Quelques mots sur l'installation d'OpenBSD

Voici quelques notes rapides sur l'installation d'OpenBSD. En cas de besoin, lisez le guide d'installation officiel.

  1. Récupérez une image d'installation à partir d'un des miroirs listés dans le lien suivant :

    http://www.openbsd.org/ftp.html.

    Pour installer à partir d'un cdrom, choisissez le fichier install60.iso. À partir d'une clé USB, choisissez alors le fichier install60.fs.
  2. Gravez l'image iso sur un cdrom avec un logiciel approprié. Pour une clé USB, vous pouvez la préparer avec la commande dd. Par exemple, sur une machine utilisant Linux :
    dd if=installXX.fs of=/dev/sdbX
    
  3. Définissez un mot de passe robuste pour le compte root, car il s'agit de l'utilisateur qui a tous les droits sur le serveur.
  4. Activer le service ssh à l'installation est recommandé pour vous connecter au serveur ensuite. Si vous l'avez relié à un écran par souci de facilité, ce n'est alors pas obligatoire.
  5. Allouez suffisamment d'espace à la partition /var qui contiendra votre site web, et les logs (journaux des services).
  6. Lors du premier démarrage, éditez le fichier /etc/pkg.conf puis mettez-y :

    installpath = http://ftp.fr.openbsd.org/pub/OpenBSD/%v/packages/%a/
    

    ou :

    installpath = ftp://ftp2.fr.openbsd.org/pub/OpenBSD/%v/packages/%a/
    

    Une liste complète des serveurs est disponible sur le site d'OpenBSD :

    https://www.openbsd.org/ftp.html

1.4.1. Exemple d'installation d'OpenBSD

Cette section n'est là que pour rassurer les plus réticents. Pour des informations plus complètes, n'hésitez pas à consulter la documentation d'OpenBSD.

On télécharge tout d'abord l'image d'installation de la dernière version d'OpenBSD, qui est, à l'heure où j'écris ces lignes, la 6.0. Une liste de miroirs est disponible ici : http://www.openbsd.org/ftp.html.

Les utilisateurs de Windows pourront faire la même chose avec le logiciel rufus.

Et hop, on insère tout ça dans le lecteur du PC, puis on redémarre en choisissant de démarrer sur le bon media (boot en anglais). Repérez les messages qui s'affichent du type F12 : Boot Menu ou F7 : Setup qui indiquent la touche permettant de configurer le média sur lequel l'ordinateur démarre en priorité.

Note : les captures suivantes sont réalisées avec qemu pour plus de simplicité.

Le premier écran nous propose d'ajouter des options pour démarrer OpenBSD. On n'en a pas besoin, on appuie donc juste sur "Entrée" :

On lance l'installation avec I :

Les valeurs proposées pour l'installation sont largement suffisantes dans la plupart des cas. Les choix par défaut sont indiqués entre crochets : [choix]. À chaque fois, des exemples sont disponibles avec '?'.

On choisit une disposition de clavier : fr

On choisit ensuite un nom de machine, par exemple "mondomaine.com"

Ensuite, on configure la connexion à internet. Notez qu'il n'est pas obligatoire d'avoir un accès en ligne si vous avez choisi une image install*.* , bien qu'un serveur sans accès à internet n'ait pas la même utilité.

Ensuite, l'installateur vous demande le mot de passe de l'administrateur système dont le petit nom est root. Choisissez un mot de passe robuste.

Vous pouvez ensuite faire en sorte que ssh soit lancé par défaut au démarrage (conseillé pour un serveur).

On nous demande si on voudra avoir un serveur X (session graphique) : ce n'est absolument pas nécessaire pour un serveur. Autant attribuer toutes les ressources aux calculs plutôt qu'à l'affichage.

Nous passons ensuite à la configuration du fuseau horaire. L'écran doit alors ressembler à ça :

C'est parti pour le choix du disque :

Nous voilà à la partie sans doute la plus complexe : le partitionnement. Sachez que celui par défaut proposé par l'installateur conviendra dans la majorité des cas.

Je tape donc "W" dans la suite pour utiliser le disque entier:

Puis "A" pour le partitionnement automatique.

Vous pouvez modifier le partitionnement par défaut en tapant "E".

Ensuite, c'est le manuel de disklabel qui vous permettra de vous en sortir. Il faut en général indiquer une action (avec une lettre) à réaliser sur la partition où il faudra l'effectuer.

Par exemple : la suite d f permet de supprimer la partition f, qui était /usr, et d k pour supprimer le /home.

Ensuite, taper a f permet de recréer cette partition, et d'en définir la taille. Notez que vous pouvez définir une taille en pourcentage du disque (par exemple 50%) ou en pourcentage de l'espace libre restant (50&). Ici, je vais réduire le /home au profit de /usr. De la même façon avec a k, on recrée /home à la taille souhaitée.

À tous moments, vous pouvez taper p pour afficher les partitions actuelles, histoire de voir où vous en êtes.

Quelques points à garder en tête :

Taper q permet de valider les changements.

Enfin l'installation des composants du système peut commencer. bsd.mp est le noyau optimisé pour les systèmes multi-processeurs, et bsd le noyau classique. bsd.rd est utilisé pour les mises à jour ou le dépannage car il se charge en mémoire. Vous n'en aurez pas forcément besoin.

Pour ajouter un set, saisissez simplement son nom, par exemple games60.tgz. Pour retirer un set, saisissez son nom précédé du signe moins : -games60.tgz. En cas de doute, laissez coché le set proposé.

Si vous installez les sets à partir du CD, un avertissement sur la signature apparaît. Rien d'inquiétant, vous pouvez dans ce cas continuer.

L'installation avance

Et voilà, l'installation est terminée, on peut redémarrer en tapant "reboot".

2. Surveiller son serveur

Une fois votre serveur en marche, il faudra veiller à ce que tout fonctionne correctement. Ça paraît bête, mais c'est très important. Heureusement, tout est déjà prévu dans OpenBSD pour nous faciliter la vie.

En effet, chaque jour un rapport est généré et envoyé à l'administrateur du serveur, cet utilisateur répondant au charmant nom de "root". Vous pourrez y lire un tas d'informations utiles comme :

Les lignes commençant par un + correspondent à ce qui a été rajouté et celles qui commencent par un - à ce qu'il y avait avant.

Tout ceci, c'est bien beau, mais comment recevoir ces messages?

Comme vous allez le voir, c'est d'une simplicité enfantine :

  1. Éditez le fichier /etc/mail/aliases ;
  2. Ajoutez tout en bas une ligne comme celle-ci :
    root : toto@openmailbox.org
    

    Bien sûr, vous remplacerez l'adresse mail par celle que vous consultez régulièrement.

  3. Lancez maintenant la commande # newaliases.
  4. Relancez le serveur mail intégré à OpenBSD : # rcctl restart smtpd.

Et voilà!

Si vous voulez tester que tout fonctionne comme prévu, saisissez la commande suivante pour vous envoyer un mail test :

echo "Coucou toi!" | mail -s "test" root

Vous devriez le recevoir à l'adresse définie dans /etc/mail/aliases.

Ne vous reste plus qu'à lire soigneusement ces messages que le serveur va vous envoyer.

3. Le Pare–feu

Quoi? Déjà le firewall?

Eh oui, on va commencer par cet élément essentiel à la sécurité du serveur. Avouez que ce serait dommage de travailler sur une machine vulnérable dès le départ. Donc avant d'aller plus loin : le pare-feu!

Sur OpenBSD, le pare-feu s'appelle pf, comme "packet filter". Sa configuration se déroule dans le fichier /etc/pf.conf, et comme vous le verrez, est nettement plus facile à appréhender que celle d'iptables (l'outil servant à configurer le pare-feu sous Linux...).

Avant toutes choses, il faut se demander ce dont on va avoir besoin sur notre serveur. Un serveur http? Les mails? Un serveur ftp? Selon les réponses à ces questions, nous n'ouvrirons pas les mêmes ports. En effet, pour assurer un maximum de sécurité, on ne va rien laisser passer sauf ce que qui est réellement utile. Redoutable.

Pour trouver les ports sur lesquels écoutent les services dont vous pourriez avoir besoin, regardez le contenu du fichier /etc/services. Ainsi, écrire www ou 80 revient au même pour pf, mais est plus lisible pour les humains.

Les règles que vous allez définir seront appliquées dans l'ordre de lecture du fichier de configuration.

On commence donc par tout bloquer, et enregistrer dans le journal les paquets interdit avec le mot log. Ensuite, on autorise le trafic à travers certains ports. Voici ci-dessous un exemple très simple pour un site web qui écoute sur les ports 80 et 443 :

tcp_pass = "{ 80 443 }"
block log

pass out quick on re0 proto tcp to any port $tcp_pass keep state
pass in quick on re0 proto tcp to any port $tcp_pass keep state

Remarquez qu'il est possible de définir plusieurs ports dans 1 seule variable $tcp_pass. C'est quand même bien pratique.

T'es mignon hein, mais c'est du charabia tout ça!

D'accord, nous allons expliquer ce que veut dire cette syntaxe. Intéressons-nous à la ligne suivante :

pass out quick on re0 proto tcp to any port $tcp_pass keep state

On peut la traduire par : "laisse passer vers l'extérieur (pass out) sans t'occuper ensuite des lignes suivantes (quick) à travers l'interface re0 (on re0) pour le protocole tcp (proto tcp) vers n'importe quelle autre ordinateur (to any) pour les ports dans $tcp_pass (port $tcp_pass) et souviens-toi de cette connexion tant qu'elle dure (keep state)".

Pfouh!

Notez qu'on a trouvé ici le nom de l'interface re0 en tapant 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.66 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.

Pf dispose d'une autre fonctionnalité très intéressante : les "tables" (tableaux). Ça va nous permettre de garder en mémoire certaines adresses IP de vilains qui tenteraient de compromettre le serveur. Par exemple, pour protéger le service ssh, on va procéder ainsi :

  1. Création d'une table pour enregistrer les IP abusives avec notre serveur ssh.
  2. Bloquer toutes les IP qui seraient dans la table précédente, et ne pas aller plus loin pour elles.
  3. Ouvrir le port ssh, mais enregistrer dans la table précédente toutes les IP qui tenteraient de se connecter plus de 3 fois par minute (attaque par bruteforce).

    Ça nous donne donc ceci :

    ssh_port = "22"
    table <ssh_abuse> persist
    block in log quick proto tcp from <ssh_abuse> to any port $ssh_port
    pass in on $ext_if proto tcp to any port $ssh_port flags S/SA keep state \
        (max-src-conn-rate 3/60, overload <ssh_abuse> flush global)
    

    Notez que nous avons enregistré le numéro du port utilisé pour le serveur ssh. C'est inutile, car on peut mettre à la place de $ssh_port simplement ssh, c'est-à-dire le nom du service. Cependant, on peut vouloir changer le port par défaut du serveur ssh, comme décrit dans le chapitre sur ce service.

    Vous l'aurez compris, pf nous permet un contrôle de premier ordre sur notre serveur. On pourra filtrer le trafic entrant et sortant. On pourra même rediriger une partie de celui-ci vers des service internes (comme par exemple un anti-spam). Je vous laisse construire votre fichier /etc/pf.conf selon vos besoins. N'hésitez pas à consulter l'exemple fournit à la fin du document.

Un dernier mot avant de terminer cette partie. Enfin plutôt quelques commandes bien pratiques :

4. SSH

SSH, c'est magique. Cet outil vous permettra de vous connecter au serveur à partir d'un autre ordinateur. Vous pourrez alors l'administrer à distance sans devoir y brancher un clavier et un écran. À vrai dire, sauf exception, tous les serveurs sont administrés ainsi, mais vous êtes chez vous après tout, donc vous pouvez faire comme vous voulez.

De plus, SSH ne se limite pas ça, car il est capable de créer des tunnels chiffrés vers votre serveur. Vous serez en mesure d'avoir un espace de stockage de fichiers en SFTP, voire même d'en faire une sorte de NAS.

Quoi qu'il en soit, si vous n'avez pas activé SSH lors de l'installation d'OpenBSD, vous pouvez l'activer avec la commande suivante :

# rcctl enable sshd

Bien que ce protocole soit fiable, ça ne coûte rien de prendre quelques précautions de sécurité. On va éditer la configuration de SSH dans le fichier /etc/ssh/sshd_config.

Par la suite, pour vous connecter au serveur, vous utiliserez la commande suivante à partir de votre ordinateur :

$ ssh -p 222 toto@votredomaine.com

Ça demandera le mot de passe de toto, puis vous pourrez administrer le serveur à distance.

4.1. Connexion sans mot de passe

Il y a des situations où c'est tout de même plus pratique de pouvoir se connecter au serveur sans avoir à entrer le mot de passe. C'est le cas par exemple dans certains scripts. C'est heureusement possible grâce à un jeu de clés. Voici la marche à suivre :

Sur le serveur, modifiez le fichier /etc/ssh/sshd_config pour qu'il contienne ces lignes :

PubkeyAuthentication yes

Maintenant, sur l'ordinateur qui veut accéder au serveur, nous allons générer la paire de clés avec la commande suivante :

$ ssh-keygen -t rsa -f ~/.ssh/votreserveur

Vous prendrez soin d'éditer le fichier ~/.ssh/config de votre utilisateur pour le remplir ainsi :

Host votreserveur
HostName nomtreslong.vraimenttroplong.long
User jeanbaptiste.professeurdanseur
PasswordAuthentication no
IdentityFile ~/.ssh/votreserveur

Bien sûr, vous modifierez le nom de domaine de votre serveur ainsi que le nom de l'utilisateur qui doit se connecter. Ensuite, lancez la commande suivante pour copier la clé publique sur le serveur.

ssh-copy-id -i ~/.ssh/votreserveur.pub "jeanbaptiste.professeurdanseur@nomtreslong.vraimenttroplong.long -p xxx"

Ici, remplacez "xxx" par le port utilisé par ssh.

Dans le cas où l'outil ssh-copy-id ne serait pas disponible, il faut copier la clé publique manuellement. Pour l'afficher, tapez

$ cat ~/.ssh/votreserveur.pub

Connectez-vous sur le serveur en ssh, puis ajoutez dans le fichier ~/.ssh/authorize_keys la clé affichée précédemment.

Une fois ceci fait, vous pouvez vous connecter sans devoir entrer de mot de passe avec simplement la commande :

$ ssh votreserveur

Pratique non?

Je vous invite à suivre ce lien pour en apprendre davantage : http://formation-debian.via.ecp.fr/ssh.html#idp11863616

4.2. SFTP

Le protocole sftp ressemble beaucoup au célèbre ftp, mais se base sur un tunnel SSH. À vrai dire, chaque utilisateur disposant d'un accès SSH peut envoyer et télécharger des fichiers en SFTP avec ses codes d'identification habituels.

Pour copier des fichiers, vous pouvez utiliser la commande scp qui s'utilise ainsi :

$ scp -p <port ssh> utilisateur@votreserveur.net:/emplacement/de/destination fichier-a-copier

On peut aussi plus simplement utiliser un client graphique comme décrit plus bas.

4.3. SFTP avec chroot

L'idée ici est d'enfermer dans un dossier les utilisateurs appartenant au groupe sftpusers. Cela leur évitera de copier n'importe où leurs documents, mais aussi de supprimer des éléments importants du serveur.

À titre d'exemple, nous allons mettre le chroot dans le dossier /mnt/sauvegarde.

Éditez le fichier /etc/ssh/sshd_config puis ajoutez les lignes suivantes :

Subsystem       sftp    internal-sftp
Match Group sftpusers
    ChrootDirectory /mnt/sauvegarde/sftp/%u
    ForceCommand internal-sftp 

Pensez à bien modifier la ligne déjà existante qui contient Subsystem.

Ensuite, relancez ssh : rcctl reload sshd

Créez maintenant un dossier /sftp dans le dossier /mnt/sauvegarde pour que les utilisateurs y soient automatiquement placés à leur connexion.

# mkdir -p /mnt/sauvegarde/sftp

Modifiez les droits pour assurer une sécurité supplémentaire :

# chown root:wheel /mnt/sauvegarde/sftp
# chmod 700 /mnt/sauvegarde/sftp

Dans /mnt/sauvegarde/sftp, il y aura les dossiers portant le nom des utilisateurs. En fait, on fait comme si le répertoire

/mnt/sauvegarde/sftp/utilisateur

était la nouvelle racine / pour les utilisateurs.

4.3.1. Ajouter un compte sftp

Ajouter un compte sftp revient à créer un nouvel utilisateur et mettre ce dernier dans le groupe sftpusers.

Il faut quand même faire attention à plusieurs points :

Voici la marche à suivre :

L'utilisateur peut maintenant utiliser le protocole sftp. Il sera enfermé dans son dossier précédemment créé.

4.3.2. Transferts avec Firefox

C'est la solution sans doute la plus simple pour ceux qui utilisent déjà ce navigateur. On va ajouter un module à Firefox qui s'appelle fireftp.

Pour cela, rendez vous à cette adresse :

https://addons.mozilla.org/fr/firefox/addon/fireftp/

Cliquez sur le bouton "Ajouter à Firefox", puis une fois l'installation terminée, redémarrez le navigateur.

Maintenant, Firefox peut se connecter au serveur. Pour cela, tapez dans la barre d'adresse ceci :

sftp://utilisateur@votreserveur.net:222

Remplacez 222 par le port ssh du serveur (22 par défaut). Bien sûr, "utilisateur" est aussi à remplacer (par exemple jean_eudes ou toto).

Un mot de passe vous est demandé, il suffit de le taper.

Reste à utiliser les flèches centrales pour envoyer ou récupérer des documents.

4.3.3. Transferts avec Filezilla

On va installer le logiciel Filezilla qui permettra de se connecter au serveur.

Vous pouvez le télécharger via l'adresse ci-dessous, ou l'installer directement via le gestionnaire de paquets de votre distribution.

http://filezilla-project.org/download.php?type=client

Ouvrez Filezilla, puis cliquez sur la petite icône en haut à gauche "Gestionnaire de sites". Une nouvelle fenêtre s'ouvre :

Cliquez sur "Nouveau Site", puis remplissez les champs ainsi :

Il ne vous reste plus qu'à cliquer sur Connexion. Sélectionnez les fichiers que vous souhaitez envoyer ou récupérer, puis faites un clic-droit pour les télécharger. La même chose est possible avec des glisser/déposer.

5. Un site web

OpenBSD intègre par défaut un serveur http qui s'appelle tout simplement httpd. Il présente un minimum de fonctionnalités, mais sa légèreté le rend d'autant plus simple à configurer. De plus, il sera amplement suffisant dans la plupart des cas. Si vous avez réellement besoin d'un serveur http plus complet, sachez que nginx et apache sont disponibles.

Avant d'aller plus loin, il est important de noter que pour des raisons de sécurité, le serveur httpd sera lancé en chroot dans le dossier /var/www.

Et c'est censé vouloir dire quoi?

En réalité, pour le serveur http, tous les documents qui sont "au-dessus" du dossier /var/www sont totalement inaccessibles. Pour lui, il s'agit de la racine /. Ce comportement peut être modifié, mais je vous le déconseille : autant garder un maximum de précautions.

5.1. Un site simple avec httpd

On commence par créer un dossier qui contiendra le site :

# mkdir /var/www/htdocs/mon_super_site

Placez maintenant les pages de votre site dans ce dossier (index.html...). Une fois terminé, on va modifier les droits sur ce dossier pour qu'il appartienne à root et soit accessible au serveur httpd. Cette étape est facultative mais recommandée :

# chown -R root:daemon /var/www/htdocs/mon_super_site

Il ne nous reste plus qu'à modifier la configuration du serveur httpd. Pour cela, on va éditer le fichier /etc/httpd.conf. Vous pourrez constater que sa configuration est très simple.

types { include "/usr/share/misc/mime.types" }

server "votredomaine.net" {
        listen on * port 80
        root "/htdocs/mon_super_site"
}

Quelques explications :

On termine en activant httpd et en le (re)démarrant :

# rcctl enable httpd
# rcctl restart httpd

Vous pouvez désormais aller admirer votre site. Toutes les pages html que vous placerez dans /var/www/htdocs/mon_super_site seront servies.

Petite astuce : vous pouvez envoyer votre site à l'aide d'un client comme le logiciel Filezilla. Choisissez dans ce cas une connexion sftp avec vos identifiants ssh. Vous obtiendrez alors un dossier par exemple dans /home/toto/monsite. Il ne vous reste plus qu'à déplacer les fichiers de votre site web à partir du compte root :

# mv /home/toto/monsite/* /var/www/htdocs/mon_super_site

Et voilà, c'est suffisant pour un simple site. Afin d'y accéder, n'oubliez pas d'ouvrir le port 80 (www) dans le parefeu et de le rediriger.

Si vous voulez en savoir plus, lisez la partie "Astuces pour httpd".

5.2. PHP

5.2.1. Configuration minimale

Il est fort possible que vous souhaitiez ajouter le support de PHP à votre site, surtout si vous voulez héberger un moteur de blog ou un CMS.

La commande suivante permet d'installer PHP (à remplacer par la version souhaitée):

# pkg_add php-7.0.8p0

Pour lister toutes les versions de PHP disponibles, tapez :

# pkg_info -Q php

Ensuite, on active PHP et on le démarre :

# rcctl enable php70_fpm
# rcctl start php70_fpm

Nous pouvons maintenant modifier la configuration de httpd pour lui dire de servir les pages au travers de PHP. Quelques lignes sont à ajouter au fichier etc/httpd.conf :

server "monserveur.net" {
        listen on * port 80
        root "/htdocs/monsupersite"
        directory index index.php

        location "*.php*" {
                fastcgi socket "/run/php-fpm.sock"
        }
}

Remarquez l'instruction directory index index.php. Elle permet de rendre l'adresse http://monserveur.net/ équivalente à l'adresse http://monserveur.net/index.php.

Et voilà, les fichiers .php seront correctement interprétés. Cette configuration est suffisante dans la plupart des cas.

5.2.2. Installation de PHP plus complète

Je vous propose toutefois d'aller un peu plus loin pour préparer l'installation d'applications plus complètes (blog, CMS...) en activant des extensions et des options qui ne le sont pas par défaut, toujours dans un souci de sécurité.

Vous avez peut-être remarqué lors de l'installation de PHP une note concernant le dossier /usr/local/share/doc/pkg-readmes. Ce dernier contient des informations très intéressantes que nous allons appliquer ici.

Les extensions installées sont dans le dossier /etc/php-7.0.sample. Afin de les activer, il faut les relier dans le dossier /etc/php-7.0. On peut le faire en deux commandes :

# cd /etc/php-7.0.sample
# for i in *; do ln -sf ../php-7.0.sample/$i ../php-7.0/; done

La plupart des extensions sont déjà présentes, mais vous voudrez peut-être y ajouter les paquets suivants :

On peut souhaiter modifier la configuration de PHP. Il faut pour cela éditer le fichier /etc/php-7.0.ini. Je vous conseille notamment de modifier ces quelques lignes :

; Augmente la taille des fichiers que vous pouvez envoyer sur le site
post_max_size = 500M
upload_max_filesize = 500M
; une application php peut chercher du contenu distant (images..)
allow_url_fopen = On
; Le fuseau horaire
date.timezone = Europe/Paris
; configuration du cache
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.enable_file_override=1

Il est possible que votre site doive récupérer des informations venant d'autres sites. Malheureusement, si vous vous souvenez bien, le serveur http est dans un chroot. Où se trouve ce chroot déjà?

Dans /var/www !!!

Très bien Jean-Eudes! Il y en a au moins un qui suit.

On va donc être obligé de mettre quelques fichiers qui normalement se trouvent dans /etc à l'intérieur du chroot. Cela permettra à PHP d'être capable de résoudre les noms de domaines, vérifier les certificats SSL, être à l'heure...

Voici la procédure :

# cd /var/www     # On va dans le chroot
# mkdir etc/      # On fabrique un dossier etc
### On copie 2 fichiers pour resoudre les domaines: 
# cp /etc/resolv.conf etc/resolv.conf            
# cp /etc/hosts etc/hosts              
### Bon fuseau horaire :
# cp /etc/localtime etc/localtime                
# mkdir etc/ssl   # On cree un autre dossier
### Pour verifier les certificats ssl :
# cp /etc/ssl/cert.pem etc/ssl/cert.pem

Vous aurez peut-être besoin d'être capable d'envoyer des mails à partir de vos sites. Puisque PHP est dans un chroot, il ne pourra pas communiquer avec le programme responsable de l'envoi des mail : sendmail. Heureusement, lorsque vous avez installé PHP, l'outil femail-chroot a été lui aussi installé grâce au jeu des dépendances. Pour que PHP puisse l'utiliser, il faut copier "sh" dans le chroot (voir le fichier /usr/local/share/doc/pkg-readmes/femail-chroot*).

cp /bin/sh /var/www/bin

Une fois toutes vos modifications réalisées, n'oubliez pas de relancer PHP avec rcctl restart php70_fpm.

5.2.3. PHP et W^X

Par défaut, OpenBSD active par défaut la protection mémoire W^X. Cette précaution peut empêcher certains programmes de fonctionner correctement, comme PHP.

Normalement, à partir d'OpenBSD en version 6.0, tout est prévu et vous n'avez rien à modifier. Sinon, vérifier dans le fichier /etc/fstab qu'il y a l'option wxallowed sur /usr/local :

e0ca6b318b796701.f /usr/local ffs rw,nodev,wxallowed 1 2

5.3. HTTPS

Prévoir un accès avec chiffrement pour votre site n'est pas obligatoire. C'est malgré tout intéressant si :

Procurez-vous tout d'abord un certificat SSL (lisez le paragraphe concerné si besoin).

Ensuite, on va préciser dans la configuration d'un site le chemin vers le certificat et vers la clé privée.

# extrait de /etc/httpd.conf
server "votreserveur.net" {
    listen on * tls port 443
    root "/htdocs/monsupersite"

    tls {
        certificate "/etc/letsencrypt/live/votresite.net/fullchain.pem"
        key         "/etc/letsencrypt/live/votresite.net/privkey.pem"
    }
    hsts

Vous remarquerez que la connexion se fait désormais sur le port 443 (https), qu'il faut ouvrir dans le parefeu et rediriger dans le routeur.

L'option hsts rend l'échange des clés et donc la qualité du chiffrement plus sûrs. Pour un mot en plus, ça ne fait pas de mal.

Afin de diriger les visiteurs qui arriveraient avec l'adresse "http://votreserveur.net" vers "https://votreserveur.net", on ajoute le bloc suivant :

# extrait de /etc/httpd.conf
server "votreserveur.net" {
    listen on * port 80
    block return 301 "https://$SERVER_NAME$REQUEST_URI"
}

5.4. Astuces pour httpd

Je ne peux m'empêcher de vous inciter à lire le man httpd.conf. On y trouve tout ce qui est écrit ici, et plus encore.

5.5. Quelles permissions donner à mon site?

Attribuer les permissions adéquates aux fichiers constituant vos sites web est très important d'un point de vue sécurité. Il n'y a cependant pas de règles générales, car cela dépend des besoins de l'application hébergée et des vôtres. Voici cependant quelques exemples :

ATTENTION : il sera certainement judicieux de modifier les permissions plus finement. Dans tous les cas, la meilleure pratique est de se poser la question concernant les droits.

À titre informatif, la plupart des hébergeurs appliquent uniquement les droits suivants :

Tout ceci peut se faire en quelques lignes :

### retrait des droits : 
# chmod -R a-rwx /var/www/htdocs/site     
### tout le monde peut lire les dossiers : 
# chmod -R a+rX /var/www/htdocs   
### seul le proprietaire peut ecrire : 
# chmod -R u+w /var/www/htdocs   

On retire d'abord l'ensemble des permissions. Ensuite, on donne accès en lecture aux dossiers et fichiers. Attention, à cette étape, il s'agit d'un X majuscule. Enfin, on accorde au propriétaire les droits d'écriture dans les dossiers et fichiers.

6. Maintenir le système à jour

Pour conserver un système robuste et sécurisé, il est essentiel de le maintenir à jour. Voici quelques conseils à ce sujet.

6.1. Mettre les paquets à jour

Mettre les paquets à jour est l'histoire d'une seule commande :

# pkg_add -u

Oui, c'est tout.

Cela ne sera pas nécessaire la plupart du temps sauf lors d'un changement de version. En effet, les failles importantes de sécurité sont corrigée dans le système (voir paragraphe suivant). Si la faille concerne un paquet, il faut alors passer par les ports pour le mettre à jour. Vous pouvez aussi utiliser le service M:Tier décrit un peu plus loin.

6.2. Mettre le système à jour

Tout d'abord, un petit rappel : OpenBSD est fournie en 3 "saveurs" (flavour) :

Il peut en effet arriver que des bugs soient découverts. À chaque fois, des correctifs sont rapidement proposés. Il est alors recommandé d'appliquer les patches de sécurité. Vous pouvez suivre les indications de la page errata (https://www.openbsd.org/errata.html) pour réaliser cette manipulation. Cependant, comme appliquer les correctifs n'est pas forcément facile, voici un résumé des pages suivantes que vous devriez lire :

6.2.1. Mise à jour manuelle

Pour commencer, on récupère les sources "patchées" et corrigées :

# cd /usr
# cvs -qd anoncvs@anoncvs.fr.openbsd.org:/cvs get -rOPENBSD_6_0 -P src
# cvs -qd anoncvs@anoncvs.ca.openbsd.org:/cvs get -rOPENBSD_6_0 -P ports

La première fois, c'est long. Pas d'inquiétudes donc, préparez un petit café pendant ce temps. Si vous aviez déjà les sources, il suffit alors de lancer :

# cd /usr/src
# cvs -q up -rOPENBSD_6_0 -Pd
# cd /usr/ports
# cvs -q up -rOPENBSD_6_0 -Pd

Vous serez peut-être intéressés par les changements effectués dans les sources depuis la dernière fois. Vous pouvez lancer cette commande :

cvs log -rOPENBSD_6_0:

Ou alors, qui donne un résultat moins long :

cvs diff -u -rOPENBSD_6_0

Ensuite, les commandes suivantes permettront de compiler le noyau :

# cd /usr/src/sys/arch/$(uname -m)/conf
# config GENERIC
# cd /usr/src/sys/arch/$(uname -m)/compile/GENERIC
# make clean && make
# make install

Si vous disposez d'un processeur multi-coeurs, vous remplacerez `GENERIC` par `GENERIC.MP. Laissez `GENERIC` en cas de doute.

Vous voudrez peut-être prendre un autre café selon la puissance de votre machine.

Il faut maintenant redémarrer sur le nouveau noyau (commande reboot) avant de passer à la suite, où l'on met à jour les fichiers du système après un petit nettoyage.

# rm -rf /usr/obj/*
# cd /usr/src
# make obj
# cd /usr/src/etc && env DESTDIR=/ make distrib-dirs
# cd /usr/src
# make build

Voilà, rien de plus qu'une série de petites commandes.

Cette opération peut paraître pour certains relativement lourde. Heureusement, il existe le service M:Tier, qui permet de vérifier les éventuelles mises à jour disponibles et de les installer tout simplement. Si ça vous intéresse, lisez la suite.

6.2.2. Mise à jour automatique avec openup

M:tier met à disposition un script qui automatise et facilite la mise à jour du système OpenBSD. Pour l'utiliser :

Vraiment, c'est extrêmement simple, non?

En somme, ça tient en une ligne :

# ftp -o- https://stable.mtier.org/openup | sh

6.3. Être averti des mises à jour

Pour savoir si des mises à jour doivent être appliquées, vous pouvez recevoir un mail de la part de l'équipe OpenBSD.

Inscrivez-vous à cette liste de diffusion en envoyant un mail à majordomo@OpenBSD.org. Vous écrirez à l'intérieur :

subscribe announce

Puis envoyez un second message avec :

subscribe security-announce

La page des errata contient la liste des patches de sécurités : https://www.openbsd.org/errata60.html.

6.4. Changer de version

Lorsqu'une nouvelle version majeure d'OpenBSD est disponible, la procédure de mise à jour est toujours détaillée sur le site officiel. Vous pouvez si vous voulez consulter les notes de version lors du passage de la 5.9 à la 6.0 à la page ci-dessous :

https://www.openbsd.org/faq/upgrade60.html

7. Les bases de données

Une base de données permet à une application de retrouver rapidement des informations reliées entre elles.

Par exemple, si on prend le cas d'un blog, alors les commentaires peuvent être stockés dans une base de données. Chaque commentaire est écrit pour un certain article, par un visiteur donné, à une date précise. Le commentaire comme l'article ont un lien bien précis. L'utilisateur peut avoir donné son adresse e-mail pour être averti de nouveaux messages...

Vous l'aurez compris, toutes ces données s'entrecroisent, et il est plus efficace d'utiliser une base de données pour les retrouver rapidement.

Cependant, ce n'est pas forcément obligatoire. Surtout sur un serveur auto-hébergé, où vous n'aurez sans doute pas des milliers d'utilisateurs.

Comprenez donc bien que si vous pouvez choisir des applications qui n'ont pas besoin de base de données, c'est un avantage pour vous car c'est un élément en moins à administrer et sécuriser. Eh oui, car une base de données peut elle aussi subir des attaques.

Une alternative est d'utiliser dans ce cas SQLite, puisque ce moteur de base de données ne nécessite pas d'administration particulière, c'est l'application qui se chargera de tout. Tous les avantages d'une base de données avec ceux des fichiers simples en somme.

7.1. SQlite

SQlite est un moteur de base de données tout simplement génial.

Vous n'avez rien de particulier à faire pour l'administrer, c'est l'application qui en a besoin qui se chargera de créer la base. En plus, c'est très facile à sauvegarder puisqu'il s'agit dans ce cas d'un simple fichier. Enfin, ce moteur sait se montrer léger et fonctionne bien même sur du matériel peu puissant.

Alors certains diront que ce n'est pas le moteur le plus performant. C'est vrai. Il reste plus efficace que pas de base de données du tout. À moins d'avoir des milliers de visiteurs sur votre site, vous ne verrez pas la différence avec un autre moteur de base de données. N'hésitez pas, il y a plus d'avantages que d'inconvénients à utiliser SQLite en auto-hébergement.

Pour l'installer, c'est tout bête : pkg_add sqlite. Notez que sqlite3 est normalement présente par défaut dans la version 6.0. Ça ne sera pas forcément le cas ensuite.

7.2. MariaDB (MySQL)

MySQL est un autre moteur de base de données, sans doute le plus répandu. Puisqu'Oracle possède désormais MySQL et en distribue une version propriétaire, un fork a été créé qui s'appelle MariaDB. Ce dernier est entièrement libre et est empaqueté pour OpenBSD.

Veillez à vous renseigner sur la sécurisation de ce service pour compléter les informations suivantes.

Vous voudrez certainement utiliser MariaDB avec PHP. Installez dans ce cas le paquet php-mysqli-7.0.* et activez l'extension mysqli comme indiqué dans la partie sur PHP.

Afin d'installer MariaDB, il faut lancer les commandes suivantes :

# pkg_add mariadb-server
# /usr/local/bin/mysql_install_db

La deuxième commande prépare la base de données par défaut et les fichiers dont mariaDB aura besoin.

On ajoute ensuite les lignes suivantes au fichier /etc/login.conf afin de laisser l'utilisateur _mysqld travailler :

  mysqld:\
                :openfiles-cur=1024:\
                :openfiles-max=2048:\
                :tc=daemon:

On peut maintenant lancer la commande suivante pour prendre les changements en compte :

# [ -f /etc/login.conf.db ] && cap_mkdb /etc/login.conf

On démarre mysql :

# rcctl enable mysqld
# rcctl start mysqld

Très importante, la commande suivante permet de sécuriser un minimum l'installation de mysql :

# /usr/local/bin/mysql_secure_installation

Donner un mot de passe fort pour l'utilisateur root, et suivez les recommandations. Cela ressemblera à ça :

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

You already have a root password set, so you can safely answer 'n'.

Change the root password? [Y/n] n
 ... skipping.

By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
ERROR 1008 (HY000) at line 1: Can't drop database 'test'; database doesn't exist
 ... Failed!  Not critical, keep moving...
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

MariaDB devra être accessible par le serveur web. Ce dernier étant dans un chroot, on lance la commande suivante qui nous permet de reproduire la structure de la racine tout en attribuant les droits nécessaires pour l'utilisateur _mysql :

# install -d -m 0711 -o _mysql -g _mysql /var/www/var/run/mysql

Il faut en plus mettre ces lignes dans le fichier /etc/my.cnf, afin de modifier les chemins pour le serveur http :

[client]
    socket = /var/www/var/run/mysql/mysql.sock

[mysqld]
    socket = /var/www/var/run/mysql/mysql.sock

Enfin, on relance mysql :

# rcctl restart mysqld

À partir de ce moment, vous pouvez créer et utiliser des bases de données avec MariaDB.

7.2.1. Créer une base de données

À titre d'exemple, on va créer une nouvelle base de données pour wordpress. Adaptez-le à votre cas.

Entrez la commande mysql -u root -p afin "d'entrer" dans MariaDB (MySQL). Les commandes à exécuter sont indiquées ci-dessous avec la réponse attendue :

# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.0.23-MariaDB-log openBSD port: mariadb-server-10.0.23p0v1

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE wordpress_base;
Query OK, 1 row affected (0.01 sec)

MariaDB [(none)]> CREATE USER 'wp'@'localhost' IDENTIFIED BY 'motdepasse';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON wordpress_base.* TO 'wp'@'localhost';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> exit
Bye

Et voilà, vous pouvez utiliser cette base dans votre application.

Quelques explications tout de même :

7.3. PostgreSQL

PostgreSQL est un autre moteur de base de données, entièrement libre.

Pour l'installer, il faut le paquet postgresql-server.

Afin de l'utiliser avec PHP, installez php-pgsql-7.0.*. Veillez à bien lire le contenu du fichier

/usr/local/share/doc/pkg-readmes/postgresql*

Ensuite, créez une base par défaut :

# su - _postgresql
$ mkdir /var/postgresql/data
$ initdb -D /var/postgresql/data -U postgres -E UTF8 -A md5 -W
$ exit

Des options supplémentaires seront à adapter à votre cas dans le fichier :

/var/postgresql/data/postgresql.conf

Par exemple, pour que le serveur http qui est enfermé dans un chroot puisse accéder à la base :

unix_socket_directories = '/var/www/run' # comma-separated list of directories

Démarrez le serveur postgresql avec :

# rcctl enable postgresql
# rcctl start postgresql

Pour se connecter à postgresql, on utilise la commande :

# su postgres -c psql

Voici quelques commandes permettant de gérer PostgreSQL.

8. Courrier électronique

Cette partie explique l'installation d'un serveur de courriel à la maison. Aucune base de données ne sera utilisée, puisque cela ne représente aucun intérêt en auto-hébergement.

La mise en place d'un serveur mail est souvent considérée comme délicate. On va donc détailler l'installation pas à pas suivant des étapes simples :

Nous verrons en passant comment ajouter de nouveaux comptes mail sur votre serveur, et comment configurer votre client de messagerie pour l'utiliser.

8.1. Configuration auprès du registrar pour les mails

Chez votre registre, ajoutez deux nouveaux champs :

Si vous disposez d'une IPv6, la configuration est identique, il suffit seulement d'enregistrer un champ AAAA à la place du champ A.

Vérifiez auprès de votre registre qu'un "reverse DNS" est bien configuré pour votre adresse IP.

Ça sera tout pour cette partie.

8.2. Création des certificats

Ces certificats permettront de chiffrer la communication entre votre serveur et le logiciel qui récupère vos mails. Il saura ainsi qu'il est bien en train de parler à votre serveur et pas à un autre, et la communication ne pourra pas être interceptée.

Nous avons ces deux commandes à lancer :

# openssl genrsa -out /etc/ssl/private/mail.votreserveur.net.key 4096
# openssl req -new -x509 -key /etc/ssl/private/mail.votreserveur.net.key \
    -out /etc/ssl/certs/mail.votreserveur.net.crt -days 730

On modifie les permissions sur ces deux fichiers par sécurité :

# chmod 640 /etc/ssl/private/mail.votreserveur.net.key
# chmod 640 /etc/ssl/certs/mail.votreserveur.net.crt

Et voilà!

8.3. Configuration d'Opensmtpd

Opensmtpd est le serveur mail par défaut sur OpenBSD. Il est déjà installé, reste à le configurer.

Cependant, avant toutes choses, ouvrez et redirigez les ports suivants : 25 (smtp), 587 (submission) et 993 (imaps).

Pour configurer opensmtpd, on édite /etc/mail/smtpd.conf pour y mettre par exemple :

table aliases file:/etc/mail/aliases

pki votreserveur.net key "/etc/ssl/private/mail.votreserveur.net.key"
pki votreserveur.net certificate "/etc/ssl/certs/mail.votreserveur.net.crt"

# Deliver
listen on lo0
listen on re0 port smtp hostname votreserveur.net tls pki votreserveur.net
listen on re0 port submission hostname votreserveur.net tls-require pki votreserveur.net auth

accept from local for local  alias <aliases> deliver to maildir "~/Maildir"
accept from any for domain "votreserveur.net" deliver to maildir "~/Maildir"

# Relay
accept from local for any relay 

Vous n'avez quasiment rien à modifier dans ce fichier, mis à part votreserveur.net à remplacer par votre nom de domaine.

STOOOP! On veut des détails!

Regardons les lignes de ce fichier les unes après les autres. Vous avez certainement déjà remarqué que la syntaxe ressemble beaucoup à celle du parefeu.

Les lignes suivantes servent à l'envoi du courrier :

Les lignes suivantes concernent la réception du courrier :

Et enfin on envoie le courrier destiné aux autres serveurs :

Nous passons maintenant à une étape simple mais importante afin que les mails soient correctement émis. Il faut indiquer dans le fichier /etc/myname votre nom de domaine :

votredomaine.net

Nous pouvons maintenant activer et relancer le serveur smtpd :

# rcctl enable smtpd
# rcctl restart smtpd

Voilà pour opensmtpd.

Je vous invite à faire en sorte que les messages du système que l'utilisateur root reçoit soient transférés à un compte utilisateur simple pour lequel vous récupérerez les messages. S'il s'agit par exemple de toto, nous allons ajouter dans le fichier /etc/mail/aliases :

root:		toto

Ainsi, lorsque toto consultera son courrier, il pourra lire les informations du système (alertes de sécurité...).

8.4. Dovecot pour l'imap

Dovecot va être utilisé comme serveur imap, afin de pouvoir récupérer son courrier à partir d'un client comme Thunderbird.

On installe dovecot :

# pkg_add dovecot

On édite maintenant le fichier /etc/dovecot/local.conf pour y mettre le contenu suivant :

# listen both ipv4 and ipv6
listen = *, [::]

# we use maildir
mail_location = maildir:~/Maildir

# imap > pop
protocols = imap

# no plaintext, let's keep it secure with ssl
ssl = yes
ssl_cert = </etc/ssl/certs/mail.votreserveur.net.crt
ssl_key = </etc/ssl/private/mail.votreserveur.net.key
disable_plaintext_auth = yes

passdb {
        driver = bsdauth
}

userdb {
        driver = passwd
}

Afin que dovecot fonctionne correctement, il faut maintenant éditer le fichier /etc/login.conf pour ajouter quelques lignes : (voir le fichier /usr/local/share/doc/pkg-readmes/dovecot*)

dovecot:\
                :openfiles-cur=512:\
                :openfiles-max=2048:\
                :tc=daemon:

On prend en compte les changements récents avec la commande suivante :

# [ -f /etc/login.conf.db ] && cap_mkdb /etc/login.conf

Pour terminer cette partie, on active dovecot et on relance les différents éléments constituant le serveur mail.

# rcctl enable dovecot
# rcctl start dovecot
# rcctl restart smtpd

Il vous est désormais possible d'utiliser votre serveur pour recevoir et envoyer du courrier.

8.5. Configurer son client de messagerie

Pour consulter vos mails sur le serveur, vous pouvez utiliser un client de messagerie comme l'excellent Thunderbird, logiciel-libre respectueux de votre vie privée.

Voici les paramètres qu'il faudra indiquer au logiciel pour envoyer et recevoir des courriels. Notez que tous ne vous seront peut-être pas demandés :

Vous souhaiterez peut-être plutôt utiliser un webmail, afin d'accéder à votre messagerie à partir d'un navigateur web.

8.6. Ne pas être mis dans les spams

En l'état, vous pouvez recevoir et envoyer des messages. Cependant, il se peut que certains serveurs de messagerie considèrent vos mails comme des spams. Heureusement, il existe quelques petites manipulations pour rendre vos messages légitimes. Nous allons les détailler dans les paragraphes suivants. Gardez à l'esprit qu'elles se complètent.

8.6.1. Reverse DNS

Chez votre registrar, ajoutez à l'IP de votre serveur un reverse DNS ou en français DNS inverse.

Alors que votre nom de domaine est relié à l'IP du serveur, il faut aussi configurer la réciproque, c'est-à-dire relier à votre IP le nom de domaine.

8.6.2. SPF

Ajoutez un champ DNS de type SPF auprès de votre registrar tel que celui-ci :

votredomaine.net.   SPF ``v=spf1 a mx ~all''

ou bien sous forme de champ TXT si le SPF n'est pas disponible :

votredomaine.net. TXT ``v=spf1 a mx ~all''

8.6.3. Signature DKIM

Cette technique consiste à signer les messages émis par le serveur à l'aide d'une clé privée. On ajoute ensuite dans un champ DNS la clé publique qui permettra au destinataire de vérifier que le mail reçu provient bien de votre serveur avec la signature.

Je n'ai rien compris!

Je reprends. Nous allons créer une clé privée et une clé publique.

La clé privée servira à signer les messages. On l'appelle "privée" car vous devez être la seule personne capable de signer (comme pour vos chèques ou vos impôts). La clé publique est là pour vérifier que la signature est bien authentique. On peut voir ça comme une pièce de puzzle unique, qui est la seule à pouvoir entrer dans l'empreinte créée par la signature.

Les commandes suivantes permettent de fabriquer la paire de clés qui servira à signer les mails émis :

### Dossier pour les clef
# mkdir -p /etc/dkimproxy/private                    
### On protege le dossier
# chown _dkimproxy:wheel /etc/dkimproxy/private 
### en modifiant les permissions
# chmod 700 /etc/dkimproxy/private                   
### On va dans le dossier
# cd /etc/dkimproxy/private                          
### On genere les clef
# openssl genrsa -out private.key 1024               
# openssl rsa -in private.key -pubout -out public.key
### On protege les clef
# chown _dkimproxy:wheel private.key public.key      
# chmod 600 private.key

On peut maintenant installer dkimproxy comme d'habitude :

# pkg_add dkimproxy

Afin de configurer la signature des messages envoyés, il faut éditer le ficher /etc/dkimproxy_out.conf ainsi :

listen    127.0.0.1:10027
relay     127.0.0.1:10028
domain    votredomaine.net
signature dkim(c=relaxed)
signature domainkeys(c=nofws)
keyfile   /etc/dkimproxy/private/private.key
selector  pubkey
Euh, c'est quoi tout ça?

Quelques menues explications :

Bien, reste à indiquer à opensmtpd de signer les mails. On va donc ajouter dans le fichier /etc/mail/smtpd.conf une ligne pour écouter sur le port 10028 en local, afin d'envoyer les mails que dkimproxy aura signé. On leur donne l'étiquette "DKIM" pour les repérer ensuite.

listen on lo0 port 10028 tag DKIM

Les messages qui auront l'étiquette "DKIM" peuvent être envoyés. On n'envoie plus les mails s'ils ne sont pas passés par dkimproxy.

accept tagged DKIM for any relay

Enfin, les messages pas encore signés sont envoyés à dkimproxy :

accept from local for any relay via smtp://127.0.0.1:10027

Le fichier /etc/mail/smtpd.conf ressemble désormais à ça :

table aliases file:/etc/mail/aliases

pki mail.votreserveur.net key "/etc/ssl/private/mail.votreserveur.net.key"
pki mail.votreserveur.net certificate "/etc/ssl/certs/mail.votreserveur.net.crt"

# Deliver
listen on lo0
listen on lo0 port 10028 tag DKIM
listen on re0 port 25 hostname mail.votreserveur.net tls pki mail.votreserveur.net
listen on re0 port 587 hostname mail.votreserveur.net tls-require pki mail.votreserveur.net auth

accept from local for local  alias <aliases> deliver to maildir "~/Maildir"
accept from any for domain "votreserveur.net" deliver to maildir "~/Maildir"

# Relay
# dkim tagged can be sent
accept tagged DKIM for any relay
# if not dkim tagged, send it to dkimproxy
accept from local for any relay via smtp://127.0.0.1:10027

Ça va? Vous suivez toujours? Je vois à votre regard pétillant que vous attendez la fin avec impatience!

Pour terminer, nous allons ajouter un nouveau champ dans vos DNS auprès de votre registrar. Eh oui, encore! On va en réalité indiquer le nécessaire pour pouvoir vérifier la signature des messages qui auront un drapeau "pubkey".

Il s'agira d'un champ DKIM ou TXT selon ce qui est disponible. Remplissez-le ainsi :

Finalement, activez dkimproxy puis rechargez opensmtpd avant de tester si vous avez réussi à configurer correctement l'envoi de vos mails.

# rcctl enable dkimproxy_out
# rcctl start dkimproxy_out
# rcctl restart smtpd

Pour vérifier que vous n'êtes pas en spam, suivez les indications du site mail-tester. Vous allez envoyer un message à l'adresse donnée, et normalement, vous devriez obtenir au moins une note de 9/10 :

Il se peut qu'on vous parle d'un enregistrement dmarc. Libre à vous de l'ajouter à vos DNS, mais ce n'est pas obligatoire. À vrai dire, le score obtenu est déjà meilleur qu'avec nombre de "grands" services de messagerie.

8.7. Installer un antispam

Votre serveur n'est actuellement pas à l'abri des spams. Nous allons donc voir une méthode simple avec spamassassin pour s'en protéger. Notez qu'il existe des techniques plus efficaces mais nettement plus difficiles à mettre en place puisque les gros fournisseurs de messagerie disposent de nombreuses adresses IP. Pour ceux que le sujet intéresse, vous pouvez consulter la documentation de spamd et de bgpd. Nous en parlerons rapidement dans un second temps.

8.7.1. Spamassassin

Nous allons faire simple et nous appuyer sur l'excellent spamassassin. Notez qu'avec ce dernier, j'ai dû recevoir une dizaine de spams au début le temps qu'il s'entraîne. Il a très vite appris et ces gêneurs arrivent désormais en quantité homéopathique.

C'est parti, on commence par installer les paquets utiles :

# pkg_add p5-Mail-Spamassassin spampd

Pour que spampd puisse faire le lien entre le serveur smtp et spamassassin qui vérifie les messages, il doit tourner en arrière-plan. On active donc ce service

# rcctl enable spampd
# rcctl start spampd

On s'assure que spampd va bien étiqueter chaque message :

rcctl set spampd flags "--tagall"

Il en va de même pour spamassassin qui doit être actif :

# rcctl enable spamassassin
# rcctl start spamassassin

Nous allons maintenant faire passer tous les messages entrants par spamassassin qui va les vérifier. Pour cela, il faut les envoyer sur le port 10025. S'il ne s'agit pas de spam, alors spampd se charge de les renvoyer sur le port 10026. Tous les messages arrivant ainsi recevront l'étiquette "NOSPAM", pour que l'on sache qu'il faut les distribuer.

Voici donc les lignes à ajouter au fichier /etc/mail/smtpd.conf :


# Messages verifies par spamassassin
listen on lo0 port 10026 tag NOSPAM

# Message venant du système
accept from local for local alias <aliases> deliver to maildir "~/Maildir"
# Message NOSPAM
accept tagged NOSPAM for domain "votreserveur.net" deliver to maildir "~/Maildir"
# Message venant d'ailleurs, on scanne avec spamassassin
accept from any for domain "votreserveur.net" relay via smtp://127.0.0.1:10025

Référez-vous à l'exemple plus complet à la fin du document si vous le souhaitez pour bien comprendre comment les choses fonctionnent.

À ce point du document, le serveur smtp fonctionne ainsi :

                +---------------+
Ce n'est pas un |               | C'est    +--------+
spam       <----+ spamassassin  +-un------>|POUBELLE|
           |    |               | spam     +--------+
           |    +-----------^---+
           |                |                 
           |                |             +---------------+
           |      +---------^--------+    |   Boîte mail  |
           |      | Le message n'a   |    +---------------+
Réception  |      | pas encore été   |            ^         
d'un       |      | vérifié ^        |            |
message    v      |         |        Mail vérifié |
    +--------->-------->----+----->--+------------+
                  |                  |
                  |       SMTPD      |
                  |                  |
    +-------+->------->------+---->--+--------->----+
Envoi       ^     |         |  Le message a une     |
d'un        |     |         |  étiquette DKIM,      |
message     |     |         v  il peut être envoyé  | 
            |     |         |        |              |
            |     +------------------+              |
            |                |Pas d'étiquette       |
            |                |DKIM, on envoie le    |
            |                |message à dkimproxy   |
            ^                |                      |
            |          +-----v-----+                |
            |          |           |                |
            +<---------+ dkimproxy |                v
                       |           |           +----+-------+
                       +-----------+           |Destinataire|
                                               +------------+


8.8. Antispam avec spamd (difficile)

Spamd fait semblant d'être un serveur mail afin de rejeter les spams. Il a été écrit dans l'optique d'être très efficace et ne pas ralentir la machine. Bien sûr, il transmet les mails légitimes au serveur smtp ensuite.

Ce qui est rigolo, c'est qu'il va faire en sorte de ralentir les spammeurs en communiquant tout doucement avec eux et leur faire consommer inutilement leur ressources ☺ .

Enfin, avantage non négligeable, il est présent par défaut dans OpenBSD.

8.8.1. Comment ça marche?

Afin de reconnaître les pourriels, spamd va mettre en attente ceux qui contactent le serveur. Ils sont mis sur liste grise.

Normalement, un serveur expéditeur légitime réessaie automatiquement de délivrer le message après un certain temps. Lors du 2e essai, ce serveur est mis sur liste blanche.

Les spammeurs ne vont pas réessayer de délivrer le message. Dans ce cas, ils sont mis après un délai assez long sur liste noire. Par la suite, votre serveur n'écoutera même plus les requêtes provenant de ces spammeurs.

Attention : Cette méthode, bien que très efficace, suppose que l'expéditeur fait les choses comme il faut. Ce n'est malheureusement pas toujours le cas, notamment pour certains sites marchands. Pensez-y. Vous devriez de toute manière utiliser une adresse poubelle comme guerrilamail par exemple dans ces cas de figure.

Afin d'enregistrer les vilains expéditeurs, il faudra exécuter la commande spamdb régulièrement.

8.8.2. Mise en place

On commence par activer spamd au démarrage, en indiquant les options dont il aura besoin, puis on le lance :

rcctl enable spamd
rcctl set spamd flags "-v -G 25:4:4242"
rcctl start spamd

Le premier chiffre correspond au nombre de minutes qu'un expéditeur doit attendre avant de réessayer de nous renvoyer son mail (puisque les spammeurs envoie des salves de mails très rapidement). Le second correspond au temps qu'une entrée reste dans la liste grise, et le dernier le temps pendant lequel une entrée restera sur la liste blanche (en heures).

On va maintenant éditer la configuration du parefeu et filtre de paquets (packet filter). Il va envoyer à spamd tous le flux destiné au serveur smtp, qui relaiera ensuite le mail normalement s'il est légitime.

Voici ce qu'il faut donc ajouter dans /etc/pf.conf :

table <nospamd> persist file "/etc/mail/nospamd"
pass in on egress proto tcp from any to any port smtp divert-to 127.0.0.1 port spamd
pass in on egress proto tcp from <nospamd> to any port smtp
pass in log on egress proto tcp from <spamd-white> to any port smtp

Dans l'ordre des lignes :

Voilà pour le parefeu. N'oubliez pas de le recharger :

# pfctl -d && pfctl -ef /etc/pf.conf

Il est nécessaire de régulièrement charger la liste noire des spammeurs dans pf afin que spamd fonctionne bien. Nous allons nous servir d'une tâche cron pour ça. Saisissez # crontab -e, puis ajoutez la ligne suivante :

*/10  *  *  *  *  /usr/libexec/spamd-setup

Pour l'édition, référez-vous aux rappels sur l'utilisation de vi.

Nous lançons ici spamd-setup toutes les 10 minutes. Ce temps doit être inférieur au temps que doit attendre un expéditeur pour tenter de renvoyer son message définit dans l'appel de spamd. Nous avions mis 25 minutes.

8.8.3. Piéger les spammeurs

Vous pouvez piéger les spammeurs en laissant traîner sur le web une fausse adresse mail. Si spamd voit un message arriver pour cette adresse, alors il sait déjà que c'est un spam : il peut donc le mettre sur liste noire. Vous voilà protégés pour l'avenir.

Afin de glisser cette "adresse-piège" sur le web sans que ça soit visible par les humains, vous pouvez l'insérer ainsi dans le code html de votre site :

<a href="mailto:blackhole@yeuxdelibad.net"></a>

Pour indiquer à spamdb cette adresse piège, il faut ajouter les options suivantes à spamdb (attention au "b" final, ce n'est pas spamd). :

# spamdb -T -a 'blackhole@yeuxdelibad.net'

Bien entendu, cette adresse piège ne doit pas être créée et ne risque pas de servir à quiconque.

8.8.4. Voir l'activité de spamd

Pour voir l'activité de spamd, lancez la commande spamdb pour voir apparaître des choses comme ça :

WHITE|62.4.1.33|||1462699174|1462699174|1465809574|1|0
GREY|182.70.43.24|abts-mum-dynamic-024.43.70.182.airtelbroadband.in|<Estella32@thunderguy.co.uk>|<thuban@yeuxdelibad.net>|1473409924|1473424324|1473424324|1|0
GREY|14.183.132.63|static.vnpt.vn|<Abby5@toddelliott.com>|<thuban@yeuxdelibad.net>|1473410586|1473424986|1473424986|1|0

On peut lire dans l'ordre :

Il n'y a pas à dire, les "temps" sont illisibles pour les humains. Utiliser la commande date pour avoir un format lisible :

$ date -r 1462699174
    Sun May  8 11:19:34 CEST 2016

Pour manuellement mettre sur liste blanche une IP que vous savez valide, utilisez :

# spamdb -a "62.4.1.37"

8.8.5. Problèmes avec le greylisting

Trop de personnes utilisent encore un fournisseur de mail, comme par exemple Gmail. Ces derniers disposent de plusieurs serveurs et donc de plusieurs adresses IP. Malheureusement, le temps que l'adresse IP du premier serveur à tenter l'envoi d'un message soit mise sur liste blanche, c'est un autre de leurs serveurs avec une IP différente qui prend le relais. Au final, ils ne sont jamais mis sur liste blanche.

Vous pouvez déjà commencer par enregistrer une liste pré-remplie d'IP connues comme légitimes, située à l'adresse suivante (merci à Peter N.M. Hansteen) : http://www.bsdly.net/~peter/nospamd .

# ftp -o /etc/mail/nospamd http://www.bsdly.net/~peter/nospamd

Cependant, cette précaution peut ne pas toujours suffire. Je vous propose alors de profiter de bgp-spamd : http://bgp-spamd.net. Ce service communautaire propose de récupérer des listes de spammeurs et d'expéditeurs légitimes. Pour l'instant, seuls des serveurs vérifiés et de confiance participent à ce service, mais chacun peut en profiter. Vous serez alors tranquilles pour la plupart des cas.

Il repose sur le service bgpd, que l'on va configurer ainsi dans le fichier /etc/bgpd.conf:

spamdAS="65066"

AS 65001
fib-update no    # Mandatory, to not update the 
                 # local routing table

group "spamd-bgp" {
	remote-as $spamdAS
	multihop 64
	announce none	# Do not send Route Server any information

	# us.bgp-spamd.net
	neighbor 64.142.121.62

	# eu.bgp-spamd.net
	neighbor 217.31.80.170

	# IPv6 eu.bgp-spamd.net
	neighbor 2a00:15a8:0:100:0:d91f:50aa:1
}

# 'match' is required, to remove entries when routes are withdrawn
match from group spamd-bgp community $spamdAS:42  set pftable "bgp-spamd-bypass"

Il y aura donc dans le groupe spamd-bgp toutes les IP connues des spammeurs. Sera créée aussi une table pour pf nommée bgp-spamd-bypass qui contient la liste des expéditeurs légitimes connus.

Il faut donc ajouter ces quelques lignes dans le fichier /etc/pf.conf :

set limit table-entries 400000    # Full list is 200k entries as of March 1
table <bgp-spamd-bypass> persist

#[...]

# Sous la section concernant spamd
pass in log quick on egress proto tcp from <bgp-spamd-bypass> to any port smtp

Référez-vous à l'exemple de pf.conf à la fin du document en cas de doute.

Relancez le parefeu :

# pctfl -d && pfctl -ef /etc/pf.conf

Activez et démarrez maintenant bgpd :

rcctl enable bgpd
rcctl start bgpd

Il ne reste plus qu'à faire prendre en compte ces listes par spamd. Nous allons utiliser la même technique qu'auparavant, à savoir une tâche cron. Tapez # crontab -e puis remplacez la ligne qui appelait spamd-setup par :

*/10  *  *  *  *  /usr/local/sbin/bgp-spamd.black.sh 

Créez maintenant le script /usr/local/sbin/bgp-spamd.black.sh pour y mettre

#!/bin/sh
AS=65066

bgpctl show rib community ${AS}:666 | 
	sed -e '1,4d' -e 's/\/.*$//' -e 's/[ \*\>]*//' > /var/mail/spamd.black

/usr/libexec/spamd-setup

/usr/bin/logger -p mail.info -t spamd-update "spamd black list updated; bgp-spamd-bypass: $(/sbin/pfctl -t bgp-spamd-bypass -T show | /usr/bin/wc -l)"

N'oubliez pas de le rendre exécutable avec

# chmod +x /usr/local/sbin/bgp-spamd.black.sh

Vous noterez que ce script appelle bien spamd-setup.

Nous avons presque terminé, il faut maintenant modifier le fichier de configuration de spamd situé à l'emplacement /etc/mail/spamd.conf :

# Configuration file for spamd.conf

all:\
	:nixspam:bgp-spamd:

# Nixspam recent sources list.
# Mirrored from http://www.heise.de/ix/nixspam
nixspam:\
	:black:\
	:msg="Your address %A is in the nixspam list\n\
	See http://www.heise.de/ix/nixspam/dnsbl_en/ for details":\
	:method=http:\
	:file=www.openbsd.org/spamd/nixspam.gz

bgp-spamd:\
	:black:\
	:msg="Your address %A has sent mail to a spamtrap\n\
	within the last 24 hours":\
	:method=file:\
	:file=/var/mail/spamd.black:

8.9. Ajouter un nouveau compte mail

Un compte mail est en fait un simple compte d'utilisateur. Vous pouvez donc en créer un nouveau avec la commande adduser. Il faudra juste veiller à donner à l'utlisateur le shell nologin par mesure de sécurité. Ainsi, il ne pourra pas exécuter de commandes sur le serveur.

Voici à quoi ça ressemblera :

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 unbound
[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 l'utilisateur, c'est nettement plus rapide :

# userdel toto
# groupdel toto

Et voilà!

8.9.1. Redirection de mail

Il est simplissime de transférer les mails reçus sur une adresse vers un autre compte de messagerie.

Par exemple, vous disposez d'une adresse bibi@mondomaine.com et souhaitez que tous les messages reçus par bibi soient transférés automatiquement à jean-eudes@openmailbox.org.

Pour ça, il suffit d'éditer le fichier /etc/mail/aliases, puis d'y ajouter une ligne comme celle-ci :

bibi: jean-eudes@openmailbox.org

De façon générale, ça donne :

utilisateur: adresse1.mail.com, adresse2.mail.com

Afin que ce changement soit pris en compte, il reste à lancer les commandes suivantes :

# newaliases
# rcctl restart smtpd

C'est tout! Je vous l'avait dit que c'était simple.

8.9.2. Vérifier que tout fonctionne bien

Vous voudrez peut-être tester votre serveur mail après tous ces efforts. Vous l'avez bien mérité. Vous pouvez bien entendu écrire à des amis, mais cela peut poser des soucis :

Il existe heureusement des robots auxquels ont peut écrire un mail, qui vous répondront très vite en vous donnant de précieuses informations. Nous avons déjà parlé de www.mail-tester.com un peu plus haut. Il existe aussi les adresses suivantes :

Vous en trouverez d'autres sur cette page :

http://www.bortzmeyer.org/repondeurs-courrier-test.html .

9. Sauvegardes

On peut utiliser un serveur à la maison pour sauvegarder ses documents. C'est une précaution qui ne fait jamais de mal.

Il faut penser aussi à sauvegarder le serveur en cas de défaillance du disque dur qui vieillit un peu, d'un orage virulent ou encore d'un dérapage incontrôlé du chat qui joue derrière les meubles...

Pour l'exemple, nous allons réaliser le tout sur un disque dur supplémentaire (disque dur externe) que l'on va préparer afin d'avoir deux partitions :

9.1. Partitionnement du disque dur

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.

On initialise le disque avec fdisk en créant une grande partition:

# fdisk -i sd1

On va diviser cette partition en 2 avec disklabel.

# disklabel -E sd1

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

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

Pas de panique, tout n'est pas important. Commençons pour une fois par les dernières lignes. Chaque partie décrit une caractéristique 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 servira à identifier le disque lorsqu'on voudra le monter.

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

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

9.2. Sauvegarde du serveur

OpenBSD a déjà pensé à tout. En effet, il sauvegardera chaque jour le système si une partition /altroot est présente.

Nous allons donc ajouter la ligne suivante dans le fichier /etc/fstab :

782f1ddb783cdd13.a /altroot ffs xx 0 0

Vous remarquerez qu'on identifie la partition avec <numéro duid du disque>.a.

Afin que chaque nuit, le serveur soit sauvegardé, ajoutez maintenant la ligne suivante dans le fichier /etc/daily.local :

ROOTBACKUP=1

Et c'est tout!

Si un jour le disque du serveur a une défaillance, vous pourrez quand même démarrer le serveur pour le dépanner. Il faudra alors booter sur la partition de sauvegarde. Tout cela se passera au tout début du démarrage de la machine, lorsque vous verrez le prompt boot >. Vous écrirez à ce moment là :

boot > set device hd1a
boot > boot -s

Ou tout en une seule fois :

boot > boot -s hd1a:/bsd

Si le moment venu vous ne savez plus sur quelle partition se trouve votre sauvegarde, tapez ceci :

boot > machine diskinfo

9.3. Sauvegarde de vos données personnelles

Nous allons utiliser la seconde partition du disque externe pour y sauvegarder nos données. Tout d'abord, on crée un point de montage :

# mkdir -p /mnt/sauvegardes

Ensuite, on ajoute une ligne au fichier /etc/fstab pour monter ce disque :

782f1ddb783cdd13.d /mnt/sauvegardes ffs rw,nodev,nosuid,softdep,noatime 1 2

Afin de le monter, tapez mount -a.

Vous pouvez changer les droits en écriture sur ce disque avec chmod ou l'attribuer à un utilisateur.

Pour un exemple d'utilisation, installez rsync sur le serveur et sur un ordinateur qui devra être sauvegardé.

À partir de cet ordinateur, lancez la commande :

$ rsync -e "ssh -p <port ssh>" -avz --progress --delete /dossier/a/sauvegarder \
	toto@votreserveur.net:/mnt/sauvegarde/toto

On utilise une connexion ssh avec le compte toto pour envoyer tout un dossier sur le serveur.

Cette solution peut ne pas convenir, en particulier si vous souhaitez permettre à plusieurs utilisateurs de réaliser des sauvegardes. Préférez dans ce cas la mise en place d'un chroot sftp.

9.4. Un cloud synchronisé avec syncthing

Syncthing permet de sauvegarder ses données et facilement les répartir sur plusieurs appareils. Il dispose de plusieurs clients (logiciels permettant de l'utiliser) pour Windows, Linux et même OpenBSD. Par défaut, tout est chiffré ce qui est tout de même rassurant.

Notez qu'il a été empaqueté pour OpenBSD, on peut donc l'installer en une simple commande :

# pkg_add syncthing

Nous allons le laisser tourner en arrière-plan sur notre serveur afin que vous puissiez à tout moment synchroniser vos documents et les sauvegarder. Pour cela, lancez ces commandes :

# rcctl enable syncthing
# rcctl start syncthing

Par défaut, syncthing va stocker sa configuration et les fichiers synchronisés dans /var/syncthing. Ce dossier contient :

Nous pourrions configurer syncthing en éditant ces fichiers, cependant, l'ajout d'autres appareil avec lesquels se synchroniser va vite devenir insupportable. Heureusement, il existe une interface d'administration pour syncthing. Elle n'est disponible qu'à partir du serveur, ce qui n'est pas pratique pour s'en servir car on a besoin d'un navigateur web pour y accéder. Heureusement, ssh est là.

En effet, nous allons créer un tunnel ssh qui va relier votre ordinateur au serveur. En passant par ce tunnel, nous pourront accéder à l'interface d'administration de syncthing très facilement.

À partir de votre ordinateur, lancez la commande suivante :

ssh -N -L 9999:127.0.0.1:8384 -p 22222 utilisateurssh@votreserver.net

Remplacez 22222 par le port configuré dans la partie dédiée à ssh, tout comme l'utilisateur.

Tant que la session est ouverte, vous pouvez ouvrir un navigateur sur votre ordinateur et aller à l'adresse http://localhost:9999 afin d'administrer syncthing :

Vous pouvez maintenant ajouter des machines avec lesquelles le serveur restera synchronisé, comme si vous étiez sur le serveur.

Afin que tout fonctionne bien, vous devriez ouvrir les ports suivant dans le pare-feu :

10. Serveur de noms

Si vous avez lu la partie concernant les [DNS #dns], vous aurez compris qu'ils sont essentiels pour un humain sur le web. Mais votre serveur lui-même en a besoin.

Si vous envoyez un mail, vous allez écrire une adresse comme "zouzoulepetitours@serveurmail.org". Votre serveur doit savoir comment communiquer avec "serveurmail.org". Pour cela, une résolution DNS est nécessaire pour connaître l'adresse IP correspondant au nom de domaine "serveurmail.org". Actuellement, c'est votre fournisseur d'accès à internet qui vous donne cette information. On dit qu'on "résout un nom de domaine".

Je vous propose dans ce chapitre d'installer tout le nécessaire pour faire la même chose, mais nous-mêmes. Cela présente plusieurs avantages :

10.1. Résolveur avec cache : Unbound

Unbound est présent par défaut dans OpenBSD. Il permet en l'état de résoudre les noms de domaines. Nous allons cependant lui ajouter la possibilité de valider les noms de domaines pour se prémunir contre le "Cache poisoning", qui consiste à la mise en cache d'une fausse IP.

On édite le fichier /var/unbound/etc/unbound.conf pour le remplir ainsi :

server:
	interface: 127.0.0.1
	interface: ::1
	do-ip6: yes
	do-ip4: yes
	do-udp: yes
	do-tcp: yes

	# seul le serveur a le droit 
	# d'utiliser unbound en local
	access-control: 0.0.0.0/0 refuse
	access-control: ::0/0 refuse
	access-control: 127.0.0.0/8 allow
	access-control: ::1 allow

	hide-identity: yes
	hide-version: yes

	auto-trust-anchor-file: "/var/unbound/db/root.key"

	prefetch: yes

Avant de lancer unbound, on va récupérer le fichier permettant de faire la vérification DNSSEC. Puisque ce fichier devra être mis à jour régulièrement, nous allons profiter du fichier /etc/weekly.local qui permettra de lancer la commande de mise à jour toutes les semaines. Éditez ce fichier puis ajoutez-y ceci :

unbound-anchor -a "/var/unbound/db/root.key"

Lancez ce script manuellement pour cette fois avec

# sh /etc/weekly.local

Il nous reste à activer unbound avec les commandes habituelles :

# rcctl enable unbound
# rcctl start unbound

Pour indiquer au serveur de demander la résolution des noms de domaines au résolveur local unbound, on édite le fichier /etc/resolv.conf pour y mettre :

nameserver 127.0.0.1

Dans le cas où votre serveur se connecte via dhcp, ajoutez alors cette ligne à la fin du fichier /etc/dhclient.conf :

prepend domain-name-servers 127.0.0.1;

Et voilà!

Vous pouvez tester l'efficacité d'unbound avec la commande dig :

$ dig 3hg.toile-libre.org
[...]
;; Query time: 61 msec

Il a fallu ici 61 millisecondes pour avoir une réponse. Relancez une deuxième fois cette commande pour voir la différence :

$ dig 3hg.toile-libre.org
[...]
;; Query time: 0 msec

C'est toujours un gain de performance bienvenu!

Pour aller plus loin dans la découverte d'unbound et ses nombreuses possibilités, vous pouvez consulter le wiki d'OBSD4* :

http://obsd4a.net/wiki/doku.php?id=network:config:unbound_dnssec

11. Travaux pratiques

Cette section propose des exemples de services que vous pouvez auto-héberger. Il conviendra de ne pas reproduire bêtement les procédures indiquées, et de vérifier que la démarche est à jour avec la version du service que vous souhaitez installer.

Comme vous le constaterez, la démarche est sensiblement la même pour la plupart des applications :

  1. On crée un dossier pour le nouveau site dans /var/www/htdocs;
  2. On télécharge l'application, souvent sous forme d'archive que l'on décompresse ;
  3. On déplace les fichiers de l'application dans le dossier prévu à cet effet ;
  4. On change les propriétaires des fichiers avec
    chown -R www:daemon /var/www/htdocs/lesite
    
  5. On ajoute une sections dans /etc/httpd.conf ;
  6. On recharge httpd ave rcctl reload httpd ;
  7. On termine l'installation en allant sur le nouveau site.

Je suppose ici que vous avez déjà procédé à l'installation de httpd et de PHP.

11.1. Un cloud avec NextCloud

NextCloud est un service qui vous permet de synchroniser vos documents, contacts, rendez-vous sur n'importe quelle machine grâce à ses multiples clients.

On va commencer par créer un dossier pour nextcloud :

# mkdir /var/www/htdocs/nextcloud

Ensuite, sans surprise, on le télécharge.

# cd /var/www/htdocs/nextcloud
# ftp "https://download.nextcloud.com/server/releases/nextcloud-10.0.0.tar.bz2"

Il faut maintenant vérifier l'intégrité de l'archive. Pour cela, on va télécharger la somme sha256 :

# ftp https://download.nextcloud.com/server/releases/nextcloud-10.0.0.tar.bz2.sha256

Et on vérifie l'archive :

# sha256 -C nextcloud-10*.sha256 nextcloud*.tar.bz2
(SHA256) nextcloud-10.0.0.tar.bz2: OK

On décompresse cette archive puis on modifie les droits pour que ces nouveaux fichiers appartiennent au serveur web :

# tar xvjf nextcloud-10*.tar.bz2
# chown -R www:daemon nextcloud

On peut désormais éditer le fichier /etc/httpd.conf afin d'ajouter une section pour nextcloud :

server "cloud.exemple.net" {
        listen on * port 80
        block return 301 "https://$SERVER_NAME$REQUEST_URI"
}

server "cloud.exemple.net" {
        listen on * tls port 443
        root "/htdocs/nextcloud/nextcloud" 
        directory index index.php
        hsts
        tls {
            certificate "/etc/letsencrypt/live/exemple.net/fullchain.pem"
            key         "/etc/letsencrypt/live/exemple.net/privkey.pem"
        }

        # Set max upload size to 513M (in bytes)
        connection max request body 537919488

        # First deny access to the specified files
        location "/db_structure.xml" { block }
        location "/.ht*"             { block }
        location "/README"           { block }
        location "/data*"            { block }
        location "/config*"          { block }

        location "/*.php*" {
                fastcgi socket "/run/php-fpm.sock"
        }

}

Avant de relancer les services, on installe les dépendances PHP dont nextcloud aura besoin :

# pkg_add php-intl php-bz2 pecl-redis icu4c

On active ces extensions :

# cd /etc/php-7.0.sample
# for i in *; do ln -sf ../php-7.0.sample/$i ../php-7.0/; done

Enfin, on recharge httpd et PHP avec :

# rcctl reload httpd
# rcctl restart php70_fpm

Pour terminer l'installation, ouvrez un navigateur à l'adresse de votre cloud https://cloud.exemple.net/ .

Ne reste plus qu'à suivre les étapes (bon, il n'y en a qu'une) :

Si vous avez des erreurs à propos de l'UTF-8 qui apparaissent, lancez les commandes suivantes pour résoudre ce problème dû au chroot :

# mkdir -p /var/www/usr/share/locale/UTF-8/
# cp /usr/share/locale/UTF-8/LC_CTYPE /var/www/usr/share/locale/UTF-8/

Autre remarque, afin d'augmenter la limite en taille des fichiers que vous aurez à envoyer, vous devez modifier le fichier /etc/php-7.0.ini pour changer les valeurs dans les variables suivantes :

post_max_size = 500M
upload_max_filesize = 500M

Ici, nous avons utilisé la base de données SQLite. Rien ne vous empêche d'utiliser MySQL (MariaDB) ou PostgreSQL si vous préférez. Référez-vous dans ce cas à la partie sur les bases de données

11.2. Un espace de stockage avec BoZoN

BoZoN est ce qu'on peut appeler un cloud simplifié. Il vous permettra de stocker vos documents sur votre serveur et de les partager facilement. Il n'a pas besoin de base de données pour fonctionner et remplacera dropbox dans la plupart des cas.

Tout ce dont vous aurez besoin pour bozon, c'est du serveur httpd et de PHP.

On télécharge bozon avec l'archive présente sur github . Avec l'outil ftp, on le fait ainsi :

# ftp -o /tmp/bozon.zip "https://github.com/broncowdd/BoZoN/archive/master.zip"

On décompresse l'archive dans /var/www/htdocs, puis on renomme le dossier créé avant d'en changer les droits pour le serveur http :

# cd /var/www/htdocs
# unzip /tmp/bozon.zip
# mv BoZoN-master bozon
# chown -R www:daemon /var/www/htdocs/bozon

On peut maintenant éditer le fichier /etc/httpd.conf afin d'ajouter une section pour BoZoN :

server "cloud.exemple.net" {
        listen on * port 80
        block return 301 "https://$SERVER_NAME$REQUEST_URI"
}

server "cloud.exemple.net" {
        listen on * tls port 443
    	root "/htdocs/bozon" 
        directory index index.php
        hsts
        tls {
            certificate "/etc/letsencrypt/live/exemple.net/fullchain.pem"
            key         "/etc/letsencrypt/live/exemple.net/privkey.pem"
        }

        # Set max upload size to 513M (in bytes)
        connection max request body 537919488

        location "/*.php*" {
                fastcgi socket "/run/php-fpm.sock"
        }

        # Protect some files
        location "/uploads*"           { block }
        location "/private*"           { block }
        location "/thumbs*"            { block }
        location "/core/"              { block }
        location "/core/*.js"          { pass }
        location "/private/temp/*.zip" { pass }
}

On recharge httpd rcctl reload httpd puis on se dirige à l'adresse https://cloud.exemple.net/ pour finir l'installation.

Vous pouvez alors utiliser BoZon. Cliquez sur "Se connecter" pour créer un compte administrateur.

Pour augmenter la restriction en taille des fichiers que vous aurez à envoyer, vous devez modifier le fichier /etc/php-7.0.ini afin de changer les valeurs dans les variables suivantes :

post_max_size = 500M
upload_max_filesize = 500M

11.3. Un Webmail

Le webmail vous servira à consulter votre messagerie à partir d'un navigateur web. Nous allons ici installer le très connu roundcube.

Installons tout d'abord quelques dépendances :

# pkg_add sqlite
# pkg_add php-pspell-7.0.8p0 php-zip-7.0.8p0 php-mcrypt-7.0.8p0 
# pkg_add php-intl-7.0.8p0 pear

Tout d'abord, on doit modifier la configuration de PHP. On édite le fichier /etc/php-7.0.ini pour y mettre à la fin :

[suhosin]
suhosin.session.encrypt = 0

Une fois cette modification effectuée, relancez PHP :

# rcctl enable php70_fpm
# rcctl restart php70_fpm

On va mettre roundcube dans le dossier /var/www/htdocs/roundcube

# mkdir -p /var/www/htdocs/roundcube

On télécharge l'archive de roundcube qu'on décompresse :

# cd /var/www/htdocs/roundcube
# ftp -o roundcube.tgz
# https://github.com/roundcube/roundcubemail/releases/download/1.2.1/roundcubemail-1.2.1-complete.tar.gz
# tar xvzf roundcube.tgz

Maintenant, on renomme le nouveau dossier roundcubemail* puis on crée les dossiers nécessaires au bon fonctionnement de roundcube :

# mv roundcubemail-* roundcube
# mkdir -p roundcube/temp roundcube/logs

Nous allons créer la base sqlite pour roundcube. On crée un dossier qui contiendra la base de données :

# mkdir /var/www/htdocs/roundcube/roundcube/db

La commande suivante crée la base :

# cd /var/wwW/htdocs/roundcube
# sqlite3 -init roundcube/SQL/sqlite.initial.sql roundcube/db/sqlite.db
-- Loading resources from SQL/sqlite.initial.sql

SQLite version 3.9.2 OpenBSD
Enter ".help" for usage hints.

(Tapez .exit pour quitter sqlite3)

Enfin, on modifie les droits de tous ces nouveaux fichiers :

# cd /var/www/htdocs/roundcube
# chown -R www:daemon roundcube
# chmod 0775 roundcube/db
# chmod 0660 roundcube/db/sqlite.db

On ajoute le nouveau site dans la configuration de httpd. Pour cela, on édite le fichier /etc/httpd.conf et on ajoute quelque chose comme :

server "webmail.votreserveur.net" {
        listen on * port 80
        block return 301 "https://$SERVER_NAME$REQUEST_URI"
        no log
}

server "webmail.votreserveur.net" { 
        listen on * tls port 443 
        root "/roundcubemail" 
        directory index index.php
        no log

        hsts 
        tls {
            certificate "/etc/letsencrypt/live/votreserveur.net/fullchain.pem"
            key         "/etc/letsencrypt/live/votreserveur.net/privkey.pem"
        }

        location "*.php*" {
            fastcgi socket "/run/php-fpm.sock"
        }
        # Deny Protected directories
        location "/config" { block }
        location "/temp" { block }
        location "/logs" { block }
        location "/README" { block }
        location "/INSTALL" { block }
        location "/LICENSE" { block }
        location "/CHANGELOG" { block }
        location "/UPGRADING" { block }
        location "/bin" { block }
        location "/SQL" { block }
        location "/db" { block }
        location "*.md" { block }
        location "\.*" { block }
} 

Rechargez httpd et PHP puis allez à l'adresse de votre nouveau webmail : https://webmail.votreserveur.net/installer.

Suivez les indications données. La plupart des choses n'ont pas besoin d'être modifiées. Vérifiez tout de même que :

Dans le navigateur sera générée la configuration. Enregistrez-la dans le fichier

/var/www/roundcubemail/config/config.inc.php

Vérifiez bien qu'il contient au moins ceci (attention au nombre de /) :

$config['db_dsnw'] = 'sqlite:////htdocs/roundcube/roundcube/db/sqlite.db?mode=0660';
$config['smtp_server'] = 'localhost';

Vous avez une dernière page de test, puis vous pouvez allez à l'URL de votre webmail http://webmail.votreserveur.net pour voir que tout fonctionne.

Bien que tout semble être en état de marche, n'oublions pas la sécurité. Modifiez le fichier config.inc.php pour désactiver l'installateur.

$config['enable_installer'] = false;

Puis supprimez le dossier d'installation totalement :

# rm -r /var/www/htdocs/roundcube/roundcube/installer

Ça y est, votre webmail est prêt!

11.4. Héberger son blog

Blogotext est un moteur de blog léger mais pourtant puissant et esthétique. Il pourra vous permettre en outre d'envoyer et partager des fichiers, faire office d'aggrégateur de flux RSS, marque page de liens, prise de notes...

Pour vous faire une idée, regardez les captures d'écran à cette adresse : http://lehollandaisvolant.net/blogotext/fr/?screenshots.

Son installation est très simple et ne nécessite qu'une dépendance, à savoir le paquet sqlite. Vous y ajouterez php-curl s'il n'est pas déjà installé.

Pour télécharger blogotext, on peut utiliser ftp :

# ftp -o /tmp/blogotext.zip "https://github.com/BoboTiG/blogotext/archive/master.zip"

On décompresse l'archive à partir du dossier /var/www/htdocs :

# cd /var/www/htdocs
# unzip /tmp/blogotext.zip

Un dossier blogotext est créé. Maintenant, on modifie les droits pour que ces nouveaux fichiers appartiennent au serveur web :

# chown -R www:daemon /var/www/htdocs/blogotext

On peut alors éditer le fichier /etc/httpd.conf afin d'ajouter une section pour blogotext :

server "blog.exemple.net" {
        listen on * port 80
        block return 301 "https://$SERVER_NAME$REQUEST_URI"
}

server "blog.exemple.net" {
        listen on * tls port 443
        root "/htdocs/blogotext" 
        directory index index.php

        # taille maximale que l'on peut envoyer en bytes
        connection max request body 1537919488
        hsts
        tls {
            certificate "/etc/letsencrypt/live/exemple.net/fullchain.pem"
            key         "/etc/letsencrypt/live/exemple.net/privkey.pem"
        }

        location "/*.php*" {
                fastcgi socket "/run/php-fpm.sock"
        }
}

On recharge httpd avec

# rcctl reload httpd

puis on se dirige à l'adresse https://blog.exemple.net/ afin de terminer l'installation.

Pour poster de nouveaux articles et administrer votre blog, rendez vous à l'adresse https://blog.exemple.net/admin/auth.php. Notez que par sécurité, vous pouvez renommer le dossier admin sur votre serveur.

11.5. Un CMS avec Wordpress

Wordpress est un moteur très lourd mais qui peut permettre de créer n'importe quel site. Si vous recherchez un CMS plus léger et facile à installer, regardez du côté de PluXML.

En attendant, nous sommes dans la partie "travaux pratiques", alors au boulot !

Quelques dépendances sont à installer, dont la base de données MariaDB :

# pkg_add php-mysqli-7.0.10 mariadb-server
# cd /etc/php-7.0.sample
# for i in *; do ln -sf ../php-7.0.sample/$i ../php-7.0/; done
# rcctl restart php70_fpm

Vous devez maintenant créer une base de données dans MariaDB, le clone libre de MySQL. Référez-vous à la partie dédiée à cette manipulation. Veillez à retenir le nom de la base choisie, l'utilisateur et le mot de passe.

On télécharge ensuite la dernière version de wordpress :

# ftp -o /tmp/wordpress.tar.gz "https://wordpress.org/latest.tar.gz"

On décompresse l'archive dans le dossier /var/www/htdocs

# cd /var/www/htdocs
# tar xvzf /tmp/wordpress.tar.gz

On modifie les droits du nouveau dossier :

# chown -R www:daemon /var/www/htdocs/wordpress

On ajoute maintenant une section dans /etc/httpd.conf

server "blog.votreserveur.net" {
        listen on * tls port 443
        root "/htdocs/wordpress"
        directory index index.php
        hsts
        tls {
            certificate  "/etc/letsencrypt/live/votreserveur.net/fullchain.pem"
            key  "/etc/letsencrypt/live/votreserveur.net/privkey.pem"
        }
        # Set max upload size to 513M (in bytes)
        connection max request body 537919488

        # protected files and dir
        location "/.*"                { block }
        location "/upload/*.php"      { block }
        location "/files/*.php"       { block }

        # Any other PHP file
        location "/*.php*" {
                fastcgi socket "/run/php-fpm.sock"
        }
}

Enfin, on recharge httpd : rcctl reload httpd.

Dirigez-vous à l'adresse du nouveau site pour terminer l'installation et remplir les informations concernant la base de données qui vient d'être créée.

L'installation de wordpress est terminée ☺ .

11.6. CardDAV et CalDAV avec Baïkal

Baïkal est un serveur Cal et CardDAV permettant de synchroniser votre calendrier et vos contacts. Il ne fait que ça, c'est pourquoi il le fait bien et sait rester léger.

Vous aurez besoin pour l'utiliser de PHP et de SQlite.

Vérifiez (https://github.com/fruux/Baikal/releases) quelle est la dernière version de baikal. Vous pouvez ensuite la télécharger avec ftp:

# ftp -o /tmp/baikal.zip "https://github.com/fruux/Baikal/releases/download/0.4.6/baikal-0.4.6.zip"

On se déplace dans le dossier web pour décompresser baikal et modifier les droits sur les fichiers :

# cd /var/www/htdocs/
# unzip /tmp/baikal.zip
# chown -R www:daemon baikal

Ajoutez une nouvelle section dans le fichier /etc/httpd.conf pour configurer httpd. Notez qu'on ne configure ici qu'un accès via une adresse en "https" :


server "dav.votreserveur.net" {
	listen on * tls port 443
	root "/htdocs/baikal/html" 
	directory index index.php
	hsts
	tls {
		certificate "/etc/letsencrypt/live/exemple.net/fullchain.pem"
		key         "/etc/letsencrypt/live/exemple.net/privkey.pem"
	}

	location "/.well-known/caldav" { 
		block return 301 "https://$SERVER_NAME/dav.php" 
	}
	location "/.well-known/carddav" { 
		block return 301 "https://$SERVER_NAME/dav.php" 
	}

	location "/.ht*" { block }
	location "/Core*" { block }
	location "/Specific*" { block }

	location "*.php*" {
		fastcgi socket "/run/php-fpm.sock"
	}
}

Reste à recharger httpd avec rcctl reload httpd. Vous pouvez désormais vous rendre à l'adresse https://dav.votreserveur.net pour terminer l'installation.

Pour utiliser votre calendrier, vous pouvez récupérer l'excellente extension lightning pour Thunderbird (iceowl sous debian). Vous trouverez un exemple de configuration à cette adresse :

https://www.guillaume-leduc.fr/synchronisez-baikal-avec-thunderbird-et-lightning.html.

11.7. Un wiki

Il existe tellement de moteurs de wiki qu'il est difficile de faire un choix. Ces derniers sont souvent très configurables et permettent d'en faire des blogs voire des sites complets.

Nous allons nous intéresser ici à l'installation de dokuwiki, un des moteurs les plus connus et les plus pratiques grâce à ses multiples extensions et le peu de dépendances qu'il nécessite. Vous aurez besoin de PHP et SQLite.

L'installation est semblable à la plupart des sites web comme vous pourrez le voir, c'est pourquoi elle ne sera pas exhaustive.

Téléchargement de dokuwiki :

# ftp -o /tmp/dokuwiki.tgz "http://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz"

Extraction de l'archive :

# cd /var/www/htdocs
# tar xvzf /tmp/dokuwiki.tgz

On renomme le dossier et on change les droits :

# mv dokuwiki-* wiki
# chown -R www:daemon wiki

La configuration de httpd peut se réaliser ainsi dans le fichier /etc/httpd.conf:

server "wiki.exemple.net" {
        listen on * port 80
        block return 301 "https://$SERVER_NAME$REQUEST_URI"
        no log
}

server "wiki.exemple.net" {
        listen on * tls port 443
        root "/htdocs/wiki"
        directory index doku.php
        connection max request body 537919488
        hsts
        tls {
           certificate  "/etc/letsencrypt/live/exemple.net/fullchain.pem"
           key  "/etc/letsencrypt/live/exemple.net/privkey.pem"
        }

        location "*.php*" {
                fastcgi socket "/run/php-fpm.sock"
        }

        location "/data*"         { block }
        location "/conf*"         { block }
        location "/bin*"          { block }
        location "/inc*"          { block }
}

Rechargez httpd avec rcctl reload httpd, puis ouvrez dans un navigateur l'adresse de votre wiki pour terminer l'installation.

Une fois l'installation terminée, supprimez le fichier install.php

# rm /var/www/htdocs/wiki/install.php

11.8. Des statistiques sur les visites de vos sites

11.8.1. Avec webalizer

Webalizer est un outil qui peut générer graphiques et tableaux à partir des logs (journaux) de votre serveur. En un clin d'oeil vous pourrez trouver à propos de votre site :

D'autres outils identiques existent, en particulier piwik. Ce dernier est toutefois moins facile à mettre en place (base de données MySQL) et nécessite l'insertion de code html dans toutes vos pages web. Il est aussi moins efficace si les visiteurs utilisent des addons Firefox comme noscript ou ublock. Cependant, les données récoltées sont plus pertinentes. Vous voudrez donc peut-être compléter l'installation de webalizer avec piwik.

Quoi qu'il en soit, nous allons voir ici une méthode pour obtenir de belles statistiques avec webalizer.

Comme d'habitude, on commence par l'installer avec la commande magique :

# pkg_add webalizer

Pour le configurer, nous allons utiliser comme base le modèle fournit. On le copie par exemple dans /etc/ :

# cp /usr/local/share/examples/webalizer/sample.conf /etc/webalizer.votreserveur.conf

Éditez ce nouveau fichier pour l'adapter à vos besoins. Voici quelques options pratiques que vous voudrez certainement changer :

Vous pouvez générer une première fois les statistiques avec la commande suivante :

# webalizer -c /etc/webalizer.votreserveur.conf

Et hop, toutes les pages html et les graphiques sont dans le dossier défini par la variable OutputDir, il suffit de vous y rendre avec un navigateur web pour les étudier.

Cependant, vous voudrez certainement régler encore quelques petits détails. Par exemple, la partie des "Referers" qui recense les sites sur lesquels le votre est cité doit être bien maigre. Il faut régler la façon dont httpd produit les logs. Rien de bien compliqué, il faut juste ajouter dans le fichier /etc/httpd.conf la ligne suivante dans le site pour lequel on veut des statistiques : log style combined.

Euh, on peut avoir un exemple siouplé?

Voici :

server "votreserveur.net" {
    listen on * tls port 443
    root "/htdocs/votreserveur.net"
    directory index index.html
    log style combined

    hsts
    tls {
        certificate "/etc/letsencrypt/live/votreserveur.net/fullchain.pem"
        key         "/etc/letsencrypt/live/votreserveur.net/privkey.pem"
    }
}

N'oubliez pas de recharger httpd avec rcctl reload httpd.

Mais on doit lancer la commande webalizer manuellement? C'est nul ce truc!

On n'en reste pas là bien entendu. Afin que les statistiques soient générées par exemple tous les jours, nous pourrions profiter du fichier /etc/daily.local. Toutefois, il faut éviter que les logs n'aient été archivés auparavant.

Nous allons donc modifier la configuration de l'outil qui archive les logs toutes les heures. Il s'agit de newsyslog. On édite le fichier /etc/newsyslog.conf qui ressemble à ça :

#       $OpenBSD: newsyslog.conf,v 1.34 2015/10/14 20:54:07 millert Exp $
#
# configuration file for newsyslog
#
# logfile_name      owner:group     mode count size when  flags
/var/cron/log       root:wheel      600  3     10   *     Z
/var/log/aculog     uucp:dialer     660  7     *    24    Z
/var/log/authlog    root:wheel      640  7     *    168   Z
/var/log/daemon                     640  5     30   *     Z
/var/log/lpd-errs                   640  7     10   *     Z
/var/log/maillog                    640  7     *    24    Z
/var/log/messages                   644  5     30   *     Z
/var/log/secure                     600  7     *    168   Z
/var/log/wtmp                       644  7     *    $W6D4 B
/var/log/xferlog                    640  7     250  *     Z
/var/log/pflog                      600  3     250  *     ZB "pkill -HUP -u root -U root -t - -x pflogd"
/var/www/logs/access.log            644  4     *    $W0   Z "pkill -USR1 -u root -U root -x httpd"
/var/www/logs/error.log             644  7     250  *     Z "pkill -USR1 -u root -U root -x httpd"

C'est l'avant-dernière ligne que nous allons changer afin de lancer webalizer avant de faire tourner les logs. Elle ressemblera à :

/var/www/logs/access.log            644  4     *    $W0   Z "/usr/local/bin/webalizer -c /etc/webalizer.votreserver.conf && pkill -USR1 -u root -U root -x httpd"

Pour vérifier que tout fonctionne bien, lancer newsyslog en le forçant à archiver les logs et en le faisant parler. Vous devriez obtenir quelque chose de la sorte :

# newsyslog -vF
/var/cron/log <3Z>: size (KB): 7.24 [10] --> trimming log....
/var/log/authlog <7Z>: age (hr): 88 [168] --> trimming log....
/var/log/daemon <5Z>: size (KB): 0.41 [30] --> trimming log....
/var/log/lpd-errs <7Z>: size (KB): 2.02 [10] --> trimming log....
/var/log/maillog <7Z>: age (hr): 16 [24] --> trimming log....
/var/log/messages <5Z>: size (KB): 0.45 [30] --> trimming log....
/var/log/secure <7Z>: age (hr): -1 [168] --> trimming log....
/var/log/wtmp <7B>: --> trimming log....
/var/log/xferlog <7Z>: size (KB): 0.00 [250] --> trimming log....
/var/log/pflog <3ZB>: size (KB): 64.26 [250] --> trimming log....
/var/www/logs/access.log <4Z>: --> trimming log....
/var/www/logs/error.log <7Z>: size (KB): 212.87 [250] --> trimming log....
/var/www/logs/mateteestmalade.log <7Z>: size (KB): 3.93 [250] --> trimming log....
Webalizer Xtended RB30 (06-Apr-2014) / [OpenBSD http://www.openbsd.org/] 5.9 amd64 / English
Copyright 2005-2014 by Patrick K. Frei
Based on Webalizer V2.23-08
Using logfile /var/www/logs/access.log (clf)
Using GeoIP Country Edition (/var/db/GeoIP/GeoIP.dat)
GEO-106FREE 20151201 Build 1 Copyright (c) 2015 MaxMind Inc All Rights Reserved
Creating output in /var/www/htdocs/yeuxdelibad.net/stats
Hostname for reports is 'yeuxdelibad.net'
Reading history file... webalizer.hist
Skipping bad record (1)
No valid records found!
Generating summary report

Il y a les messages de webalizer qui montrent qu'il a été exécuté.

Et voilà, les statistiques sont générées à chaque fois avant que les logs soient archivés.

11.8.2. Avec piwik

Piwik est nettement plus lourd. Si votre serveur a une puissance limitée, préférez webalizer.

Je ne vais pas détailler l'installation pas à pas dans cette partie. Je suppose donc que vous avez lu et compris la partie sur PHP ainsi que celle sur MySQL.

Pour PHP, installez et activez ces paquets : php-curl php-gd. Il y a aussi besoin des bibliothèques geoip et cli qui sont normalement intégrées dans le paquet PHP d'OpenBSD.

Installez une base MySQL (mariadb). Voici un récapitulatif tiré de la documentation de piwik:

# mysql -u root -p
mysql> CREATE DATABASE piwik_db_name_here;
mysql> CREATE USER 'piwik'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON piwik_db_name_here.* TO 'piwik'@'localhost';

Ensuite, on télécharge piwik dans le dossier /var/www/htdocs/piwik :

# mkdir -p /var/www/htdocs/piwik
# cd /var/www/htdocs/piwik
# ftp -o /tmp/piwik.zip "http://builds.piwik.org/piwik.zip" && unzip /tmp/piwik.zip

Configurez maintenant un nouveau site dans le fichier /etc/httpd.conf :

server "stats.votreserveur.net" { 
    listen on * tls port 443 
    root "/htdocs/piwik/piwik/"
    directory index index.php

    hsts 
    tls {
        certificate "/etc/letsencrypt/live/votreserveur.net/fullchain.pem"
        key         "/etc/letsencrypt/live/votreserveur.net/privkey.pem"
    }

    location "*.php*" {
        fastcgi socket "/run/php-fpm.sock"
    }
}

Modifiez les droits sur ce dossier :

# chown -R www:daemon /var/www/htdocs/piwik

Rechargez httpd avec rcctl reload httpd puis dirigez-vous avec un navigateur sur l'adresse du site fraîchement activé pour terminer l'installation de piwik.

N'oubliez pas d'ajouter à vos pages web le code d'intégration donné.

12. Gopher

J'en entends déjà rire en lisant ce titre. Non, le protocole gopher n'est pas mort. Bien que très peu utilisé, on y trouve encore quelques trésors. Gopher vous permettra d'écrire et d'échanger des documents tout simplement.

On dit aussi que ce protocole est très léger et permet le transfert de données même avec de minuscules bandes passantes.

Que ce soit par utilité ou par jeu, nous allons voir comment installer un serveur gopher sous OpenBSD.

Tout d'abord, on installe le serveur avec pkg_add :

# pkg_add gophernicus

Ensuite, on doit éditer le fichier /etc/inetd.conf pour y mettre la ligne suivante :

gopher stream tcp nowait _gophernicus /usr/local/libexec/in.gophernicus in.gophernicus -h votredomaine.net

N'oubliez-pas de remplacer votredomaine.net par votre nom de domaine puis activez et redémarrez ce service avec rcctl :

# rcctl enable inetd
# rcctl start inetd

À partir de ce moment là, il ne reste plus qu'à ouvrir et rediriger le port 70 (TCP).

Mettez vos fichiers textes, vos images, vos vidéos (...) dans le dossier /var/gopher, ils seront automatiquement disponibles à l'adresse gopher://votredomaine.net .

Pour personnaliser un peu plus votre site, vous pouvez créer un fichier gophermap dans lequel vous déposez un message pour les visiteurs. Terminez ce fichier avec un * pour qu'il y ait une liste automatiquement générée des documents disponibles.

Par exemple :

 ____  _
| __ )(_) ___ _ ____   _____ _ __  _   _  ___
|  _ \| |/ _ \ '_ \ \ / / _ \ '_ \| | | |/ _ \
| |_) | |  __/ | | \ V /  __/ | | | |_| |  __/
|____/|_|\___|_| |_|\_/ \___|_| |_|\__,_|\___|
----------------------------------------------
                                  

*

Note : Pour accéder à un site hébergé avec le protocole gopher, vous pouvez utiliser l'extension Firefox OverbiteFF.

Un site peut alors ressembler à ça :

13. Seedbox

Ce chapitre décrit comment mettre en place une seedbox.

On commence par installer l'excellent rtorrent :

# pkg_add rtorrent

On ajoute maintenant un utilisateur dont l'unique tâche sera de faire tourner rtorrent :

# 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 []: _rtorrent
Enter full name []: rtorrent daemon
Enter shell csh ksh nologin sh [nologin]: ksh
Uid [1005]:
Login group _rtorrent [_rtorrent]:
Login group is ``_rtorrent''. Invite _rtorrent into other groups: guest no
[no]:
Login class authpf bgpd daemon default dovecot pbuild staff unbound
[default]:
Enter password []:
Enter password again []:

Name:        _rtorrent
Password:    ***************
Fullname:    rtorrent daemon
Uid:         1005
Gid:         1005 (_rtorrent)
Groups:      _rtorrent
Login Class: default
HOME:        /home/_rtorrent
Shell:       /sbin/ksh
OK? (y/n) [y]: y
Added user ``_rtorrent''
Add another user? (y/n) [y]: n
Goodbye!

Nous pouvons maintenant nous connecter en tant qu'utilisateur _rtorrent :

# su _rtorrent

Nous allons créer les dossiers qui serviront à télécharger les torrents, ainsi qu'un dossier dans lequel tous les fichiers .torrent ajoutés seront directement pris en charge par rtorrent :

$ mkdir -p Telechargements/{download,session,torrents}

On crée maintenant le fichier ~/.rtorrent.rc. Vous pouvez copier l'exemple fournit avec le paquet :

$ cp /usr/local/share/examples/rtorrent ~/.rtorrent.rc

On modifie la configuration selon nos besoins :

# Maximum and minimum number of peers to connect to per torrent.
#min_peers = 40
#max_peers = 100

# Same as above but for seeding completed torrents (-1 = same as downloading)
#min_peers_seed = 10
#max_peers_seed = 50

# Maximum number of simultanious uploads per torrent.
#max_uploads = 15

# Global upload and download rate in KiB. "0" for unlimited.
#download_rate = 0
upload_rate = 20

# Default directory to save the downloaded torrents.
directory = ~/Telechargements/download 

# Default session directory. Make sure you don't run multiple instance
# of rtorrent using the same session directory. Perhaps using a
# relative path?
session = ~/Telechargements/session

# Watch a directory for new torrents, and stop those that have been
# deleted.
schedule = watch_directory,5,5,load_start=~/Telechargements/torrents/*.torrent
schedule = untied_directory,5,5,stop_untied=

# Close torrents when diskspace is low.
#schedule = low_diskspace,5,60,close_low_diskspace=100M

# The ip address reported to the tracker.
#ip = 127.0.0.1
#ip = rakshasa.no

# The ip address the listening socket and outgoing connections is
# bound to.
#bind = 127.0.0.1
#bind = rakshasa.no

# Port range to use for listening.
#port_range = 6890-6999

# Start opening ports at a random position within the port range.
#port_random = no

# Check hash for finished torrents. Might be usefull until the bug is
# fixed that causes lack of diskspace not to be properly reported.
#check_hash = no

# Set whether the client should try to connect to UDP trackers.
#use_udp_trackers = yes

# Alternative calls to bind and ip that should handle dynamic ip's.
#schedule = ip_tick,0,1800,ip=rakshasa
#schedule = bind_tick,0,1800,bind=rakshasa

# Encryption options, set to none (default) or any combination of the following:
# allow_incoming, try_outgoing, require, require_RC4, enable_retry, prefer_plaintext
#
# The example value allows incoming encrypted connections, starts unencrypted
# outgoing connections but retries with encryption if they fail, preferring
# plaintext to RC4 encryption after the encrypted handshake
#
encryption = allow_incoming,require,require_rc4,enable_retry

# Enable DHT support for trackerless torrents or when all trackers are down.
# May be set to "disable" (completely disable DHT), "off" (do not start DHT),
# "auto" (start and stop DHT as needed), or "on" (start DHT immediately).
# The default is "off". For DHT to work, a session directory must be defined.
# 
dht = auto

# UDP port to use for DHT. 
# 
# dht_port = 6881

# Enable peer exchange (for torrents not marked private)
#
# peer_exchange = yes

system.method.set_key = event.download.finished,notify_me,"execute=~/.rtorrent_mail.sh,$d.get_name="

#scgi_port = 127.0.0.1:5000

Afin d'être averti lorsqu'un téléchargement est terminé, on crée le script ~/.rtorrent_mail.sh :

#!/bin/sh
echo "$(date) : $1 - Download completed." | mail -s "[rtorrent] - Download completed : $1" root

Notez que tous les fichiers .torrents qui seront déposés dans le dossier watch seront directement ajoutés dans rtorrent. Si vous voulez ajouter un fichier torrent à partir de votre ordinateur habituel, vous pouvez utiliser un client SFTP ou la commande scp :

$ scp -p <port_ssh> _rtorrent@votredomaine.net:/home/_rtorrent/Telechargements/watch

Reste à lancer rtorrent en arrière-plan à chaque démarrage du serveur. Revenez sur le compte root (ctrl-D) puis ajoutez la commande suivante dans le fichier /etc/rc.local :

/usr/bin/su _rtorrent -c "/usr/bin/tmux new -s rtorrent -d /usr/local/bin/rtorrent"

On utilise l'excellent tmux installé par défaut sur OpenBSD pour envoyer rtorrent en arrière-plan.

Si vous souhaitez administrer rtorrent par la suite, connectez-vous en ssh avec l'utilisateur _rtorrent, et affichez rtorrent avec la commande tmux a -t rtorrent. Appuyez successivement sur "ctrl-b" puis la touche d pour vous détacher de rtorrent.

14. Serveur d'impression

Nous allons voir dans ce chapitre comment relier une imprimante au serveur et la rendre accessible afin de pouvoir imprimer de n'importe où depuis le réseau local. Ça peut être très pratique pour convertir une imprimante USB en imprimante sans-fil.

On commence par installer cups et des pilotes d'imprimante :

# pkg_add cups cups-filters gutenprint foomatic-db

Pensez à ouvrir dans le parefeu le port 631 (ipp). Pour un réseau local, inutile de le rediriger dans le routeur.

Maintenant, il faut autoriser l'accès à distance à l'interface d'administration de l'imprimante (à moins que vous ne réalisiez toute la configuration directement sur le serveur avec un navigateur en mode console comme w3m ou lynx). Pour cela, modifiez de cette façon le fichier /etc/cups/cupsd.conf :

Listen 0.0.0.0:631
Listen /var/run/cups/cups.sock

# Restrict access to the server...
<Location />
Order deny,allow
Deny From All
Allow From 192.168.1.*
Allow From 127.0.0.1
Allow From @LOCAL
</Location>

Quelques explications :

On active ensuite cups, puis on le démarre :

# rcctl enable cupsd
# rcctl start cupsd

Maintenant, reliez votre imprimante sur le serveur. Ouvrez un navigateur à l'adresse suivante : http://localhost:631. Sur un serveur, cela peut être avec w3m, un navigateur en console. Sinon utilisez votre ordinateur de bureau, et indiquez l'adresse locale du serveur à la place de localhost (que vous pouvez trouver en tapant la commande ifconfig |grep inet sur le serveur). Cela donnerait quelque chose comme http://192.168.1.22:631.

Pour installer l'imprimante, allez dans “Administration, Ajouter une imprimante” puis suivez les indications. Si le modèle de votre imprimante n'est pas dans la liste, choisissez la version la plus proche.

Important : n'oubliez pas de cocher la case "Partager cette imprimante".

Finalement, vous pouvez ajouter cette imprimante sur les ordinateurs qui auront besoin d'y accéder. Ouvrez un navigateur sur votre ordinateur puis allez à l'adresse http://localhost:631/admin. Suivez la procédure d'installation d'imprimante, mais cette fois choisissez “Internet Printing Protocol (http)”. Vous devez entrer l'adresse de l'imprimante.

Pour la trouver, affichez l'interface de CUPS du serveur, puis cliquez en haut à droite sur “Imprimantes” et cliquez sur le nom de l'imprimante fraîchement installée. Notez l'adresse qui est du type http://192.168.1.32:631/printers/HL2130.

Vous devrez alors pour l'installer sur un ordinateur préciser une URL de ce type :

ipp://192.168.1.32:631/printers/Brother_HL-2130_series.

Cliquez sur “Continuer” et terminez l'installation. Et voilà, votre serveur d'impression est prêt.

14.1. Note à propos des imprimantes USB

La gestion des imprimantes USB sous OpenBSD est un peu particulière. Comme décrit dans /usr/local/share/doc/pkg-readme/cups*, il faut autoriser l'accès au port USB pour l'utilisateur cups. Tapez alors la commande usbdevs -vd. Vous obtenez une sortie de ce type :

# usbdevs -vd
Controller /dev/usb0:
addr 1: high speed, self powered, config 1, EHCI root hub(0x0000), Intel(0x8086), rev 1.00
  uhub0
 port 1 addr 2: high speed, self powered, config 1, Rate Matching Hub(0x0024), Intel(0x8087), rev 0.00
   uhub2
  port 1 powered
  port 2 addr 3: low speed, power 100 mA, config 1, USB Mouse(0x1205), Genesys Logic(0x05e3), rev 1.00
    uhidev0
  port 3 powered
  port 4 powered
  port 5 powered
  port 6 powered
 port 2 powered
Controller /dev/usb1:
addr 1: high speed, self powered, config 1, EHCI root hub(0x0000), Intel(0x8086), rev 1.00
  uhub1
 port 1 addr 2: high speed, self powered, config 1, Rate Matching Hub(0x0024), Intel(0x8087), rev 0.00
   uhub3
  port 1 addr 3: high speed, self powered, config 1, HL-2130 series(0x003f), Brother(0x04f9), rev 1.00, iSerialNumber E2N507126
    ugen0

On remarque que l'imprimante (Brother) est identifiée par ugen0 sur le contrôleur /dev/usb1. Pour permettre à cups d'accéder à l'imprimante on lance la commande suivante :

# chown _cups /dev/ugen0.* /dev/usb1

Afin que ces modifications soient automatiques à chaque fois que l'imprimante est reliée au serveur, installez le démon hotplugd puis activez-le :

# pkg_add hotplug-diskmount
# rcctl enable hotplugd
# rcctl start hotplugd

Créez maintenant le script /etc/hotplug/attach pour y mettre :

#!/bin/sh

DEVCLASS=$1
DEVNAME=$2

case $DEVCLASS in
0)
    if [ -n "$(echo $DEVNAME | grep -o "ugen[0-9]")" ]; then
        DEVDESCR=$(usbdevs -d | grep -B1 $DEVNAME | sed -Ee 's/ addr [0-9]+: (.+)$/\1/' -e 1q)
        if [ "${DEVDESCR}" == "HL-2130 series, Brother" ]; then
            chown _cups /dev/${DEVNAME}.* /dev/usb1
        fi
    fi
;;
2)
	# disk devices
	echo "Things for disks"
;;
esac

exit

Si votre imprimante n'était pas identifiée par quelque chose comme "ugen1" mais "ulpt", alors il faut modifier la configuration du noyau pour désactiver ce module. Cela se fait ainsi :

# config -fe /bsd                                   
OpenBSD 6.0-stable (GENERIC.MP) #1: Fri Sep  2 10:41:52 CEST 2016
    root@votreserveur.net: /usr/src/sys/arch/amd64/compile/GENERIC.MP
Enter 'help' for information
ukc> disable ulpt
291 ulpt* disabled
ukc> quit
Saving modified kernel.

Un redémarrage du serveur est nécessaire pour prendre les changements en compte.

15. TOR

Tor est un logiciel libre permettant de renforcer la vie privée de ses utilisateurs et ainsi passer outre les surveillances subies lors de l'utilisation d'internet. Lorsqu'on l'utilise, les communications sont réparties à travers une maille de serveurs, afin d'obtenir un onion router. En gros, ce que vous demandez sur le web circule entre une série de serveurs (les couches de l'oignon), ce qui rend très difficile de savoir d'où viennent les paquets, et donc de vous localiser!

15.1. Configurer un relais

Il vous est possible de participer à ce réseau en étant un serveur relais. Qui plus est, cela rendra d'autant plus difficile de déterminer vos propres activités, puisque vos centres d'intérêt seront noyés parmi le trafic sortant de votre connexion.

Installez et activez Tor ainsi :

# pkg_add tor
# rcctl enable tor

Assurez-vous d'ouvrir dans votre pare-feu, et de rediriger dans votre routeur le port 9001.

Ensuite, éditez le fichier /etc/tor/torrc , afin d'obtenir ces quelques lignes :

SOCKSPort 0
ORPort 9001
Nickname Surnom
RelayBandwidthRate 75 KB  
RelayBandwidthBurst 100 KB 
ContactInfo votrenom <adresse AT email dot fr>
ExitPolicy reject *:* # no exits allowed

Modifiez les valeurs pour RelayBandwidthRate et RelayBandwidthBurst selon votre accès à internet. Il s'agit de la bande passante que vous laissez disponible pour Tor.

Enfin, démarrez Tor avec rcctl start tor et attendez de voir apparaître dans le fichier /var/log/messages :

May 12 12:20:41 votreserveur Tor[12059]: Bootstrapped 80%: Connecting to the Tor network
May 12 12:20:41 votreserveur Tor[12059]: Bootstrapped 85%: Finishing handshake with first hop
May 12 12:20:42 votreserveur Tor[12059]: Bootstrapped 90%: Establishing a Tor circuit
May 12 12:20:44 votreserveur Tor[12059]: Tor has successfully opened a circuit. Looks like client functionality is working.
May 12 12:20:44 votreserveur Tor[12059]: Bootstrapped 100%: Done
May 12 12:20:44 votreserveur Tor[12059]: Now checking whether ORPort 109.190.xxx.xxx:9001 is reachable... (this may
take up to 20 minutes -- look for log messages indicating success)
May 12 12:21:10 votreserveur Tor[12059]: Self-testing indicates your ORPort is reachable from the outside. Excellent. Publishing server descriptor.
May 12 12:21:12 votreserveur Tor[12059]: Performing bandwidth self-test...done.

15.2. Configurer un service caché

Vous pouvez proposer votre site web (ou n'importe quel autre service) au travers du réseau Tor. Ceux qui voudront y accéder utiliseront une adresse se terminant par ".onion", comme par exemple "5rud2tr7sm3oskw5.onion".

Avant d'aller plus loin, notez qu'il est très fortement déconseillé d'héberger un relais et un service caché en même temps.

Ceci étant dit, vous pouvez activer votre site caché en éditant le fichier /etc/torrc. Décommentez les lignes correspondantes ou ajoutez-les :

SOCKSPort 0
HiddenServiceDir /var/tor/hidden/
HiddenServicePort 80 127.0.0.1:80

Relancez Tor pour activer ce service caché : rcctl restart tor. Deux nouveaux fichiers vont apparaître dans le dossier /var/tor/hidden/ : "hostname" et "private_key". L'adresse de votre site en .onion se trouve dans le fichier hostname. Notez-la :

# cat /var/tor/hidden/hostname
5rud2tr7sm3oskw5.onion

Cependant, ne communiquez jamais le contenu de private_key.

Il ne nous reste plus qu'à configurer httpd pour lui dire de recevoir les connexions vers l'adresse en ".onion" et de les servir. Le fichier /etc/httpd.conf pourra alors contenir ceci :

server "5rud2tr7sm3oskw5.onion" {
        listen on 127.0.0.1 port 80
        # emplacement du site
        root "/htdocs/votresite.net"     
        directory index index.html

        [...]
}

Vous pouvez tester votre site (après un rcctl reload httpd bien sûr) avec le navigateur torbrowser.

Mais, ce n'est pas chiffré dans une adresse https! Est-ce vraiment sécurisé?

Bonne remarque. Le chiffrement TLS n'est pas nécessaire ici, puisque le tunnel ouvert par Tor pour accéder au site est entièrement chiffré. De plus, le navigateur devrait valider le certificat, or, ce dernier n'est pas enregistré pour un domaine en ".onion". Notez que si vous pouvez obtenir un certificat pour cette adresse, c'est alors possible de configurer un accès en https.

15.3. Informations sur la charge du serveur

Il peut être intéressant de garder un oeil sur la charge que le serveur subit, afin d'être sûr qu'il dispose de suffisamment de ressources. Il existe de nombreuses solutions, que l'on ne pourra pas toutes présenter ci-dessous. Mon choix s'est porté sur systat et symon.

15.3.1. Avec systat

Systat est présent par défaut dans OpenBSD. Vous pouvez obtenir des informations sur le système en temps réel en tapant la commande systat vm.

Pour des informations concernant la température du matériel (attention à la surchauffe!), tapez systat sensors

cpu0.temp0          51.00 degC
acpitz0.temp0       26.80 degC      zone temperature

À chaque fois, appuyez sur la touche q pour quitter.

15.3.2. Avec symon

Symon va vous permettre d'obtenir des statistiques sur votre serveur et de les consulter sur une page web.

Commençons par installer le nécessaire :

# pkg_add symon symux syweb

On modifie ensuite la configuration de symon qui va surveiller le système. Pour cela, on modifie le fichier /etc/symon.conf pour garder les informations qui nous intéressent :

monitor { cpu(0),  mem,
          if(lo0),
          if(re0),
          pf,
          mbuf,
          sensor(cpu0.temp0),
          proc(httpd),
          io(wd0),
          io(wd1),
          df(sd1b)
} stream to 127.0.0.1 2100

De la même façon, on configure symux qui va analyser les données recueillies par symon. On édite le fichier /etc/symux.conf :

mux 127.0.0.1 2100

source 127.0.0.1 {
	accept { cpu(0),  mem,
		if(lo0),
		if(re0),
		pf,
		mbuf,
		sensor(cpu0.temp0),
		proc(httpd),
		io(wd0)
		io(wd1),
		df(sd1b)
	}

	datadir "/var/www/symon/rrds/localhost"
}

On ne fait que reproduire les mêmes éléments que dans /etc/symon.conf. Attention à bien indiquer le chemin vers les données datadir. On va d'ailleurs le créer dès maintenant :

# mkdir -p -m 0755 /var/www/symon/rrds/localhost

On crée maintenant les fichiers rrd :

# /usr/local/share/examples/symon/c_smrrds.sh all

Puisque le serveur web est dans un chroot, il faut lancer la commande suivante pour installer l'outil d'analyse des données (rddtool) :

# /usr/local/share/examples/rrdtool/rrdtool-chroot enable

Une fois ceci fait, il faut préciser dans la configuration de syweb où trouver l'outil rrdtool. Dans le fichier /var/www/htdocs/syweb/setup.inc, modifiez la ligne contenant $symon['rrdtool_path'] ainsi :

$symon['rrdtool_path']='/usr/local/bin/rrdtool';

Reste une dernière modification à apporter. Puisque le serveur web est en chroot, il faut lui donner accès au shell /bin/sh afin que PHP puisse lancer rrdtool qui génère les graphiques :

# mkdir -p /var/www/bin
# cp /bin/sh /var/www/bin

On recharge tous les nouveaux démons après les avoir activés :

# rcctl enable symon
# rcctl enable symux
# rcctl start symon
# rcctl start symux

On ajoute la configuration convenable pour le serveur http, dans le fichier /etc/httpd.conf :

server "statistiques.votreserveur.net" {
        listen on * port 80  
        root "/htdocs/syweb"
        directory index index.php

        location "*.php*" {
                fastcgi socket "/run/php-fpm.sock"
        }
}

Reste à recharger ce dernier avec # rcctl reload httpd puis à aller sur le site définit pour voir les beaux graphiques.

16. Serveur de stockage

Aussi appelé NAS, ces serveurs permettent de stocker et partager des fichiers dans un réseau domestique.

Pour mettre en place cette fonctionnalité, nous verrons deux solutions : l'une basée sur SSH et l'autre sur NFS.

16.1. Solution du fainéant : SSH

Si vous avez déjà configuré SSH, nous pouvons utiliser l'outil sshfs qui permet de monter dans un dossier les fichiers contenus sur le serveur, un peu comme avec une clé USB. Cette solution fonctionnera quel que soit l'endroit qui vous sert de point d'accès à internet et restera sûr.

Admettons que vous souhaitez monter le dossier /mnt/partage du serveur dans votre dossier /home/toto/serveur. Vous utiliserez alors la commande suivante

sshfs utilisateur_ssh@votreserveur.net:/mnt/partage /home/toto/serveur

On demandera le mot de passe de l'utilisateur ssh, puis ensuite vous pourrez voir les documents du serveur dans /home/toto/serveur comme s'ils étaient sur votre ordinateur.

Notez que ce n'est pas toujours pratique d'avoir à entrer le mot de passe, surtout lorsqu'on souhaite que le dossier du serveur soit monté automatiquement à chaque démarrage. Vous pouvez dans ce cas consulter l'authentification par clés.

16.2. Solution un poil plus compliquée : NFS

NFS veut dire "Network File System", autrement dit "Système de fichiers en réseau".

Cependant, nous n'allons pas ouvrir le partage NFS au monde entier comme on peut le fait pour d'autres services, car nous ne pouvons pas restreindre l'accès à certains utilisateurs. L'utilisation de NFS sera donc adaptée à un partage local, c'est à dire pour toutes les machines utilisant votre routeur pour se connecter.

Cette configuration sort du cadre de ce document si je souhaite le garder simple et sécurisé. Sachez que cela existe, et que vous pouvez trouver l'excellente documentation sur le sujet dans la FAQ d'OpenBSD :

https://www.openbsd.org/faq/faq6.html#NFS

17. Proxy VPN (OpenVPN)

Un VPN veut dire "Réseau privé virtuel". Cela permet de disposer d'un tunnel chiffré pour que tout le trafic sorte par votre serveur. Et dans ce cas, le mot "tunnel" est une image tout à fait adaptée car un VPN présente plusieurs intérêts, notamment :

Convaincu de l'utilité d'un VPN?

La mise en place va se passer en deux temps :

  1. Sur le serveur, nous allons générer des certificats et installer OpenVPN.
  2. Sur les machines qui voudront passer par le tunnel VPN, il faudra faire passer le trafic par notre serveur. Afin de s'identifier, des certificats sont souvent utilisés, mais nous utiliserons plutôt des identifiants et mots de passe.

Cette démarche n'est pas forcément facile. Prenez le temps de lire et relire ce qui suit et suivez pas à pas les étapes proposées.

Notez aussi que des choix ont été faits afin de simplifier la procédure. Le résultat est donc un compromis entre sécurité et facilité d'utilisation pour l'administrateur et l'utilisateur. On pourra par exemple remarquer que :

Les plus aguerris voudront certainement lire la page suivante pour aller plus loin :

http://openbsdsupport.org/openvpn-on-openbsd.html

17.1. Préparation de la configuration

On commence par installer OpenVPN :

# pkg_add openvpn openvpn_bsdauth

Vous voudrez peut-être lire la documentation fournie avec le paquet :

less /usr/local/share/doc/pkg-readmes/openvpn-2.3.11

Pour l'instant, nous allons créer les dossiers nécessaires à openvpn. Ces derniers contiendront la configuration, les certificats, et on termine par le dossier qui contiendra les journaux d'openvpn :

# install -m 700 -d /etc/openvpn/private
# install -m 755 -d /etc/openvpn/certs
# install -m 755 -d /var/log/openvpn

La commande install est très pratique pour créer des dossiers avec les permissions adéquates.

C'est tout pour l'instant, on y va doucement mais sûrement.

17.2. Création des certificats

On va maintenant créer les certificats et autres fichiers servant à l'authentification du serveur. Par simplicité, nous allons utiliser l'outil easy-rsa :

# pkg_add easy-rsa

Afin de créer les fichiers dont on aura besoin, on se place dans un dossier temporaire /tmp/openvpn dans lequel on copie les fichiers nécessaires à easy-rsa :

# mkdir -p /tmp/openvpn
# cd /tmp/openvpn
# cp -r /usr/local/share/easy-rsa/* .

On va maintenant configurer easy-rsa en éditant un fichier dont le petit nom est vars. On copie tout d'abord l'exemple donné :

# cp vars.example vars

Éditez ce fichier. Vous devriez changer au moins les variables suivantes selon votre cas:

set_var EASYRSA_REQ_COUNTRY     "FR"
set_var EASYRSA_REQ_PROVINCE    "France"
set_var EASYRSA_REQ_CITY        "Nantes"
set_var EASYRSA_REQ_ORG "PuffyCorp"
set_var EASYRSA_REQ_EMAIL       "me@example.net"
set_var EASYRSA_REQ_OU          "PuffyCorpUnit"

set_var EASYRSA_KEY_SIZE        4096

Ensuite, on va générer les certificats en lançant les commandes suivantes :

# ./easyrsa init-pki
# ./easyrsa build-ca nopass
# ./easyrsa build-server-full server nopass
# ./easyrsa gen-dh

C'est long, il y a des ., des + qui apparaissent, c'est normal.

On en profite pour générer au passage le certificat de révocation, qui vous sera peut-être utile un jour :

# ./easyrsa gen-crl

Une fois terminé, on va changer les permissions sur les fichiers générés :

chown -R _openvpn:wheel pki/*
chmod -R 600 pki/*

On retourne dans le dossier d'openvpn, dans lequel on copie les fichiers créés précédemment :

# cd /etc/openvpn
# cp -p /tmp/openvpn/pki/ca.crt certs/ca.crt
# cp -p /tmp/openvpn/pki/issued/server.crt certs/server.crt
# cp -p /tmp/openvpn/pki/private/server.key private/server.key
# cp -p /tmp/openvpn/pki/dh.pem dh.pem
# cp -p /tmp/openvpn/pki/crl.pem crl.pem

Pensez à supprimer le dossier /tmp/openvpn :

# rm -rf /tmp/openvpn

17.3. Configuration d'OpenVPN

Afin de configurer OpenVPN, on va définir un mot de passe pour restreindre l'administration. Mettez ce bon mot de passe dans le fichier /etc/openvpn/private/mgmt.pwd. Modifier les permissions vers ce fichier pour en restreindre l'accès :

# chown root:wheel /etc/openvpn/private/mgmt.pwd
# chmod 600 /etc/openvpn/private/mgmt.pwd

Nous pouvons maintenant configurer openvpn en créant le fichier /etc/openvpn/server.conf. Afin qu'il soit pré-rempli, on va copier l'exemple fournit avec la commande :

# cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /etc/openvpn/server.conf

Éditez maintenant ce fichier. Vous devrez au moins changer ces lignes :

# configuration reseau
dev tun0
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1"
# On propose le resolveur de FDN
# https://www.fdn.fr/actions/dns/
push "dhcp-option DNS 80.67.169.12"
# Si le serveur a son propre resolveur
push "dhcp-option DNS 10.8.0.1"

# les certificats
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/private/server.key
dh /etc/openvpn/dh.pem
crl-verify /etc/openvpn/crl.pem

# options diverses
comp-lzo
daemon openvpn
float
group _openvpn
user _openvpn
ifconfig-pool-persist /var/openvpn/ipp.txt
keepalive 10 120
management 127.0.0.1 1195 /etc/openvpn/private/mgmt.pwd
max-clients 100
persist-key
persist-tun
port 1194
proto udp

# authentification
client-cert-not-required
username-as-common-name
script-security 3 system
auth-user-pass-verify /usr/local/libexec/openvpn_bsdauth via-env
auth-nocache

# journaux
log-append  /var/log/openvpn/openvpn.log
status /var/log/openvpn/openvpn-status.log
verb 3

On modifie les permissions vers ce fichier :

# chown root:_openvpn /etc/openvpn/server.conf
# chmod 640 /etc/openvpn/server.conf

Ça sera tout pour la configuration du serveur.

17.4. Configuration réseau pour OpenVPN

Nous devons modifier la configuration du parefeu afin de rediriger le trafic provenant du VPN. Dans le fichier /etc/pf.conf, vous aurez alors cette ligne en plus :

pass out on $ext_if from 10.8.0.0/24 to any nat-to ($ext_if)

Il faut aussi autoriser le trafic à travers le tunnel VPN :

pass in quick on $tun_if keep state

N'oubliez pas au passage d'ouvrir et de rediriger le port 1194 en UDP.

On peut maintenant relancer le pare-feu avec pfctl -d && pfctl -ef /etc/pf.conf.

Il faut autoriser le transfert d'IP (ou "l'IP packet forwarding") en éditant le fichier /etc/sysctl.conf pour y mettre :

net.inet.ip.forwarding=1

Pour ne pas avoir à redémarrer le serveur, vous pouvez activer cette option avec la commande :

# sysctl net.inet.ip.forwarding=1

Si vous avez la chance de disposer d'une IPv6, n'oubliez pas l'équivalent :

# sysctl net.inet6.ip6.forwarding=1
# echo 'net.inet6.ip6.forwarding=1' >> /etc/sysctl.conf

17.5. Création des utilisateurs du VPN

C'est presque finit! Courage!

Seuls quelques utilisateurs auront le droit d'utiliser le VPN. Les élus autorisés seront ceux appartenant au groupe _openvpnusers. Pour créer ces utilisateurs, utilisez la commande suivante :

# useradd -G _openvpnusers utilisateur

Profitez-en pour attribuer un mot de passe robuste pour ce dernier :

# passwd utilisateur

17.6. Démarrage du VPN

Afin de lancer le VPN automatiquement à chaque fois que le serveur démarre, une interface de type "tunnel" doit être créée. Tout ceci peut être réalisé automatiquement par OpenBSD en ajoutant un fichier /etc/hostname.tun0 pour mettre dedans :

up
!/usr/local/sbin/openvpn --config /etc/openvpn/server.conf

Afin de le lancer manuellement, tapez :

# sh /etc/netstart

Vous pouvez alors vérifier que openvpn est bien en cours de fonctionnement en regardant les journaux :

# tail -f /var/log/openvpn/*

Afin d'arrêter openvpn pour une raison ou une autre, vous pouvez tuer son processus avec la commande kill -9 $(pgrep openvpn).

17.7. Configuration client

Il existe des outils graphiques permettant de faciliter la configuration d'une connexion avec openvpn. Libre à vous d'en installer un sur votre ordinateur ou smartphone.

Le plus souvent, vous devrez fournir le certificat du serveur afin que le client puisse se connecter. Envoyez-le par mail ou tout autre moyen. Il s'agit du fichier /etc/openvpn/certs/ca.crt. Vous pouvez afficher son contenu avec la commande cat :

# cat /etc/openvpn/certs/ca.crt

-----BEGIN CERTIFICATE-----

MIIGNTCCAh2gAwIBAgIJALxL5Rt5/p1TMA0GCSqGSIb3D
BAMMC3lldXhkZWxpYmFkMB4XDTE2MTAyMzA5MTk0NloXD
FjE9MBIGA1UEAwwLeWV1eGRlbGliYWQwggEiMA0GCSqGS
0NRT4WgYexgM6Dh+S/tMq8JciQMUEgMwLZZrFZn7mDBt1
...
...
jqudepBh87dbZUBSbmr9QuOV1sdPA6TUp+yn8Ytyfd0M2
nyPoapWcItouatMe42gzo0f3NPkHSIhi/dXv9BGNa1jxG
OTIdoOdFmQw3BlD+TCyYDMgKpWKaFi6t9Jyji7WJst68+
u2WyqiFXS/FrWqxoTs4WWGuAM/LPzMvhhNZ5eiP/l0aIR

-----END CERTIFICATE-----

Ensuite, reste à copier ce contenu dans un fichier pour l'envoyer au client.

Avec la configuration proposée ci-dessus, l'utilisateur devra se connecter avec les identifiants créés rien que pour lui.

Selon le logiciel vous permettant de vous connecter à votre VPN, la configuration générée ressemblera à ceci pour les clients :

client
dev tun0
proto udp
remote votreserveur.net 1194
ca ca.crt
auth-user-pass
comp-lzo
auth-nocache

Remarquez qu'on retrouve les mêmes options que celles définies pour le serveur. Le fichier ca.crt correspond au certificat du serveur récupéré plus tôt, qu'il faudra enregistrer sur le client.

Une fois vos identifiants entrés, vos communications passent par votre VPN. Vous pouvez le vérifier en utilisant un service web qui vous donne votre adresse IP, comme par exemple http://whatismyipv6.com/. Ce dernier doit afficher l'IP du serveur et non l'IP de votre ordinateur.

18. Radio Web

Dans cette partie, nous allons voir comment proposer une radio web. L'objectif sera d'avoir un service qui ne prend pas toutes les ressources du serveur.

L'idéal serait de pouvoir diffuser des émissions en direct. Lorsque personne ne parle sur la radio, de la musique sera automatiquement jouée à partir d'une liste de lecture.

Nous allons utiliser les outils icecast et mpd.

18.1. Configuration d'icecast et mpd

Commençons par les installer :

# pkg_add icecast mpd

On va copier l'exemple de configuration d'icecast avant de l'éditer :

# cp /usr/local/share/examples/icecast/icecast.xml.dist /var/icecast/icecast.xml

Configurez ce fichier à votre goût. Voici un exemple de ce que j'ai modifié :

<location>Sur Mars</location>

<authentication>
	<source-password>motdepasse</source-password>
	<relay-password>motdepasse</relay-password>

	<admin-user>admin</admin-user>
	<admin-password>adminpw</admin-password>
</authentication>

<hostname>votredomaine.net</hostname>
<!-- You may have multiple <listener> elements -->
<listen-socket>
	<port>8000</port>
	<bind-address>0.0.0.0</bind-address>
</listen-socket>

<mount>
    <mount-name>/play.ogg</mount-name>
    <no-mount>1</no-mount>
</mount>
<mount>
    <mount-name>/live.ogg</mount-name>
    <fallback-mount>/play.ogg</fallback-mount>
    <fallback-override>1</fallback-override>
</mount>

On voit bien dans cette configuration que lorsqu'un "live" est en cours, il est diffusé, sinon ça bascule automatiquement sur la playlist.

On active icecast puis on le lance :

# rcctl enable icecast
# rcctl start icecast

Ensuite, nous allons configurer le lecteur de musique, qui sera ici mpd. Éditez le fichier /etc/mpd.conf de cette façon :

# Dossier contenant toute la musique
music_directory                 "/mnt/bigstorage/Musique"

# Pour icecast. Pensez à modifier le mot de passe
audio_output {
    type        "shout"
    encoding    "ogg"
    name        "Ma super radio"
    host        "localhost"
    port        "8000"
    mount       "/play.ogg"
    password    "motdepasse"
    bitrate     "128"
    format      "44100:16:2"
}

Je n'ai listé ci-dessus seulement ce que j'ai eu besoin de modifier. Changez bien le mot de passe pour envoyer la musique à icecast.

Enfin, activez mpd et lancez-le :

# rcctl enable mpd
# rcctl start mpd

Vous pouvez lancer la lecture en utilisant un client mpd, comme par exemple mpc. Il s'installe tout simplement :

# pkg_add mpc

Voici quelques commandes bien pratiques :

Avant d'essayer d'écouter votre musique, ouvrez et redirigez le port 8000 dans votre pare-feu et routeur.

Pour tester votre radio, ouvrez l'adresse suivante avec un lecteur de musique (vlc par exemple) : http://votreserveur.net:8000/live.ogg .

18.2. Diffuser une émission

Afin de diffuser une émission, il faudra utiliser n'importe quel logiciel capable de communiquer avec icecast. La seule différence sera que l'on diffusera sur "/live.ogg" directement et non plus sur "/play.ogg".

Si vous souhaitez faire des podcasts, je vous conseille l'excellent logiciel idjc.

En attendant, prenons pour exemple vlc qui va jouer ce que vous voulez pour l'envoyer sur le serveur.

Une fois vlc ouvert, cliquez sur ``Media'' -> ``Flux''. Ajoutez un fichier puis cliquez sur diffuser.

Cliquez sur ``Next, puis choisissez dans ``Nouvelle destination ``IceCast. Cliquez sur ``Ajouter.

Remplissez ensuite les différents champs :

Vous pouvez activer le transcodage si vous le souhaitez. Audio Vorbis (OGG) fonctionne bien en général. Il vous reste à valider la suite.

18.3. Montrer en ligne ce qui est joué

Vous voudrez peut-être afficher sur votre site web ce que la radio est en train de jouer. Mettez alors ceci dans /var/icecast/web/all.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="*">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>

Ensuite, dans un fichier /var/icecast/web/onair.xsl, mettez :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/icestats">
<!-- only show the first source -->
<xsl:apply-templates select="source[1]"/>
</xsl:template>

<xsl:template match="source">
<xsl:choose>
<xsl:when test="title or artist">
<xsl:if test="artist"><xsl:value-of select="artist" /> - </xsl:if>
<xsl:value-of select="title" />
</xsl:when>
<xsl:otherwise>Unknown</xsl:otherwise>
</xsl:choose>
</xsl:template>

</xsl:stylesheet>

Les personnes allant à http://votreserveur.net:8000/onair.xsl pourront voir ce qui est joué. Dans votre code html, il suffirait alors de rajouter ceci pour l'afficher sur une page:

<h3>Now playing</h3>
<iframe id="icecast" src="http://votreserveur.net:8000/onair.xsl">
</iframe>
<audio src="http://votreserveur.net:8000/live.ogg" controls="controls"></audio>

19. Annexes

19.1. Liens et références

19.1.1. Références

Ce document n'est pas le fruit de mon invention, mais rassemble des informations glanées ci et là.

19.1.2. Liens

Voici plusieurs liens énoncés au cours de ce document, plus ou moins dans leur ordre d'apparition :

19.2. Obtenir un certificat SSL

19.2.1. Obtenir un certificat avec letsencrypt

Le site lestencrypt.org fournit un client permettant d'obtenir un certificat qui sera automatiquement considéré comme "de confiance" par tous les navigateurs. C'est un service absolument génial tout à fait adapté à l'auto-hébergement.

Tout d'abord, installez certbot, disponible dans les paquets d'OpenBSD.

# pkg_add certbot

Si vous avez déjà un serveur http en marche, vous pouvez obtenir un certificat ainsi :

# certbot certonly --webroot --rsa-key-size 4096 -w /var/www/htdocs/votresite -d votredomaine.com -d www.votredomaine.com 

Adaptez les éléments suivants :

Si le serveur http n'est pas en fonctionnement, récupérez le certificat avec cette commande :

# certbot certonly --standalone --rsa-key-size 4096 -d votredomaine.com -d www.votredomaine.com -d autredomaine...

Cette dernière solution est la plus pratique pour plusieurs sous-domaines différents. À vrai dire, j'utilise un script ressemblant à celui ci-dessous pour obtenir mes certificats :

#/bin/sh
rcctl stop httpd

certbot certonly --standalone --rsa-key-size 4096 -d votreserveur.net \
        -d www.votreserveur.net \
        -d piwik.votreserveur.net \
        -d webmail.votreserveur.net \
        -d rephael.votreserveur.net \
        -d aufildemesenvieshebdos.votreserveur.net

rcctl start httpd
exit 0

À l'avenir, pour renouveler les certificats, il faudra simplement lancer certbot renew. En cas de doute, n'hésitez pas à vous référer à la documentation officielle.

Le certificat obtenu se trouve dans le dossier :

/etc/letsencrypt/live/votredomaine.com/.

19.2.2. Générer un certificat SSL auto-signé

Nous allons ici auto-signer le certificat. Les visiteurs de votre site risquent juste d'avoir un avertissement de ce type :

Sachez qu'il est possible d'acheter une autorité de certification. Mais dépenser votre argent n'est pas nécessaire n'est-ce pas? De plus un certificat auto-signé ne retire en rien la protection du chiffrement SSL.

Pour créer un certificat et le signer, il faut lancer la commande suivante. Bien sûr, remplacez le nom du fichier certificat.pem à votre convenance :

# openssl req -x509 -sha512 -nodes -days 365 -newkey rsa:4096 \
	-keyout /etc/ssl/private/certificat.pem \
	-out /etc/ssl/private/certificat.pem

Quelques questions vous seront posées. Vous n'êtes pas obligé de remplir tous les champs.

Finalement, il faut protéger ce certificat. Lancez ces deux dernières commandes afin d'en restreindre les permissions :

# chown root:root /etc/ssl/private/certificat.pem
# chmod 600 /etc/ssl/private/certificat.pem

Retenez bien le chemin vers ce certificat. Il faudra le préciser dans la configuration de votre serveur http.

Pour les plus intéressés, vous pourrez tester la sécurité de votre serveur sur le site sslabs, qui fournit d'excellents conseils pour l'améliorer.

19.3. Un nom de domaine

Vous voudrez certainement obtenir un nom de domaine, qui permettra à tous d'accéder plus facilement votre serveur. Cela vous donne aussi la possibilité de mieux vous organiser avec des sous-domaines, par exemple mail.mondomaine.com, blog.mondomaine.com...

Mais c'est quoi un nom de domaine?

Imaginons que M. Ali Gator vit au 5 rue du moulin à Picsouville. Pour aller lui rendre visite, c’est à cette adresse que vous allez vous rendre. Sur le web, l’adresse de votre serveur, c’est une série de nombres. Par exemple 93.22.160.7. C’est pratique pour les machines, pas pour les humains.

Un nom de domaine nous permet d’utiliser l’adresse wikipedia.org, qui est traduit par les ordinateurs en 91.198.174.192. Avouez que c’est plus facile à retenir.

La série de nombres indiquant “l’adresse” d’un serveur est ce qu’on appelle une adresse IP. L’association d’une IP avec un nom de domaine est possible grâce aux enregistrements DNS (Domain Name System).

Vous pouvez acheter un nom de domaine auprès de ce que l’on appelle un registre ou registrar comme OVH ou Gandi. Il en existe aussi des gratuits, comme ceux de FDN ou freenom.com.

Une fois votre domaine acquis, configurer les champs DNS pour le faire pointer vers votre adresse IP. Pour ça, référez vous à la partie sur les DNS .

19.4. Gestion des DNS

Lorsque un ordinateur doit aller sur un site dont le nom est "mondomaine.com", alors il va demander à un serveur DNS (qu'on appelle résolveur) à quelle adresse IP ce nom de domaine correspond.

Une fois que vous avez un nom de domaine, il faut le relier à l’adresse IP de votre serveur. Mais si, souvenez-vous, cette série de nombres ressemblant à 91.198.174.192. Pour cela, enregistrez un champ de type A dans l’interface d’administration du registre. Par exemple :

mondomaine.com	A	34.121.124.123
Comment connaître mon adresse IP ?

Rien de plus simple, il existe de nombreux services qui vous permettent de la retrouver. Quelques exemples :

Vous pouvez aussi la retrouver en tapant dans un terminal :

# /sbin/ifconfig

Notez qu'il existe plusieurs types d’enregistrements :

19.5. Rediriger les ports sur son routeur

Votre serveur, tout comme votre ordinateur actuellement, sera certainement connecté à internet par l’intermédiaire d’un modem (une *box). Il faut s’assurer que lorsqu’un visiteur voudra accéder à votre serveur, la *box le redirige bien vers votre serveur, et non vers une autre machine du réseau local. On dit que l’on configure le routeur.

Autrement dit, imaginez votre *box comme un grand mur avec dedans plusieurs portes. Chaque porte est numérotée. Quand quelqu’un veut accéder à votre serveur, il va venir frapper à l’une des portes, par exemple la numéro 80 pour un serveur http. Afin que tout fonctionne bien, il est nécessaire de savoir où mène la porte numéro 80. Si la box ne le sait pas, alors la porte reste fermée et votre serveur est inaccessible. Bien sûr, pour plus de sécurité encore, une fois la porte 80 passée, votre serveur sera équipé d’un parefeu pour vérifier que vous avez bien le droit d’entrer.

Dans le schéma ci-dessus, seuls les ports 443, 80 et 22 sont associés au serveur. Si le petit malin demande un port qui n’est pas redirigé vers le serveur (la porte est fermée), alors la requête ne peut pas aller jusqu'au bout. C’est comme s’il demandait d'aller à une destination qui n’existe pas. En revanche, lorsque le visiteur demande de passer par la porte 80, il est bien renvoyé vers le serveur.

La configuration du routeur se déroule toujours de la même façon :

  1. Vous accédez à l’interface de configuration du modem ;
  2. Vous précisez le port d’écoute par lequel vont arriver les requêtes. Par exemple, le port 80 pour un site web ;
  3. Vous indiquez que ce qui est adressé à ce port doit être mis en relation avec le port 80 de votre serveur (et pas un autre ordinateur connecté à la *box).

Cependant, l’interface de configuration n’est pas la même selon si vous avez une livebox, freebox, modem OVH... Pas d’inquiétude, on peut trouver l’adresse à taper dans un navigateur web pour accéder à cette interface. Essayez dans l’ordre suivant (Bien sûr, cette “adresse” est à utiliser sur un ordinateur lui-même connecté à la *box.) :

Il est possible qu’un nom d’utilisateur et un mot de passe soient demandés. Essayez dans ce cas admin/admin, sinon, demandez directement à votre fournisseur d’accès à internet. Une fois connecté, allez dans la section "Configurer mon routeur".

Pour plus d’informations, cette page peut vous être utile :

https://craym.eu/tutoriels/utilitaires/ouvrir_les_ports_de_sa_box.html.

19.6. Notes et astuces diverses

19.6.1. Que faire en cas de problème?

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

19.6.2. Quelles permissions donner aux fichiers d'un site?

Une méthode simple et pourtant redoutable pour sécuriser son site web consiste à modifier les droits et le propriétaire des fichiers dudit site. Voici quelques explications succinctes sur le sujet.

Afin de connaître la situation des fichiers, vous pouvez utiliser la commande ls -l. Dans la suite, on utilisera l'exemple ci-dessous :

$ ls -l
total 120
-rw-r--r--   1 www  daemon  18092 May  5 17:09 COPYING
-rw-r--r--   1 www  daemon    306 May  5 17:09 README
-rw-r--r--   1 www  daemon     23 May  5 17:09 VERSION
drwxr-xr-x   2 www  daemon    512 May  5 17:10 bin
drwxr-xr-x   2 www  daemon   1024 May  5 17:10 conf
drwxr-xr-x  12 www  daemon    512 May  5 17:10 data
-rw-r--r--   1 www  daemon   3674 May  5 17:09 doku.php
-rw-r--r--   1 www  daemon  19372 May  5 17:09 feed.php
drwxr-xr-x   6 www  daemon   1536 May  5 17:10 inc
-rw-r--r--   1 www  daemon    182 May  5 17:09 index.php
drwxr-xr-x   8 www  daemon    512 May  5 17:10 lib
drwxr-xr-x   5 www  daemon    512 May  5 17:10 vendor

On observe une ligne par fichier/dossier. Chaque ligne est découpée de cette façon :

<permissions> <inode> <proprietaire> <groupe> <taille> <date dernier acces> <nom du ficher>

19.6.2.1. Propriétaire et groupe

Chaque fichier appartient à un propriétaire et fait partie d'un groupe. Cela nous permettra de donner certaines permissions aux propriétaires, qui ne seront pas forcément les mêmes que celles données au membre du groupe.

Pour modifier le propriétaire et le groupe, on utilise la commande chown (change owner).

# chown <proprietaire>:<groupe> nom_du_fichier

19.6.2.2. Les permissions

Les lettres en début de ligne décrivent les permissions accordées au fichier. Nous pouvons retenir deux choses :

  1. Si le premier caractère est un d, alors il s'agit d'un répertoire. Sinon, c'est un fichier (sauf exceptions).
  2. Les caractères restants se lisent 3 par 3. Chaque "trio" décrit respectivement les permissions pour le propriétaire, pour le groupe puis pour tous les autres.

    Par exemple, pour cette ligne :

    drwxr-xr-x   2 www  daemon    512 May  5 17:10 bin
    

    On voit qu'il s'agit d'un répertoire. Ensuite :

En règle générale, il faut éviter autant que possible de donner les droits d'écriture et d'exécution à d'autres personnes que le serveur web. Parfois, on retire aussi les droits de lecture sur certains fichiers (mots de passe...).

Pour changer les droits, il existe plusieurs méthodes. Certains utilisent une série de chiffres, comme par exemple chmod 700. Je trouve cette façon peu claire pour un débutant. Quitte à devoir taper quelques commandes en plus, préférez utiliser chmod <personne>±<permission> où :

Vous prendrez bien quelques exemples?

Ces modifications peuvent être appliquées récursivement (à tous les sous-documents d'un dossier) avec l'option -R.

Astuce : pour autoriser à se déplacer dans les dossiers, sans rendre exécutables les fichiers, utilisez X au lieu de x.

19.6.3. Générer des 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 finit 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 parefeu.

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 :

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

19.6.4. Utiliser les portages de logiciels d'OpenBSD

Vous le savez déjà, OpenBSD dispose de nombreux paquets vérifiés avec soin. Cependant, c'est impossible pour les développeurs d'examiner tous les programmes pouvant être installés. Vous pourrez alors installer un programme ne figurant pas dans les paquets grâce au système de ports.

Il s'agit d'un arbre contenant toutes les instructions pour compiler et installer vous même les paquets. Pas de panique, vous aurez besoin uniquement de la commande make. En effet, le nécessaire pour compiler un paquet, les petites modifications au code source apportées par les développeurs d'OpenBSD et un tas d'autres détails sont précisés dans les ports, si bien que vous n'avez pas à vous en préoccuper.

Nous supposons par la suite que vous utilisez OpenBSD en branche -stable. Vous disposerez ainsi des correctifs de sécurité pour les programmes dans le cas d'une éventuelle faille.

Voici la marche à suivre :

  1. On récupère les ports. Pour cela, on se déplace dans le dossier /usr puis on lance la commande suivante :

    # cvs -qd anoncvs@anoncvs.ca.openbsd.org:/cvs get -rOPENBSD_6_0 -P ports
    

    Si vous aviez déjà récupéré les ports, vérifiez qu'il n'y a pas eu de changements avec la commande :

    # cd /usr/ports && cvs -q up -rOPENBSD_6_0 -Pd
    

  2. Cherchez le paquet qui vous intéresse. Par exemple, pour compiler php7.0, je vais chercher où se trouve son port en utilisant la commande make search key=ma_recherche dans le dossier /usr/ports. Puisqu'il risque d'y avoir beaucoup de résultats, on filtre avec la commande grep pour ne voir que ce qui contient 7.0

    # cd /usr/ports
    # make search key=php | grep 7.0
    
    On constate alors que le port se trouve dans le dossier (on le repère avec le mot Path) /usr/ports/lang/php/7.0.

  3. Afin de compiler et installer ce port, il ne reste plus qu'à taper make install dans ce dossier :

    # cd /usr/ports/lang/php/7.0
    # make install
    
    Toutes les dépendances sont alors récupérées et installées sous forme de paquets que vous pourrez modifier plus tard avec pkg_.

    Afin d'installer tous les "sous-paquets", c'est-à-dire les extensions de PHP (php-curl, php-gd...), on lance :
# make install-all

Pour installer les dépendances à partir des paquets déjà compilés s'il sont disponibles, ajoutez dans le fichier /etc/mk.conf la ligne suivante :

FETCH_PACKAGES=yes

Ça peut faire gagner un peu de temps.

19.6.5. Équivalences de commandes avec debian

Voici quelques équivalences de commandes avec debian :

Debian OpenBSD
apt-get upgrade pkg_add -u
apt-get autoremove pkg_delete -a
apt-cache search pkg_info -Q
apt-cache show pkg_info

19.6.6. Comment modifier un fichier?

Il existe une ribambelle d’éditeurs de texte (vim, nano...). L'éditeur par défaut sur OpenBSD est vi. Il peut être étonnant à utiliser au premier abord, vous voudrez peut-être installer à la place nano.

Voici quelques conseils pour utiliser vi au travers d'un exemple. Pour éditer le fichier /etc/iloverocknroll, vous saisirez ceci :

$ vi /etc/iloverocknroll

Apparaîtra alors le contenu de ce fichier dans le terminal :

Pour pouvoir écrire et modifier le fichier, appuyez sur la touche i.

Vous voilà en mode édition, vous pouvez écrire tout ce que vous voulez. Afin de quitter le mode édition, appuyez sur la touche échap.

Pour enregistrer les modifications, appuyez sur : puis sur w. Validez avec entrée. On peut maintenant quitter en écrivant :q. Notez que vous pouvez aller plus vite en saisissant directement :wq.

Afin de chercher un texte, ce qui est bien utile dans les gros fichiers, appuyez sur la touche / puis écrivez votre recherche.

Si vous souhaitez quitter sans enregistrer vos modifications, saisissez alors :q!.

Cela devrait être suffisant dans un premier temps. Si le fonctionnement de vi vous intéresse, vous pouvez consulter cette documentation :

http://wiki.linux-france.org/wiki/Utilisation_de_vi.

19.6.7. Gestion des services sous Openbsd

Afin d'activer/désactiver des services (qu'on appelle "démons" car ils tournent en arrière-plan), la commande rcctl est prévue à cet effet. Tous les services disponibles sont dans le dossier /etc/rc.d. Voici quelques rappels :

Si vous préférez la méthode manuelle, alors il vous est possible d'éditer directement le fichier /etc/rc.conf.local qui gère les services lancés au démarrage.

19.6.8. Comment changer le mot de passe?

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

# passwd cocolasticot

Pour changer le mot de passe du superutilisateur, c'est un peu plus difficile. On pourrait se contenter d'un passwd root, mais veillez à ce que le message indique bien que le changement est pour l'utilisateur ``root`, ce n'est pas forcément le cas selon la façon dont vous êtes passés superutilisateur.

Sinon, il faut redémarrer la machine, et lorsque vous voyez le terminal de démarrage (prompt boot), démarrez en mode "single user" :

boot> boot -s

Vous verrez un message comme :

Enter pathname of shell or RETURN for sh:

Appuyez sur ENTREE, puis les commandes suivantes afin de monter le système de fichiers

# mount -uw /
# mount /usr

Enfin, changez le mot de passe puis redémarrez normalement :

# passwd
# reboot

19.7. FAQ : Foire aux questions

19.8. Merci!

Ce document ne s'est pas fait tout seul. Au risque d'en oublier, je tiens à remercier Starsheep pour la quatrième de couverture et son enthousiasme ainsi qu'arpinux pour son amitié, sa confiance et son soutient sans failles.

Je tiens aussi à remercier Stéphane qui m'a beaucoup aidé dans ma découverte d'OpenBSD, ainsi que Fred Galusik, PengouinPdt et kuniyoshi qui m'ont accompagnés et m'accompagnent encore dans l'aventure d' obsd4*.

Merci à tous les contributeurs qui m'ont aidé à financer la publication de ce livre, en particulier Trefix et kuniyoshi, mais aussi jeau-2, laloke, alexbat, arndriel, sync, lotr, pfercour, reme-2, nellsounds, ddaugareil bart-26, throlen, ducobu89, javascript, saintraph, maxc62, alainbaudier, atbd, phil_s comete-7, thy-4, gillaume, mencattini, tomazinio, greazi, goujonjean, Florestan Fournier, monsieurnicolas, mmeinert, cedprad, piebriola, nicolas3, mignotjm, harlie, goerfra, pep1 gbabinfr, michel-106, sganarel69, doublefracture, hadrienv-2, mathias44wolff, lpox eparthuisot, monge08, palm123, nhix, chdorb, alkeo, ggr, iterreros, xuoro, matheus974 ygster, linuxmario, fredgalusik, the_big_lebowski, anopenbsd, jfch_, ecnerrolf, hucste nicolas51, tiubuk, nicolassimond, bendia-2, arnaudsenet, starsheep-2, ayl-a, roelandtn bricabraco, fredbezies, pafzedog, rico00 et arpinux.

Merci à Goofy, saintraph et arpinux pour la relecture.

Merci Péhä pour tes encouragements et tes conseils afin d'illustrer ce livre, ainsi que pour le super dessin à la fin du livre (sous licence CC-BY-SA).

Un coucou tout spécial à mon ami JB.

Et puisque j'aime garder le meilleur pour la fin, un merci tout spécial pour ma maîtresse favorite qui est toujours à mes côtés malgré l'odeur de café répandue par un vilain barbu tapotant sur un clavier à l'heure de la sieste.

19.9. Exemples et fichiers

19.9.1. /etc/pf.conf

# See pf.conf(5) and /etc/examples/pf.conf

## Configuration generale ##
# voir /etc/services pour les noms des ports
ext_if = "re0"                       # interface
tun_if = "tun0"                      # vpn
ssh_port = "222"                    # port ssh
http_ports = "{ www https }"         # ports http(s)
mail_ports = "{ submission imaps }"  # ports mails 
tcp_pass = "{ 8888 domain ipp }"     # ports tcp ouverts
udp_pass = "{ 1195 ipp }"            # ports udp ouverts
set block-policy drop    # bloque silencieusement
set skip on lo           # Pas de filtre en local
set limit table-entries 400000   

## tables pour les vilains bruteforceurs
table <ssh_abuse> persist
table <http_abuse> persist
table <mail_abuse> persist

# antispam avec greylisting
table <spamd-white> persist
table <nospamd> persist file "/etc/mail/nospamd"
table <bgp-spamd-bypass> persist

## Traitement des paquets ##
# Paquets partiels ou invalides
match in all scrub (max-mss 1440 no-df random-id reassemble tcp)
block in quick from urpf-failed  # Protection pour le vol d'ip
#antispoof quick for $ext_if # idem

## Les regles du pare-feu ##
# on bloque tout par defaut
block 

# on bloque les ip blacklistees
block in log quick proto tcp from <http_abuse> to any port $http_ports
block in log quick proto tcp from <ssh_abuse> to any port $ssh_port

# antispam
pass in on $ext_if proto tcp from any to any port smtp \
	divert-to 127.0.0.1 port spamd
pass in on $ext_if proto tcp from <nospamd> to any port smtp
pass in log on $ext_if proto tcp from <spamd-white> to any port smtp
pass in log quick on $ext_if proto tcp from <bgp-spamd-bypass> to any port smtp

# anti bruteforce
# Si + de 3 connections toutes les 60 secondes sur le port ssh
# on ajoute l'ip pour la bloquer.
pass in on $ext_if proto tcp to any port $ssh_port flags S/SA modulate state \
    (max-src-conn-rate 3/60, overload <ssh_abuse> flush global)

# Si + de 40 connections toutes les 5 secondes sur les ports http(s)
# ou si elle essaie de se connecter + de 100 fois
# on ajoute l'ip pour la bloquer.
pass in on $ext_if proto tcp to any port $http_ports flags S/SA modulate state \
     (max-src-conn 100, max-src-conn-rate 40/5, overload <http_abuse> flush)

# Protection bruteforce pour les mails
pass in on $ext_if proto tcp to any port $mail_ports flags S/SA modulate state \
    (max-src-conn-rate 5/60, overload <mail_abuse> flush global)

# on ouvre les autres ports
pass in quick on $ext_if proto tcp to any port $tcp_pass modulate state
pass in quick on $ext_if proto udp to any port $udp_pass modulate state

# on laisse entrer les mails
pass in log quick on $ext_if proto tcp from any to any port smtp

# on autorise le ping
pass quick inet6 proto ipv6-icmp all icmp6-type { echoreq, unreach, timex, paramprob }
pass quick inet proto icmp all icmp-type { echoreq, unreach }

# vpn
pass in quick on $tun_if modulate state
pass out on $ext_if from 10.8.0.0/24 to any nat-to ($ext_if)

# tout ouvert en sortie
pass out on $ext_if proto { tcp udp icmp } all modulate state

19.9.2. /etc/httpd.conf

server "default" {
        listen on * port 80 
        root "/htdocs/votreserveur.net" 
} 

types { include "/usr/share/misc/mime.types" }

server "votreserveur.net" {
        listen on * port 80
        block return 301 "https://$SERVER_NAME$REQUEST_URI"
}

server "votreserveur.net" { 
        alias "www.votreserveur.net"
        listen on * tls port 443 
        root "/htdocs/votreserveur.net" 
        directory index index.html
        log style combined

        hsts 
        tls {
            certificate "/etc/letsencrypt/live/votreserveur.net/fullchain.pem"
            key         "/etc/letsencrypt/live/votreserveur.net/privkey.pem"
        }

        location "/Blog/" {
            directory index index.php
        }

        location "*.php*" {
            fastcgi socket "/run/php-fpm.sock"
        }

        location "/DL/PDF/" {
            directory auto index
        }

        location "/educ/" {
            authenticate "education" with "/htdocs/educ.htpw"
            directory auto index
        }
}

server "site2.votreserveur.net" { 
        alias "www.site2.votreserveur.net"
        listen on * port 80 
        listen on * tls port 443 
        root "/htdocs/site2" 
        directory index index.html
        log access "site2.log"

        hsts 
        tls {
            certificate "/etc/letsencrypt/live/votreserveur.net/fullchain.pem"
            key         "/etc/letsencrypt/live/votreserveur.net/privkey.pem"
        }

        location "*.php*" {
            fastcgi socket "/run/php-fpm.sock"
        }
        location "/downloads/" {
            directory index index.php
        }
} 

server "autresite.votreserveur.net" { 
        listen on * port 80 
        root "/htdocs/autresite" 
        directory index index.html
        log access "mateteestmalade.log"
} 

server "deb.votreserveur.net" { 
        listen on * port 80 
        root "/htdocs/deb" 
        directory auto index 
        no log
} 

server "webmail.votreserveur.net" {
        listen on * port 80
        block return 301 "https://$SERVER_NAME$REQUEST_URI"
		no log
}

server "webmail.votreserveur.net" { 
        listen on * tls port 443 
        root "/roundcubemail" 
        directory index index.php
        no log

        hsts 
        tls {
            certificate "/etc/letsencrypt/live/votreserveur.net/fullchain.pem"
            key         "/etc/letsencrypt/live/votreserveur.net/privkey.pem"
        }

        location "*.php*" {
            fastcgi socket "/run/php-fpm.sock"
        }
        # Deny Protected directories
        location "/config" { block }
        location "/logs" { block }
        location "/logs" { block }
        location "/README" { block }
        location "/INSTALL" { block }
        location "/LICENSE" { block }
        location "/CHANGELOG" { block }
        location "/UPGRADING" { block }
        location "/bin" { block }
        location "/SQL" { block }
        location "/db" { block }
        location "*.md" { block }
        location "\.*" { block }

} 

server "wiki.votreserveur.net" { 
        listen on * port 80 
        listen on * tls port 443 
        root "/htdocs/dokuwiki" 
        directory index doku.php
        no log

        hsts 
        tls {
            certificate "/etc/letsencrypt/live/votreserveur.net/fullchain.pem"
            key         "/etc/letsencrypt/live/votreserveur.net/privkey.pem"
        }

        location "*.php*" {
            fastcgi socket "/run/php-fpm.sock"
        }

        location "/data*"          { block }
        location "/conf*"          { block }
        location "/bin*"          { block }
        location "/inc*"          { block }
} 

server "cloud.votreserveur.net" {
        listen on * port 80
        block return 301 "https://$SERVER_NAME$REQUEST_URI"
        log access "owncloud.log"
}

server "cloud.votreserveur.net" {
        listen on * tls port 443
        root "/htdocs/owncloud"
        directory index index.php
        hsts
        tls {
            certificate "/etc/letsencrypt/live/votreserveur.net/fullchain.pem"
            key         "/etc/letsencrypt/live/votreserveur.net/privkey.pem"
        }
        log access "owncloud.log"
        log error "owncloud.log"

        # Set max upload size to 513M (in bytes)
        connection max request body 537919488

        # First deny access to the specified files
        location "/db_structure.xml" { block }
        location "/.ht*"             { block }
        location "/README"           { block }
        location "*/data*"            { block }
        location "*/config*"          { block }

        # Any other PHP file
        location "/*.php*" {
                fastcgi socket "/run/php-fpm.sock"
        }
}

19.9.3. /etc/mail/smtpd.conf

table aliases file:/etc/mail/aliases

pki votreserveur.net key "/etc/ssl/private/mail.votreserveur.net.key"
pki votreserveur.net certificate "/etc/ssl/certs/mail.votreserveur.net.crt"

## RECEPTION ##
# Messages avec signature DKIM
listen on lo0 port 10028 tag DKIM   
# Messages verifies par spamassassin
listen on lo0 port 10026 tag NOSPAM
# Messages locaux
listen on lo0

## ENVOI ##
# Pour utiliser un client mail
listen on re0 port smtp hostname votreserveur.net tls pki votreserveur.net
listen on re0 port submission hostname votreserveur.net tls-require pki votreserveur.net auth

## RECEPTION ##
# Message venant du système
accept from local for local alias <aliases> deliver to maildir "~/Maildir"
# Message NOSPAM
accept tagged NOSPAM for domain "votreserveur.net" deliver to maildir "~/Maildir"
# Message venant d'ailleurs, on scanne avec spamassassin
accept from any for domain "votreserveur.net" relay via smtp://127.0.0.1:10025

## ENVOI ##
# Mail sortant portant une signature DKIM
accept tagged DKIM for any relay

# Mail en envoi pas encore signe avec DKIM
accept from local for any relay via smtp://127.0.0.1:10027
Sommaire