Обратный прокси-сервер Docker Nginx для защиты контейнера Docker - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть две докерские службы (угловое веб-приложение и серверная часть tomcat), которые я хочу защитить с помощью третьей докерской службы, которая представляет собой nginx, настроенный как обратный прокси-сервер.Моя конфигурация прокси работает, но я страдаю от базовой авторизации, которую должен обрабатывать и мой обратный прокси.Когда я защищаю свой угловой сервис с помощью базовой аутентификации через конфигурацию обратного прокси-сервера, все работает нормально, но мой бэкэнд все еще доступен для всех.Когда я добавляю также базовую аутентификацию в бэкэнд-сервис, у меня возникает проблема, заключающаяся в том, что мой базовый заголовок конфигурации аутентификации из моего внешнего интерфейса не перенаправляется / не добавляется в бэкэнд-запросы REST.Можно ли настроить обратный прокси-сервер nginx для добавления заголовка авторизации к каждому запросу, отправляемому веб-интерфейсом.Или, может быть, я ошибаюсь, и есть лучшее решение?

infrastructure scheme

browser

Вот моя конфигурация docker и nginx:

Конфигурация обратного прокси:

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;

    upstream docker-nginx {
        server frontend-nginx:80;
    }

    upstream docker-tomcat {
        server backend-tomcat:8080;
    }

    map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
        '' 'registry/2.0';
    }

    server {
        listen 80;

        location / {

            auth_basic "Protected area";
            auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;

            add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

            proxy_pass         http://docker-nginx;
            proxy_redirect     off;
        }
    }

    server {
        listen 8080;

        location / {

            auth_basic "Protected area";
            auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;

            add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

            proxy_pass         http://docker-tomcat;
            proxy_redirect     off;
        }
    }

}

docker-compose (настройка всех контейнеров):

version: '2.4'

services:
  reverse-proxy:
    container_name: reverse-proxy
    image: nginx:alpine
    volumes:
      - ./auth:/etc/nginx/conf.d
      - ./auth/nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "80:80"
      - "8080:8080"
    restart: always
    links:
      - registry:registry

  frontend-nginx:
    container_name: frontend
    build: './frontend'
    volumes:
      - /dockerdev/frontend/dist/:/usr/share/nginx/html
    depends_on:
          - reverse-proxy
          - bentley-tomcat
    restart: always

  backend-tomcat:
    container_name: backend
    build: './backend'
    volumes:
      - /data:/data
    depends_on:
      - reverse-proxy
    restart: always

  registry:
    image: registry:2
    ports:
      - 127.0.0.1:5000:5000
    volumes:
      - ./data:/var/lib/registry

внешний Dockerfile:

FROM nginx
COPY ./dist/ /usr/share/nginx/html
COPY ./fast-nginx-default.conf /etc/nginx/conf.d/default.conf

Конфигурация внешнего интерфейса:

server {
  listen 80;
  sendfile on;
  default_type application/octet-stream;

  gzip on;
  gzip_http_version 1.1;
  gzip_disable      "MSIE [1-6]\.";
  gzip_min_length   256;
  gzip_vary         on;
  gzip_proxied      expired no-cache no-store private auth;
  gzip_types        text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
  gzip_comp_level   9;

  root /usr/share/nginx/html;

  location / {
    try_files $uri $uri/ /index.html =404;
  }
}

Внутренний Dockerfile:

FROM openjdk:11
RUN mkdir -p /usr/local/bin/tomcat
COPY ./backend-0.0.1-SNAPSHOT.jar /usr/local/bin/tomcat/backend-0.0.1-SNAPSHOT.jar
WORKDIR /usr/local/bin/tomcat
CMD ["java", "-jar", "backend-0.0.1-SNAPSHOT.jar"]

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Я решил свою проблему, перечислив на порт 80 запрос с /api и перенаправил их на tomcat на порт 8080. Для этого мне также пришлось настроить свои запросы переднего и заднего плана, теперь все моиБэкэнд-запрос начинается с /api.Благодаря этому решению я могу реализовать базовую аутентификацию на порту 80 для защиты передней и задней части.

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;

    client_max_body_size 25M;

    upstream docker-nginx {
        server frontend-nginx:80;
    }

    upstream docker-tomcat {
        server backend-tomcat:8080;
    }

    server {
        listen 80;

        location /api {

            proxy_pass http://docker-tomcat;
        }

    location / {

            auth_basic "Protected area";
            auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;

            proxy_pass         http://docker-nginx;
            proxy_redirect     off;
        }
    }
}
0 голосов
/ 02 декабря 2018

Попробуйте добавить эти директивы в блок вашего местоположения

proxy_set_header Authorization $http_authorization;
proxy_pass_header  Authorization;
...