Ankündigung

Einklappen
Keine Ankündigung bisher.

Reverse Proxy

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Max2612
    antwortet
    psilo Danke für dein Beispiel... hab's schon etwas studiert.

    Jetzt habe ich ein paar Verständnisfragen.

    1. Diese Zertifikate
    Code:
    ssl_certificate /etc/letsencrypt/live/xxx.dyndns.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xxx.dyndns.de/privkey.pem;
    haben nichts mit diesen zu tun?? Richtig??
    Code:
    ssl_client_certificate /etc/ssl/ca/certs/ca.crt;
    ssl_crl /etc/ssl/ca/private/ca.crl;
    ssl_verify_client optional;
    2. Sollte es (wenn 1. = richtig) dann möglich sein, mit
    Code:
    server {
        server_tokens off;
    
        listen 443 ssl default_server;
        server_name xxx.dyndns.de;
    
        ##
        # SSL
        ##
    
        ssl on;
        ssl_certificate /etc/letsencrypt/live/xxx.dyndns.de/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/xxx.dyndns.de/privkey.pem;
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_ciphers    HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!RC4;
    
        add_header Strict-Transport-Security "max-age 31536000; includeSubDomains";
    
        ##
        # global
        ##
    
        root /var/www/xxx.dyndns.de;
        index index.php index.htm index.html;
    
    
      location /smartVISU {
    
            auth_basic "Restricted Area: smartVISU";
            auth_basic_user_file /etc/nginx/.htpasswd;
    
    
            proxy_pass https://192.168.178.100/smartVISU;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    über https://xyz.dyndns.de/smartVISU die Visu zu erreichen? Oder sind die Zertifikate unbedingt erforderlich?

    Vielleicht kannst du mir die 2 Fragen kurz beantworten??

    Gruß, Max

    Einen Kommentar schreiben:


  • psilo
    antwortet
    Hier ist noch meine nginx.conf:

    Code:
    user www-data;
    worker_processes 4;
    pid /run/nginx.pid;
    
    events {
            worker_connections 768;
            # multi_accept on;
    }
    
    http {
    
            ##
            # GeoIP Settings
            ##
            geoip_country /usr/share/GeoIP/GeoIP.dat;
            map $geoip_country_code $allowed_country {
                    default yes;
                    BY no;
                    BR no;
                    KP no;
                    KR no;
                    RS no;
                    RO no;
                    RU no;
                    CN no;
                    CD no;
                    NE no;
                    GH no;
                    IQ no;
                    IR no;
                    SY no;
                    UA no;
            }
    
            ##
            # Basic Settings
            ##
    
            sendfile on;
            tcp_nopush on;
            tcp_nodelay on;
            types_hash_max_size 2048;
    
            server_names_hash_bucket_size 64;
    
            include /etc/nginx/mime.types;
            default_type application/octet-stream;
    
            ##
            # SSL Settings
            ##
    
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
            ssl_prefer_server_ciphers on;
    
            ##
            # Logging Settings
            ##
    
            access_log /var/log/nginx/access.log;
            error_log /var/log/nginx/error.log;
    
            ##
            # Gzip Settings
            ##
    
            gzip on;
            gzip_disable "msie6";
    
            gzip_min_length   1100;
            gzip_vary         on;
            gzip_proxied      any;
            gzip_buffers      16 8k;
            gzip_comp_level   6;
            gzip_http_version 1.1;
            gzip_types        text/plain text/css application/json application/x-javascript text/xml application/xml
                              application/rss+xml text/javascript images/svg+xml application/x-font-ttf font/opentype
                              application/vnd.ms-fontobject;
    
            ##
            # Virtual Host Configs
            ##
    
            include /etc/nginx/conf.d/*.conf;
            include /etc/nginx/sites-enabled/*;
    
            ##
            ##
            # Harden nginx against DDOS
            ##
    
            client_header_timeout 10;
            client_body_timeout   10;
            keepalive_timeout     10 10;
            send_timeout          10;
    }

    Einen Kommentar schreiben:


  • psilo
    antwortet
    Mit listen 80 hast Du halt auf HTTP Port 80 etwas offen. Das brauchst Du meiner Meinung nach temporär, da die LetsEncrypt Zertifikaterstellung einen Callback gegen Port 80 macht.
    Ich würde es am Ende aber auf jeden Fall dicht machen bzw. Anfragen mit 403er Error quittieren. Für alles andere reicht HTTPS und ist auch wesentlich sinnvoller/sicherer.

    Ich poste nochmal heute Abend meine vollständige Konfiguration, es gibt noch eine globale Konfig-Datei, wo bspw. das mit den Ländern drinsteckt. Vielleicht dokumentiere ich auch mal im SNHG Wiki wie das gesamthaft funktioniert. Ich habe ja auch noch zur Sicherheit meine Firewall durchkonfiguriert.

    Ich habe bei mir allerdings einen eigenen Raspberry Pi, der ausschliesslich als ReverseProxy agiert (und damit im Fall eines Angriffs getrennte Hardware). Evtl reagiert das etwas anders, als wenn alles auf der selben Maschine läuft. Die paar Euro in die Trennung würde ich aber auf jdn. Fall investieren, da so kein Datenstrom direkt auf Dein HomeAutomation-System offen ist.
    Zuletzt geändert von psilo; 26.09.2017, 06:42.

    Einen Kommentar schreiben:


  • Max2612
    antwortet
    Ja, das hab ich vor. Ist dein Beispiel eigentlich komplett, oder hast du noch irgendetwas, das zum nginx gehört? (Außer die Länderabfrage) php-fpm oder so?

    Was ich überhaupt noch nicht verstehe, ist, warum ich einen Teil listen 80 habe, und du nicht.

    Kannst mir das kurz laienhaft erklären??

    Gruß, Max

    Einen Kommentar schreiben:


  • psilo
    antwortet
    Max2612 nimm dir mal ein wochenende zeit fuer das Thema und durchdenke mein beispiel. dann geht das schon. alles nicht so schwer

    Einen Kommentar schreiben:


  • Max2612
    antwortet
    Zitat von psilo Beitrag anzeigen
    Ich glaube Du kopierst wild Zeug zusammen und verstehst eben nicht so recht, was Du tust
    Da muss ich dir leider zu 100% Recht geben. Netzwerktechnisch hab ich so gut wie 0 Ahnung...
    Dann bleib ich erstmal bei VPN.

    Vielleicht verstehe ich's ja irgenwann mal...

    Einen Kommentar schreiben:


  • psilo
    antwortet
    achja und was wird denn hier included?
    include /etc/nginx/include.d/common;

    noch ein guter Tipp: in die Logs schauen und Fehleranalyse machen ;-) Anders wirst Du den Thema nicht Herr werden.

    Gegen welche URL geht denn Alexa? Bei mir gegen "/alexa". da habe ich natürlich das HTTP_UPGRADE NICHT drin. Das prüft eben explizit auf eine Websocket-Verbindung und das ist etwas anderes als der Callback, den AWS macht.. die Websocket-Verbindung hast Du nur von SV nach SH. Wenn Dich das VPN nicht stört würde ich aber ernsthaft eher den Use Case "SmartVISU im VPN" und Alexa via NGINX anstreben.. Wenn Du kein VPN willst, musst Du an Clientzertifikaten vorbei.. Und das wird noch heftiger als das hier

    Ich übertrage nochmal - hier sieht man gut unterschiedliche Regeln je Kontextpfad.. :

    Code:
    server {
        server_tokens off;
    
        if ($allowed_country = no) {
            return 403;
        }    
        if ($http_user_agent ~* LWP::Simple|BBBike) {
            return 403;
        }
        if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex) ) {
             return 403;
        }
    
        listen 443 ssl default_server;
        server_name xxx.dyndns.de;
    
        ##
        # SSL
        ##
    
        ssl on;
        ssl_certificate /etc/letsencrypt/live/xxx.dyndns.de/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/xxx.dyndns.de/privkey.pem;
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_ciphers    HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!RC4;
    
        ssl_client_certificate /etc/ssl/ca/certs/ca.crt;
        ssl_crl /etc/ssl/ca/private/ca.crl;
        ssl_verify_client optional;
        # client certifcate creation: https://arcweb.co/securing-websites-nginx-and-client-side-certificate-authentication-linux/
        ssl_session_timeout 5m;
    
    
        ##
        # HSTS
        ##
    
        add_header Strict-Transport-Security "max-age 31536000; includeSubDomains";
    
        ##
        # global
        ##
    
        root /var/www/xxx.dyndns.de;
        index index.php index.htm index.html;
    
    [COLOR=#00FF00]  location / {    
            if ($ssl_client_verify != SUCCESS) {
                    return 403;
                    break;
            }
    
            if ($http_upgrade = websocket) {
                proxy_pass http://192.168.178.100:2424;
            }
            if ($http_upgrade != websocket) {
                 return 403;
            }
        }[/COLOR]
    
    [COLOR=#EE82EE]  location = /privacy.htm { }    [/COLOR]
    
    [COLOR=#FFA07A]  location /smartVISU {
            if ($ssl_client_verify != SUCCESS) {
                return 403;
                break;
            }
            #auth_basic "Restricted Area: smartVISU";
            #auth_basic_user_file /etc/nginx/.htpasswd;
    
            if ($allowed_country = no)  {
                    return 403;
            }
            proxy_pass https://192.168.178.100/smartVISU;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }[/COLOR]
    
        location /video {
            if ($ssl_client_verify != SUCCESS) {
                return 403;
                break;
            }
            #auth_basic "Restricted Area: FlurCam";
            #auth_basic_user_file /etc/nginx/.flurcam;
    
            if ($allowed_country = no)  {
                    return 403;
            }
            proxy_pass http://192.168.178.40/video;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Authorization "Basic xxxxxxxxxxxxxxxxxxxxxxx";
        }
    
    [COLOR=#DAA520]  location /alexa {
            auth_basic "Restricted Area: Alexa";
            auth_basic_user_file /etc/nginx/.alexa;
    
            if ($allowed_country = no) {
                return 403;
            }
            proxy_pass http://192.168.178.100:9000/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }   [/COLOR]
    
        location /shng {
            auth_basic "Restricted Area: SmartHomeNG";
            auth_basic_user_file /etc/nginx/.shng;
    
            if ($allowed_country = no) {
                return 403;
            }
            proxy_pass http://192.168.178.100:8888/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    Konfigurationsfehler oder den Bug in der smarthome_io findest Du über die Javascript Konsole raus.. Da habe ich gesehen, dass die Requests nichts wie konfiguriert gegen 443 gingen.

    Achja: die farblich oben markierten dürften für Dich relevant sein.

    Aber nochmal:

    Erstmal ein Ding umsetzen, dann verifizieren, dass Du verstehst was Du umgesetzt hast. Dann das nächste.. Ich glaube Du kopierst wild Zeug zusammen und verstehst eben nicht so recht, was Du tust
    Zuletzt geändert von psilo; 25.09.2017, 18:32.

    Einen Kommentar schreiben:


  • psilo
    antwortet
    wo stehen denn die ganzen SSL sachen bei Dir? Ich würde zudem erstmal nur HTTP Port 80 ODER HTTPS Port 443 versuchen.. Sonst kann es da komische nebeneffekte geben. Schau Dir bitte mein gesamtes File im anderen Thread an

    ssl on;
    ssl_certificate /etc/letsencrypt/live/xxx.dyndns.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xxx.dyndns.deprivkey.pem;
    ssl_session_cache builtin:1000 shared:SSL:10m;
    ssl_ciphers HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!RC4;

    Einen Kommentar schreiben:


  • Max2612
    antwortet
    Ich hab's jetzt mal so versucht.
    Code:
    upstream php {    
      server localhost:9090;
    }    
    
    server {    
      listen 80 default_server;    
      server_name xyz.spdns.eu;    
      satisfy any;    
      allow 192.168.1.0/24;    
      deny all;    
      auth_basic "SmartVisu Anmeldung";    
      auth_basic_user_file /etc/nginx/htpasswd.smartvisu;    
      root /var/www/html;    
      index index.php index.html index.htm;    
    
      location / {       
        if ($http_upgrade = websocket) {
                proxy_pass http://192.168.1.13:2424;
            }
    
      }    
    
      location ~ \.php$ {      
        include /etc/nginx/fastcgi_params;          
        fastcgi_pass 127.0.0.1:9090;          
        fastcgi_read_timeout 300;        
        fastcgi_index index.php;      
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
      }    
    
     location /.well-known {              
        allow all;    
      }
    
    }  
     # Alexa  
    
    server {    
      listen 443 ssl default_server;    
      server_name xyz.spdns.eu;    
      access_log /var/log/nginx/alexa.log combined;    
    
      include /etc/nginx/include.d/common;      
    
      location / {        
    
        if ($http_upgrade = websocket) {
                proxy_pass http://192.168.1.13:2424;
            }
    #        if ($http_upgrade != websocket) {
    #             return 403;
    #        }
    
        auth_basic "Alexa";    
        auth_basic_user_file /etc/nginx/htpasswd.alexa;
    
        proxy_pass http://192.168.1.13:9000/;    
        proxy_set_header Host $host;        
        proxy_set_header X-Real-IP $remote_addr;        
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    
      }  
    }
    Das bringt jedoch keine Änderung.
    Wenn ich
    Code:
    # if ($http_upgrade != websocket) {
    #     return 403;
    # }
    das stehen lasse, geht auch Alexa nicht mehr.

    Wo müsste man den smarthome io.treiber anpassen?

    Einen Kommentar schreiben:


  • psilo
    antwortet
    wo ist die weiterleitungsregel für deine websocket verbindung?

    im anderen thread habe ich mein beispiel gepostet.

    das sind übrigens meine websocket anteile:
    Code:
        location / {    
    [COLOR=#FF0000]     if ($ssl_client_verify != SUCCESS) {
                return 403;
                 break;
            }[/COLOR]
    
            if ($http_upgrade = websocket) {
                proxy_pass http://192.168.178.100:2424;
            }
            if ($http_upgrade != websocket) {
                 return 403;
            }
        }
    der rote Teil ist für meine Clientzertifikate.

    die websockets gehen nicht auf einen kontextpfad, daher musst du sie auf "/" durchrouten. ob man einen pfad in der SV konfig mit angeben kann, habe ich nicht probiert.

    in der config.ini muss deine dyndns domain rein und der ssl port:
    Code:
    driver_address = "xxx.dyndns.de"
    driver_port = "443"
    dann gab es da noch einen bug mit der konfiguration und dem smarthome_io treiber. ich weiss nicht, ob smai das inzwischen behoben hat? ich musste den 443er auch noch direkt in den driver reinschreiben

    PS: NGINX auf einer eigenen Hardware vor SmartVisu und SHNG ist eine super Sache. Du solltest aber wirklich verstehen, was Deine Regeln machen. Fang ab besten bei Null an und kopiere nicht blind Beispiele rein. Sonst hast du am Ende eine vollkommen unsichere Konfiguration.. Man kann auch viel falsch machen.

    Ich kann auch schwer empfehlen, sich in das Thema Security in diesem Kontext etwas einzulesen.

    Und wenn das alles zu hoch ist: Alexa via NGINX und Basic Auth. SmartVISU nur im VPN... dann ist alles easy und Du kannst lokale IPs nehmen und NGINX wird übersprungen, wenn Du es richtig machst..
    Zuletzt geändert von psilo; 25.09.2017, 17:06.

    Einen Kommentar schreiben:


  • Max2612
    antwortet
    Hallo Miteinander!

    Ich stehe auch gerade vor dem Problem, dass die Visu hinter meinem Reverse-Proxy zwar erreichbar ist, aber im Offline-Modus.
    Meine nginx Konfiguration sieht im Moment so aus: (nginx war nötig, um das Alexa Plugin zu nutzen)
    Code:
    upstream php {    
      server localhost:9090;
    }    
    
    server {    
      listen 80 default_server;    
      server_name xyz.spdns.eu;    
      satisfy any;    
      allow 192.168.1.0/24;    
      deny all;    
      auth_basic "SmartVisu Anmeldung";    
      auth_basic_user_file /etc/nginx/htpasswd.smartvisu;    
      root /var/www/html;    
      index index.php index.html index.htm;    
    
      location / {      
         autoindex on;    
      }    
    
      location ~ \.php$ {      
        include /etc/nginx/fastcgi_params;          
        fastcgi_pass 127.0.0.1:9090;          
        fastcgi_read_timeout 300;        
        fastcgi_index index.php;      
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
      }    
    
     location /.well-known {              
        allow all;    
      }
    
    }  
     # Alexa  
    
    server {    
      listen 443 ssl default_server;    
      server_name xyz.spdns.eu;    
      access_log /var/log/nginx/alexa.log combined;    
      auth_basic "Alexa";    
      auth_basic_user_file /etc/nginx/htpasswd.alexa;    
      include /etc/nginx/include.d/common;      
    
      location / {        
        proxy_pass http://192.168.1.13:9000/;    
        proxy_set_header Host $host;        
        proxy_set_header X-Real-IP $remote_addr;        
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    
      }  
    }
    Ich habe aber leider keine Ahnung, wie ich diese nun ändern muss, dass auch der Websocket funktioniert.
    Kann mir hier jemand dabei helfen?

    Gruß, Max

    Einen Kommentar schreiben:


  • psilo
    antwortet
    Vielleicht hier die Variante, die ich verwende, um die Clientzertifikate nur auf / (für die Websocket-Connection bzw auf /smartVISU einzusetzen, und auf allem anderen nicht. Im Beispiel das Network Plugin von SHNG (für EgiGeoZone) ohne Clientzertifikate nur mit Basic Auth.

    Auf iOS habe ichs aber noch nicht getestet, da wo ich die Lösung her hatte stand, dass Safari hier wohl manchmal Probleme macht:
    Code:
    ssl_verify_client optional;
    ssl_session_timeout 5m;
    [...]
    location / {
            if ($ssl_client_verify != SUCCESS) {
                            return 403;
                            break;
                    }
    
            if ($http_upgrade = websocket) {
                proxy_pass http://192.168.178.100:2424;
            }
            if ($http_upgrade != websocket) {
                 return 403;
            }
        }
    
    location /smartVISU {
            if ($ssl_client_verify != SUCCESS) {
                return 403;
                break;
            }
    
            if ($allowed_country = no)  {
                    return 403;
            }
            proxy_pass https://192.168.178.100/smartVISU;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
    }
    
    location /shng {
            auth_basic "Restricted Area: SmartHomeNG";
            auth_basic_user_file /etc/nginx/.shng;
    
            if ($allowed_country = no) {
                return 403;
            }
            proxy_pass http://192.168.178.100:8888/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    Und das hier war sehr sinnvoll für die Client-Zertifikate Erstellung: https://arcweb.co/securing-websites-...ication-linux/
    Zuletzt geändert von psilo; 04.07.2017, 15:21.

    Einen Kommentar schreiben:


  • malte
    antwortet
    McTao: die "Apple Welt" scheint aktuell leider abgehangen zu sein. Die entsprechenden Configs findest du eigentlich vollständig in den vorherigen Posts:
    #17: Überblick
    #12: Config

    Wenn du es auf MacOS und/oder iOS ans Laufen gebracht hast, lass es mich wissen ;-)

    Einen Kommentar schreiben:


  • McTao
    antwortet
    Zitat von psilo Beitrag anzeigen
    Nach Installation eines Clientzertifikats geht nun auch alles. habe es sogar hinbekommen, dass bestimmte Pfade nur via Basic Auth, andere via Clientzertifikat gesichert sind.
    Kannst du eine anonymisierte Einstellungsdaten (proxy conf) posten. Ich habe das zwar mal vor Jahren unter Apache gemacht, möchte aber nicht wieder von vorne anfangen. Eine Conf kann ich lesen und mit meinem alten Wissen dann anpassen. Besonders der Teil mit der unterschiedl. Auth klingt interessant.

    Würde es dann in der Apple Welt nutzen.

    Gruss Andreas

    Einen Kommentar schreiben:


  • psilo
    antwortet
    Mal eine dumme Frage: Port 443 ist gemäß der hier diskutierten Lösung dann doch für jegliche Websocketverbindung offen im Netz via Port 443 erreichbar, richtig?
    Das ist natürlich etwas unschön...

    PS: ok sehe gerade, dass Clientzertifikate genutzt werden.. Dann muss ich das wohl auch noch einrichten.

    PPS: Nach Installation eines Clientzertifikats geht nun auch alles. habe es sogar hinbekommen, dass bestimmte Pfade nur via Basic Auth, andere via Clientzertifikat gesichert sind.
    Zuletzt geändert von psilo; 02.07.2017, 10:34.

    Einen Kommentar schreiben:

Lädt...
X