我遇到过一种情况,需要将最大 200M 的文件上传到独立于主网站服务器的实用程序服务器。以下是我的配置:
Authenticated
Client on
Public Internet
/\ \
| \_____ 200M
| \_____
| \_____
V V
Authenticating <-------> Utility Server
Web Site (EC2, Windows, Apache, Python, Django)
Server
(EC2 LAMP)
我当前的解决方案只是让我的 Web 服务器传递实用程序服务器的 EC2 URL,并允许客户端直接与实用程序服务器通信。这有两个缺陷——它暴露了未经身份验证的实用程序服务器的 URL,并且它需要客户端上的跨域技巧才能将 POST 上传路由到实用程序服务器。
问题是,在不通过 Web 服务器推送文件上传数据的情况下,向客户端隐藏实用程序服务器的最佳方法是什么?以下是我想尝试的想法:
- DNS 使用子域为实用程序服务器设置别名。这可能解决了我的跨域脚本问题,但我不确定它是否有助于保护实用程序服务器。也许我可以从实用程序服务器检查 Web 服务器的身份验证 cookie?
- 网站 Apache 配置中的重写规则。我不清楚这会如何影响 POST 数据的实际路由位置。
- 在网站的 Apache 配置中重定向。我不确定是否可以通过重定向向用户隐藏实用程序服务器 URL。
- 从网站的控制器代码重定向。与 #3 问题相同,但我认为这可能比 #3 更好,因为它会通过 PHP 身份验证层传递请求。
- 更好的东西??
笔记:
- 实用程序服务器的不同寻常的配置是它需要执行的实用程序的可用软件交集的功能。
- 公用事业服务器不是严重恶作剧的高价值目标。设置相当于锁上前门的安全措施就足够了,但我不想把钥匙放在垫子下面。
答案1
您无法在不将实用程序服务器 URL 代理到 Web 服务器的情况下向客户端隐藏该 URL。我将在 Web 服务器和实用程序服务器中设置一个共享密钥,然后按如下方式操作:
Web 服务器使用以下参数绘制链接或将客户端重定向到实用程序服务器:
- 已验证用户名
- 链接生成(或重定向)时间戳
- 客户端 IP
- 签名(使用共享密钥对前 3 个值进行哈希处理)
在实用程序服务器中您可以检查:
- 收到的签名是正确的(使用共享密钥重新进行哈希计算)
- 客户端 ip 与参数中报告的相同
- 自参数中收到的时间戳以来经过的时间小于合理量(10-20 秒应该足够,因为 Web 服务器和实用程序服务器都使用相同的时间源)
如果所有检查都通过,您可以接受用户进行身份验证(因为您信任共享密钥),启动会话,并绘制文件上传的表单。