关于csrf:如何使用-Apache-APISIX-CSRF-安全插件拦截跨站点伪造攻击

9次阅读

共计 3450 个字符,预计需要花费 9 分钟才能阅读完成。

CSRF(Cross-Site Request Forgery),即跨站点申请伪造。发动跨站点申请伪造攻打的关键点在于让指标服务器无奈分辨泛滥申请的起源是实在用户还是攻击者。攻打的个别流程为:首先攻击者会诱导用户导航至攻击者提供的网页上。该网页蕴含一个主动发送到指标服务器的申请。而后该网页失常加载,这个申请就会主动发送至服务器。在服务器看来,这个申请和用户失常发送的申请截然不同,殊不知这是由攻击者发动,而用户却毫不知情。因为该申请携带了用户的一些凭据,攻击者通过解析这些凭据,就能够获取用户信息,进而产生平安危险。

本文介绍了 Apache APISIX 的 CSRF 平安插件 csrf,并具体阐明如何在 Apache APISIX 中借助 csrf 插件来爱护您的 API 信息安全。

插件介绍

csrf 插件基于 Double Submit Cookie 计划实现。依据 RFC 7231#section-4.2.1 的定义,咱们把 GETHEADOPTIONS 这三种办法称为 平安办法。依照这一约定,csrf 插件会间接放行这三种办法,但会对其余的办法做查看并拦挡其中的不平安申请。

为了抵挡 CSRF 攻打,咱们须要制作一个无奈伪造的令牌或标识符,并且保障这个不会与攻击者的申请一起发送。用户须要将 csrf 插件依赖的 token 携带在申请头,token 应用密钥进行签名计算。这样就保障了 token 无奈被别人伪造,从而保障了 API 的平安。

[外链图片转存失败, 源站可能有防盗链机制, 倡议将图片保留下来间接上传(img-yyZwLqQV-1645607360060)(https://tfzcfxawmk.feishu.cn/…)]

在路由中开启 csrf 插件后,拜访该路由的所有申请响应中都会蕴含携带了 csrf token 的 Cookie。

用户须要在对该路由的不平安申请中携带这一 Cookie,并在申请头增加额定的字段携带 Cookie 的内容。字段为插件配置中的 name 值,这样的申请能力通过 CSRF 插件的校验。

用户在插件的配置中提供一个随机密钥,插件应用该密钥对 token 信息进行 sha256 哈希加密,而后生成 CSRF token,从而保障该 token 不可伪造。

如何应用

配置开启 CSRF 插件的路由

在 APISIX 中应用 Admin API 创立一条路由并启用 csrf 插件:

curl -i http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{"uri":"/hello","plugins": {"csrf": {"key":"edd1c9f034335f136f87ad84b625c8f1"}
  },
  "upstream": {
    "type": "roundrobin",
    "nodes": {"127.0.0.1:9001": 1}
  }
}'

其中对于插件有三个配置项:

  • key:必填项,随机秘钥的值。用户须要提供一个随机密钥。
  • expires:选填项,随机秘钥的过期工夫,默认值为 7200 秒。因为 CSRF token 应用 Cookie 下发至客户端,该配置会被搁置在 Cookie 的配置中,从而管制 Cookie 的过期工夫。另外在插件外部也会计算工夫来判断 token 是否过期。
  • name:选填项,CSRF token 的名称,默认值为 apisix-csrf-token

发送申请测试

首先应用 POST 申请拜访该路由:

curl -i http://127.0.0.1:9080/hello -X POST

Apache APISIX 会拦挡该申请并返回 401 谬误。在返回的头部中会发现设置了一个 Cookie,如果没有配置插件的 name 字段的话,Cookie 外部应该为默认值 apisix-csrf-token=....。这就是 CSRF 插件生成的 CSRF token。在申请中,须要确保申请携带该 Cookie 并且在申请头写入该 token。

HTTP/1.1 401 Unauthorized
Set-Cookie: apisix-csrf-token=eyJyYW5kb20iOjAuNjg4OTcyMzA4ODM1NDMsImV4cGlyZXMiOjcyMDAsInNpZ24iOiJcL09uZEF4WUZDZGYwSnBiNDlKREtnbzVoYkJjbzhkS0JRZXVDQm44MG9ldz0ifQ==;path=/;Expires=Mon, 13-Dec-21 09:33:55 GMT
{"error_msg":"no csrf token in headers"}

客户端应用 JavaScript 示例:应用 js-cookie 读取 Cookie 并应用 axios 发送申请。

const token = Cookie.get('apisix-csrf-token');

const instance = axios.create({headers: {'apisix-csrf-token': token}
});

如果 Cookie 中的 token 和申请头中的 token 不统一,申请会被 csrf 插件拦挡,示例如下:

curl -i http://127.0.0.1:9080/hello -X POST -H 'apisix-csrf-token: differenteyJyYW5kb20iOjAuNjg4OTcyMzA4ODM1NDMsImV4cGlyZXMiOjcyMDAsInNpZ24iOiJcL09uZEF4WUZDZGYwSnBiNDlKREtnbzVoYkJjbzhkS0JRZXVDQm44MG9ldz0ifQ==' -b 'apisix-csrf-token=eyJyYW5kb20iOjAuNjg4OTcyMzA4ODM1NDMsImV4cGlyZXMiOjcyMDAsInNpZ24iOiJcL09uZEF4WUZDZGYwSnBiNDlKREtnbzVoYkJjbzhkS0JRZXVDQm44MG9ldz0ifQ=='
HTTP/1.1 401 Unauthorized
Set-Cookie: apisix-csrf-token=eyJyYW5kb20iOjAuNjg4OTcyMzA4ODM1NDMsImV4cGlyZXMiOjcyMDAsInNpZ24iOiJcL09uZEF4WUZDZGYwSnBiNDlKREtnbzVoYkJjbzhkS0JRZXVDQm44MG9ldz0ifQ==;path=/;Expires=Mon, 13-Dec-21 09:33:55 GMT
{"error_msg":"csrf token mismatch"}

最初应用 curl 验证失常的拜访:

curl -i http://127.0.0.1:9080/hello -X POST -H 'apisix-csrf-token: eyJyYW5kb20iOjAuNjg4OTcyMzA4ODM1NDMsImV4cGlyZXMiOjcyMDAsInNpZ24iOiJcL09uZEF4WUZDZGYwSnBiNDlKREtnbzVoYkJjbzhkS0JRZXVDQm44MG9ldz0ifQ==' -b 'apisix-csrf-token=eyJyYW5kb20iOjAuNjg4OTcyMzA4ODM1NDMsImV4cGlyZXMiOjcyMDAsInNpZ24iOiJcL09uZEF4WUZDZGYwSnBiNDlKREtnbzVoYkJjbzhkS0JRZXVDQm44MG9ldz0ifQ=='
HTTP/1.1 200 OK

插件在外部须要校验 Cookie 中的 token 与 申请头中携带 token 的是否统一,并对其进行从新计算签名来验证该 token 是否无效。

禁用插件

移除 csrf 插件的相干配置信息,而后发送一个更新路由的申请,即可停用该插件。

curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{"uri":"/hello","upstream": {"type":"roundrobin","nodes": {"127.0.0.1:1980": 1}
  }
}'

总结

本文详细描述了 csrf 插件的工作形式以及应用办法,心愿通过本文能够让大家对在 Apache APISIX 中应用插件拦挡 CSRF 攻打有更清晰的意识,不便在理论场景中利用。

正文完
 0