Disclaimer:
Jeg har ingen ekspertkunnskap om dette emne, men har kjørt med dette oppsettet en god stund og mener det er satt opp på en sikker måte (basert på forskjellige guider på nett). Jeg tar likevel ikke noe ansvar for evt "sikkerhetshull" som måtte bli innført ved å følge denne oppskriften.
Homeseer har en innstilling for å bruke https, men den har ikke blitt oppdatert på lang tid og fungerer delvis ikke i det hele tatt og baserer seg på krypteringsmetoder som ikke er regnet som sikre lengre.
Hvorfor bør man kjøre kryptering?
All kommunikasjon mot HS-serveren direkte (ikke via myHS) går ukryptert på nettverket. Dvs at hvem som helst som har tilgang til nettverket et eller annet sted på veien fra deg og til serveren, kan se all kommunikasjon (også brukernavn/passord). Det er også enkelt for uvedkommende å sette opp en falsk HomeSeer-server og dermed lure deg til å taste inn brukernavn/passord mot den, fordi du ikke kan verifisere at det faktisk er "din" server du logger deg på.
Hvordan?
Siden HomeSeer sin krypteringsløsning er ubrukelig, må vi sette opp en tjeneste (som kan kjøre på samme maskin) som tar seg av krypteringen/sikkerheten, før kommunikasjonen sendes videre til HomeSeer. Til dette bruker vi "nginx" som "reverse proxy". Nginx er en webserver, som kan sammenlignes med Apache (som kanskje er mer kjent).
Se bilde som illustrerer dette:
Forutsetninger:
Jeg kjører dette på Linux (Ubuntu 16.04) og noen av trinnene vil nok være forskjellige på Windows. Da er vi så heldig at @Moskus kjører tilsvarende oppsett på Windows og kan "fill out the blanks"!
Komme i gang:
1. Klargjøre Homeseer
nginx skal overta kommunikasjonen mot klienten, dermed må den svare på forespørsler på de vanlige web-portene (80 og 443), i stedet for HomeSeer.
a. Start derfor med å bytte port som HomeSeer lytter på til f.eks port 85 via "tools->setup->network-> server port (80=default)".
b. Slå av "System is Discoverable Using UPNP".
c. Slå på "No Password Required for Local/Same Network Login (Web Browser/HSTouch)".
Restart HS og sjekk at du fortsatt kommer inn via http://<ip>:85 før du går videre (merk at om du kjører brannmur på serveren eller noe sted mellom deg og serveren, så må du også der legge til åpning for port 85 midlertidig, inntil du har alt oppe og går).
2. Last ned og installer nginx: Guide for Ubuntu 16.04
Hvis du bruker ufw-brannmuren, bruk "Nginx Full" (ikke bare "Nginx HTTP", som det står i den guiden).
3. Sett opp kryptering med sertifikater på nginx
Her har du 2 valg:
a. Skaffe et offentlig sertifikat
Offenlig sertifikat kan f.eks være fra letsencrypt.org eller man kan kjøpe ett ganske billig. Det forutsetter at man har et domene som peker mot routeren din hjemme (f.eks via DynDns) og at man har satt opp portforwarding på portene på routeren mot HS-serveren (80 og 443). Dette er i utgangspunktet litt mer komplisert enn alternativ b, men det gjør at man slipper å få slike advarsler fra nettleseren:
I tillegg vil man kunne verifisere at man faktisk snakker med SIN server med et slikt sertifitkat, for med alternativ b, så kan man i utgangspunktet ikke verifisere om advarselen kommer fra sin server eller om noen har satt opp en falsk server som utgir seg for å være din. Man kan oppnå dette i alternativ b også, men det er litt mer jobb.
b. Bruke et "selvsignert" sertifikat
Det betyr at serveren signerer sitt eget sertifikat og klientene har da ingen sertifikatutsteder (CA, Certificate Authority) de kan verifisere at sertifikatet er ekte mot.
Jeg har valgt en variant av alternativ b, for jeg har ikke eksponert HS mot internett (jeg bruker VPN inn på nettverket mitt og så kommuniserer jeg med HS på LANet). Mitt hovedformål var å sørge for at informasjonen var kryptert og det oppnår man med alternativ b. Jeg har likevel omgått den advarselen og sikret at jeg får verifisert at det er MIN server jeg kobler på.
Alternativ a:
Her er en guide på hvordan bruke letsencrypt.org sine gratis sertifikater mot nginx på Ubuntu 16.04:
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04
Dette forutsetter at port 80 og 443 videresendes fra routeren din til HS-serveren og at du har et domene tilknyttet IPen til routeren din.
Alternativ b:
Her er en guide på hvordan utstede egne sertifikater for nginx på Ubuntu 16.04:
https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-nginx-in-ubuntu-16-04
Jeg har egentlig valgt å ingen av alternativene over, jeg kjører pfSense som router og den har en egen "certificate manager". Jeg har valgt å utstede sertifikater via den, som jeg har overført og installert på HS-serveren. Deretter har jeg lastet ned CA-sertifikatet (altså sertifikatutsteder-sertifikatet) fra pfSense og installert dette som et godkjent root-sertifikat på PCen min og mobilen min. Det gjør at når jeg går inn på webserveren fra PCen/mobilen, så slipper jeg den advarselen som er vist over, for PCen/mobilen verifiserer da mot pfSense at sertifikatet er ekte/gyldig. På den måten oppnår jeg at jeg får både kryptert kommunikasjonen OG jeg får verifisert at serveren faktisk er min server og ikke en falsk en.
Før du går videre, sjekk at du får opp standard websiden til nginx via https://<ip> (bruker du alternativ b, må du bekrefte at du ønsker å gå videre forbi sikkerhetsadvarselen før du får opp siden).
4. Da er det klart for å konfigurere nginx som reverse proxy mot HS:
Opprinnelig hentet fra denne tråden:
https://forums.homeseer.com/showthread.php?t=178990
Ta først en backup av /etc/nginx/sites-available/default.
Bytt den deretter ut med denne filen (husk å endre filbane til HS-mappen din!).
Her er filen jeg bruker (jeg har gjort noen endringer på den før jeg la den ut her, for jeg bruker nginx til andre tjenester også, så jeg håper jeg ikke har tatt vekk noe som må være der):
Da er det bare å ta en "sudo nginx -t", for å sjekke at det ikke er noe feil i konfig, deretter "sudo service nginx reload" og sjekke at du kommer inn på HS3 ved å gå på både http://<ip> og https://<ip>
Til slutt fjerner du den midlertidige åpningen for port 85 i brannmuren (hvis du kjører ufw, så må 127.0.0.1 fortsatt ha tilgang, men ingen andre).
Et par ekstra sikkerhetsmekanismer å vurdere:
1. Sette " "tools->setup->network->Bind Server to IP Address" til 127.0.0.1, slik at man MÅ inn via nginx (ellers kan man logge på via http://<ip>:85, uten passord!)
(dette er jo også løsbart ved å blokkere tilgangen til port 85 i brannmur i stedet)
2. Sette opp "fail2ban", slik at ugyldige pålogginger fører til IP-ban
3. Sette opp IP-filter i brannmuren (f.eks pfSense), slik at bare norske IP-adresser blir sluppet gjennom
4. Sette opp "monit" til å monitorere både HS og nginx og restarte tjenestene automatisk hvis de feiler