Nginx als Reverse Proxy für Home Assistant

In der Standardkonfiguration verwendet Home Assistant kein SSL/TLS. Zwar kann das in der configuration.yaml im Abschnitt http: einfach aktiviert werden, aber bei mir laufen Home Assistant und Phoscon auf dem gleichem virtuellen System (siehe auch Artikel Turris Omnia: deCONZ im LXC-Container). Daher sollen beide Web-Oberflächen über unterschiedliche Hostnamen über HTTPS auf Port 443 erreichbar sein. Daher möchte ich die Seite über einen NGINX-Reverse-Proxy aufrufen, der sich um die SSL/TLS-Verschlüsselung kümmert und die Anfragen in abhängigkeit des Hostnamens an das entsprechende Backend weiterleitet. 

NGINX Grundkonfiguration

Nachdem NGINGX mit apt update; apt install nginx installiert wurde, müssen einige grundlegende Anpassungen an der Konfiguration vorgenommen werden. 

Hinweis: Wer Home Assistant und Phoscon ebenfalls auf einem Host betreibt und bereits den Reverse-Proxy gemäs der Anleitung in "Nginx als Reverse Proxy für Phoscon/deCONZ" vorgenomman hat kann dieses Kapitel überspringen.

In der nginx.conf werden nur wenige Punkte angepasst. Das wichtigste davon ist das auskommentieren der SSL-Einstellungen, da ich diese in einer gesonderten Config-Datei zusammenfasse:

  server_tokens off;
  server_names_hash_bucket_size 64;
  
  # Alle SSL-Optionen in der nginx.conf habe ich deaktiviert. 
  # SSL wird in einer eigenen Datei definiert (s.u.)
  # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
  # ssl_prefer_server_ciphers on;

Die SSL-Konfiguraiton kommt in die Datei /etc/nginx/conf.d/ssl.conf, die automatisch in der nginx.conf Datei inkludiert wird:

echo "
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;

  # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
  #ssl_dhparam /etc/nginx/tls/dh-parm-4096.pem;

  # Protokolle und Cipher Suiten festlegen
  ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE and TLS 1.0/1.1
  ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
  # more secure, but less compatible set of ciphers
  #ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384';

  ssl_ecdh_curve secp521r1:secp384r1:prime256v1;
  ssl_prefer_server_ciphers on;
" > /etc/nginx/conf.d/ssl.conf

Die Default-Seite des NGINX wird nicht benötigt und kann daher deaktiviert werden:

rm /etc/nginx/sites-enabled/default

Da ich auf Port 80 keine Web-Dienste anbieten möchte, leite ich als nächstes den gesamten Datenverkehr auf Port 80 um, so dass alle unverschlüsselten Anfragen an HTTPS weitergeleitet werden:

echo "server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
    location / {
        return 301 https://$host$request_uri;
    }

    ## Only allow these request methods ##
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
             return 444;
    }
    ## Do not accept DELETE, SEARCH and other methods ##
}" > /etc/nginx/sites-available/default-redirect

Reverse-Proxy für Home Assistant einrichten

Mit der folgenden Konfiguration wird der Reverse-Proxy für Home Assistant im NGINX konfiguriert. Die Zeilen 2-4 sorgen dafür, dass der Proxy als Default-Server im NGINX konfiguriert wird, und daher alle Anfragen, die nicht durch ander virtuelle Hosts in der NGINX-Konfiguration abgefangen werde, an Home Assistant weitergeleitet werden.

echo "server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name _;

    # ECC certificate (brainpool384r)
    ssl_certificate /etc/nginx/tls/ecc_fullchain.pem;
    ssl_certificate_key /etc/nginx/tls/ecc_key.pem;

    # RSA certificate (4096)
    ssl_certificate /etc/nginx/tls/rsa_fullchain.pem;
    ssl_certificate_key /etc/nginx/tls/rsa_key.pem;

    proxy_buffering off;

    location / {
        proxy_pass http://127.0.0.1:8123;
        proxy_set_header Host $host;
        proxy_redirect http:// https://;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location /api/websocket {
        proxy_pass http://127.0.0.1:8123;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}" > /etc/nginx/sites-available/hass

Die in den Zeilen 7 - 12 referenzierten Schlüssel und Zertifikate müssen natürlich noch erstellt werden. Ist der Server öffentlich erreichbar, so bietet sich ein Zertifikat von Let's Encrpyt an. Alternativ kann man natürlich auch eine eigene CA erstellen. Hierzu gibt es zahlreiche Anleitungen im Netz, so dass ich in diesem Artikel nicht genauer darauf eingehen werde.

Konfiguration von Home Assistant anpassen

Durch folgende Anpassungen im Abschnitt http: in der Datei configuration.yaml wird dann auch Home Assistant für den Reverse-Proxy fit gemacht. Vor den Änderungen wird der Home Assistant Dienst mit dem Befehl systemctl stop home-assistant@hass.service gestoppt.

http:
  # Secrets are defined in the file secrets.yaml
  # api_password: !secret http_password
  
  # Die Base URL muss angepasst werden
  #base_url: https://192.168.1.10:8123
  base_url: https://192.168.1.10
  
  # Uncomment this if you are using SSL/TLS, running in Docker container, etc.
  # Home Assistant Selbst soll kein SSL/TLS mehr verwenden, 
  # da das nun vom NGINX übernommen wird!
  #ssl_certificate: /home/hass/certs/fullchain.pem
  #ssl_key: /home/hass/certs/privkey.pem

  # Proxy-Header verwenden
  use_x_forwarded_for: true
  
  # You must set the trusted proxy IP address so that Home Assistant will properly accept connections
  # Set this to your NGINX machine IP, or localhost if hosted on the same machine.
  trusted_proxies: 127.0.0.1

Anschließend wird Home Assistant wieder mit systemctl start home-assistant@hass.service gestartet.

NGINX Konfiguration aktivieren

Die erzeugten Sites müssen jetzt nur noch aktiviert werden:

cd /etc/nginx/sites-enabled
ln -s ../sites-available/default-redirect
ln -s ../sites-available/deconz

Mit dem Befehl nginx -t kann die Konfiguration überprüft werden. Wenn dabei keinen Fehler auftreten sollte es ungeführ so aussehen:

$ nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nach einem Neustart de Servers via systemctl restart nginx sollte das Home Assistant auch über den neu eingerichteten Proxy erreichbar sein. 

 

Quellen

[1] https://www.home-assistant.io/docs/ecosystem/nginx/
[2] https://blog.ktz.me/home-assistant-external-reverse-proxy-setup/ 

Kommentare

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page