我的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失败。,原点返回未定义。添加到我的白名单未定义值,它不起作用。
限制访问我的API的最好方法是什么?
Origin头可以在非浏览器环境中伪造,因此使用CORS来尝试防止未经授权的访问您的API不是一个安全的解决方案。
CORS专门用于防止浏览器向没有适当CORS标头的服务器发出跨域请求。它不是为了保护服务器而设计的;这是为了保护浏览器和用户。
假设你真的想要保护和认证你的api,你有几个简单的选择:
- 删除运行状况检查端点的身份验证(不建议)
- 在你的liveessprobe中使用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白名单,而错误用于表示在配置它时出现了错误。它给人一种错误的安全感,因为origin头可以被任何非浏览器请求库欺骗。
这是关于CORS和它的用途的一个很好的答案。