限制为“允许”指令
编辑访问nginx的服务器位置,以特定的码头工人容器:塔伦的答案不正是我问。欧根的答案也是一个非常好的解决方案。我最终接受塔伦的答案是正确的,但是使用了欧根的答案。如果你有类似的问题并担心其他容器访问nginx状态服务器,请使用Tarun的答案。如果你想坚持Docker的正常主机名方案,请使用Eugen's。限制为“允许”指令
+++原始的问题+++
我有我建立与码头工人,组成一个应用程序。我正试图通过DataDog集成监控。我使用DataDog的代理容器,到目前为止一切正常。我试图通过修改this tutorial来启动并运行nginx监控。
我的应用程序在这样的码头工人,撰写文件中定义:
version: '2'
services:
flask:
restart: always
image: me/flask-app
command: /home/app/flask/start_app.sh
expose:
- "8080"
nginx:
restart: always
build: ./nginx
command: /runtime/start_nginx.sh
ports:
- "80:80"
- "443:443"
expose:
- "81"
volumes:
- app-static:/app-static:ro
links:
- flask:flask
datadog-agent:
image: me/datadog-agent
env_file: ./datadog-agent/dev.env
links:
- flask
- nginx
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /proc/mounts:/host/proc/mounts:ro
- /sys/fs/cgroup:/host/sys/fs/cgroup:ro
每本教程中,我添加了一个服务器块nginx的,看起来像这样:
server {
listen 81;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
随着这个配置,我可以检查nginx容器内的nginx状态。到现在为止还挺好。现在我想更改位置块中的“allow”指令以允许仅访问数据代理服务。但是,我不知道datadog-agent的IP。在配置访问瓶uwsgi服务器,我可以用指令是这样的:
location/{
uwsgi_pass: flask:8080;
}
但是这似乎并没有工作了允许指示;如果我尝试:
location /nginx_status {
...
allow datadog-agent;
...
}
我得到以下错误:
nginx: [emerg] invalid parameter "datadog-agent" in /etc/nginx/sites-enabled/nginx-status:8
我怎样才能安全地暴露nginx的状态,我的监测容器?
由于我们是通过docker-compose
运行的服务,我们的问题是我们不知道代理的IP。所以简单的解决方案是在开始之前知道IP。这意味着分配给我们的代理特定的IP
下面是一个更新docker-compose
做
version: '2'
services:
flask:
restart: always
image: me/flask-app
command: /home/app/flask/start_app.sh
expose:
- "8080"
nginx:
restart: always
build: ./nginx
command: /runtime/start_nginx.sh
ports:
- "80:80"
- "443:443"
expose:
- "81"
volumes:
- app-static:/app-static:ro
links:
- flask:flask
networks:
agent:
ipv4_address: 172.25.0.101
default:
datadog-agent:
image: me/datadog-agent
env_file: ./datadog-agent/dev.env
links:
- flask
- nginx
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /proc/mounts:/host/proc/mounts:ro
- /sys/fs/cgroup:/host/sys/fs/cgroup:ro
networks:
agent:
ipv4_address: 172.25.0.100
networks:
agent:
driver: bridge
ipam:
config:
- subnet: 172.25.0.0/24
现在你可以做两种可能的事情
server {
listen 172.25.0.101:81;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
allow 172.25.0.100;
deny all;
}
}
您可以只监听172.25.0.101
这是只能在代理网络上运行的容器。您也可以添加allow 172.25.0.100
以仅允许代理容器访问此容器。
有不同的想法:)
做绑定端口10080的服务器,该服务器确实提供的状态位置。 80/443也在那里,只有那些绑定到主机端口(暴露于外部世界)。
由于datadog是你的搬运工网络/服务网络的一部分,它仍然可以访问10080,但没有别的。
防弹,容易 - 无任何附加条件。
让我看看我是否明白。我从我的服务器块中删除允许/拒绝指令。我听一些高端随机端口(我目前使用81,但可能是10080)。我公开端口(就像我现在,而不是使用“端口”指令)。 (伪)端口可供所有链接的容器访问,但不能访问主机上的物理端口。 DataDog可以访问统计信息,我的Flask容器也可以访问统计信息,但除此之外什么都不能。我将卸载责任保护从nginx到docker的数据,但只要没有人进入另一个链接的容器(然后我无论如何都被搞砸了),我很好。正确? – nrlakin
。确保你的意思是从dockerfile中'揭露',而不是像在“主机”上暴露的那样(这不是你所想的)。我们可以说,10080是集装箱的私人港口。你可以选择你喜欢的任何港口,但是高端港口在这里是有意义的,它是一种习俗 - 你不想侵犯别人的道路。 如果有人进入你的主机上的docker-server,他是root的,没有什么可以防范的,对。但是,这和码头工人一样安全,而且大多数其他的Linux工作都是如此。 –
我最终接受了Tarun的回答,因为它完全符合我的要求,但我想我可能会走这条路,因为使用Docker的DNS似乎不那么脆弱。我将编辑这个问题,并将您的答案也归功于您。 – nrlakin
言之过早不可能。我正在研究一个可能的解决方案 –
您是否在寻找[autodiscovery](https://docs.datadoghq.com/guides/autodiscovery/)? – stephenlechner
@TarunLalwani太棒了 - 我会继续检查这个帖子。 – nrlakin