Настройка шифрования данных

Для обеспечения безопасности данных включите SSL-шифрование. Выполните следующие действия:

  1. На хосте создайте директорию с конфигурацией nginx, включающую каталог для хранения информации о SSL-шифровании:

    sudo mkdir -p /etc/nginx/ssl/
    
  2. Создайте ключ и сертификат SSL. Если будет использоваться самоподписанный сертификат, выполните следующую команду:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/my-example-domain.com.key -out /etc/nginx/ssl/my-example-domain.com.crt
    

    Для заполнения полей сертификата вам будет предложено несколько вопросов. Ответьте на них, уделив особое внимание строке Common Name. В ней нужно ввести имя или публичный IP-адрес домена, связанного с сервером. Созданные файлы ключа my-example-domain.com.key и сертификата my-example-domain.com.crt будут сохранены в каталоге /etc/nginx/ssl/.

  3. Если используется подтвержденный сертификат, то нужно добавить путь сертификата в volumes для сервиса findface-video-worker, добавить установку ca-certificates и обновить корневое хранилище сертификатов в контейнере сервиса.

    1. Откройте файл docker-compose.yaml:

      sudo vi /opt/findface-multi/docker-compose.yaml
      
    2. Найдите раздел findface-video-worker и отредактируйте его, чтобы он выглядел так, как показано ниже.

      Для CPU:

      findface-video-worker:
          entrypoint: ["sh", "-c", "apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends --yes ca-certificates && update-ca-certificates && exec /tini -- /findface-video-worker-cpu --config=/etc/findface-video-worker.yaml"]
          depends_on: [findface-video-manager, findface-ntls, mongodb]
          image: docker.int.ntl/ntech/universe/video-worker-cpu:ffserver-8.221216
          logging: {driver: journald}
          network_mode: service:pause
          restart: always
          volumes: ['./configs/findface-video-worker/findface-video-worker.yaml:/etc/findface-video-worker.yaml:ro',
            './models:/usr/share/findface-data/models:ro', './cache/findface-video-worker/models:/var/cache/findface/models_cache',
            './cache/findface-video-worker/recorder:/var/cache/findface/video-worker-recorder',
            '/etc/nginx/ssl/my-example-domain.crt:/usr/local/share/ca-certificates/my-example-domain.crt:ro']
      

      Для GPU достаточно будет добавить путь до сертификата и обновить корневое хранилище:

      findface-video-worker:
          entrypoint: ["sh", "-c", "update-ca-certificates && exec /tini -- /findface-video-worker-gpu --config=/etc/findface-video-worker.yaml"]
          depends_on: [findface-video-manager, findface-ntls, mongodb]
          environment: [CUDA_VISIBLE_DEVICES=0]
          image: docker.int.ntl/ntech/universe/video-worker-gpu:ffserver-8.221216
          logging: {driver: journald}
          network_mode: service:pause
          restart: always
          runtime: nvidia
          volumes: ['./configs/findface-video-worker/findface-video-worker.yaml:/etc/findface-video-worker.yaml:ro',
            './models:/usr/share/findface-data/models:ro', './cache/findface-video-worker/models:/var/cache/findface/models_cache',
            './cache/findface-video-worker/recorder:/var/cache/findface/video-worker-recorder',
            '/etc/nginx/ssl/my-example-domain.crt:/usr/local/share/ca-certificates/my-example-domain.crt:ro']
      

      Важно

      Для CPU версии настройка требует доступ к интернету. Если он отсутствует, обратитесь к нашими техническим специалистам (support@ntechlab.com).

      Предупреждение

      Для CPU версии вырастет время запуска контейнера findface-video-worker на ~15 секунд.

    3. Выполните перезапуск контейнеров FindFace Multi.

      cd /opt/findface-multi/
      
      sudo docker-compose restart
      
  4. Настройте nginx для использования SSL. Откройте файл конфигурации nginx /opt/findface-multi/configs/findface-multi-ui/nginx-site.conf. Внесите в файл следующие изменения:

    1. Добавьте новый раздел server {...}, содержащий правило замены URL. В строке rewrite ^(.*) https://… замените ip_address_server_ffmulti IP-адресом сервера, на котором установлен экземпляр FindFace Multi.

      server {
              listen 80;
              server_name my-example-domain.com www.my-example-domain.com;
              rewrite ^(.*) https://ip_address_server_ffmulti$1 permanent;
              access_log off;
      }
      
    2. Закомментируйте следующие строки в существующем разделе server {...}:

      # listen 80 default_server;
      # listen [::]:80 default_server;
      
    3. Добавьте следующие строки, включая пути к сертификату и ключу, в существующий раздел server {...}:

      listen 443 ssl;
      
      ssl_certificate     /etc/nginx/ssl/my-example-domain.com.crt;
      ssl_certificate_key /etc/nginx/ssl/my-example-domain.com.key;
      

      Пример файла конфигурации /opt/findface-multi/configs/findface-multi-ui/nginx-site.conf с корректно заданными настройками SSL показан в примере ниже:

      upstream ffsecurity {
              server 127.0.0.1:8002;
      }
      
      upstream ffsecurity-ws {
              server 127.0.0.1:8003;
      }
      
      upstream ffsecurity-django {
              server 127.0.0.1:8004;
      }
      
      upstream audit {
              server 127.0.0.1:8012;
      }
      
      upstream identity-provider {
              server 127.0.0.1:8022;
      }
      
      map $http_upgrade $ffsec_upstream {
              default "http://ffsecurity-ws";
              "" "http://ffsecurity";
      }
      
      
      server {
              listen 80;
              server_name my-example-domain.com www.my-example-domain.com;
              rewrite ^(.*) https://my-example-domain.com$1 permanent;
              access_log off;
      }
      
      server {
              # listen 80 default_server;
              # listen [::]:80 default_server;
      
              listen 443 ssl;
              ssl_certificate /etc/nginx/ssl/my-example-domain.com.crt;
              ssl_certificate_key /etc/nginx/ssl/my-example-domain.com.key;
      
              root /var/lib/findface-security;
      
              autoindex off;
      
              server_name _;
      
              location = / {
                      alias /usr/share/findface-security-ui/;
                      try_files /index.html =404;
              }
              location /static/ {
              }
              location /uploads/ {
                      # internal; # uncomment if you intend to enable OVERPROTECT_MEDIA
                      add_header 'Access-Control-Allow-Origin' '*';
                      add_header 'Access-Control-Allow-Methods' '*';
                      add_header 'Access-Control-Allow-Headers' '*';
                      add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
                      add_header 'Access-Control-Max-Age' 2592000;
      
                      location ~ /card/(?<card_type>[a-zA-Z]+)/(?<card_id>[0-9]+)/attachments/(.*)$ {
                              add_header 'Access-Control-Allow-Origin' '*';
                              add_header 'Access-Control-Allow-Methods' '*';
                              add_header 'Access-Control-Allow-Headers' '*';
                              add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
                              add_header 'Access-Control-Max-Age' 2592000;
                              add_header 'Content-Disposition' 'attachment';
                              add_header 'Content-Security-Policy' 'sandbox';
                      }
              }
              location /ui-static/ {
                      alias /usr/share/findface-security-ui/ui-static/;
              }
              location /doc/ {
                      alias /opt/findface-security/doc/;
              }
              location /api-docs {
                      alias /opt/findface-security/rapidoc;
                      index index.html;
              }
              location /api-docs/ {
                      alias /opt/findface-security/rapidoc/;
                      try_files $uri index.html =404;
              }
              location ~ /videos/(?<video_id>[0-9]+)/upload/(.*)$ {
                      client_max_body_size 15g;
      
                      proxy_set_header Host $http_host;
                      proxy_set_header X-Forwarded-For $remote_addr;
                      proxy_set_header X-Forwarded-Proto $scheme;
                      proxy_pass http://ffsecurity;
              }
              location @django {
                      internal;
                      client_max_body_size 1g;
                      proxy_set_header Host $http_host;
                      proxy_set_header X-Forwarded-For $remote_addr;
                      proxy_set_header X-Forwarded-Proto $scheme;
                      proxy_http_version 1.1;
                      proxy_read_timeout 5m;
                      proxy_pass http://ffsecurity-django;
              }
      
      #      location /v1/video-liveness {
      #          add_header Access-Control-Allow-Headers "*" always;
      #          add_header Access-Control-Allow-Methods "*" always;
      #          add_header Access-Control-Allow-Origin  "*" always;
      #
      #          if ($request_method = 'OPTIONS') {
      #              return 204;
      #          }
      #
      #          client_max_body_size 300m;
      #          proxy_set_header Host $http_host;
      #          proxy_set_header X-Forwarded-For $remote_addr;
      #          proxy_set_header X-Forwarded-Proto $scheme;
      #          proxy_pass http://127.0.0.1:18301;
      #          proxy_read_timeout 5m;
      #      }
      
              location / {
                      client_max_body_size 1g;
                      proxy_set_header Host $http_host;
                      proxy_set_header X-Forwarded-For $remote_addr;
                      proxy_set_header X-Forwarded-Proto $scheme;
                      proxy_http_version 1.1;
                      proxy_set_header Upgrade $http_upgrade;
                      proxy_set_header Connection "upgrade";
                      proxy_pass $ffsec_upstream;
                      proxy_read_timeout 5m;
      
                      location ~ ^/(cameras|videos|vms|external-vms).*/stream/?$ {
                              proxy_set_header Host $http_host;
                              proxy_set_header X-Forwarded-For $remote_addr;
                              proxy_set_header X-Forwarded-Proto $scheme;
                              proxy_pass http://ffsecurity;
                      }
      
                      location ~ ^/streams/(.*)$ {
                              internal;
                              proxy_pass $1$is_args$args;
                      }
      
                      location /audit-logs {
                              proxy_pass http://audit;
                      }
      
                      location ~ ^/(auth|ad_groups|cproauth|groups|permissions|sessions|users|user-face|device-blacklist-records) {
                              proxy_pass http://identity-provider;
                      }
              }
      #       location /users/me/ad {
      #
      #                 proxy_pass <FFmulti_address>/auth/ad_login/; e.g http://127.0.0.1/auth/ad_login/;
      #                 proxy_method POST;
      #
      #                 proxy_set_header   X-Real-IP $remote_addr;
      #                 proxy_set_header   Host $http_host;
      #                 proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
      #                 proxy_set_header  Authorization $http_authorization;
      #                 proxy_pass_header Authorization;
      #                 proxy_no_cache 1;
      #                 proxy_cache_bypass 1;
      #
      #                 auth_gss on;
      #                 auth_gss_realm <REALM>; # e.g. TESTNTL.LOCAL;
      #                 auth_gss_keytab <path/to/file.keytab>; # e.g. /var/lib/web.keytab
      #                 auth_gss_service_name <service_name>; # e.g. HTTP/web.testntl.local;
      #                 auth_gss_allow_basic_fallback on;
      #         }
      
      }
      
    4. Скопируйте общий файл конфигурации nginx nginx.conf из контейнера findface-multi-findface-multi-ui-1 в директорию /etc/nginx/:

      sudo docker cp findface-multi-findface-multi-ui-1:/etc/nginx/nginx.conf /etc/nginx/nginx.conf
      
    5. В общем файле конфигурации /etc/nginx/nginx.conf найдите раздел SSL Settings и добавьте в его конец следующие строки:

      ssl_session_cache   shared:SSL:10m;
      ssl_session_timeout 1h;
      
  5. В файле /opt/findface-multi/docker-compose.yaml добавьте (смонтируйте) каталог, хранящий данные SSL-шифрования /etc/nginx/ssl/ и файл конфигурации /etc/nginx/nginx.conf системы-хоста в контейнер findface-multi-findface-multi-ui-1:

    1. Откройте файл docker-compose.yaml:

      sudo vi /opt/findface-multi/docker-compose.yaml
      
    2. Найдите раздел findface-multi-ui и отредактируйте его, чтобы он выглядел так, как показано в примере ниже:

      findface-multi-ui:
        depends_on: [findface-multi-legacy]
        image: docker.int.ntl/ntech/multi/multi/ui:ffmulti-2.1.3
        network_mode: service:pause
        restart: always
        volumes: ['./configs/findface-multi-ui/nginx-site.conf:/etc/nginx/conf.d/default.conf:ro',
          './data/findface-multi-legacy/uploads:/var/lib/findface-security/uploads',
          '/etc/nginx/ssl:/etc/nginx/ssl',
          '/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro']
      
  6. Отредактируйте файл конфигурации /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py.

    1. В параметрах ROUTER_URL и IMAGE_CROP_URL замените префикс http:// на https://.

      sudo vi /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py
      
      ...
      'ROUTER_URL': 'https://127.0.0.1',
      'IMAGE_CROP_URL': 'https://127.0.0.1',
      ...
      
    2. При использовании подтвержденного сертификата необходимо в ROUTER_URL указать домен, по которому был создан сертификат:

      'ROUTER_URL': 'https://my-example-domain.com'
      
    3. Добавьте адрес https://my-example-domain.com в параметр EXTERNAL_ADDRESS:

      ...
      EXTERNAL_ADDRESS = 'https://my-example-domain.com'
      ...
      
  7. На сервере с установленным FindFace Multi откройте файл /etc/hosts и добавьте следующую строку:

    sudo vi /etc/hosts
    
    ...
    127.0.0.1 my-example-domain.com
    
  8. В системе, где вы используете браузер для взаимодействия с FindFace Multi, откройте файл hosts. Добавьте IP-адрес сервера, на котором установлен FindFace Multi, вместо ip_address_server_ffmulti. Замените my-example-domain.com адресом вашего домена — так же, как вы делали в предыдущих шагах.

    1. Для операционной системы Linux выполните следующее:

      sudo vi /etc/hosts
      
      ...
      *ip_address_server_ffmulti* my-example-domain.com
      
    2. Если вы используете операционную систему Windows, откройте файл C:\Windows\System32\drivers\etc\hosts от имени администратора. Добавьте следующую строку в файл hosts:

      *ip_address_server_ffmulti* my-example-domain.com
      
  9. Выполните перезапуск контейнеров FindFace Multi.

    cd /opt/findface-multi/
    
    sudo docker-compose restart
    
  10. При использовании самоподписанного сертификата для работы камер и загруженных видеоархивов нужно отключать проверку SSL-сертификата:

    1. Перейдите на вкладку Источники видео -> Камеры или Загрузки.

    2. Нажмите на камеру или загруженный видеоархив.

    3. На вкладке Дополнительные снимите флажок Проверить SSL-серnификат.

    camera_verify_SSL_ru

Предупреждение

Если среда будет сильно распределена при полностью настраиваемой установке и компонент pause будет исключен из установки, то могут возникнуть проблемы с получением скриншотов в камерах и в работе с видеоплеером. Для решения этой проблемы можно добавить следующие строки в файл /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py:

USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

Выполните перезапуск контейнеров FindFace Multi.

cd /opt/findface-multi

sudo docker-compose restart