--- categories: ['OpenBSD','Réseau','Serveur'] date: 2018-12-24T21:28:03+01:00 description: "Mettre en place un serveur TURN sous OpenBSD" draft: false tags: ['OpenBSD','TURN','VoIP'] title: "OpenBSD : Service TURN" translationKey: 'openbsd-turnserver' --- ## Description Un serveur TURN est un serveur de {{< abbr VoIP "Voices and videos over IP" >}} - un serveur de trafic qui passe sur les réseaux NAT et au-travers des passerelles. * Site web : https://github.com/coturn/coturn * Version installée : 4.5.0.7p0 * OS : OpenBSD 6.4 ## Installation {{< inside2 l="sys/openbsd/pkg" t="Installez" a="installer" >}} le paquet **turnserver** ! Un utilisateur `_turnserver` sans droit système est créé ! ## Configuration ### Fichier de configuration `/etc/turnserver.conf` Il faut décommenter ou remplir les options suivantes : * `fingerprint` * `lt-cred-mech` * `use-auth-secret` * `static-auth-secret` - pour {{< anchor "générer un secret d'authentification" "secret-d-authentification" >}}… * `realm` - écrire le nom de domaine ou sous-domaine * `total-quota` - paramétrer la à la valeur de `100` * `bps-capacity` - valeur de `0` * `stale-nonce` * `no-loopback-peers` * `no-multicast-peers` ### HTTP ou HTTPS Quelques options à modifier pour avoir une configuration fonctionnelle : * Si TLS/HTTPS : `tls-listening-port` - la valeur par défaut du port est `5349` * Autrement : `listening-port` - la valeur par défaut du port est `3478` Si vous utilisez HTTPS, il faut en plus paramétrer ces options : * `cert` - chemin vers le certificat HTTPS du serveur * `pkey` - chemin vers la clé privée liée au certificat HTTPS du serveur * `cipherlist` - il est fortement recommandé de modifier cette option à l'identique de la configuration de votre serveur web, si vous en avez un actif sur le même serveur. Voici les valeurs minimales : `ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5` * il est possible d'exclure les versions suivantes des protocoles TLS en utilisant les options suivantes : `no-tlsv1` et `no-tlsv1_1` * il est possible de {{< anchor "configurer un fichier Diffie-Hellman" "fichier-diffie-hellman" >}}, c'est l'option `dh-file` - *n'utilisez pas le même que celui de votre serveur web ; générez-en exprès rien que pour ce service !* ### CLI Par défaut, l'interface d'administration en ligne de commande est activée ! Pour la désactiver, il faut décommenter l'option *no-cli… Sinon, décommentez les options suivantes pour ajouter un peu de sécurité dessus : * `cli-ip` - la valeur par défaut est `127.0.0.1`, sauf à raison contraire, laissez-la telle quelle. * `cli-port` - la valeur par défaut est `5766`. * `cli-password` - si l'option reste commentée, il n'y aura pas de mot de passe - {{< anchor "générez un nouveau mot de passe" turnadmin >}} avec la commande `turnadmin` et copiez-le… {{< note warning >}} Par défaut, l'interface CLI est accessible sur le réseau en clair. Pour administrer de manière plus sécurisée, ouvrez une session ssh sur votre machine, puis administrez votre serveur turn… ;) {{< /note >}} ### Bases de données Par défaut, SQLite est utilisée, et les données sont enregistrées dans `/var/db/turndb` - là, encore, sous OpenBSD, il est nécessaire que l'utilisateur `_turnserver` ait les droits sur ledit fichier. Pour les bases de données, MySQL/MariaDB, PostgreSQL, Mongo, Redis, veuillez lire le fichier [INSTALL](https://github.com/coturn/coturn/blob/master/INSTALL) ! ### Logs Il est possible de gérer les journaux en modifiant/activant les options suivantes : * `no-stdout-log` - empêcher que les journaux soient publiés sur la sortie standard * `syslog` - rediriger les sorties vers le journal syslog * `simple-log` - * `log-file` - donnez-lui le chemin absolu vers le nom de fichier dans lequel vous désirez que les journaux soient écrits. - {{< note warning >}} ATTENTION, il est nécessaire que l'utilisateur lié au service puisse lire le fichier journal. Il semble qu'il ne peut être écrit que dans `/var/tmp/turn.log`. {{< /note >}} ### Secret d'authentification Pour générer un secret d'authentification, il suffit de se servir de la commande *openssl*, tel que :
`$ openssl rand -hex 32` ### Fichier Diffie-Hellman Là, aussi, *openssl* sera notre secours, tel que :
`$ openssl dhparam -out dhparam_4096.pem 4096`
ce qui nous générera un fichier de 4096 bits. ### Turnadmin Pour générer un mot de passe, il faut utiliser l'option `-P` *(ou son équivalent : `--generate-encrypted-password*`)* alliée de l'option `-p` *(ou son équivalent : `--password`)*. * pour l'option `cli-password` : `$ turnadmin -P -p cli-password` ## Dépannage ### WARNING: cannot find private key file Les journaux indiquent que le fichier relatif à la clé privée du certificat SSL/HTTPS ne peut être lu, tel que : `Dec 19 09:08:17 srvr turnserver: 0: WARNING: cannot find private key file: /etc/ssl/acme/private/mydomain.net.privkey.pem (1)`
`Dec 19 09:08:17 srvr turnserver: 0: WARNING: cannot start TLS and DTLS listeners because private key file is not set properly`
En effet, lors de la génération par le client acme natif sous OpenBSD, les droits sur ledit fichier appartiennent en lecture seule à `root:wheel` - or, le serveur fonctionne avec les droits de l'utilisateur `_turnserver`, il ne peut donc pas y accéder…
*(bien sûr, je n'ai pas abordé la génération de certificats TLS avec Lets'Encrypt… voici un exemple d'explication pour le [client acme sous OpenBSD](https://ybad.name/ah/doku.php/4-httpd/ssl))* * Une des manières est de copier la clé privée de la mettre dans un répertoire où seul l'utilisateur `_turnserver` aura accès avec des droits en lecture seule, et sur le répertoire et sur le fichier de clé privée copié. Une fois fait, indiquez à l'option `pvkey` le nouveau chemin. * L'autre serait de créer un groupe sans droits systèmes, d'y ajouter l'utilisateur `_turnserver` et d'attribuer les droits 0440 sur le fichier original de la clé privée. *Personnellement, je n'aime ni l'une, ni l'autre de ces deux solutions*… mais je ne peux proposer mieux ! ## Démarrer le service Une fois le fichier configuré, il ne vous reste plus qu'à activer le service et le démarrer à l'aide de l'outil `rcctl` :
`# rcctl start turnserver` ## Règles PF La configuration des règles du pare-feu PF est un peu plus délicate. Gardez à l'esprit que ce sont des *règles à modifier selon vos nécessités* : {{< file "sys-openbsd-turnserver-pf.conf" sh "/etc/pf.conf" >}} Il est très intéressant de déclarer une table abuse et de modifier la règle qui bloque la connexion à l'interface CLI afin que les IP correspondantes soient enregistrées dans la table abuse. Veillez à créer une tâche cron pour purger régulièrement ladite table ;) ## Remerciements Source : https://help.nextcloud.com/t/howto-setup-nextcloud-talk-with-turn-server/30794 ------------------------------------------------------------------------ ***Enjoy-ID!
Enjoy-IT!*** ------------------------------------------------------------------------