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

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

Важно

Использование самоподписанного сертификата не рекомендуется.

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

    sudo mkdir /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. Настройте nginx для использования SSL. Откройте файл конфигурации nginx /etc/nginx/sites-available/ffsecurity-nginx.conf. Внесите в файл следующие изменения:

    1. Добавьте новый раздел server {...}, содержащий правило замены URL:

      server {
              listen 80;
              server_name domain.ru www.domain.ru;
              rewrite ^(.*) https://domain.ru$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/domain.crt;
      ssl_certificate_key /etc/nginx/ssl/domain.key;
      
    4. В общем файле конфигурации /etc/nginx/nginx.conf найдите раздел SSL Settings и добавьте в его конец следующие строки:

    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 1h;
    

    Пример файла конфигурации /etc/nginx/sites-available/ffsecurity-nginx.conf с корректно заданными настройками SSL показан в примере ниже:

    upstream ffsecurity {
     server 127.0.0.1:8002;
    }
    
    upstream ffsecurity-ws {
      server 127.0.0.1:8003;
    }
    
    map $http_upgrade $ffsec_upstream {
      default "http://ffsecurity-ws";
      "" "http://ffsecurity";
    }
    
    server {
      listen 80;
      server_name domain.ru www.domain.ru;
      rewrite ^(.*) https://domain.ru$1 permanent;
      access_log off;
    }
    
    server {
      # listen 80 default_server;
      # listen [::]:80 default_server;
      listen 443 ssl;
      ssl_certificate /etc/nginx/ssl/domain.crt;
      ssl_certificate_key /etc/nginx/ssl/domain.key;
    
      root /var/lib/ffsecurity;
    
      autoindex off;
    
      server_name _;
    
      location = / {
    
        alias /usr/share/ffsecurity-ui/;
        try_files /index.html =404;
         }
      location /static/ {
    
      }
      location /uploads/ {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
        add_header 'Access-Control-Max-Age' 2592000;
      }
      location /ui-static/ {
        alias /usr/share/ffsecurity-ui/ui-static/;
      }
      location /doc/ {
        alias /opt/ffsecurity/doc/;
      }
      location ~ /videos/(?<video_id>[0-9]+)/upload/(.*)$ {
        if ($request_method = 'OPTIONS') {
          add_header 'Content-Type' 'text/plain; charset=utf-8';
          add_header 'Content-Length' 0;
          return 204;
        }
        set $auth_request_uri "http://ffsecurity/videos/$video_id/auth-upload/";
        auth_request /video-upload-auth/;
    
        alias "/var/lib/ffsecurity/uploads/videos/$video_id.bin";
        client_max_body_size 15g;
    
        dav_access user:rw group:rw all:rw;
        dav_methods PUT;
    
        create_full_put_path on;
        autoindex off;
        autoindex_exact_size off;
        autoindex_localtime on;
        charset utf-8;
    
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'PUT, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'authorization';
      }
      location = /video-upload-auth/ {
        internal;
        client_max_body_size 15g;
        proxy_set_header Content-Length "";
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass_request_body off;
        proxy_pass $auth_request_uri;
      }
    
      location / {
        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_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)/([0-9]+)/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;
        }
      }
    }
    
  4. Перезапустите nginx.

    sudo service nginx restart
    
  5. Внесите изменения в файл конфигурации findface-security. В параметрах EXTERNAL_ADDRESS и ROUTER_URL измените приставку http:// на https://.

    sudo vi /etc/ffsecurity/config.py
    
    ...
    EXTERNAL_ADDRESS="https://my-example-domain.com"
    ...
    ROUTER_URL="https://IP_address"
    
  6. Если есть запущенные процессы findface-video-worker, нужно либо пересоздать камеры в веб-интерфейсе, либо изменить значение параметра router_url в job-заданиях, заменив приставку http:// на https://. Это можно сделать с помощью команды, аналогичной следующей:

    curl -s localhost:18810/jobs | jq -r '.[]["id"]' | xargs -I {} curl -X PATCH -d '{"router_url": "https://domain.ru/video-detector/frame"}' http://localhost:18810/job/{}