Utilisation de la passerelle web Signal

En écrivant ces quelques lignes dans mon journal de bord, je m'aperçois que cette petite installation commence finalement a dater. Toutefois, on peut considérer ici qu'il s'agit ici d'une bonne nouvelle. Déformation professionnelle oblige, j'ai plutôt tendance à me débarrasser “vite fait, bien fait” de tout ce qui n'est pas très fiable.

Bref.

Pourquoi Signal ?

Cela faisait donc longtemps que je cherchais un système de notifications (fiable ... j'insiste !) pour lamaisonquiparle.

Afin de faire rire l'internet (vite fait) un certain nombre d'éléments communiquent directement sur Mastodon (@lamaisonquiparle). Toutefois, il me fallait bien aussi un canal plus discret pour des raisons évidentes de vie privée.

Aussi, je souhaitais profiter de ce même canal pour envoyer des commandes de contrôle en plus de l'interface (douteuse) de Home Assistant. Je dois garder cette vielle habitude de l'époque des bots IRC. Il aurait tout de même été possible de les poster publiquement certes, mais l'idée d'avoir débat de troll infini lorsque je réglerai la consigne de mon chauffage +2 degrés au-dessus de la normale, me hante beaucoup.

La révélation m'est apparue après avoir convaincu un bon nombre de mes proches à finalement migrer de toutes ces saloperies de Whatsapp, Messenger, Hangouts ... vers Signal !

Si seulement, ma maison pouvait elle aussi communiquer sur ce même canal, je m'évitais un nouveau logiciel et remplissait haut la main le cahier des charges (code ouvert, vie privée, sécurité).

Dans mon cas, la maisonquiparle dispose de sa propre ligne SIP. Pas mal obligatoire pour uns certains nombres de projets connexes qui apparaîtront en temps voulus dans ce journal.

Le numéro de ligne SIP sera donc son identifiant Signal. Le numéro doit être saisi dans vos contacts et synchronisé dans Signal.

Non (à ma connaissance), vous ne pouvez pas utiliser votre identifiant personnel Signal avec la passerelle.

A ce sujet, veiller aussi à avoir la possibilité de lire ou router les SMS entrants sur ce numéro. Dans mon cas, j'ai juste activé une redirection vers mon numéro de téléphone personnel.

Le cerveau de la maison est un ordinateur recyclé (type PC bureautique) avec CentOS. Afin de préserver un système propre et stable, l'ensemble des applications tierces sont donc des conteneurs. Mettre la merde dans des boîtes, c 'est ce que l'on fait de mieux en 2019.

Le code source de la passerelle et le build de l'image sont disponibles sur Gitlab.

La documentation est facile à suivre pas à pas. Il suffit de créer 2 volumes persistants et de s'authentifier via un code reçu par le SMS le confirmation.

# docker volume ls
DRIVER              VOLUME NAME
[...]
local               signal-web-gateway_config
local               signal-web-gateway_storage

La seule différence avec la documentation du projet dans mon cas sera sur le choix d'utiliser le démarrage automatique des applications par Docker lui-même (restart: always) et non par systemd ou supervisord, afin d'être homogène avec le reste de mon installation.

Le fichier docker-compose prend alors cette forme:

version: '3.2'
services:
  signal-web-gateway:
    image: registry.gitlab.com/morph027/signal-web-gateway:master
    restart: always
    ports:
    - 5000:5000
    volumes:
      - config:/signal/.config
      - storage:/signal/.storage
    network_mode: host
volumes:
  config:
  storage:

Une fois la passerelle installée, nous pouvons utiliser cURL pour tester le service:

$ curl -X POST -F "to=+1__________" -F "message=Test de message." http://1.2.3.4:5000

Ok c'est bon, la suite mec.

Configurer Home Assistant

Pour envoyer les notifications depuis Home Assistant, il y a plusieurs méthodes. Le plus simple pour illustrer l'exemple est de configurer une commande shell dans le fichier de configuration home-assistant/config/configuration.yaml.

shell_command:
  signal_porte_open: /usr/bin/curl -X POST -F "to=+1__________" -F "message=Porte de garage ouverte" http://1.2.3.4:5000

Ensuite il suffit d'ajouter une règle de déclenchement automatique dans home-assistant/config/automations.yaml. Dans mon cas, il s'agit d'un changement d'état du capteur installé pour la porte de garage. Passage de off à on (porte fermée vers porte ouverte).

- id: '123456789'
  alias: Notification → Signal → Garage → Open
  trigger:
  - entity_id: binary_sensor.garage_door_sensor
    platform: state
    from: 'off'
    to: 'on'
  condition: []
  action:
  - alias: ''
    service: shell_command.signal_porte_open

Exemples de notifications sur Signal

Utilisation de Signal pour une authentification à double facteur (2FA)

L'autre utilisation fortement sympathique de cette passerelle est pour l'authentification à double facteur. L'idée consiste, pour ceux qui étaient dans un congélateur depuis ces 5 dernières années, a exiger un second mot de passe lors d'une phase d'authentification. Oui, nous vivons une époque ou 1 mot de passe, même fort, même unique, même [mettre ce que tu veux ici ] ne suffit plus.

Ce second mot de passe est à usage unique et sera transmis sur un canal de communication différent. Dans notre cas, ce canal sera donc Signal.

Il est agréable de constater que nous (nous, les passionnés du self hosted) pouvons aussi bénéficier de sécurité renforcée !

Dans mon cas, j'utilise 2FA a peu près partout et maintenant aussi dans mon instance Nextcloud. Le module 2FA de Nextcloud supporte Signal nativement.

Une fois de plus, la documentation est suffisamment facile à suivre pour éviter d'être copié collé dans ce journal.

En résumé, il faut charger le module dans l'instance en prenant soin d'y configurer quelques informations de base (occ twofactorauth:gateway:configure signal).

Suite à quoi, l'utilisateur pourra l'activer à la demande via son menu personnel settings > security.

A ma connaissance, il n'est pas encore possible d'utiliser des passerelles différentes. Cette limitation peut être pénible dans certains cas, puisque je le rappelle, le numéro de téléphone (identifiant Signal de la source) est unique par passerelle.

Lors de la prochaine connexion, suite à la saisi de votre mot de passe, un code de quelques chiffres vous sera exigé pour finalement ouvrir votre session.

D'un point de vue réseau, il conviendra de prendre les mesures nécessaires entre les conteneurs Nextcloud et la passerelle Signal (utilisation d'un réseau privé entre conteneurs ou reverse proxy SSL) pour éviter que ce genre de paquet ne voyage trop ...

15:44:28.249893 IP 172.18.0.2.55766 > 1.2.3.4.commplex-main: Flags [P.], seq 
POST / HTTP/1.1
Host: 1.2.3.4:5000
User-Agent: GuzzleHttp/6.3.3 curl/7.64.0 PHP/7.3.8
Content-Type: application/x-www-form-urlencoded
Content-Length: 70

to=%2BXXXXXXXXXXX&message=336411+is+your+Nextcloud+authentication+code................

Passez une belle journée. EOF