使用 API 网关保护 Web 应用程序

198 阅读6分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情

通过设置适当的 API 网关,随时注意嗅探和 HTTPS Pinning。

API 管理解决方案,也称为API 网关,在 API 时代是必不可少的。但是,一旦设置了这样的网关,你就可以将它用于与 API 无关的不同目的。今天,通过这篇文章展示如何提高 Web 应用程序的安全性。

防止嗅探

浏览器是一项非常棒的技术,它试图让用户的生活尽可能舒适。然而,易用性和安全性之间的平衡有时可能会倾向于前者而损害后者。例如,如果 HTTP 响应未设置内容类型,浏览器可能会尝试推断它:

内容嗅探,也称为媒体类型嗅探或 MIME 嗅探,是检查字节流内容以尝试推断其中数据的文件格式的做法。内容嗅探通常用于弥补准确元数据的缺失,否则需要准确元数据才能正确解释文件。

听起来不错,但存在安全风险。想象一个允许上传图片的网站。攻击者可以上传还包含恶意 JavaScript 的图像。如果在没有发送任何内容的情况下访问图像,浏览器可以将流解释为脚本 - 从域提供。

为了防止这种灾难性的情况,可以设置X-Content-Type-Options响应标头:

X-Content-Type-Options: nosniff

作为示例,将使用Apache APISIX API Gateway。Apache APISIX 建立在插件架构之上。顾名思义,[response-rewrite]插件允许修改响应,包括HTTP 响应标头。

您可以通过 HTTP 调用配置 Apache APISIX。这是防止嗅探的命令:

curl -i http://apisix:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
  "uri": "/*",
  "plugins": {
    "response-rewrite": {
      "headers": {
        "X-Content-Type-Options": "nosniff"
      }
    }
  }
}'

HTTPS Pinning

与普通 HTTP 相比,HTTPS 更为安全

安全超文本传输​​协议 (HTTPS) 是超文本传输​​协议 (HTTP) 的扩展。它用于计算机网络上的安全通信,并在 Internet 上广泛使用。在 HTTPS 中,通信协议使用传输层安全性 (TLS) 或以前的安全套接字层 (SSL) 进行加密。因此,该协议也称为 HTTP over TLS 或 HTTP over SSL。

HTTPS 的主要动机是对访问的网站进行身份验证,以及在传输过程中保护交换数据的隐私和完整性。它可以防止中间人攻击,客户端和服务器之间的双向通信加密可以防止通信被窃听和篡改。

作为网站所有者,你可以通过两种方式提供 HTTPS:

  1. 只能通过 HTTPS 配置站点。问题是,试图通过 HTTP 访问站点的用户将无法访问。
  2. 可以301重定向用户从HTTP到HTTPS。但是由于HTTP是不受保护的,因此在初始请求期间可能会发生MITM攻击。恶意行为者可能会返回伪造的响应,而不是重定向到合法的HTTPS站点。

HTTP Strict Transport Security 是对上述困境的回应:

HTTP 严格传输安全 (HSTS) 是一种策略机制,有助于保护网站免受中间人攻击,例如协议降级攻击和 cookie 劫持。它允许 Web 服务器声明 Web 浏览器(或其他符合要求的用户代理)应该仅使用 HTTPS 连接自动与其交互,HTTPS 连接提供传输层安全性 (TLS/SSL),这与单独使用的不安全 HTTP 不同。HSTS 是 IETF 标准跟踪协议,在 RFC 6797 中指定。

HSTS 策略由服务器通过名为“ Strict-Transport-Security”的 HTTP 响应标头字段传达给用户代理。HSTS 策略指定用户代理只能以安全方式访问服务器的时间段。使用 HSTS 的网站通常不接受明文 HTTP,要么拒绝通过 HTTP 连接,要么系统地将用户重定向到 HTTPS(尽管这不是规范所要求的)。这样做的结果是无法执行 TLS 的用户代理将无法连接到该站点。

该保护仅在用户至少访问过该站点一次后才适用,这取决于首次使用的信任原则。这种保护的工作方式是,用户输入或选择指向指定 HTTP 的站点的 URL 时,将自动升级到 HTTPS,而无需发出 HTTP 请求,从而防止发生 HTTP 中间人攻击。

HSTS的最大缺点是它仅在用户至少访问过该站点一次后才起作用。除此之外,它解决了上述问题。

细粒度的内容控制

攻击者可以通过多种方式从域中加载恶意资源。如果他们可以访问底层网站,他们可以添加一个 `` 标签并引用他们想要的任何内容。动态呈现内容的CMS,例如WordPress,是攻击者最喜欢的目标。

另一方面,你可能想自己加载额外的资源。这些资源包括样式表、字体、脚本等;同一个域或任何其他域都可以托管它们。因此,需要细粒度地控制哪些资源被允许,哪些资源不被允许。这是内容安全策略HTTP报头的目标。

内容安全策略 (CSP)是一种计算机安全标准,旨在防止跨站点脚本 (XSS)、点击劫持和其他因在受信任的网页上下文中执行恶意内容而导致的代码注入攻击。

这是一个示例CSP:

Content-Security-Policy: default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self'; frame-ancestors 'self'; form-action 'self';

该策略允许来自同一来源的图像、脚本、表单提交和 CSS 。但是,它不允许加载任何其他资源。

然而,CSP 通用配置;你必须根据基础站点设置标头。虽然遗留服务器/反向代理允许细粒度配置,但它们通常有两个缺点:

  • 停机时间:你必须重新启动服务器以使新配置生效。
  • 没有原生的持续部署集成:你必须同时部署网站的新版本和配置。它需要一个“管理”API,这是传统解决方案普遍缺乏的。

结论

正确的 HTTP 响应标头可以大大提高你的 Web 应用程序的安全性。大多数标头都是通用的:Web 服务器和反向代理可以轻松配置它们。

但是,当标头值取决于底层 Web 应用程序时,我们需要在不停机的情况下重新加载配置,并需要一种将其与我们的持续部署管道集成的方法。API 网关Apache APISIX非常适合这种用法。