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

В этой главе:

Для обеспечения безопасности данных включите SSL-шифрование. Начиная с версии FindFace Multi 2.3, вы можете развернуть FindFace Multi с поддержкой HTTPS во время автоматического односерверного развертывания. Мы настоятельно рекомендуем включить HTTPS при развертывании FindFace Multi. Если требуется установка HTTPS вручную, выполните следующие действия:

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

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

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -addext "subjectAltName = DNS:localhost, DNS:findface-multi-ui, IP:external_address" -keyout /opt/findface-multi/configs/ssl/domain.key -out /opt/findface-multi/configs/ssl/domain.crt
    

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

  3. Добавьте путь сертификата в volumes для сервиса findface-video-worker. Добавьте команду обновления корневого хранилища сертификатов в контейнере сервиса в entrypoint.

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

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

      CPU

      findface-video-worker:
        entrypoint: ["sh", "-c", "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-12.241211.2
        logging: {driver: journald}
        networks: [product-network]
        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',
          '/opt/findface-multi/configs/ssl/domain.crt:/usr/local/share/ca-certificates/domain.crt']
      

      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-12.241211.2
        logging: {driver: journald}
        networks: [product-network]
        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',
          '/opt/findface-multi/configs/ssl/domain.crt:/usr/local/share/ca-certificates/domain.crt']
      
  4. Настройте nginx для использования SSL. Откройте файл конфигурации nginx /opt/findface-multi/configs/findface-multi-ui/nginx-site.conf. Внесите в файл следующие изменения:

    1. Закомментируйте следующие строки в существующем разделе server {...}

      # listen 80 default_server;
      # listen [::]:80 default_server;
      

      и добавьте следующие строки:

      listen 443 ssl;
      listen [::]:443 ssl;
      
    2. Раскомментируйте следующие строки в существующем разделе server {...}:

      ssl_certificate /etc/ssl/domain.crt;
      ssl_certificate_key /etc/ssl/domain.key;
      
      ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
      
      http2 on;
      

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

  5. В файле /opt/findface-multi/docker-compose.yaml добавьте (смонтируйте) каталог, хранящий данные SSL-шифрования /opt/findface-multi/configs/ssl/ в контейнер findface-multi-findface-multi-ui-1:

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

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

      • Добавьте '443:443' в секцию ports,

      • Добавьте '/opt/findface-multi/configs/ssl:/etc/ssl' в секцию volumes.

      findface-multi-ui:
        depends_on: [findface-multi-legacy]
        image: docker.int.ntl/ntech/multi/multi/ui:ffmulti-2.3.0
        logging: {driver: journald}
        networks: [product-network]
        ports: ['80:80','443:443']
        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',
          '/opt/findface-multi/configs/ssl:/etc/ssl']
      
    3. Измените конфигурацию сервисов:

      • Для сервисов backend_api и service_alarmer замените префикс http:// на https:// в переменной окружения DSN_IMAGE_EXTERNAL_ADDRESS.

      • Для сервисов backend_api, service_notifier_ws и service_notifier_tg замените префикс http:// на https:// в переменной окружения DSN_FF_AUTH.

      • Для сервисов backend_api, service_notifier_ws и service_notifier_tg добавьте volumes, как показано ниже.

      • Для сервисов backend_api, service_notifier_ws и service_notifier_tg измените команду запуска сервиса на [sh, -c, update-ca-certificates && python -m backend_api], [sh, -c, update-ca-certificates && python -m service_notifier.ws] и [sh, -c, update-ca-certificates && python -m service_notifier.tg] соответственно.

      backend_api:
        command: [sh, -c, update-ca-certificates && python -m backend_api]
        depends_on:
          timescaledb: {condition: service_healthy}
        environment: {DSN_FF_AUTH: 'https://findface-multi-ui/', DSN_FF_VIDEO_MANAGER: 'http://findface-video-manager:18810/',
          DSN_FF_VIDEO_STORAGE: 'http://findface-video-storage:18611/', DSN_IMAGE_EXTERNAL_ADDRESS: 'https://<ip_address>',
          DSN_PG: 'postgresql+asyncpg://ntech:<...>@timescaledb:5433/annex',
          SERVER_HOST: 0.0.0.0, SERVER_PORT: '2222'}
        image: docker.int.ntl/presale/annex:2.0.2
        logging: {driver: journald}
        networks: [product-network]
        restart: always
        volumes: &id007 ['/opt/findface-multi/configs/ssl/domain.crt:/usr/local/share/ca-certificates/domain.crt']
      service_alarmer:
        command: [python, -m, service_alarmer]
        depends_on:
          rabbitmq: {condition: service_healthy}
          timescaledb: {condition: service_healthy}
        environment: {DROP_ALL: 'False', DSN_AMQP: 'amqp://ntech:<...>@rabbitmq:5672/',
          DSN_FF_UPLOAD: 'http://findface-upload:3333/', DSN_IMAGE_EXTERNAL_ADDRESS: 'https://<ip_address>',
          DSN_PG: 'postgresql+asyncpg://ntech:<...>@timescaledb:5433/annex'}
        image: docker.int.ntl/presale/annex:2.0.2
        logging: {driver: journald}
        networks: [product-network]
        restart: always
      service_notifier_ws:
        command: [sh, -c, update-ca-certificates && python -m service_notifier.ws]
        depends_on:
          rabbitmq: {condition: service_healthy}
        environment: {CHECK_ACCESS: 'True', DSN_AMQP: 'amqp://ntech:<....>@rabbitmq:5672/',
          DSN_FF_AUTH: 'https://findface-multi-ui/', SERVER_HOST: 0.0.0.0, SERVER_PORT: 3311,
          USER_AUTOFILL: 'True'}
        image: docker.int.ntl/presale/annex:2.0.2
        logging: {driver: journald}
        networks: [product-network]
        ports: ['3311:3311']
        restart: always
        volumes: *id007
      service_notifier_tg:
        command: [sh, -c, update-ca-certificates && python -m service_notifier.tg]
        depends_on:
          rabbitmq: {condition: service_healthy}
        environment: {ALLOWED_SERVICES: null, ALLOWED_STREAMS: null, BOT_TOKEN: '', DSN_AMQP: 'amqp://ntech:<...>@rabbitmq:5672/',
          DSN_FF_AUTH: 'https://findface-multi-ui/', DSN_REDIS: 'redis://@redis:6379/1',
          USER_AUTOFILL: 'True'}
        image: docker.int.ntl/presale/annex:2.0.2
        logging: {driver: journald}
        networks: [product-network]
        volumes: *id007
      
  6. Отредактируйте файл конфигурации /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py.

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

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

      'ROUTER_URL': 'https://my-example-domain.com'
      
    3. В параметре EXTERNAL_ADDRESS замените префикс http:// на https://.

      ...
      EXTERNAL_ADDRESS = 'https://<ip_address_server_ffmulti>'
      ...
      
    4. В параметре ANNEX_URL замените префикс http:// на https://.

      ...
      'ANNEX_URL': 'https://findface-multi-ui/service_alarmer/alarms/'
      ...
      
  7. В системе, где вы используете браузер для взаимодействия с 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
      
  8. В файле конфигурации /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')
    
  9. Выполните перезапуск контейнеров FindFace Multi.

    cd /opt/findface-multi/
    
    sudo docker-compose down
    sudo docker-compose up -d
    
  10. При использовании самоподписанного сертификата для обеспечения корректной проверки SSL требуется указание в subjectAltName findface-multi-ui и IP-адреса сервера (см. п. 2). Если в самоподписанном сертификате не указан subjectAltName, то для работы камер и загруженных видеоархивов нужно отключать проверку SSL-сертификата.

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

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

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

      camera_verify_SSL_ru

  11. Если вы используете Тревожный монитор с безопасным соединением, то укажите wss:// перед адресом сервера подключения (wss://ip_address/annex/).

Замена самоподписанного сертификата на подтвержденный после установки

  1. Если для настройки SSL в FindFace Multi вы используете подтвержденный сертификат, то сертификат и ключ необходимо скопировать в каталог /opt/findface-multi/configs/ssl на хосте.

  2. Если имена файлов сертификата и ключа отличаются от domain.key и domain.crt, необходимо:

    • либо переименовать имеющиеся файлы в domain.key и domain.crt (предпочтительно),

    • либо внести изменения в конфигурационные файлы /opt/findface-multi/configs/findface-multi-ui/nginx-site.conf и /opt/findface-multi/docker-compose.yaml, заменив наименования файлов domain.key и domain.crt на актуальные.

  3. После замены файлов сертификата и ключа и изменения файлов настроек выполните перезапуск контейнеров FindFace Multi.

    cd /opt/findface-multi/
    
    sudo docker-compose down
    sudo docker-compose up -d
    

Примечание

Для избежания ошибок при работе камер и загруженных видеоархивов нужно выполнить одно из следующих условий:

  • Доменное имя из CN сертификата доступно из контейнера findface-video-worker и указано в ROUTER_URL в конфигурационном файле /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py.

  • Настройка Проверить SSL-сертификат в настройках камер и видео архивов отключена.