node.js - 带有健康检查的nestjs enableCors
问题描述
我的 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 的访问的最佳方法是什么?
解决方案
原始标头可以在非浏览器环境中伪造,因此使用 CORS 来尝试防止对您的 API 的未经授权的访问并不是一个安全的解决方案。
CORS 专门用于防止浏览器向没有适当 CORS 标头的服务器发出跨域请求。它不是为了保护服务器而设计的;它旨在保护浏览器和用户。
假设您实际上想要保护和验证您的 api,您有几个简单的选择:
- 删除健康检查端点的身份验证(不推荐)
- 使用 livenessProbe 中的 HTTP 标头对 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白名单的,error用来表示配置的时候出了点问题。它给人一种虚假的安全感,因为原始标头可以被任何非浏览器请求库欺骗。
这是关于 CORS 及其用途的一个很好的答案。
推荐阅读
- php - 如何在函数内重启函数?
- javascript - TypeError:“config.server”属性是必需的,并且必须是 NodeJS 中的字符串类型
- kubernetes - 在普罗米修斯中重新标记 pod 名称
- wordpress - 如何确认 ESLint 正在执行哪些自定义规则集?
- qt - 如何为两个QTabWidget的两个不同标签栏设置qss样式?
- c - 在 OSX 中获取进程内存和 cpu 使用率
- c++ - 获取 cv::Mat 的值类型
- angularjs - 从 AngularJS 客户端中的 mod_auth_openidc 检索身份验证令牌
- python - 如何从字典中的文件中将相同键的值相互添加?
- boolean - COBOL 中数字和字符串的布尔值