OpenBSD : Service TURN

Article publié, le
5 minute(s) de lecture

Cet article contient 1028 mots.
Source brute de l'article : MD

Description

Un serveur TURN est un serveur de VoIP - un serveur de trafic qui passe sur les réseaux NAT et au-travers des passerelles.

Installation

Un coup de pkg_add turnserver suffit !

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 générer un 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 configurer un 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 - générez un nouveau mot de passe avec la commande turnadmin et copiez-le…
Attention

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 !

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. -
Attention

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)

  • 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 :

Fichier : /etc/pf.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
()

host = "ipv4 address server"
host6 = "ipv6 address server"

cli_port  = "5766"
turn_port = "3478"
turn_tls_port = "5349"

()

# empêcher les connexions sur l'interface CLI
block drop in quick log on egress proto { tcp udp } from any to egress port $cli_port label "turn: unwanted connexion to cli"

block log
pass out

()

pass in quick log on egress proto { tcp udp } from any to { $host $host6 } port { $turn_port $turn_tls_port } flags S/SA modulate state

()

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!