Реестр NiFi за прокси-сервером nginx с (клиентским) SSL/TLS и базовой аутентификацией

#nginx #ssl-certificate #apache-nifi #apache-nifi-registry

Вопрос:

У меня есть Nifi и Nifi-Реестр, которые работают на двух разных экземплярах AWS EC2 за прокси-сервером Nginx поверх docker docker-compose. Все работает хорошо, хотя и не защищено, по HTTP.

Теперь я пытаюсь сделать все немного более безопасным:

  1. Безопасный Nifi-реестр с самозаверяющим сертификатом SSL/TLS
  2. Добавьте базовую аутентификацию при доступе к Nifi-реестру из браузера.
  3. Сделайте связь между клиентом и сервером (nifi < — > nifi-реестр) защищенной, а также с помощью сертификатов клиент-сервер.

Я наткнулся на это https://michalklempa.com/2019/04/nifi-registry-nginx-proxy-tls-basic-auth/ сообщение в блоге Михала Клемпы. Следуя методам, описанным в ссылке выше, мне удалось получить запрос Nifi-реестра на базовую проверку подлинности при доступе к https://[МОЙ-NIFI-REG-ХОСТ].com:18433/nifi-реестр. Следующий шаг-заставить Nifi обойти проверку подлинности сертификата клиент-сервер.

Я добавил https://[МОЙ-NIFI-REG-ХОСТ].com:18433 в качестве «Клиента реестра» в настройки контроллера Nifi. Но когда я пытаюсь запустить систему управления версиями в одной из групп процессоров Nifi, я получаю следующую ошибку:

Ошибка аутентификации 401

Похоже, что Nifi не удалось пройти аутентификацию в Nginx на экземпляре Nifi-реестра с использованием сертификата клиента, поэтому Nginx ответил 401.

Я несколько раз пытался следовать инструкциям, но не уверен, где я ошибся.

Вот мой экземпляр Nifi-реестра docker-compose.конфигурации yaml и настройки обратного прокси-сервера Nginx:

 version: '3.4'

services:
   nginx:
      image: nginx:latest
      container_name: nginx
      restart: always
      depends_on:
       - nifi_registry
      ports:
       - 18443:18443
      volumes:
       - ~/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
       - ~/nginx/server_cert.pem:/etc/nginx/server_cert.pem
       - ~/nginx/server_key.pem:/etc/nginx/server_key.pem
       - ~/nginx/client_cert.pem:/etc/nginx/client_cert.pem
       - ~/nginx/htpasswd:/etc/nginx/htpasswd
      networks:
       - static-network

   nifi_registry:
      image: apache/nifi-registry:latest
      restart: always
      container_name: nifi-registry
      ports:
       - 18080:18080
      environment:
       - NIFI_REGISTRY_WEB_HTTP_HOST=0.0.0.0
      networks:
       - static-network

volumes:
   share_dir: {}

networks:
  static-network:
    ipam:
      config:
        - subnet: 172.20.0.0/16 

Nginx default.conf is the same as on the author blog-post:

 server {
  listen 18443 ssl;

  root /usr/share/nginx/html;

  index index.html;

  server_name _;

  ssl_certificate /etc/nginx/server_cert.pem;
  ssl_certificate_key /etc/nginx/server_key.pem;

  ssl_client_certificate /etc/nginx/client_cert.pem;
  ssl_verify_client optional;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  # enables server-side protection from BEAST attacks
  ssl_prefer_server_ciphers on;

  # Disabled insecure ciphers suite. For example, MD5, DES, RC4, PSK
  ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:@STRENGTH";

  # -!MEDIUM:exclude encryption cipher suites using 128 bit encryption.
  # -!LOW:   exclude encryption cipher suites using 64 or 56 bit encryption algorithms
  # -!EXPORT: exclude export encryption algorithms including 40 and 56 bits algorithms.
  # -!aNULL:  exclude the cipher suites offering no authentication. This is currently the anonymous DH algorithms and anonymous ECDH algorithms.
  # These cipher suites are vulnerable to a "man in the middle" attack and so their use is normally discouraged.
  # -!eNULL:exclude the "NULL" ciphers that is those offering no encryption.
  # Because these offer no encryption at all and are a security risk they are disabled unless explicitly included.
  # @STRENGTH:sort the current cipher list in order of encryption algorithm key length.

  location / {
    if ($ssl_client_verify = SUCCESS) {
      set $auth_basic off;
    }
    if ($ssl_client_verify != SUCCESS) {
      set $auth_basic "Restricted Content";
    }

    auth_basic $auth_basic;
    auth_basic_user_file /etc/nginx/htpasswd;

    proxy_pass    http://nifi-registry:18080;
    proxy_set_header   Host                 $host;
    proxy_set_header   X-Real-IP            $remote_addr;
    proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto    $scheme;
    proxy_set_header   X-Forwarded-User     $remote_user;
    proxy_set_header   Authorization        "";
    proxy_set_header   X-ProxyScheme        $scheme;
    proxy_set_header   X-ProxyHost          $hostname;
    proxy_set_header   X-ProxyPort          $server_port;
    proxy_set_header   X-ProxyContextPath   /;
  }
} 

В экземпляре Nifi все, как описано в сообщении в блоге, я скопировал файлы client_keystore.p12 и client_trustorestore.p12 , подписанные центром сертификации, в контейнер nifi docker вместе с необходимыми nifi.properties

Я думаю, я что-то пропустил, или сертификаты клиент-сервер не совпадают… Надеюсь, кто-нибудь сможет указать на это.