我正在学习两种特定场景下docker容器之间的SSL和加密。在这两种情况下,Traefik容器都是外部世界和NodeJS API容器之间的反向代理。NodeJS API只是将一条记录写入mongo数据库容器。在这两种情况下,Traefik都将使用SSL加密自身和外部世界之间的任何通信。我认为Traefik和NodeJS API之间的通信将以明文形式发生,因为NodeJS API不会使用SSL证书。我认为NodeJS API和数据库之间的数据也将是纯文本的。
这里有一个
docker-compose
我拥有的文件,我认为上面的陈述描述了这一点。
version: '3'
services:
traefik:
image: traefik:v2.5.4
command:
- "--providers.docker"
- "--providers.docker.swarmMode=true"
- "--providers.docker.exposedByDefault=false"
- "--providers.file.directory=/etc/traefik/dynamic_conf"
- "--providers.file.watch=true"
- "--entrypoints.websecure.address=:3001"
ports:
- 80:80
- 3001:3001
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./templates/ssl/:/certs/:ro
- ./traefik.config.yml:/etc/traefik/dynamic_conf/conf.yml:ro
networks:
- mynet
api:
image: johnlai2004/swarm:latest
environment:
- "DB=${STACK_NAME}_db"
deploy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.${STACK_NAME}_api.entrypoints=websecure"
- "traefik.http.routers.${STACK_NAME}_api.tls=true"
- "traefik.http.routers.${STACK_NAME}_api.rule=Host(`${APP_HOST}`)"
- "traefik.http.services.${STACK_NAME}_api.loadbalancer.server.port=3000"
depends_on:
- db
networks:
- mynet
db:
image: mongo:4.0.3
networks:
- mynet
networks:
mynet:
external: true
然后我用这些命令开始工作:
docker swarm init;
docker network create
STACK_NAME=mystack1 APP_HOST=mystack1.example.com docker stack deploy -c docker-compose.yml mystack1;
问题1:以上所有代码都在一台主机上运行。许多开发人员会担心Traefik和NodeJS API之间的未加密流量,以及NodeJS API和Mongo数据库之间的未加密流量吗?我假设这两种情况下的流量发生在虚拟docker网络中,除非攻击者已经可以访问主机,否则外部攻击者不容易访问该网络?这些假设合理吗?
问题2:假设我在另一个城市创建了第二台主机。我负责
docker swarm join
这样第二台机器就变成了工作节点。然后我运行命令
docker service scale api=4
这又创建了四个api容器实例,其中一些将在第二台主机上运行。在这种情况下,攻击者能否轻松嗅探Traefik和API之间的通信量,以及API和数据库之间的通信量?攻击者会以明文形式看到流量吗?