web-dev-qa-db-ja.com

HTTPSをサポートしていないリモートアクセス可能なIPカメラの保護

ホームネットワークにWPA2で保護されたIPカメラをいくつかセットアップしています。これらのカメラは、ルーターのDDNSアドレスとポート番号を介してインターネットからアクセスできるように設定されています。

たとえば、オフィスPCから http://urltomyrouter.com:12345 にアクセスして、ユーザー名とパスワードを入力した後でcam#1を表示できます。

これらのカメラはFoscams FI8910Wであり、HTTPSをサポートしていません。ちなみに私のルーターはAsus RT-N56Uです。

私がカメラへのログインに使用する私の資格情報はプレーンテキストで送信されており、暗号化されていないため、安全ではないと思います。

これを修正してアクセスをより安全にするための私の選択肢は何ですか?

「リバースプロキシ」が可能な解決策であるとどこかで読みましたが、それがどのように機能するかわかりません...

16
unknownprotocol

私はあなたのルーターがそれ自体で暗号化されたリバースプロキシを設定するのに十分スマートではないと仮定します。

以下で使用される規約

  • ホームIPアドレス:1.2.3.4( Googleで自分のIPアドレスを検索
  • WebCam IPアドレス/ポート:ポート456の192.168.0.123
  • リバースプロキシを実行しているLinux/Unixコンピューター:192.168.0.101

初期チェック

ローカルネットワークのhttp://192.168.0.123:456でウェブカメラを見ることができますか?すごい。外部からWebカメラに接続できませんか(つまり、http://1.2.3.4:456はファイアウォールで保護されています)。すごい。そうでない場合は、ルーターでWebカメラとポート転送/ファイアウォールルールを再構成してください。

次に、ウェブカメラに接続するたびにオンになっているローカルネットワーク上のコンピューターにウェブサーバーをインストールします。 linux/unixを想定して、nginxの手順を説明します。

最初のテストとして、暗号化なしでリバースプロキシを設定します。 nginxの最新バージョンをインストールし、構成ファイル(/etc/nginx/conf.d/default.conf)を編集して、次のような行を追加します。

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

ここでnginx(Sudo /etc/init.d/nginx restart)を再起動し、プロキシ(http://192.168.0.101:8080)に接続してみてください。これは、http://192.168.0.123:456にアクセスした場合と同じように機能するはずです。問題が発生した場合は、すべてをもう一度確認するか、 nginxのドキュメントを参照 してください。

TLS/SSL証明書の取得

次に、SSL証明書と関連する秘密鍵を追加する必要があります。認証局によって署名されたもの(たとえば、startssl.comから無料で)を生成することも、自己署名されたものを自分で生成することもできます(最初はWebブラウザーによって信頼されません)。ドメイン名(所有しているCAに証明できる)を取得したり、そのドメイン名に動的DNSを設定したりする必要があるホームネットワークでは、CA署名付き証明書の設定はより複雑になります(もしダイナミックDNSを使い始めようとしている- https://freedns.afraid.org/ から始めるのが最適です)。

自己署名証明書を生成するには、最初にopensslを使用して秘密鍵(この場合は4096ビットのRSA秘密鍵)を作成します。

# openssl genrsa -out private.key 4096

興味があれば、openssl rsa -in private.key -text -nooutでコンテンツを表示できます。次に、その秘密鍵に基づいて証明書を生成する必要があります。これは、次のように実行できます。

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

3650は3650日(〜10年)で期限が切れると言っています。 opensslは、詳細の入力を求めるプロンプトを表示します。空白のままにするか、そこに情報を入力してください。 (証明書の内容はopenssl x509 -in yourcert.crt -text -nooutで確認できます)。

秘密鍵と証明書を安全な場所に(たとえば、/etc/ssl/private/private.keyおよび/etc/ssl/certs/yourcert.crtに)配置し、それらの権限を制限します(rootが所有し、他のユーザーが読み取り/書き込み権限を持っていないことを確認してください)。

リバースプロキシでSSLをオンにする

次に、nginxサーバー構成ファイルを編集して、次のようにSSLを有効にします。

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
   }
}

Nginxを再起動すると、https://192.168.0.101でローカルネットワーク上のWebカメラに接続できるようになります(自己署名証明書であるため、証明書が信頼できないという警告が表示されます)。

ルーターのポート転送を設定します

最後のステップは、ポート転送を行うようにルーターを構成することです。つまり、外部からhttps://1.2.3.4(ポート443)に接続する場合は、ポート転送を192.168.0.101(ポート443)に設定します。おそらく、ダイナミックDNSをセットアップして、ホームIPアドレスが変更されても正しい場所を指すようにします。一部のISPはポート80と443をブロックしているため、他のポートに変更する必要がある場合があります。

接続方法に注意してください。多くのIPカメラプログラムが証明書の信頼性をチェックしない(多くの場合、自己署名されているため)ため、攻撃者は別の自己署名証明書を挿入してMitM攻撃を行う可能性があります。自分のブラウザーで信頼される自己署名証明書を追加し、変更された場合はそれを拒否するのが最善です。

13
dr jimbob

ルーターがパケットを転送するだけで、その背後にあるプロトコルがセキュリティを決定します。確かに、あなたが述べたように、HTTPS接続をリッスンし、すべてをHTTP接続に転送するリバースプロキシにすることができます。これは、Apacheの mod_proxy を使用して簡単に行うことができます。

または、少しやり過ぎに見えるかもしれませんが、接続できるVPNを設定することをお勧めします。これは OpenVPN で簡単に(そして無料で)実行できます。ローカルネットワーク上のトンネルを安全に終了すると、すべての内部リソースにアクセスできます。これにより、将来的に柔軟性が高まる可能性があります。ネットワーク全体にアクセスできます。

どちらの方法でも、暗号化された認証済みの接続でトンネリングされているため、盗聴者には何も見えません。

3
ndrix