保护不支持 HTTPS 的可远程访问的 IP 摄像机

信息安全 加密 网络 http 访问控制 代理人
2021-08-16 02:28:06

我的家庭网络上设置了一些 IP 摄像机,这些网络受 WPA2 保护。这些摄像机设置为可以通过我的路由器的 DDNS 地址和端口号从 Internet 访问。

例如,在我的办公室 PC 上,我可以在输入用户名和密码后访问http://urltomyrouter.com:12345以查看 cam#1。

这些相机是 Foscams FI8910W 的,它们不支持 HTTPS。顺便说一句,我的路由器是华硕 RT-N56U。

我假设我用来登录摄像机的凭据是以明文形式发送的,而不是加密的,这是不安全的。

我有什么选择来解决这个问题并使我的访问更加安全?

我在某处读到“反向代理”是一种可能的解决方案,但我不确定它是如何工作的......

2个回答

我将假设您的路由器不够智能,无法自行设置加密反向代理。

下面使用的约定

  • 家庭IP地址:1.2.3.4(谷歌搜索我的IP找到你的
  • 网络摄像头 IP 地址/端口:192.168.0.123在端口 456 上。
  • 运行反向代理的 Linux/Unix 计算机: 192.168.0.101

初步检查

在本地网络上,您可以看到网络摄像头http://192.168.0.123:456吗?伟大的。您不能从外界连接到网络摄像头(http://1.2.3.4:456即被防火墙关闭)吗?伟大的。如果不重新配置您的网络摄像头和路由器上的端口转发/防火墙规则。

接下来,在本地网络上的计算机上安装一个网络服务器,只要您想连接到网络摄像头,该计算机就会打开。我将假设 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 签名证书会更加复杂,您必须获得一个域名(您可以向您拥有的 CA 证明)、为该域名设置动态 DNS 等。(如果您正在尝试开始使用动态 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.keyand中/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(您将收到有关证书不受信任的警告,因为它是自签名证书)。

在路由器中设置端口转发

最后一步是配置您的路由器进行端口转发。也就是当你https://1.2.3.4从外界连接到(端口 443)时,将其设置为端口转发到192.168.0.101(端口 443)。可能设置动态 DNS,因此如果您的家庭 IP 地址发生更改,它仍然指向正确的位置。一些 ISP 确实阻止了端口 80 和 443,因此您可能必须将其更改为其他端口。

小心你的连接方式。我注意到许多 IP 摄像头程序不会检查证书是否信任(因为它们通常是自签名的),因此攻击者可能会通过插入不同的自签名证书来进行中间人攻击。最好将您的自签名证书添加到您自己的浏览器上受信任并在更改时拒绝它。

您的路由器仅转发数据包,无论其背后的协议决定了安全性。正如您所提到的,您确实可以是一个反向代理,它侦听 HTTPS 连接,并将所有内容转发到 HTTP 连接。这可以使用 Apache 的mod_proxy轻松完成

或者,它可能看起来有点矫枉过正,但一个好方法是设置一个可以连接的 VPN。这可以通过OpenVPN轻松(免费)完成您将安全地终止本地网络上的隧道,然后您可以访问所有内部资源。这可能会给您未来更多的灵活性;您可以访问您的整个网络。

无论哪种方式,窃听者都看不到任何东西,因为你是在一个加密的、经过身份验证的连接中建立的。