ТЕХНИЧЕСКАЯ ДОКУМЕНТАЦИЯ
На програмное обеспечение "InfoOTP"

Содержание

Требования к аппаратному и программному обеспечению
Установка ПО Сервер 1 (внутренний)
Установка ПО Сервер 2 (DMZ)
Активация ПО
Описание разделов InfoOTP
Ошибки работы ПО
Пользовательский портал
Требования к аппаратному и программному обеспечению
Сервер 1 (внутренний)
·       Процессор: 1 ядро (arm64 или amd64) (от 2,2 ГГц)
·       Память: 6 ГБ RAM
·       Свободное место: 40 ГБ SSD
·       Операционная система: ОС Astra Linux 1.7 или Debian 12 64-бит

Сервер 2 (DMZ)
·       Процессор: 1 ядро (arm64 или amd64) (от 2 ГГц)
·       Память: 2 ГБ RAM
·       Свободное место: 40 ГБ SSD
·       Операционная система: ОС Astra Linux 1.7 или Debian 12 64-бит
Установка ПО Сервер 1 (внутренний)
Скачать на целевой сервер установочный пакет (архив) infootp-build_Х.Х.Х.Х.zip и Install_InfoOtp.sh

Установить пакет, для работы с архивами, unzip.
sudo apt install unzip

Распаковываем архив infootp-build_Х.Х.Х-Х.zip командой.
unzip infootp-build_Х.Х.Х-Х.zip
 
Установка через инсталляционный скрипт

       Сделать файл Install_InfoOtp.sh исполняемым.
                 sudo chmod +x Install_InfoOtp.sh
Запустить установку программного обеспечения InfoOTP.
./Install_InfoOtp.sh
Далее установка будет осуществляться в диалоговом формате.


Установка в ручном режиме

Установить все необходимые пакеты программ, которые понадобятся в дальнейшем (nginx, uwsgi, uwsgi-plugin-python3, python3-pip, python3-venv, redis, mariadb-server, default-libmysqlclient-dev, default-mysql-client, pkg-config).

sudo apt install nginx uwsgi uwsgi-plugin-python3 python3-pip python3-venv redis mariadb-server default-libmysqlclient-dev default-mysql-client pkg-config unzip

Создаем директорию для программы
       sudo mkdir /var/www/infoOTP

Копируем содержимое каталога infootp-master в созданную директорию
       /var/www/infoOTP

       sudo cp -r infootp-master/* /var/www/infoOTP/

Переходим в директорию /var/www/infoOTP/
       cd /var/www/infoOTP/

Создаем каталог для изолированного виртуального окружения
       sudo mkdir venv

Создаем изолированное виртуальное окружение
       sudo python3 -m venv venv

Активируем изолированное виртуальное окружение (Если не под root то выдает ошибку)
       source venv/bin/activate

Устанавливаем пакеты, список зависимостей проекта, необходимых для его работы, перечисленных в файле req.txt.
       pip install -r req.txt

Производим настройку базы данных mariadb.
       sudo mysql_secure_installation

Необходимо для учетной записи root в базе данных задать пароль. На следующие вопросы можно ответить, как указано ниже.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n
(Ваша учетная запись root уже защищена, поэтому вы можете безопасно отвечать "n".
Переключитесь на аутентификацию unix_socket [Y/n])
 
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] n
(Ваша учетная запись root уже защищена, поэтому вы можете безопасно отвечать "n".
Измените пароль root? [Y/n])
 
By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them.  This is intended only for testing, and to make the installation go a bit smoother.  You should remove them before moving into a production environment.
Remove anonymous users? [Y/n] y
(По умолчанию при установке MariaDB используется анонимный пользователь, что позволяет любому пользователю входить в MariaDB без создания учетной записи пользователя. Это предназначено только для тестирования и упрощения процесса установки. Вам следует удалить их перед переходом в рабочую среду.
Удалите анонимных пользователей? [Y/n])
 
Normally, root should only be allowed to connect from 'localhost'.  This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] y
(Обычно root-пользователям разрешается подключаться только с "локального хоста". Это гарантирует, что кто-либо не сможет угадать пароль root от сети. Запретить удаленный вход пользователя root? [Y/n])
 
By default, MariaDB comes with a database named 'test' that anyone can access.  This is also intended only for testing, and should be removed before moving into a production environment.
Remove test database and access to it? [Y/n] y
(По умолчанию MariaDB поставляется с базой данных с именем "test", к которой может получить доступ любой желающий. Она также предназначена только для тестирования и должна быть удалена перед переносом в рабочую среду.
Удалить тестовую базу данных и доступ к ней? [Y/n])
 
Reloading the privilege tables will ensure that all changes made so far will take effect immediately.
Reload privilege tables now? [Y/n] y
(Перезагрузка таблиц привилегий гарантирует, что все внесенные до сих пор изменения вступят в силу немедленно.
Перезагрузите таблицы привилегий сейчас? [Y/n])
 
Подключаемся к базе данных
       mysql -u root

Создаем базу данных (infoOTP)
       CREATE DATABASE infoOTP;

Создаем пользователя (infoOTP) и пароль (например 1234567890) для него
       CREATE USER infoOTP@localhost IDENTIFIED BY '1234567890';

Назначаем права доступа к созданной базе пользователю
       GRANT ALL PRIVILEGES ON infoOTP.* TO infoOTP@localhost;
FLUSH PRIVILEGES;
Выходим из базы данных.
exit
Генерируем ключи для работы системы
python create_tokens.py
В результате мы получаем ENCRYPTION_KEY, TOKEN_PRIVATE_KEY, TOKEN_PUBLIC_KEY, REFRESH_PRIVATE_KEY, REFRESH_PUBLIC_KEY.
Создаем файл настройки для взаимодействия с базой данных.
sudo nano OTP/secr.py
DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.mysql',
       'NAME': 'infoOTP',
       'USER': 'infoOTP',
       'PASSWORD': '1234567890',
       'HOST': 'localhost',
       'PORT': '3306',
   }
}
 
TOKEN_PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n…"
TOKEN_PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\n…"
REFRESH_PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n…"
REFRESH_PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\n…"

Файл secr_sample.py является шаблоном, который можно заполнить и переименовать.
Обратите внимание, что вставлять ключ необходимо полностью, но без b’’.
Запускаем процесс копирования статических файлов для NGINX
python manage.py collectstatic
Запускаем процесс миграции данных.
python manage.py migrate
Устанавливаем права на каталог infoOTP
chown www-data:www-data /var/www/infoOTP/ -R
 
Создаем пароль для Redis не менее 25 знаков (можно использовать любой генератор паролей).
Создаем файл с настройками uwsgi, протокола и программного интерфейса для связи веб-серверов с приложениями. В данным файле необходимо изменить строки ENCRYPTION_KEY и REDIS_URL. В строке REDIS_URL заменить пароль на только что сгенерированный
sudo nano /etc/uwsgi/apps-available/infoOTP.ini
[uwsgi]
plugins = python3
chdir = /var/www/infoOTP
pyhome = /var/www/infoOTP/venv
virtualenv = /var/www/infoOTP/venv
home = /var/www/infoOTP/venv
env=ENCRYPTION_KEY=P2FFsdEEEEB3Kn6k3xuVgo5r4p-55A1GuyYbKKKq5aa=
env=REDIS_URL=redis://default:12345678901234567899012345@127.0.0.1:6379/0
wsgi-file = OTP/wsgi.py
enable-threads
max-request = 5000
master = true
chmod-socket = 660
vacuum = true
uid = www-data
gui = www-data

Редактируем файл redis.conf. Необходимо раскомментировать параметр
# requirepass foobared, параметр foobared заменить на ранее сгенерированный пароль Redis.

sudo nano /etc/redis/redis.conf

requirepass
12345678901234567899012345

Перезапускаем службы redis.
sudo systemctl restart redis

Проверяем подключение к redis
redis-cli -a 12345678901234567899012345
    (пароль Redis)
ping
AUTH12345678901234567899012345

Создаем символическую ссылку файла infoOTP.ini
sudo ln -s /etc/uwsgi/apps-available/infoOTP.ini /etc/uwsgi/apps-enabled/

Перезапускаем службы uwsgi.
sudo systemctl restart uwsgi

Создаем файла dhparam.pem, содержащий параметры Диффи-Хеллмана длиной 2048 бит, для установления TLS-соединений. Сохраняем в каталоге /etc/ssl/infoOTP/dh.pem
         sudo openssl dhparam -out dhparam.pem 2048

Генерируем самоподписанный сертификат.
Создаем директорию и назначаем на нее права доступа
sudo mkdir /etc/ssl/infoOTP
mv dhparam.pem /etc/ssl/infoOTP/dh.pem
         chmod 600 /etc/ssl/infoOTP/

         Создаем самоподписанный сертификат
         openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/infoOTP/private.key -out /etc/ssl/infoOTP/chained.cer

         Создаем файл конфигурации Nginx
         sudo nano /etc/nginx/conf.d/options-ssl.conf

ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;
 
#ssl_protocols TLSv1.2 TLSv1.3;
#ssl_prefer_server_ciphers off;
 
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";

Удаляем файл default из каталога /etc/nginx/sites-enabled
sudo rm /etc/nginx/sites-enabled/default
 
Создаем файл infoOTP, настройка Веб сервиса (170.22.1.22 – ip адрес сервера InfoOTP; infootp.ru – URL сервера InfoOTP; chained.cer, private.key – сертификат и ключ SSL)
         sudo nano /etc/nginx/sites-available/infoOTP
 
server {
  listen 80 default_server;
 
  if ($request_uri !~* ^/(media|static)/) {
     return 301 https://infootp.ru$request_uri;
  }
 
  location /static/ {
     alias /var/www/infoOTP/static/;
  }
 
  location /media/ {
      alias /var/www/infoOTP/media/;
  }
}
 
server {
  listen 443 ssl default_server;
  server_name 170.22.1.22;
  ssl_certificate /etc/ssl/infoOTP/chained.cer;
  ssl_certificate_key /etc/ssl/infoOTP/private.key;
  include /etc/nginx/conf.d/options-ssl.conf;
  ssl_dhparam /etc/ssl/infoOTP/dh.pem;
  return 301 https://infootp.ru$request_uri;
}
server {
  listen 443 ssl;
  server_name infootp.ru;
  error_log /var/www/infoOTP/error.log;
 
  location / {
      uwsgi_pass unix:///run/uwsgi/app/infoOTP/socket;
      include uwsgi_params;
      uwsgi_read_timeout 300s;
      client_max_body_size 32m;
  }
 
  location /static/ {
     alias /var/www/infoOTP/static/;
  }
 
  location /media/ {
      alias /var/www/infoOTP/media/;
  }
  ssl_certificate /etc/ssl/infoOTP/chained.cer;
  ssl_certificate_key /etc/ssl/infoOTP/private.key;
  include /etc/nginx/conf.d/options-ssl.conf;
  ssl_dhparam /etc/ssl/infoOTP/dh.pem;
 
  access_log /var/www/infoOTP/access.log;
}

Создаем символическую ссылку файла infoOTP
sudo ln -s /etc/nginx/sites-available/infoOTP /etc/nginx/sites-enabled/

Проверяем синтаксис конфигурационных файлов Nginx перед перезапуском или перезагрузкой сервиса (nginx: the configuration file /etc/nginx/nginx.conf syntax is ok – успешная проверка).
nginx -t
 
Перезапускаем Nginx
         sudo systemctl restart nginx

Перезапускаем службы redis и uwsgi.
sudo systemctl restart redis
sudo systemctl restart uwsgi

Создаем демон infoOTPworker.service
sudo nano /lib/systemd/system/infoOTPworker.service
 
[Unit]
Description=Celery worker service for InfoOTP
After=network.target
 
[Service]
ExecStart=/var/www/infoOTP/venv/bin/celery -A OTP worker -l INFO -P gevent --concurrency=1
ExecReload=/var/www/infoOTP/venv/bin/celery -A OTP worker -l INFO -P gevent --concurrency=1
Environment="ENCRYPTION_KEY=P2FFsdEEEEB3Kn6k3xuVgo5r4p-55A1GuyYbKKKq5aa="
Environment="REDIS_URL=redis://default:12345678901234567899012345@127.0.0.1:6379/0"
WorkingDirectory=/var/www/infoOTP/
KillMode=process
Restart=always
RestartSec=2
 
[Install]
WantedBy=multi-user.target
 
Меняем REDIS_URL и ENCRYPTION_KEY насозданные ранее, как в файле infoOTP.ini
Присваиваем права на чтение запись для пользователя root файл infoOTPworker.service
sudo chmod 600 /lib/systemd/system/infoOTPworker.service
 
 
Создаем демон infoOTPcelery.service
sudo nano /lib/systemd/system/infoOTPcelery.service
[Unit]
Description=Celery sheduller service for InfoOTP
After=network.target
 
[Service]
ExecStart=/var/www/infoOTP/venv/bin/celery -A OTP beat -S django_celery_beat.schedulers:DatabaseScheduler -l INFO
ExecReload=/var/www/infoOTP/venv/bin/celery -A OTP beat -S django_celery_beat.schedulers:DatabaseScheduler -l INFO
Environment="ENCRYPTION_KEY=P2FFsdEEEEB3Kn6k3xuVgo5r4p-55A1GuyYbKKKq5aa="
Environment="REDIS_URL=redis://default:12345678901234567899012345@127.0.0.1:6379/0"
WorkingDirectory=/var/www/infoOTP/
KillMode=process
Restart=always
RestartSec=2
 
[Install]
WantedBy=multi-user.target
 
Меняем REDIS_URL и ENCRYPTION_KEY насозданные ранее, как в файле infoOTP.ini
Присваиваем права на чтение запись для пользователя root файл infoOTPcelery.service
sudo chmod 600 /lib/systemd/system/infoOTPcelery.service
 
Создаем демон infoOTPtelegram.service
              sudo nano /lib/systemd/system/infoOTPtelegram.service
 
[Unit]
Description=Telegram service for InfoOTP
After=network.target
 
[Service]
ExecStart=/var/www/infoOTP/venv/bin/python manage.py telebot
ExecReload=/var/www/infoOTP/venv/bin/python manage.py telebot
Environment="DJANGO_SETTINGS_MODULE=OTP.settings"
Environment="ENCRYPTION_KEY=P2FFsdEEEEB3Kn6k3xuVgo5r4p-55A1GuyYbKKKq5aa="
Environment="REDIS_URL=redis://default:12345678901234567899012345@127.0.0.1:6379/0"
WorkingDirectory=/var/www/infoOTP/
KillMode=process
Restart=always
RestartSec=2
 
[Install]
WantedBy=multi-user.target
 
Меняем REDIS_URL и ENCRYPTION_KEY насозданные ранее, как в файле infoOTP.ini
Присваиваем права на чтение запись для пользователя root файл infoOTPtelegram.service
sudo chmod 600 /lib/systemd/system/infoOTPtelegram.service
 
 
Создаем демон infoOTPradius.service
         sudo nano /lib/systemd/system/infoOTPradius.service
 
[Unit]
Description=Radius service for InfoOTP
After=network.target
 
[Service]
ExecStart=/var/www/infoOTP/venv/bin/python manage.py radius_server
ExecReload=/var/www/infoOTP/venv/bin/python manage.py radius_server
Environment="DJANGO_SETTINGS_MODULE=OTP.settings"
Environment="ENCRYPTION_KEY=P2FFsdEEEEB3Kn6k3xuVgo5r4p-55A1GuyYbKKKq5aa="
Environment="REDIS_URL=redis://default:12345678901234567899012345@127.0.0.1:6379/0"
WorkingDirectory=/var/www/infoOTP/
KillMode=process
Restart=always
RestartSec=2
 
[Install]
WantedBy=multi-user.target
 
Меняем REDIS_URL и ENCRYPTION_KEY насозданные ранее, как в файле infoOTP.ini
Присваиваем права на чтение запись для пользователя root файл infoOTPradius.service
sudo chmod 600 /lib/systemd/system/infoOTPradius.service
 
Создаем демон infoOTPldapproxy.service
              sudo nano /lib/systemd/system/infoOTPldapproxy.service
 
[Unit]
Description=LDAP Proxy service for InfoOTP
After=network.target
 
[Service]
ExecStart=/var/www/infoOTP/venv/bin/python manage.py ldap_proxy
ExecReload=/var/www/infoOTP/venv/bin/python manage.py ldap_proxy
Environment="DJANGO_SETTINGS_MODULE=OTP.settings"
Environment="ENCRYPTION_KEY=P2FFsdEEEEB3Kn6k3xuVgo5r4p-55A1GuyYbKKKq5aa="
Environment="REDIS_URL=redis://default:12345678901234567899012345@127.0.0.1:6379/0"
WorkingDirectory=/var/www/infoOTP/
KillMode=process
Restart=always
RestartSec=2
 
[Install]
WantedBy=multi-user.target
 
Меняем REDIS_URL и ENCRYPTION_KEY насозданные ранее, как в файле infoOTP.ini
Присваиваем права на чтение запись для пользователя root файл infoOTPldapproxy.service
sudo chmod 600 /lib/systemd/system/infoOTPldapproxy.service
 
Включаем необходимые для работы демоны
         sudo systemctl enable infoOTPworker
sudo systemctl enable infoOTPcelery
sudo systemctl enable infoOTPtelegram
sudo systemctl enable infoOTPradius
sudo systemctl enable infoOTPldapproxy
sudo systemctl enable uwsgi
sudo systemctl enable nginx
sudo systemctl enable mariadb
 
Создаем администратора системы панели администрирования InfoOTP
python manage.py createsuperuser
 
Настраиваем файл sudoers.
sudo nano /etc/sudoers
 
после %sudo  ALL=(ALL:ALL) ALL необходимо добавить:
%www-data ALL=(ALL:ALL) NOPASSWD: /usr/bin/systemctl

Настройка модуля отправки почтовых сообщений через ТГ.

Для корректной работы возможности отправки сообщений в ЦТП через ТГ необходимо добавить самоподписанные сертификаты почтового сервера в каталог /usr/local/share/ca-certificates/ в формате PEM, после этого выполнить

sudo update-ca-certificates

Порядок обновления InfoOTP
 
Для обновления ПО необходимо остановить службы
sudo systemctl stop infoOTPworker
sudo systemctl stop infoOTPcelery
sudo systemctl stop infoOTPtelegram
sudo systemctl stop infoOTPradius
sudo systemctl stop uwsgi
 
Копируем файлы из нового дистрибутива с ключом -r (замена файлов)
sudo cp -r infootp-master/* /var/www/infoOTP/
 
Переходим в каталог с infoOTP
sudo cd /var/www/infoOTP/
 
Активируем изолированное виртуальное окружения
source venv/bin/activate
 
Запускаем процесс копирования статических файлов для NGINX.
python manage.py collectstatic
 
Запускаем процесс миграции данных.
python manage.py migrate
 
Устанавливаем права на каталог infoOTP
sudo chown www-data:www-data ../infoOTP/ -R
 
Запускаем службы
sudo systemctl start infoOTPworker
sudo systemctl start infoOTPcelery
sudo systemctl start infoOTPtelegram
sudo systemctl start infoOTPradius
sudo systemctl start uwsgi
Установка ПО Сервер 2 (DMZ)
Скачать на целевой сервер установочный пакет (архив) infootpdmz-masterХ.Х.zip.
Установить все необходимые пакеты программ, которые понадобятся в дальнейшем (nginx, uwsgi, uwsgi-plugin-python3, python3-pip, python3-venv, mariadb-server, default-libmysqlclient-dev, default-mysql-client, pkg-config, unzip).
sudo apt install nginx uwsgi uwsgi-plugin-python3 python3-pip python3-venv mariadb-server default-libmysqlclient-dev default-mysql-client pkg-config unzip redis
Распаковываем архив infootp-masterХ.Х.zip командой.
unzip infootpdmz-masterХ.Х.zip
Создаем директорию для программы
sudo mkdir /var/www/infoOTPDMZ
Копируем содержимое каталога infootpdmz-master в созданную директорию /var/www/infoOTPDMZ
sudo cp -r infootpdmz-master/* /var/www/infoOTPDMZ/
Переходим в директорию /var/www/infoOTPDMZ/
cd /var/www/infoOTPDMZ/
Создаем каталог для изолированного виртуального окружение
         sudo mkdir venv
Создаем изолированное виртуальное окружение
         python3 -m venv venv
Активируем изолированное виртуальное окружение
         source venv/bin/activate
Устанавливаем пакеты, список зависимостей проекта, необходимых для его работы, перечисленных в файле req.txt.
pip install -r req.txt
Производим настройку базы данных mariadb.
         sudo mysql_secure_installation
Необходимо для учетной записи root в базе данных задать пароль. На следующие вопросы можно ответить, как указано ниже.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n
(Ваша учетная запись root уже защищена, поэтому вы можете безопасно отвечать "n".
Переключитесь на аутентификацию unix_socket [Y/n])
 
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] n
(Ваша учетная запись root уже защищена, поэтому вы можете безопасно отвечать "n".
Измените пароль root? [Y/n])
 
By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them.This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment.
Remove anonymous users? [Y/n] y
(По умолчанию при установке MariaDB используется анонимный пользователь, что позволяет любому пользователю входить в MariaDB без создания учетной записи пользователя. Это предназначено только для тестирования и упрощения процесса установки. Вам следует удалить их перед переходом в рабочую среду.
Удалите анонимных пользователей? [Y/n])
 
Normally, root should only be allowed to connect from 'localhost'.This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] y
(Обычно root-пользователям разрешается подключаться только с "локального хоста". Это гарантирует, что кто-либо не сможет угадать пароль root от сети. Запретить удаленный вход пользователя root? [Y/n])
 
By default, MariaDB comes with a database named 'test' that anyone can access.  This is also intended only for testing, and should be removed before moving into a production environment.
Remove test database and access to it? [Y/n] y
(По умолчанию MariaDB поставляется с базой данных с именем "test", к которой может получить доступ любой желающий. Она также предназначена только для тестирования и должна быть удалена перед переносом в рабочую среду.
Удалить тестовую базу данных и доступ к ней? [Y/n])
 
Reloading the privilege tables will ensure that all changes made so far will take effect immediately.
Reload privilege tables now? [Y/n] y
(Перезагрузка таблиц привилегий гарантирует, что все внесенные до сих пор изменения вступят в силу немедленно.
Перезагрузите таблицы привилегий сейчас? [Y/n])

Подключаемся к базе данных
         mysql -u root
Создаем базу данных (infoOTPDMZ)
CREATE DATABASE infoOTPDMZ;
Создаем пользователя (infoOTPDMZ) и пароль (например, 1234567890) для него
         CREATE USER infoOTPDMZ@localhost IDENTIFIED BY '1234567890';
Назначаем права доступа к созданной базе пользователю
GRANT ALL PRIVILEGES ON infoOTPDMZ.* TO infoOTPDMZ@localhost;
Обновляем созданные привилегии
FLUSH PRIVILEGES;
Выходим из базы данных.
exit
Создаем пароль для Redis не менее 25 знаков (можно использовать любой генератор паролей).
Редактируем файл redis.conf. Необходимо раскомментировать параметр
# requirepass foobared, параметр foobared заменить на ранее сгенерированный пароль Redis.
sudo nano /etc/redis/redis.conf

requirepass 12345678901234567899012345

Перезапускаем службы redis.
sudo systemctl restart redis

Проверяем подключение к redis
redis-cli -a 12345678901234567899012345
    (пароль Redis)
ping
AUTH12345678901234567899012345

Переходим в директорию /var/www/infoOTPDMZ/
cd /var/www/infoOTPDMZ/
Внимание. Для данного сервера необходимо использовать такие же ключи, как и для infoOTP. ENCRYPTION_KEY, TOKEN_PRIVATE_KEY, TOKEN_PUBLIC_KEY, REFRESH_PRIVATE_KEY, REFRESH_PUBLIC_KEY.
Генерируем ключи для подписи JWT-токенов (работа с мобильными приложением)
python generate_keys.py
В результате получаем необходимые ключи

Данную информацию сохраняем.
Создаем файл настройки для взаимодействия с базой данных.
sudo nano OTPDMZ/secr.py
ENCRYPTION_KEY = " ENCRYPTION_KEY "
 
TOKEN_PRIVATE_KEY = "ACCESS PRIVATE"
TOKEN_PUBLIC_KEY = "ACCESS PUBLIC"
REFRESH_PRIVATE_KEY = "REFRESH PRIVATE"
REFRESH_PUBLIC_KEY = "REFRESH PUBLIC"
 
DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.mysql',
       'NAME': 'infoOTPDMZ',
       'USER': 'infoOTPDMZ',
       'PASSWORD': '1234567890',
       'HOST': 'localhost',
       'PORT': '3306',
   }
}
 
CACHES = {
   "default": {
       "BACKEND": "django.core.cache.backends.redis.RedisCache",
       "LOCATION": "redis://default:PASSWORD@127.0.0.1:6379/0",
   }
}
 
Файл secr_sample.py является шаблоном, который можно заполнить и переименовать.
Строки ACCESS PRIVATE, ACCESS PUBLIC, REFRESH PRIVATE, REFRESH PUBLIC необходимо заменить на ранее сгенерированные ключи. (значение b удаляем)
Пример: TOKEN_PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n…=\n-----END RSA PRIVATE KEY-----\n"
Запускаем процесс копирования статических файлов для NGINX
python manage.py collectstatic
Запускаем процесс миграции данных.
python manage.py migrate
Устанавливаем права на каталог infoOTPDMZ
chown www-data:www-data /var/www/infoOTPDMZ/ -R
 
Создаем файл с настройками uwsgi, протокола и программного интерфейса для связи веб-серверов с приложениями.
sudo nano /etc/uwsgi/apps-available/infoOTPDMZ.ini
[uwsgi]
plugins = python3
chdir = /var/www/infoOTPDMZ
pyhome = /var/www/infoOTPDMZ/venv
virtualenv = /var/www/infoOTPDMZ/venv
home = /var/www/infoOTPDMZ/venv
wsgi-file = OTPDMZ/wsgi.py
enable-threads
max-request = 5000
master = true
chmod-socket = 660
vacuum = true
uid = www-data
gui = www-data
 
Создаем символическую ссылку файла infoOTPDMZ.ini
sudo ln -s /etc/uwsgi/apps-available/infoOTPDMZ.ini /etc/uwsgi/apps-enabled/

Перезапускаем службы uwsgi.
sudo systemctl restart uwsgi

Создаем файла dhparam.pem, содержащий параметры Диффи-Хеллмана длиной 2048 бит, для установления TLS-соединений. Сохраняем в каталоге /etc/ssl/infoOTPDMZ/dh.pem
         sudo openssl dhparam -out dhparam.pem 2048

Создаем директорию и назначаем на нее права доступа
sudo mkdir /etc/ssl/infoOTPDMZ
mv dhparam.pem /etc/ssl/infoOTPDMZ/dh.pem
         chmod 600 /etc/ssl/infoOTPDMZ/

В директорию /etc/ssl/infoOTPDMZ/ необходимо скопировать выданный удостоверяющим центром name.cer

         Создаем файл конфигурации Nginx
         sudo nano /etc/nginx/conf.d/options-ssl.conf

ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;
 
#ssl_protocols TLSv1.2 TLSv1.3;
#ssl_prefer_server_ciphers off;
 
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";

 Создаем файл infoOTPDMZ, настройка Веб сервиса (172.22.2.10 – ip адрес сервера InfoOTPDMZ; infootp.ru – URL сервера InfoOTPDMZ; chained.cer, private.key – сертификат и ключ SSL)
         sudo nano /etc/nginx/sites-available/infoOTPDMZ
 
server {
   listen 443 ssl default_server;
   server_name iod.infootp.ru;
   error_log /var/www/infoOTPDMZ/error.log;
   access_log /var/www/infoOTPDMZ/access.log;
 
   include /etc/nginx/conf.d/options-ssl.conf;
   ssl_certificate /etc/ssl/infoOTPDMZ/chained.cer;
   ssl_certificate_key /etc/ssl/infoOTPDMZ/private.key;
   ssl_dhparam /etc/nginx/ssl/dhparam.pem;
 
   error_page 404 /404.html;
   error_page 403 /404.html;
 
   location = /404.html {
       root /var/www/html;
       internal;
   }
 
   location / {
       root /var/www/html;
       index 404.html;
       try_files $uri $uri/ =404;
   }
 
  location /api/mobile/ {
       uwsgi_pass unix:///run/uwsgi/app/djangoInfoOTPDMZ/socket;
       include uwsgi_params;
       uwsgi_read_timeout 300s;
       uwsgi_param PATH_INFO $uri;
       client_max_body_size 32m;
   }
 
   location /api/inter/ {
       uwsgi_pass unix:///run/uwsgi/app/djangoInfoOTPDMZ/socket;
       include uwsgi_params;
       uwsgi_read_timeout 300s;
       uwsgi_param PATH_INFO $uri;
       client_max_body_size 32m;
       deny 192.168.1.12;    # Если публикация производится через прокси, то обязательно запретите этот путь
       allow 192.168.0.0/16;
       allow 10.0.0.0/8;
       allow 172.22.0.0/12;  # разрешаем локальные адреса
       allow 127.0.0.1;
       deny all;
   }
 
   location /static/ {
       alias /var/www/infoOTPDMZ/static/;
   }
 
   location /media/ {
       alias /var/www/infoOTPDMZ/media/;
   }
}
 
Удаляем файл default из каталога /etc/nginx/sites-enabled
sudo rm /etc/nginx/sites-enabled/default

Создаем символическую ссылку файла infoOTPDMZ
sudo ln -s /etc/nginx/sites-available/infoOTPDMZ /etc/nginx/sites-enabled/

Проверяем синтаксис конфигурационных файлов Nginx перед перезапуском или перезагрузкой сервиса (nginx: the configuration file /etc/nginx/nginx.conf syntax is ok – успешная проверка).
nginx -t
 
Перезапускаем Nginx
         sudo systemctl restart nginx
 
Включаем необходимые для работы демоны
sudo systemctl enable uwsgi
sudo systemctl enable nginx
sudo systemctl enable mariadb
 
Создаем учетную запись для взаимодействия внутреннего сервера с сервером InfoOTPDMZ
python manage.py createsuperuser

Необходимо указать имя учетной записи, User id: -1 и пароль.
После этого необходимо опубликовать API сервера DMZ в сети интернет для взаимодействия с мобильным приложением.
Активация ПО
Инициализация работы InfoOTP

Для работы в ПО откройте браузер и введите в адресную строку https://ip-adress или DNS-name/ (рисунок 1)

Рисунок 1 – Страница авторизации

После перехода по адресу https://ip-adress или DNS-name/ необходимо авторизоваться с помощью локальной учетной записи, созданной при установке, ПО выдаст сообщение о том, что лицензия отсутствует, предоставит возможность загрузить файл с лицензионным ключом (рисунок 2). Загрузите файл лицензии, предоставленный разработчиком. Будет выведено подтверждение об успешной активации лицензии.

Рисунок 2 – окно Загрузки лицензии

Рисунок 2 – окно Загрузки лицензии

После активации необходимо обновить страницу, чтобы перейти в раздел Конфигурации (рисунок 3) и сохранить конфигурацию для сохранения настроек в базе данных.

Рисунок 3 – окно Конфигурации

Раздел Другие (рисунок 4) включает в себя следующие параметры:

Рисунок 4 – окно Другие настройки

- Количество попыток до временной блокировки: - параметр, который определяет количество неудачных попыток после чего происходит временная блокировка учетной записи на подключение.
- Количество попыток до блокировки: - параметр, который определяет количество неудачных попыток после чего происходит постоянная блокировка учетной записи на подключение (разблокировка осуществляется в ручном режиме администратором).
- Тип подтверждения входа по умолчанию: - параметр выставляет типа подтверждения второго фактора, для всех новых учетных записей добавленных в систему.
- Ключ доступа агентов Windows: - секретный ключ для взаимодействия с агентами, установленными на оконечных устройствах.
- URL адрес сайта: - внутренний URL адрес веб сервера InfoOTP (данный параметр необходимо указать для корректного отображения изображений в тексте писем, отправляемых от сервера).
- Тайминг закрытия сессии RDP: - параметр позволяющий выставлять время до повторного запроса второго фактора при разрыве сессии при подключении по RDP (рекомендуемое значение 30 сек, при меньших значениях при повторном подключении после обрыва соединения будет запрашиваться подтверждение через второй фактор).
- URL смены пароля включена: - параметр вкл\выкл добавления в сообщение ссылки на ресурс для смены пароля на учетную запись.
- URL смены пароля: - ссылки на ресурс для смены пароля на учетной записи.
Рисунок 5 – окно Настройки LDAP
Раздел Настройки LDAP (рисунок 5) включает в себя следующие параметры:

- LDAP включен: - параметр включения\выключения работы с LDAP.
- IP адрес домен контроллера: - ip-адрес контроллера домена, для синхронизации с AD.
- Ldap использует SSL: - параметр включения\выключения работы с LDAPS.
- LDAP порт: - порт взаимодействия с LDAP 389 или LDAPS 636.
- Базовый домен LDAP: - имя базового домена в формате DC=lab,DC=local
- Имя пользователя LDAP: - имя учетной записи для синхронизации с AD указывается в формате lab\username
- Пароль пользователя LDAP: - пароль от учетной записи для синхронизации с AD.
- Атрибут имен пользователей: - атрибут поля имени учетной записи в AD
- Атрибут группы: - атрибут поля имени группы в AD.
- Группа 2FA: - имя группы в AD на которую распространяется подключение к инфраструктуре с использованием 2 фактора.
- Группа без запроса 2FA: - имя группы в AD на которую распространяется подключение к инфраструктуре без использования 2 фактора.
- LDAP Proxy включен: - параметр включения\выключения работы с LDAP Proxy.
- Имя пользователя LDAP Proxy без домена: - имя учетной записи, с помощью которой осуществляется взаимодействие с AD (например, на АПКШ Континент используется учетная запись для синхронизации с AD, имя этой учетной записи необходимо указать в данном окне).
- Порт LDAP Proxy: - порт взаимодействия с LDAP 389 или LDAPS 636.
Рисунок 6 – окно Настройки SMTP
Раздел Настройки SMTP (рисунок 6), предназначен для возможности отправки электронных писем, включает в себя следующие параметры:

- SMTP включен: - параметр включения\выключения работы с почтовым сервером.
- Имя пользователя SMTP: - имя учетной записи для отправки электронных писем.
- Пароль SMTP: - пароль от учетной записи.
- Smtp server: - DNS- имя почтового сервера (URL).
- Порт SMTP сервера: - порт SMTP сервера (стандартный порт 465 при работе c SSL).
- Email отправителя: - Email от имени которого осуществляется отправка электронных писем.
- Имя отправителя: - имя отправителя по умолчанию для отправки писем в внутреннюю техническую поддержку компании.
- Адрес центра технической поддержки: - электронный адрес технической поддержки. Указывается если необходимо чтобы пользователи могли направлять заявку в поддержку через Телеграм бот.
- Отправка писем в ЦТП включена: - параметр включения\выключения возможности отправки заявок в техническую поддержку через Телеграм бот.
Рисунок 7 – окно Настройки взаимодействия с Телеграм
Раздел TELEBOT (рисунок 7), предназначен для настройки взаимодействия с Телеграм, включает в себя следующие параметры:

- Телеграм включен: - параметр вкл\выкл возможность получение второго фактора через Телеграм.
- Токен телеграм бота: - ключ для взаимодействия сервера с Телеграм ботом.
- Префикс сообщения телеграмм: - текстовое сообщение перед цифровым значением второго фактора. 
- Постфикс сообщения телеграмм: - текстовое сообщение после цифрового значениея второго фактора. 
- Время длительности токена Телеграм в секундах: - время длительности жизни цифрового кода направленного через Телеграм
Рисунок 8 – окно Настройки Radius-сервера

Раздел RADIUS (рисунок 8), предназначен для настройки Radius-сервера, включает в себя следующие параметры:


- IP адрес Radius сервера: адрес внутреннего сетевого интерфейса InfoOTP, по умолчанию установлено 0.0.0.0 для прослушивания всех интерфейсов.

- Клиенты Radius:

- список хостов, взаимодействующих по Radius.

- "+" функция добавления хоста для взаимодействия по Radius.

- "-" функция удаления хоста, взаимодействующего по Radius.

Рисунок 9 – окно Настройки Мобильного приложения

Раздел MOBILE (рисунок 9), предназначен для настройки взаимодействия с мобильным приложением, включает в себя следующие параметры:


- URL мобильного сайта:- внешний URL-адрес, на котором опубликован интерфейс для взаимодействия с мобильным приложением (например: https://example.ru).
- Порт мобильного сайта: - внешний порт, на котором опубликован интерфейс для взаимодействия с мобильным приложением.
- Используется промежуточный сервер: параметр вкл\выкл использования DMZ - сервера.
- URL промежуточного сервера: - внутренний URL-адрес DMZ – сервера (например: https://192.168.1.101), для взаимодействия с основным сервером.
- Порт промежуточного сервера: - порт, для взаимодействия основного сервера с DMZ-сервером.

Рисунок 10 – окно авторизации на сервере DMZ

После включения «Используется промежуточный сервер» и заполнения всех параметров при сохранении появится всплывающее окно (рисунок 10), в которое необходимо указать данные учетной записи, для взаимодействия внутреннего сервера с сервером InfoOTPDMZ.
Описание разделов InfoOTP
Рисунок 11 – Разделы InfoOTP
OTP Пользователи

Страница управления и мониторинга пользователями (рисунок 12) содержит основные сведения по всем пользователям системы
Рисунок 12 – раздел OTP Пользователи
Синхронизировать LDAP – принудительный запуск синхронизации с LDAP

Проверить OTP пользователя – раздел для проверки одноразовых паролей пользователей. В всплывающем окне необходимо выбрать пользователя системы после этого в окно «otp:» ввести шестизначный код пользователя для проверки и нажать «Проверить».

Кнопка Кабинет (рисунок 13) – раздел для настройки данных пользователей.
Рисунок 13 – раздел OTP Пользователи
Кнопка Добавить устройство – дает возможность администратору зарегистрировать устройство пользователя

Тип подтверждения – выбирается тип работы с сервисом (цифровой – ввод шестизначного кода, кнопочный – подтверждение через сообщение в Telegram или приложение – подтверждение через подтверждение в мобильном приложении).  

Кнопка Зарегистрировать приложение – отправка письма на почту пользователя с одноразовым QR-кодом.

Кнопка Удалить – удаление пользователя из системы (также пользователя необходимо удалить из группы в домене, если этого не сделать, то при синхронизации пользователь вновь появится, но при этом генерируются новые данные для входа, со старыми данными пользователь не сможет осуществлять подключение. Необходимо будет повторно указание данные Telegram-id и осуществить регистрацию в мобильном приложении)
Telegram

Страница для быстрого добавления Telegram-id пользователей (рисунок 14)
Рисунок 14 – раздел Telegram
Журнал

Страница отображения сведений по событиям о подключении и ошибкам (рисунок 15)
Рисунок 15 – раздел Журнал
Мониторинг RDP

Страница отображения сведений по событиям о подключении по RDP (рисунок 16)
Рисунок 16 – раздел Мониторинг RDP
Службы

Страница отображения сведений по сервисам и запущенным задачам (рисунок 17)
Рисунок 17 – раздел Службы
Имена сервисов должно быть таким же как имена демонов в операционной системе. Нажатием на индикатор состояния ,, Х можно перезапустить или запустить службу.

Следующие задачи создаются автоматически:
Синхронизация Ldap,
celery.backend_cleanup,
Перезапуск Radius,
Перезапуск Telegram,
Перезапуск Ldap Proxy,
Обработка запросов авторизации,
Удаление истёкших токенов
Обработка запросов авторизации

В данных задачах можно осуществить перенастройку периодичности запуска (остальные параметры менять не рекомендуется).
Следующие задачи рекомендуется создать:

Напоминание сменить пароль – задача проверки истечения срока действия пароля и информирования пользователя в Telegram (рисунок 18)
Рисунок 18 – окно задачи
Взаимодействие с DMZ – задача связи с DMZ-сервером (рисунок 19)
Рисунок 19 – окно задачи
Статус Radius – задача самодиагностики Radius (рисунок 20)
Рисунок 20 – окно задачи
Конфиг

 

Страница конфигурационных настроек (рисунок 21)
Рисунок 21 – раздел Конфигурации
Пользователи

 

Страница Управления пользователями (рисунок 22).
Рисунок 22 – раздел Пользователи
В данном разделе возможно назначить администратором системы доменного пользователя, также отключить доступ учетной записи без ее удаления (при синхронизации с LDAP доступ остается заблокированным).

ВНИМАНИЕ! У администраторов отключена возможность подключения к системам, где используется многофакторная аутентификация.

Устройства пользователей

Страница, отображающая сведения об устройствах пользователей, зарегистрированных в системе (рисунок 23). Для одной учетной записи возможно зарегистрировать только одно устройство.
Рисунок 23 – раздел Устройства пользователей
Смена пароля

Страница, смены пароля локального администратора системы (рисунок 24).
Рисунок 24 – раздел Смена пароля
Добавить пользователя

Страница, для добавления локальных учетных записей (рисунок 25), для возможности интеграции системы с сервисами и оборудованием, подключение к которым осуществляется с помощью не доменных учетных записей.
Рисунок 25 – раздел Смена пароля
Лицензия

Страница, содержащая сведения о лицензии (рисунок 26).
Рисунок 26 – раздел Лицензия
Выйти

Раздел, выход из системы.

Версии ПО

Версия отображается в главном меню внизу слева.
Ошибки работы ПО
При возникновении ошибки при работе ПО сообщение об ошибке выводится на странице на который ошибка произошла во всплывающей красной строке или в разделе Журнал.
Пользовательский портал
Пользовательский портал доступен через браузер по https://ip-adress или https://DNS-name/ (рисунок 27).
Рисунок 27 – Страница авторизации
Пользовательский портал (рисунок 28) служит для самостоятельной регистрации пользователей в сервисе двухфакторной аутентификации и регистрации мобильного приложения.
Рисунок 28 – Страница пользовательского портала
Кнопка Добавить устройство – дает возможность зарегистрировать устройство пользователя, через приложение отсканировав QR-код.

Тип подтверждения – выбирается тип работы с сервисом (цифровой – ввод шестизначного кода, кнопочный – подтверждение через сообщение в Telegram или приложение – подтверждение через подтверждение в мобильном приложении).

Для работы через Telegram, необходимо подключиться к созданному администраторами боту. После начала общения (/start), бот сообщает id пользователя, который необходимо указать в соответствующее окно на пользовательском портале. Проверка работоспособности бота осуществляется через кнопку Тестовое сообщение.

Мобильное приложение для Android можно скачать
https://www.rustore.ru/catalog/app/com.infosell.infootp
По всем вопросам свяжитесь с нами любым удобным способом:
105318, г. Москва,
ул. Мироновская, дом 33, строение 26
Телефон: +7 (495) 651-8285
Email: info@infocell.ru

Технопарк «МЗТА»