NGINX + Dockerized Gunicorn - 我的 Web 服务器设置的安全性和效率如何?

NGINX + Dockerized Gunicorn - How secure & efficient is my webserver setup?


我正在开发一个需要与服务器通信的 ios 应用程序。作为该通信的一部分,该应用程序会发送一个必须**安全**传输的私人 cookie。
经过大量的研究和挫折,我成功地按照以下方式设置了我的网络服务器:
  1. 我的整个设置是 运行 在 AWS EC2 机器上 运行 linux.

  2. 我的路由是用 FastAPI 定义的

  3. 根据官方 uvicorn 文档的建议,网络服务器部署有 GUNICORN 启动多个 uvicorn worker: gunicorn -w 4 -k uvicorn.workers.UvicornWorker example:app

  4. Web 服务器使用 docker 容器在端口 8080 上启动:
    Dockerfile

... docker setup ...
EXPOSE 8080
CMD ["gunicorn", "-b", "0.0.0.0:8080", "-w", "2", "-k", "uvicorn.workers.UvicornWorker", "main:app"]
  1. 我的网络服务器在 NGINX 反向代理后面运行。代理侦听端口 80 和 443 并将请求重定向到我的网络服务器(位于端口 8080)。
    我的 NGINX .conf 文件非常小,看起来像这样:
server {
    server_name example.*;

    location / {
            proxy_pass http://127.0.0.1:8080/;
            proxy_set_header Host $http_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;
    }
}
  1. NGINX 使用 certbot 生成的证书仅支持 HTTPS 通信。
    证书是使用 python-certbot-nginx 生成的,命令如下: sudo certbot --nginx -d example.club -d www.example.club

  2. 最后,为了确保没有人越过我的 PROXY 直接向我的网络服务器发送请求,我将我的机器配置为只允许从机器的 IP 地址到端口 8080 通信。
    端口 80 和端口 443 显然ios对任何 IP 地址开放。

由于我是网络服务器的新手,尤其是网络服务器部署方面的新手,我想知道:
此设置的效率和安全性如何?
你有什么建议或其他我应该实施的东西来确保没有私人数据泄漏,同时还要处理请求负载吗?


谢谢!

在不知道详细的确切配置的情况下,这里有一些事情需要考虑。总而言之,设置似乎是正确的。

  1. I’ve configured my machine to only allow communication to port 8080 from the machine’s IP address. -> 你真的使用了机器的外部 IP,还是你在那里使用了 localhost/127.0.0.1 值?对于 127.0.0.1 上的代理传递,只允许通过环回适配器进行连接是可以的。
  2. 我不知道你为nginx 使用的ssl 参数。您可以配置很多。尝试 https://www.ssllabs.com/ssltest/ 看看配置是否足够好。 A++ 或 A+ 几乎是 impos 可以达到的,而无需为您的用户群设置很多限制。但是A绝对是你想要达到的好点。
  3. 您可能想要为除 certbot 需要的路径之外的所有内容设置 http -> https 转发。然后设置HSTS Header:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security

希望对您有所帮助。但正如我所说。根本没有那里的安全漏洞。我看到的入口点是你的 nginx、certbot 和你的 dockerized webapp。你必须信任 nginx 和 certbot。您可能想确保自动为ose 安装安全更新,也许unattended-upgrades 不会“忘记”它们。同样适用于 docker,以及来自您的包管理器的所有其他基于 os 的软件。

问候