Настройка шифрования данных
В этой главе:
Для обеспечения безопасности данных включите SSL-шифрование. Начиная с версии FindFace Multi 2.3, вы можете развернуть FindFace Multi с поддержкой HTTPS во время автоматического односерверного развертывания. Мы настоятельно рекомендуем включить HTTPS при развертывании FindFace Multi. Если требуется установка HTTPS вручную, выполните следующие действия:
На хосте создайте директорию с конфигурацией nginx, включающую каталог для хранения информации о SSL-шифровании:
sudo mkdir -p /opt/findface-multi/configs/ssl/
Создайте ключ и сертификат 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/
.Добавьте путь сертификата в volumes для сервиса
findface-video-worker
. Добавьте команду обновления корневого хранилища сертификатов в контейнере сервиса в entrypoint.Откройте файл
/opt/findface-multi/docker-compose.yaml
:sudo vi /opt/findface-multi/docker-compose.yaml
Найдите раздел
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']
Настройте nginx для использования SSL. Откройте файл конфигурации nginx
/opt/findface-multi/configs/findface-multi-ui/nginx-site.conf
. Внесите в файл следующие изменения:Закомментируйте следующие строки в существующем разделе
server {...}
# listen 80 default_server; # listen [::]:80 default_server;
и добавьте следующие строки:
listen 443 ssl; listen [::]:443 ssl;
Раскомментируйте следующие строки в существующем разделе
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 вы можете посмотретьздесь
.
В файле
/opt/findface-multi/docker-compose.yaml
добавьте (смонтируйте) каталог, хранящий данные SSL-шифрования/opt/findface-multi/configs/ssl/
в контейнерfindface-multi-findface-multi-ui-1
:Откройте файл
/opt/findface-multi/docker-compose.yaml
:sudo vi /opt/findface-multi/docker-compose.yaml
Найдите раздел
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']
Измените конфигурацию сервисов:
Для сервисов
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
Отредактируйте файл конфигурации
/opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py
.В параметре
ROUTER_URL
замените префиксhttp://
наhttps://
.sudo vi /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py ... 'ROUTER_URL': 'https://findface-multi-ui', ...
При использовании подтвержденного сертификата необходимо в
ROUTER_URL
указать домен, по которому был создан сертификат:'ROUTER_URL': 'https://my-example-domain.com'
В параметре
EXTERNAL_ADDRESS
замените префиксhttp://
наhttps://
.... EXTERNAL_ADDRESS = 'https://<ip_address_server_ffmulti>' ...
В параметре
ANNEX_URL
замените префиксhttp://
наhttps://
.... 'ANNEX_URL': 'https://findface-multi-ui/service_alarmer/alarms/' ...
В системе, где вы используете браузер для взаимодействия с FindFace Multi, откройте файл
hosts
. Добавьте IP-адрес сервера, на котором установлен FindFace Multi, вместоip_address_server_ffmulti
. Заменитеmy-example-domain.com
адресом вашего домена — так же, как вы делали в предыдущих шагах.Для операционной системы Linux выполните следующее:
sudo vi /etc/hosts ... ip_address_server_ffmulti my-example-domain.com
Если вы используете операционную систему Windows, откройте файл
C:\Windows\System32\drivers\etc\hosts
от имени администратора. Добавьте следующую строку в файлhosts
:ip_address_server_ffmulti my-example-domain.com
В файле конфигурации
/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 down sudo docker-compose up -d
При использовании самоподписанного сертификата для обеспечения корректной проверки SSL требуется указание в
subjectAltName
findface-multi-ui
и IP-адреса сервера (см. п. 2). Если в самоподписанном сертификате не указанsubjectAltName
, то для работы камер и загруженных видеоархивов нужно отключать проверку SSL-сертификата.Если вы используете Тревожный монитор с безопасным соединением, то укажите
wss://
перед адресом сервера подключения (wss://ip_address/annex/
).
Включение рекомендованных настроек безопасности
Если требуется, включите рекомендуемые настойки безопасности nginx.
Для дополнительной защиты трафика создайте
dhparam
файл, выполнив команду:sudo openssl dhparam -out /opt/findface-multi/configs/ssl/dhparam.pem 4096
Откройте файл конфигурации nginx
/opt/findface-multi/configs/findface-multi-ui/nginx-site.conf
. Внесите в файл следующие изменения:Добавьте путь к
dhparam
файлу и строку с заголовкомStrict-Transport-Security
в существующий разделserver {...}
:ssl_dhparam /etc/ssl/dhparam.pem; add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
Замените
server_name _;
наserver_name my-example-domain.com;
.Замените
set $cors_origin "*";
наset $cors_origin "my-example-domain.com";
.Замените
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
наssl_protocols TLSv1.2 TLSv1.3;
.Скопируйте общий файл конфигурации 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
В общем файле конфигурации
/etc/nginx/nginx.conf
найдите разделSSL Settings
и добавьте в его конец следующие строки:ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_session_tickets off; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_stapling on; ssl_stapling_verify on;
В файле
/opt/findface-multi/docker-compose.yaml
добавьте (смонтируйте) файл конфигурации/etc/nginx/nginx.conf
системы-хоста в контейнерfindface-multi-findface-multi-ui-1
:Откройте файл
/opt/findface-multi/docker-compose.yaml
:sudo vi /opt/findface-multi/docker-compose.yaml
Найдите раздел
findface-multi-ui
и отредактируйте его, чтобы он выглядел так, как показано в примере ниже: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', '/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro']
Для автоматического перенаправления с HTTP на HTTPS добавьте в конфигурационном файле
/opt/findface-multi/configs/findface-multi-ui/nginx-site.conf
новый разделserver {...}
, содержащий правило замены URL. В строкеrewrite ^(.*) https://…
заменитеip_address_server_ffmulti
IP-адресом сервера, на котором установлен экземпляр FindFace Multi.sudo vi /opt/findface-multi/configs/findface-multi-ui/nginx-site.conf ... 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; }
Выполните перезапуск контейнеров FindFace Multi.
cd /opt/findface-multi/ sudo docker-compose down sudo docker-compose up -d
Замена самоподписанного сертификата на подтвержденный после установки
Если для настройки SSL в FindFace Multi вы используете подтвержденный сертификат, то сертификат и ключ необходимо скопировать в каталог
/opt/findface-multi/configs/ssl
на хосте.Если имена файлов сертификата и ключа отличаются от
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
на актуальные.
После замены файлов сертификата и ключа и изменения файлов настроек выполните перезапуск контейнеров 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-сертификат в настройках камер и видео архивов отключена.