Docker Swarm容器间OAuth2通信问题:求回调失效的安全解决方案
针对Docker Swarm中OAuth2集成问题的解决方案
方案1:通过Traefik内部路由访问Authelia(推荐)
核心思路是让服务在Swarm overlay网络内,直接通过Traefik的内部域名访问Authelia的HTTPS端点,绕开主机IP限制:
- 确保Traefik和需要OAuth的服务(HedgeDoc、Immich)都加入同一个Swarm overlay网络(比如
traefik-public)。 - 给Authelia添加Traefik标签,配置一个仅内部访问的路由:
traefik.http.routers.authelia-internal.rule: Host(`authelia-internal`) traefik.http.routers.authelia-internal.entrypoints: websecure traefik.http.routers.authelia-internal.tls: true traefik.http.routers.authelia-internal.service: authelia - 修改HedgeDoc/Immich的OAuth配置,将授权、令牌等端点替换为内部路由地址,比如:
- 授权端点:
https://authelia-internal/oauth/authorize - 令牌端点:
https://authelia-internal/oauth/token
这样容器直接在overlay网络内通过Traefik访问Authelia的HTTPS服务,无需依赖主机IP或手动配置extra_hosts。
- 授权端点:
方案2:为Authelia开启内部HTTPS服务
既然直接访问authelia:9091缺HTTPS,那就给Authelia配置内部自签名证书,让服务直接连内部HTTPS端口:
- 生成自签名证书(用openssl命令):
openssl req -x509 -newkey rsa:4096 -keyout authelia.key -out authelia.crt -days 365 -nodes -subj "/CN=authelia" - 将证书文件挂载到Authelia容器的配置目录,修改Authelia的
configuration.yml开启HTTPS:server: host: 0.0.0.0 port: 9091 tls: key: /config/authelia.key certificate: /config/authelia.crt - 在HedgeDoc/Immich的配置中,关闭SSL证书验证(因为是自签名),并将OAuth端点改为
https://authelia:9091/oauth/...,比如HedgeDoc添加环境变量:
此方案完全在Swarm内部通信,彻底避开主机IP访问问题。environment: - HD_OAUTH2_TLS_INSECURE=true
方案3:利用Swarm服务VIP配置静态映射
Swarm服务的VIP(虚拟IP)在服务生命周期内保持稳定,可替代动态变化的主机IP:
- 先获取Traefik服务的VIP:
docker service inspect traefik --format '{{.Endpoint.VirtualIPs}}' - 将该VIP配置到HedgeDoc/Immich的
extra_hosts中:
这个方案比手动填主机IP稳定,只要Traefik服务不删除重建,VIP就不会变,减少重启后的配置修改次数。extra_hosts: - "auth.example.com:192.168.128.2" # 替换为实际获取的VIP
内容的提问来源于stack exchange,提问作者mylan
相关产品推荐
相关产品推荐

