【问题标题】:nestjs enableCors with health check带有健康检查的nestjs enableCors
【发布时间】:2021-10-04 06:21:27
【问题描述】:

我的 API 集群在 kubernetes 下。

    if (!configService.isProduction()) {
        app.enableCors();
    } else {
        const whitelist = ['https://sub. domain .com', 'https:// www.domain .com', 'undefined'];
        app.enableCors({
            origin: function (origin, callback) {
                if (whitelist.indexOf(origin) !== -1) {
                    console.log("allowed cors for:", origin)
                    callback(null, true)
                } else {
                    console.log("blocked cors for:", origin)
                    callback(new Error('Not allowed by CORS'))
                }
            },
            allowedHeaders: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept, Observe',
            methods: "GET,PUT,POST,DELETE,UPDATE,OPTIONS",
            credentials: true,
        });
    }

这里的问题是,当 Kubernetes 上的部署尝试运行健康检查并在 origin 失败时,origin 返回未定义。 添加到我的白名单未定义值,它不起作用。

限制对我的 API 的访问的最佳方法是什么?

【问题讨论】:

  • 速率限制,我猜。

标签: node.js kubernetes nestjs health-check


【解决方案1】:

原始标头可以在非浏览器环境中伪造,因此使用 CORS 来尝试防止对您的 API 的未经授权的访问并不是一个安全的解决方案。

CORS 专门用于防止浏览器向没有适当 CORS 标头的服务器发出跨域请求。它不是为了保护服务器而设计的;它旨在保护浏览器和用户。

假设您实际上想要保护和验证您的 api,您有几个简单的选择:

  1. 删除健康检查端点的身份验证(不推荐)
  2. Use HTTP headers 在你的 livenessProbe 中验证 Kubernetes:

这样的事情应该可以工作。请注意,您可以在此处使用任何类型的身份验证标头。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/liveness
    args:
    - /server
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        # Add basic auth, or any other auth mechanism you want here:
        # Make sure to use your own user:password in Base64 if you copy/paste
        httpHeaders:
        - name: Authorization
          value: Basic dXNlcjpwYXNzd29yZA==
      initialDelaySeconds: 3
      periodSeconds: 3

还有其他方法可以实现这一点,但如果没有关于集群其余部分的更多信息,很难为您提供更好的答案。

我还强烈建议您不要拒绝使用 origin 函数的请求。一般来说,这是用来动态配置CORS白名单的,错误是用来表示配置时出错的信号。它给人一种虚假的安全感,因为原始标头可以被任何非浏览器请求库欺骗。

Here 是关于 CORS 及其用途的一个很好的答案。

【讨论】:

  • 谢谢!为什么不删除健康检查的身份验证?我为什么要关心一个人是否试图达到它?
猜你喜欢
  • 2021-11-18
  • 2017-07-16
  • 2014-10-02
  • 2021-09-13
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
相关资源
最近更新 更多