我正在尝试在反向代理(Traefik)后面部署 OpenSearch。我正在使用 docker 和 docker-compose 来实现此目的。我在 OpenSearch Dashboards 方面取得了成功。因此我觉得我已经接近解决方案了,但肯定还缺少一些东西。
问题是,我想更改管理员密码,为此我需要启用安全插件(如果没有,任何人都可以连接到它)。但如果我启用它,OpenSearch 会强制我使用 SSL 进行连接。如果我有 SSL 连接,我需要生成证书,但 Traefik 和 OpenSearch 之间的连接会导致下一个错误:
DecoderException: io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS
我理解,有意义(也是我想要的)的架构是 Traefik 处理 SSL 连接,使用服务器域自动更新证书。在内部,traefik 不使用 SSL 与 OpenSearch 进行普通连接。
我发现 Elastic Search 允许禁用 SSL 连接并仍然启用其他安全功能,但我没有发现任何类似于 OpenSearch 的内容。
我在 OpenSearch 上使用“SERVER_BASEPATH”和“SERVER_REWRITEBASEPATH”。我在 OpenSearch 仪表板上找到了此信息,并且似乎该信息也适用于 OpenSearch,因为流量已正确重定向。
docker-compose 文件:
opensearch-node1:
image: opensearchproject/opensearch:latest
container_name: opensearch-node1
restart: always
environment:
- TZ=Europe/Madrid
- cluster.name=opensearch-cluster
- node.name=opensearch-node1
- discovery.seed_hosts=opensearch-node1
- cluster.initial_cluster_manager_nodes=opensearch-node1
- http.port=9200
- bootstrap.memory_lock=true
- DISABLE_INSTALL_DEMO_CONFIG=true
- "OPENSEARCH_JAVA_OPTS=-Xms1024m -Xmx1024m"
- "OPENSEARCH_INITIAL_ADMIN_PASSWORD=${adminPassword}"
# - "DISABLE_SECURITY_PLUGIN=true"
- plugins.security.ssl.transport.enforce_hostname_verification=false
- plugins.security.ssl.transport.enabled=true
- plugins.security.ssl.transport.pemkey_filepath=certs/admin-key.pem
- plugins.security.ssl.transport.pemcert_filepath=certs/admin.pem
- plugins.security.ssl.transport.pemtrustedcas_filepath=certs/root-ca.pem
- plugins.security.ssl.http.enabled=true
- plugins.security.ssl.http.pemkey_filepath=certs/admin-key.pem
- plugins.security.ssl.http.pemcert_filepath=certs/admin.pem
- plugins.security.ssl.http.pemtrustedcas_filepath=certs/root-ca.pem
- "SERVER_BASEPATH=/opensearch"
- "SERVER_REWRITEBASEPATH=true"
labels:
- "traefik.enable=true"
- "traefik.backend=opensearch-node1"
- "traefik.http.routers.opensearch.entrypoints=https"
- "traefik.http.routers.opensearch.tls.certresolver=https"
- "traefik.http.routers.opensearch.rule=(Host(`${machine_domain}`) && PathPrefix(`/opensearch`))"
- "traefik.docker.network=containers"
ulimits:
memlock:
soft: -1 # Set memlock to unlimited (no soft or hard limit)
hard: -1
nofile:
soft: 65536 # Maximum number of open files for the opensearch user - set to at least 65536
hard: 65536
volumes:
- opensearch-data1:/usr/share/opensearch/data # Creates volume called opensearch-data1 and mounts it to the container
- ./certs:/usr/share/opensearch/config/certs:ro
ports:
- 9200:9200 # REST API
- 9600:9600 # Performance Analyzer
expose:
- 9200
networks:
- containers
目前,Traefik 正在将流量从
my.domain.com/opensearch
正确重定向到 OpenSearch docker 容器。但 OpenSearch 拒绝了:
我想要实现的目标:
我测试过的:
plugins.security.ssl.http.enabled
禁用 ssl。安全插件抱怨并且服务器无法启动。尝试设置目标服务端口,镜像可能会暴露多个,明确告诉Traefik使用哪一个,例如:
whoami:
image: traefik/whoami:v1.8
networks:
- proxy
labels:
- traefik.enable=true
- traefik.http.routers.mywhoami.rule=Host(`whoami.example.com`) || Host(`www.whoami.example.com`)
- traefik.http.services.mywhoami.loadbalancer.server.port=80
如果您的目标服务的自定义 TLS 证书存在问题,您可以在 Traefik 静态配置中全局设置
insecureSkipVerify
或在您的个人 Traefik 服务中设置 serversTaransport
。