AWS负载均衡器后挂载Sidekiq Web操作时触发403禁止访问问题求助
根因说明
Sidekiq Web默认开启了CSRF校验、同源检测等安全策略,所有非GET类操作都会触发安全校验,请求经过ALB转发时如果修改了请求上下文或拦截了指定请求方法,就会触发403错误。
排查与修复步骤
CSRF令牌校验失败修复
这是最高发的原因,ALB转发请求时如果改写了Host、X-Forwarded-Proto等头,会导致Sidekiq服务端生成的CSRF令牌和请求携带的令牌不匹配。非Rails应用直接通过Rack挂载时添加如下配置即可:# 配置信任ALB所在的VPC网段,避免代理头被拦截 Sidekiq::Web.set :trusted_proxies, ["替换为你的AWS VPC CIDR段,例如10.0.0.0/8"] # 关闭不必要的HTTP Origin校验,避免跨代理时校验失败 Sidekiq::Web.set :protection, except: :http_origin同时检查ALB配置,确保X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-Host三个头开启透传,不要自定义覆盖。
会话Cookie透传异常修复
Sidekiq Web依赖rack.sessionCookie存储会话信息,如果ALB配置了Cookie重写、或者会话粘性时长小于Sidekiq会话过期时长,会导致会话校验失败。
检查ALB规则确认没有自定义Cookie改写逻辑,若开启了会话粘性,将粘性时长调整为至少24小时,和Sidekiq默认会话过期时长对齐。WAF/ALB拦截非GET方法修复
Sidekiq Web的重试、删除任务等操作默认使用PUT、DELETE方法提交,若ALB关联的WAF规则禁用了这些方法,会直接返回403。
首先调整WAF规则允许PUT、DELETE、PATCH方法访问Sidekiq对应的路径,也可以添加方法覆写配置,让Sidekiq用POST模拟其他请求方法:Sidekiq::Web.use Rack::MethodOverride跨域校验失败修复
如果通过子路径挂载Sidekiq、或者访问域名和服务端配置的域名不一致,会触发同源校验返回403。添加可信域名配置即可:Sidekiq::Web.set :allowed_origins, ["替换为你的ALB访问域名,例如https://elb.example.com"]注意:如果是内部可信网络环境下使用,也可以临时关闭安全校验快速验证问题,但公网暴露的服务不建议使用该配置:
Sidekiq::Web.set :protection, except: [:http_origin, :remote_token]
内容的提问来源于stack exchange,提问作者DeivinsonTejeda

