Veuillez vous référer à l'article précédent pour comprendre ce qu'est le SSO et comment installer et configurer Authelia.
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.
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.
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
).
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.
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 :
docker exec -it homeassistant bash
. En fonction de votre distribution, vous pourriez avoir besoin de préfixer la commande précédente par sudo
wget -O - https://get.hacs.xyz | bash -
pour installer HACS sur votre installation HASettings
et sur le menu hamburger en haut à droite, puis sur Restart Home Assistant
).Custom Repository
. https://github.com/BeryJu/hass-auth-header
et sélectionnez Intégration
dans le champ catégorie puis cliquez sur Ajouter
.Header
dans le champ de recherche et cliquer sur la carte Header Authentication
qui s'affiche.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.
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).
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!
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.