Настройка шифрования данных
В этой главе:
Для обеспечения безопасности данных включите 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 требуется указание в
subjectAltNamefindface-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_ffmultiIP-адресом сервера, на котором установлен экземпляр 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-сертификат в настройках камер и видео архивов отключена.
