web-dev-qa-db-fra.com

Sécurisation des caméras IP accessibles à distance qui ne prennent pas en charge HTTPS

J'ai des caméras IP installées sur mon réseau domestique, qui est protégé par WPA2. Ces caméras sont configurées pour être accessibles depuis Internet via l'adresse DDNS et le numéro de port de mon routeur.

Ainsi, par exemple, depuis mon PC de bureau, je peux aller sur http://urltomyrouter.com:12345 pour voir la caméra n ° 1 après avoir entré mon nom d'utilisateur et mon mot de passe.

Ces caméras sont des Foscams FI8910W et ne prennent pas en charge HTTPS. Mon routeur est d'ailleurs un Asus RT-N56U.

Je suppose que mes informations d'identification que j'utilise pour me connecter aux caméras sont envoyées en clair et non cryptées, ce qui n'est pas sûr.

Quelles sont mes options pour résoudre ce problème et sécuriser mon accès?

J'ai lu quelque part qu'un "proxy inverse" est une solution possible mais je ne sais pas comment cela fonctionnerait ...

16
unknownprotocol

Je vais supposer que votre routeur n'est pas assez intelligent pour configurer lui-même un proxy inverse chiffré.

Conventions utilisées ci-dessous

Vérifications initiales

Sur le réseau local, pouvez-vous voir la webcam à http://192.168.0.123:456? Génial. Ne pouvez-vous pas vous connecter à la webcam depuis le monde extérieur (c'est-à-dire http://1.2.3.4:456 le pare-feu est-il désactivé)? Génial. Sinon, reconfigurez votre webcam et les règles de redirection de port/pare-feu sur votre routeur.

Ensuite, installez un serveur Web sur un ordinateur de votre réseau local qui est allumé chaque fois que vous souhaitez vous connecter à votre webcam. Je vais supposer linux/unix et donner des instructions pour nginx.

Comme test initial, configurez un proxy inverse sans chiffrement. Installez la dernière version de nginx, éditez le fichier de configuration (/etc/nginx/conf.d/default.conf) et ajoutez des lignes similaires à:

server {
  listen 8080;
  location / {
      proxy_pass http://192.168.0.123:456; 
  } # replace with your webcam's local IP address and port.
}

Redémarrez maintenant nginx (Sudo /etc/init.d/nginx restart) et essayez de vous connecter au proxy (http://192.168.0.101:8080) et cela devrait fonctionner comme si vous alliez à http://192.168.0.123:456. Si vous avez des problèmes, vérifiez à nouveau tout ou consultez la documentation nginx .

Obtention d'un certificat TLS/SSL

Vous devez maintenant ajouter un certificat SSL et la clé privée associée. Vous pouvez en générer un signé par une autorité de certification (par exemple, à partir de startssl.com gratuitement) ou en générer un vous-même qui est auto-signé (et qui ne sera pas initialement approuvé par les navigateurs Web). La configuration d'un certificat signé par une autorité de certification sera plus compliquée pour un réseau domestique où vous devrez obtenir un nom de domaine (que vous pouvez prouver à l'autorité de certification que vous possédez), configurer un DNS dynamique avec ce nom de domaine, etc. (si vous essayez de démarrer avec Dynamic DNS - https://freedns.afraid.org/ est un excellent point de départ).

Pour générer un certificat auto-signé, utilisez d'abord openssl pour créer une clé privée (dans ce cas, une clé privée RSA 4096 bits):

# openssl genrsa -out private.key 4096

Si vous êtes curieux, vous pouvez afficher le contenu avec openssl rsa -in private.key -text -noout. Ensuite, vous devez générer un certificat basé sur cette clé privée, ce qui peut être fait avec:

# openssl req -new -x509 -key private.key -out yourcert.crt -days 3650

Le 3650 indique qu'il expirera dans 3650 jours (~ 10 ans). Openssl vous demandera plus de détails, n'hésitez pas à les laisser vides ou à y mettre des informations. (Vous pouvez afficher le contenu de votre certificat avec openssl x509 -in yourcert.crt -text -noout).

Placez maintenant votre clé privée et votre certificat dans un endroit sûr (par exemple, dans /etc/ssl/private/private.key et /etc/ssl/certs/yourcert.crt), restreignez leurs autorisations (assurez-vous qu'elles appartiennent à root et que personne d'autre n'a les autorisations de lecture/écriture).

Activer SSL dans le proxy inverse

Modifiez ensuite votre fichier de configuration du serveur nginx pour activer SSL comme suit:

server {
   listen 443; # doesn't have to be port 443 - could be any port (say 8080) if you 
               # connect via https://192.168.0.101:8080 .  But on port 443
               # you can just use https://192.168.0.101
   ssl on;
   ssl_certificate  /etc/ssl/certs/yourcert.crt;
   ssl_certificate_key  /etc/ssl/private/private.key;
   # certificate and private key where you just placed them

   ssl_session_timeout  5m;    
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_prefer_server_ciphers on;
   ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
   # reasonable SSL configuration, disable some known weak ciphers.

   location / {
     proxy_pass http://192.168.0.123:456;
     proxy_redirect http://192.168.0.123:456/ $scheme://$Host:$server_port/;
 # If your webcam (or other proxied application) ever gives URLs in the HTTP headers
 # (e.g., in a 302 or 304 HTTP redirect),
 # the proxy_redirect line changes the URL in the HTTP header field
 # from http://192.168.0.123:456/some/path to https://192.168.0.1:8080/some/path
   }
}

Redémarrez nginx et vous devriez maintenant pouvoir vous connecter à votre webcam sur votre réseau local à https://192.168.0.101 (vous obtiendrez des avertissements concernant le certificat non approuvé car il s'agit d'un certificat auto-signé).

Configurez la redirection de port dans votre routeur

La dernière étape consiste à configurer votre routeur pour effectuer la redirection de port. C'est lorsque vous vous connectez à https://1.2.3.4 (port 443) du monde extérieur, configurez-le pour rediriger vers 192.168.0.101 (port 443). Configurer éventuellement un DNS dynamique, donc si votre adresse IP personnelle change, elle pointe toujours au bon endroit. Certains FAI bloquent les ports 80 et 443, vous devrez donc peut-être le changer pour un autre port.

Faites attention à la façon dont vous vous connectez. J'ai remarqué que de nombreux programmes de caméras IP ne vérifient pas la confiance des certificats (car ils sont souvent auto-signés), donc un attaquant pourrait éventuellement faire une attaque MitM en insérant un certificat auto-signé différent. Il est préférable d'ajouter votre certificat auto-signé pour faire confiance à votre propre navigateur et de le rejeter s'il change.

13
dr jimbob

Votre routeur ne fait que transmettre des paquets, quel que soit le protocole qui le sous-tend dicte la sécurité. Vous pouvez en effet, comme vous l'avez mentionné, être un proxy inverse qui écoute sur une connexion HTTPS et transmet tout à une connexion HTTP. Cela peut être fait facilement en utilisant mod_proxy d'Apache.

Alternativement, cela peut sembler un peu exagéré, mais un bon moyen serait de configurer un VPN auquel vous pouvez vous connecter. Cela peut être fait facilement (et gratuitement) avec OpenVPN . Vous termineriez en toute sécurité un tunnel sur votre réseau local, puis vous pourrez accéder à toutes les ressources internes. Cela peut vous donner plus de flexibilité à l'avenir; vous pouvez accéder à l'ensemble de votre réseau.

Quoi qu'il en soit, les écoutes ne verront rien, car vous êtes tunnelé dans une connexion cryptée et authentifiée.

3
ndrix