使用 "allow" 指令将对 nginx 服务器位置的访问限制为特定的 Docker 容器
Restrict access to nginx server location to a specific Docker container with "allow" directive
编辑:Tarun 的回答完全符合我的要求。欧根的回答也是一个很好的解决方案。我最终接受了 Tarun 的正确答案,但使用了 Eugen 的答案。如果您有类似的问题并且担心其他容器访问 nginx 状态服务器,请使用 Tarun 的答案。如果您宁愿坚持 Docker 的正常主机名方案,请使用 Eugen 的方案。
+++ 原题+++
我有一个使用 docker-compose 构建的应用程序。我正在尝试通过 DataDog 集成监控。我正在使用 DataDog 的代理容器,到目前为止一切正常。我正在尝试通过调整 this tutorial.
来启动 nginx 监控和 运行
我的应用程序在 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
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 服务。但是,我不知道datadog-agent的IP。在配置对 Flask uwsgi 服务器的访问时,我能够使用这样的指令:
location / {
uwsgi_pass: flask:8080;
}
但这似乎不适用于 allow 指令;如果我尝试:
location /nginx_status {
...
allow datadog-agent;
...
}
我收到以下错误:
nginx: [emerg] invalid parameter "datadog-agent" in /etc/nginx/sites-enabled/nginx-status:8
如何安全地将 nginx 状态公开到我的监控容器?
换个思路:)
此外,请在端口 10080 上绑定一个 nginx-server (vhost) - 该服务器确实提供状态位置和您需要的内容。
80/443 上的服务器也在那里,只有 bound/exposed 主机(暴露给外部世界)。
由于datadog是你的docker网络/服务网络的一部分,它仍然可以在内网访问10080,但不能从外网访问其他人。
防弹,简单 - 没有任何附加条件。
因为我们是 运行 通过 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
以仅允许代理容器能够访问它。
有两种(更简单的)方法。
第一个是 docker-compose
但是因为我已经有一个设置 运行 2 年没有使用 docker-compose,我选择了第二种方式。
第二种方式是 Allow
具有一系列 IP 的指令。
例如:
location /stub_status {
stub_status;
allow 172.18.0.0/16; # This is my local docker IP range
allow 192.168.0.0/16; $ This is my production server IP range
deny all; # deny all other hosts
}
我不是安全专家,但大多数 192.168.*
IP 范围适用于本地网络,但不确定 172.18.*
范围。
要了解有关此 IP 范围和 CIDR 内容的更多信息,请参阅以下链接
http://nginx.org/en/docs/http/ngx_http_access_module.html
https://www.ripe.net/about-us/press-centre/understanding-ip-addressing
编辑:Tarun 的回答完全符合我的要求。欧根的回答也是一个很好的解决方案。我最终接受了 Tarun 的正确答案,但使用了 Eugen 的答案。如果您有类似的问题并且担心其他容器访问 nginx 状态服务器,请使用 Tarun 的答案。如果您宁愿坚持 Docker 的正常主机名方案,请使用 Eugen 的方案。
+++ 原题+++
我有一个使用 docker-compose 构建的应用程序。我正在尝试通过 DataDog 集成监控。我正在使用 DataDog 的代理容器,到目前为止一切正常。我正在尝试通过调整 this tutorial.
来启动 nginx 监控和 运行我的应用程序在 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
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 服务。但是,我不知道datadog-agent的IP。在配置对 Flask uwsgi 服务器的访问时,我能够使用这样的指令:
location / {
uwsgi_pass: flask:8080;
}
但这似乎不适用于 allow 指令;如果我尝试:
location /nginx_status {
...
allow datadog-agent;
...
}
我收到以下错误:
nginx: [emerg] invalid parameter "datadog-agent" in /etc/nginx/sites-enabled/nginx-status:8
如何安全地将 nginx 状态公开到我的监控容器?
换个思路:)
此外,请在端口 10080 上绑定一个 nginx-server (vhost) - 该服务器确实提供状态位置和您需要的内容。
80/443 上的服务器也在那里,只有 bound/exposed 主机(暴露给外部世界)。
由于datadog是你的docker网络/服务网络的一部分,它仍然可以在内网访问10080,但不能从外网访问其他人。
防弹,简单 - 没有任何附加条件。
因为我们是 运行 通过 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
以仅允许代理容器能够访问它。
有两种(更简单的)方法。
第一个是 docker-compose
但是因为我已经有一个设置 运行 2 年没有使用 docker-compose,我选择了第二种方式。
第二种方式是 Allow
具有一系列 IP 的指令。
例如:
location /stub_status {
stub_status;
allow 172.18.0.0/16; # This is my local docker IP range
allow 192.168.0.0/16; $ This is my production server IP range
deny all; # deny all other hosts
}
我不是安全专家,但大多数 192.168.*
IP 范围适用于本地网络,但不确定 172.18.*
范围。
要了解有关此 IP 范围和 CIDR 内容的更多信息,请参阅以下链接 http://nginx.org/en/docs/http/ngx_http_access_module.html
https://www.ripe.net/about-us/press-centre/understanding-ip-addressing