Un exemple de SSO avec Authelia et Home Assistant

Veuillez vous référer à l'article précédent pour comprendre ce qu'est le SSO et comment installer et configurer Authelia.

Qu'est-ce que HomeAssistant ?

Home Assistant

Home Assistant est un serveur domotique open source qui est probablement le meilleur de tous.

Home Assistant (HA) est probablement le logiciel le plus professionnel que vous puissiez utiliser pour gérer tous les gadgets de votre maison. Il n'est peut-être pas le plus facile à configurer (veuillez vous référer à cette page pour cela) en raison des nombreuses possibilités qu'il offre, mais une fois qu'il est configuré, il est hyper stable. Il reconnaîtra et détectera tous vos équipements IoT en provenance de Chine, de l'Oncle Sam voire d'ailleurs, et les ajoutera en quelques clics.

Généralement, une fois que vous avez installé HA, lorsque vous ajoutez quelque chose à votre maison, vous vérifiez si le gadget est compatible avec HA avant de l'acheter et la plupart d'entre eux le sont !

Cependant, il y a quelques domaines où HA n'est pas très facile à utiliser. L'authentification unique est une fonctionnalité que les développeurs d'HA ont refusé d'implémenter car elle ajoute beaucoup de travail à toutes leurs interfaces (mobile, web, etc...). Ainsi, par défaut, HA fournit une page de connexion que vous devez valider pour y accéder.

Dans cet article, nous allons mettre en place une solution SSO avec Authelia pour éviter de voir cette page de login. Cela fonctionnera pour l'interface web, mais comme l'interface mobile ne peut pas gérer Authelia, nous fournirons également une solution de repli pour l'interface mobile afin qu'elle fonctionne sans modification. Il est très probable que la solution SSO soit moins utile sur mobile, car il est plus probable que vous utilisiez l'application dédiée Home Assistant de toute façon.

Installation de Home Assistant

Je vous recommande de suivre les étapes d'installation à partir d'ici

Home Assistant fonctionne dans ses propres conteneurs et répond sur son propre sous-domaine, appelons-le ha.myhome.com

Si vous avez installé HA en mode OS/Supervised au lieu du mode Docker's container, vous devrez ajuster les étapes ci-dessous en remplaçant l'entrée dans le conteneur par une entrée SSH sur le serveur.

HA gère son propre mécanisme de mise à jour (interne), il est donc plus sûr et plus facile de l'exécuter dans un conteneur Docker, contrairement à Authelia qui ne gère pas les mises à jour et est beaucoup plus facile à installer et à mettre à jour à partir de votre distribution.

Je me concentre sur l'utilisation du SSO une fois l'application correctement installée sur votre serveur.

Donc une fois que vous êtes satisfait de l'application, vous devrez changer quelques clés de configuration pour qu'elle fonctionne avec le SSO.

Configuration NGINX

Nous utilisons ici NGINX pour proxifier une connexion HTTPS vers l'instance docker de HA.

Pour ce faire, vous devez avoir défini la bonne entrée DNS dans la zone DNS de votre domaine (quelque chose comme ha.myhome.com. A yourServerIP).

Étape 1. HAM ou mise en place d'un chemin de repli

Pendant que vous y êtes, dupliquez cette entrée DNS pour ajouter un nouveau sous-domaine que l'application mobile utilisera (quelque chose comme ham.myhome.com. A yourServerIP, remarquez le m supplémentaire pour mobile dans le nom du sous-domaine). Dans votre configuration NGINX, la configuration du site ham.myhome.com ressemblera un peu à ceci :

server {
    server_name  ham.myhome.com;

    # Home assistant
    location /
    {
        proxy_pass http://homeassistantserverip:8123;
        proxy_set_header   Host             $host;
        proxy_set_header   Upgrade          $http_upgrade;
        proxy_set_header   Connection       $connection_upgrade;
        proxy_http_version 1.1;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_buffering    off;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/ham.myhome.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/ham.myhome.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = ham.myhome.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen       80;
    server_name  ham.myhome.com;
    return 404; # managed by Certbot
}

Vous devrez également activer le site, en le liant via :

$ sudo ln -sf /etc/nginx/sites-available/ham.myhome.com /etc/nginx/sites-enabled/ham.myhome.com

Comme d'habitude avec HTTPS, vous pourriez avoir besoin d'utiliser certbot pour récupérer un certificat SSL valide, via sudo certbot run -d ham.myhome.com --nginx.

Redémarrez nginx (sudo systemctl restart nginx) et vérifiez que vous pouvez accéder à votre installation HA en naviguant vers https://ham.myhome.com. Si vous êtes accueilli par la page de login de HA, félicitations, vous pouvez continuer ce tutoriel. Sinon, revérifiez toutes les étapes ci-dessus jusqu'à ce que vous trouviez ce qui n'a pas fonctionné.

Ce domaine ham est le domaine qui sera utilisé par les applications mobiles. Il n'est pas derrière le serveur SSO Authelia. C'est un processus d'authentification HA 100% authentique.

Étape 2. Modifier HA pour permettre l'authentification à distance

Comme d'habitude avec le SSO (voir l'article précédent pour l'explication), le serveur SSO agit comme un proxy. Si une session valide existe, il signale à l'application protégée qu'aucune authentification n'est requise. Dans le cas contraire, il redirige lui-même vers sa propre page de connexion pour créer la session.

HA ne gère pas vraiment l'authentification externe en soi et il est probablement un peu trop complexe de modifier et de maintenir le code d'authentification pour valider l'authentification externe.

Heureusement, la moitié du travail est déjà faite en utilisant un Authentication provider. Vous devrez installer celui-ci.

Le processus est un peu alambiqué, car il nécessite de configurer l'intégration HACS d'abord dans HA. Ne vous inquiétez pas, voici la marche à suivre :

  1. Déterminez l'installation HA que vous avez effectuée (je recommande d'utiliser des conteneurs, ce tutoriel est donc basé sur ce type d'installation).
  2. Ouvrez un terminal sur l'ordinateur qui exécute HA et tapez docker exec -it homeassistant bash. En fonction de votre distribution, vous pourriez avoir besoin de préfixer la commande précédente par sudo
  3. Le prompt devrait avoir changé. Tapez wget -O - https://get.hacs.xyz | bash - pour installer HACS sur votre installation HA
  4. Suivez ensuite les instructions de [cette page] (https://hacs.xyz/docs/configuration/basic) pour installer l'intégration dans HA. Une intégration, en langage HA, est un logiciel qui s'insère au système HA.
  5. Redémarrez HA (cliquez sur Settings et sur le menu hamburger en haut à droite, puis sur Restart Home Assistant).
  6. Une fois que HACS est installé et fonctionne (vous devriez avoir une nouvelle icône dans la colonne de gauche) comme ceci : HACS
  7. Cliquez dessus et sur "Intégrations". Cliquez ensuite sur le menu hamburger en haut à droite et sélectionnez Custom Repository.
  8. Une boîte de dialogue s'ouvre pour demander l'URL du référentiel. Entrez https://github.com/BeryJu/hass-auth-header et sélectionnez Intégration dans le champ catégorie puis cliquez sur Ajouter.
  9. Ceci devrait avoir ajouté l'Authentification Header dans la liste ci-dessus. Puisqu'un grand nombre d'intégrations sont listées, vous pouvez rechercher Header dans le champ de recherche et cliquer sur la carte Header Authentication qui s'affiche.
  10. Une fois qu'il est actif, redémarrez HA (voir ci-dessus). Tant qu'il n'est pas redémarré, la configuration n'acceptera pas la nouvelle directive d'authentification.
  11. Une fois que HA a redémarré, ouvrez votre configuration.yml (soit en utilisant le File Editor de l'assistant Home, soit en entrant dans le conteneur et en éditant directement le /configuration/configuration.yml) et changez la section qui se lit :
    http:
    use_x_forwarded_for: true
    trusted_proxies:
        - 1.2.3.4/32 # This needs to be set to the IP of your reverse proxy
    logger:
    default: info

    en

    http:
    use_x_forwarded_for: true
    trusted_proxies:
        - 1.2.3.4/32 # This needs to be set to the IP of your reverse proxy
    auth_header:
    # Optionally set this if you're not using authentik proxy or oauth2_proxy
    username_header: Remote-User
    # Optionally enable debug mode to see the headers Home-Assistant gets
    # debug: false
    # Optionally, if something is not working right, add this block below to get more information
    logger:
    default: info
    logs:
        custom_components.auth_header: debug

    Changez l'adresse IP pour qu'elle corresponde à votre configuration, l'adresse IP doit être celle du serveur NGINX, et sauvegardez le fichier.

Ensuite, cliquez sur les Outils de développement dans la barre de gauche et cliquez sur Vérifier la configuration. La vérification devrait être verte. Si ce n'est pas le cas, rééditez votre configuration pour corriger l'erreur signalée. Une fois qu'elle est valide, redémarrez HA une fois de plus.

Étape 3. Mettre à jour la configuration de NGINX pour l'authentification par proxy

Ensuite, vous devez mettre à jour la configuration de votre site pour ha.myhome.com. En gros, il s'agit d'ajouter 2 lignes dans le fichier, pour qu'il ressemble à ceci :

server {
    server_name  ha.myhome.com;

    # Add this line
    include snippets/authelia.conf;

    # Home assistant
    location /
    {
        proxy_pass http://homeassistantserverip:8123;
        proxy_set_header   Host             $host;
        proxy_set_header   Upgrade          $http_upgrade;
        proxy_set_header   Connection       $connection_upgrade;
        proxy_http_version 1.1;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_buffering    off;

        # And this line
        include snippets/auth.conf;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/ha.myhome.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/ha.myhome.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = ha.myhome.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen       80;
    server_name  ha.myhome.com;
    return 404; # managed by Certbot
}

Redémarrez NGINX via sudo systemctl restart nginx, effacez le cache et les cookies de votre navigateur (mais ne vous connectez pas encore à https://ha.myhome.com).

Étape 4. Mettre à jour la configuration d'Authelia pour accepter le domaine de l'assistant familial et transférer les en-têtes nécessaires

Dans votre fichier de configuration Authelia (probablement /etc/authelia/configuration.yml) assurez-vous que vous avez listé ha.myhome.com dans votre liste access_control/rules/domain. Cela devrait ressembler à ceci (ce n'est qu'un extrait de la configuration complète) :

access_control:     
  default_policy: deny    
  rules:
    - domain:
        - 'auth.myhome.com'
      policy: bypass
    - domain:
        - 'myapp.myhome.com'
        - 'ha.myhome.com'
      policy: one_factor  

Assurez-vous que le compte utilisateur de votre HA a le même nom que le nom d'utilisateur de Authelia.

Redémarrez Authelia avec sudo systemctl restart authelia si vous avez fait des changements dans le fichier de configuration.

Enfin, naviguez jusqu'à https://ha.myhome.com et vous serez accueilli par la page de login de Authelia, et non par la page de l'assistant Home. Lors du processus de connexion, la page de connexion ne devrait jamais apparaître complètement (seulement l'icône de HA).

Félicitations, vous avez réussi!

Remarques finales

Si vous utilisez l'application mobile, utilisez ham.myhome.com au lieu de ha.myhome.com pour l'URL de votre serveur. De cette façon, le login habituel de HA est utilisé.

Vous pouvez toujours naviguer vers ha.myhome.com sur le navigateur web de votre mobile pour bénéficier du SSO. Mais l'application mobile utilise une Webview avec un support limité pour cette succession de redirection et le partage de session de cookie, c'est pour cela que ça ne fonctionne pas directement.

Article précédent