如何使用 KrakenD 禁止访问来自本地主机的请求的某些端点?

How to forbid access to certain endpoint for requests out of localhost using KrakenD?

我有两个端点,我希望其中之一只能通过本地主机的请求访问。另一个应该接收来自任何地方的请求。在文档的 Security 部分,我找到了下一个配置:

"extra_config": {
  "github_com/devopsfaith/krakend-httpsecure": {
    "allowed_hosts": [
      "host.known.com:443"
    ]
  }
}

但这只是在根级别。此外,这包括端口,我需要过滤条件:“来自本地主机?”

有什么方法可以满足这个要求吗?是否使用KrakenD、IPTables等...

KrakenD Enterprise 为您解决。但如果您使用的是社区版,那么您可以使用 Common Expression Language (CEL) 组件。

虽然它比 IP 过滤(企业)本身有更多限制,但 CEL 允许您在后端实际受到攻击之前编写 pre-conditions。

检查请求是否来自本地主机 (IPv6) 的示例:

{
    "endpoint": "/localhost-ipv6",
    "extra_config": {
        "validation/cel": [
            {
                "check_expr": "'127.0.0.1' in req_headers['X-Forwarded-For']"
            }
        ]
    }
}

您可以使用您在环境中收到的 X-Forwarded-For 的确切值来调整上述代码段。为确保您测试的是正确的东西,请创建如下所示的测试端点:

{
    "endpoint": "/test-headers",
    "backend": [
        {
            "host": ["http://localhost:8080"],
            "url_pattern": "/__debug/"
        }
    ]
}

使用 krakend run -d -c krakend.json 启动 krakend,然后从内部和外部发出请求。您将在 KrakenD 日志中看到 headers。喜欢:

2022/03/15 10:38:26 KRAKEND DEBUG: [ENDPOINT: /__debug/*] Headers: map[Accept-Encoding:[gzip] User-Agent:[KrakenD Version 2.0.0] X-Forwarded-For:[127.0.0.1] X-Forwarded-Host:[localhost:8080]]

最后,还有其他方法可以用 CEL 组件解决这个问题。您甚至可以使用 CEL 创建伪身份验证,例如:

{
    "validation/cel": [
        {
            "check_expr": "'acbdefghijklmnopqrstuvwxyz1234567890' in req_headers['X-KEY']"
        }
    ]
}

文档中有更多示例https://www.krakend.io/docs/endpoints/common-expression-language-cel/