使用“ allow”指令将对nginx服务器位置的访问限制为特定的Docker容器

nrl*_*kin 3 nginx docker datadog docker-compose

编辑:塔伦(Tarun)的答案正是我所要求的。Eugen的答案也是一个很好的解决方案。我最终接受塔伦(Tarun)的答案是正确的,但使用了欧根(Eugen)的答案。如果您有类似的问题,并且担心其他容器访问nginx状态服务器,请使用Tarun的答案。如果您想坚持使用Docker的常规主机名方案,请使用Eugen的方案。

+++原始问题+++

我有一个使用docker-compose构建的应用程序。我正在尝试通过DataDog集成监视。我正在使用DataDog的Agent容器,到目前为止一切正常。我试图通过改编本教程来使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
Run Code Online (Sandbox Code Playgroud)

在本教程中,我向nginx添加了一个服务器块,如下所示:

server {
  listen 81;

  location /nginx_status {
    stub_status on;
    access_log off;
    allow 127.0.0.1;
    deny all;
  }
}
Run Code Online (Sandbox Code Playgroud)

通过这种配置,我可以从nginx容器中检查nginx的状态。到目前为止,一切都很好。现在,我想更改位置块中的“ allow”指令,以仅允许访问datadog-agent服务。但是,我不知道datadog-agent的IP。在配置对Flask uwsgi服务器的访问时,我能够使用如下指令:

location / {
    uwsgi_pass: flask:8080;
}
Run Code Online (Sandbox Code Playgroud)

但这似乎不适用于allow指令。如果我尝试:

location /nginx_status {
    ...
    allow datadog-agent;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

nginx: [emerg] invalid parameter "datadog-agent" in /etc/nginx/sites-enabled/nginx-status:8
Run Code Online (Sandbox Code Playgroud)

如何安全地将nginx状态公开给监视容器?

Eug*_*yer 6

换个角度:)

另外在端口10080上绑定nginx服务器(vhost)-该服务器确实提供状态位置和您需要的内容。

80/443上的服务器也在那里,并且只有一个服务器绑定/暴露于主机(暴露于外部环境)。

由于datadog是docker-network / service网络的一部分,因此它仍可以访问内部网络中的10080,但不能访问外部网络中的其他任何人。

防弹,简单-不附带任何条件。


Tar*_*ani 5

由于我们正在运行服务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
Run Code Online (Sandbox Code Playgroud)

现在你可以做两件事

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

您只能监听172.25.0.101在代理网络上运行的只能访问的容器。您也可以添加allow 172.25.0.100只允许代理容器能够访问它。