| ВАЖНО! При переходе на гибридные чаты, во избежание потерь истории переписок, необходимо пройти процесс миграции, в противном случае, история переписок будет недоступна. |
Для защиты данных чатов от компрометации при размещении в облаке Dion можно использовать гибридную схему.
Гибридная схема размещения предполагает, что компонент DION.Чаты разворачивается таким образом, что часть его функциональных возможностей находится в облаке под централизованным управлением, а другая часть, связанная с шифрованием конфиденциальной информации, разворачивается на локально (сервис dion-crypto-engine). Это позволяет ограничить доступ к конфиденциальной информации в чатах и минимизировать ресурсы локальной инфраструктуры за счет хранения сообщений и вложений в них в облаке.

Пользователь отправляет сообщение, зашифрованное сессионным ключом, выработанным dion-crypto-engine в контуре организации. Затем данные отправляются в сервис dion-crypto-engine, где они перешифровываются с использованием постоянного ключа, который хранится в конфигурации сервиса. Перешифрованные данные пересылаются в облако для хранения. Хранение данных, зашифрованным локальным постоянным ключом, ведется в облаке.
|
Если в контуре организации используется только один экземпляр сервиса dion-crypto-engine и он выходит из строя, работа корпоративных чатов будет нарушена:



Для реализации отказоустойчивости, а также при инсталляциях с численностью пользователей более 4000, потребуется более одного экземпляра dion-crypto-engine. Для балансировки запросов мы рекомендуем использовать сервер reverse proxy.
Система балансировки gRPC-трафика должна соответствовать следующим ключевым требованиям:
Пример конфигурации для nginx:
user nginx;
worker_processes auto;
# Лимит открытых файлов для воркеров. Должен быть <= системного ulimit -n.
# Проверить: cat /proc/$(cat /var/run/nginx.pid)/limits | grep "open files"
worker_rlimit_nofile 262144;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 16384;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_max_body_size 10m;
# ── Keepalive ────────────────────────────────────────────────────────────
keepalive_timeout 70s;
keepalive_requests 1000000;
# ── Логирование ──────────────────────────────────────────────────────────
log_format grpc_main '$remote_addr - $remote_user [$time_local] '
'"$request" status=$status bytes=$body_bytes_sent '
'grpc_status="$sent_http_grpc_status" grpc_message="$sent_http_grpc_message" '
'ssl_client_verify="$ssl_client_verify" '
'upstream="$upstream_addr" upstream_status="$upstream_status" '
'request_time=$request_time upstream_time="$upstream_response_time" '
'ua="$http_user_agent"';
access_log /var/log/nginx/grpc_access.log grpc_main;
# ── SSL глобальные настройки ─────────────────────────────────────────────
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-GCM-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
# ── Upstream ─────────────────────────────────────────────────────────────
upstream dc_crypto_engine_upstream {
least_conn;
# Укажите IP:PORT нод dion-crypto-engine.
# HOST не должен быть loopback (127.x / localhost).
server <IP-адрес_1>:9168 max_fails=3 fail_timeout=30s;
# server <IP-адрес_2>:9168 max_fails=3 fail_timeout=30s;
keepalive 128;
}
# ── Internal healthcheck ─────────────────────────────────────────────────
listen 127.0.0.1:18080;
server_name localhost;
access_log off;
location = /healthCheck {
return 204 '';
}
location = /basic_status {
stub_status;
}
}
# ── Основной gRPC сервер ─────────────────────────────────────────────────
server {
listen 9168 ssl;
http2 on;
server_name _;
default_type application/grpc;
# TLS — укажите пути к сертификатам
ssl_certificate /crt/cert.crt;
ssl_certificate_key /crt/cert.key;
keepalive_timeout 70s;
keepalive_requests 1000000;
# ── Healthcheck ───────────────────────────────────────────────────────
location = /healthCheck {
access_log off;
return 204 '';
}
location = /basic_status {
access_log off;
stub_status;
}
# ── gRPC endpoint ─────────────────────────────────────────────────────
location /dc_crypto_engine.CryptoEngineService {
grpc_pass grpc://dc_crypto_engine_upstream;
grpc_connect_timeout 3s;
grpc_read_timeout 75s;
grpc_send_timeout 75s;
grpc_socket_keepalive on;
grpc_intercept_errors on;
grpc_next_upstream error timeout http_502 http_503 http_504;
grpc_next_upstream_tries 3;
error_log /var/log/nginx/grpc_error.log warn;
}
error_page 400 = @grpc_internal;
error_page 401 = @grpc_unauthenticated;
error_page 403 = @grpc_permission_denied;
error_page 404 = @grpc_unimplemented;
error_page 429 = @grpc_unavailable;
error_page 502 = @grpc_unavailable;
error_page 503 = @grpc_unavailable;
error_page 504 = @grpc_unavailable;
error_page 405 = @grpc_internal;
error_page 408 = @grpc_deadline_exceeded;
error_page 413 = @grpc_resource_exhausted;
error_page 414 = @grpc_resource_exhausted;
error_page 415 = @grpc_internal;
error_page 426 = @grpc_internal;
error_page 495 = @grpc_unauthenticated;
error_page 496 = @grpc_unauthenticated;
error_page 497 = @grpc_internal;
error_page 500 = @grpc_internal;
error_page 501 = @grpc_internal;
location @grpc_deadline_exceeded {
add_header grpc-status 4;
add_header Content-Type "application/grpc";
add_header grpc-message 'deadline exceeded';
return 204;
}
location @grpc_permission_denied {
add_header grpc-status 7;
add_header Content-Type "application/grpc";
add_header grpc-message 'permission denied';
return 204;
}
location @grpc_resource_exhausted {
add_header grpc-status 8;
add_header Content-Type "application/grpc";
add_header grpc-message 'resource exhausted';
return 204;
}
location @grpc_unimplemented {
add_header grpc-status 12;
add_header Content-Type "application/grpc";
add_header grpc-message unimplemented;
return 204;
}
location @grpc_internal {
add_header grpc-status 13;
add_header Content-Type "application/grpc";
add_header grpc-message 'internal error';
return 204;
}
location @grpc_unavailable {
add_header grpc-status 14;
add_header Content-Type "application/grpc";
add_header grpc-message unavailable;
return 204;
}
location @grpc_unauthenticated {
add_header grpc-status 16;
add_header Content-Type "application/grpc";
add_header grpc-message unauthenticated;
return 204;
}
}
}
| Для пилотной установки мы предлагаем развернуть в качестве балансировщика NGINX в docker-контейнере. Архив содержит образ NGINX c минимальной конфигурацией для запуска. |
Прежде, чем перейти к установке и конфигурированию сервиса, выполните следующие шаги:
sudo apt install ./dion-crypto-engine-v7-x-x.deb
Чтобы сконфигурировать гибридный сервис dion-crypto-engine, выполните следующие действия:
| Конфигурация приведена для операционной системы Ubuntu 22.04. |
1. Откройте конфигурационный файл для редактирования:
sudo nano /etc/dion/dion-crypto-engine.yml
Конфигурационный файл содержит несколько блоков, которые отвечают за следующие функции:
listen.grpc — настройка gRPC-сервера, который запускается при старте dion-crypto-engine. gRPC-сервер принимает различные вызовы для шифрования и дешифрования данных.application — настройка таких параметров, как ключ шифрования secretkey, использование DLP, а также размер передаваемых данных (chunk).stubErrorText — заглушка, используемая, если по каким-то причинам не получается расшифровать сообщение.Требуется заполнить блоки listen.grpc.host, application.scrambler.secretkey. |
2. Отредактируйте конфигурационный файл согласно комментариям в файле:
listen:
grpc:
# Впишите в переменную host локальный адрес данного экземпляра dion-crypto-engine в кавычках
# Пример заполнения: host: "10.10.10.10"
host: ""
# не меняйте порт
port: 9168
Для шифрования потребуется указать secretKey, для генерации ключа можно использовать одну из предложенных ниже команд:
head -c 32 /dev/urandom | base64 | tr '+/' '-_'
python3 -c "import os, base64; print(base64.urlsafe_b64encode(os.urandom(32)).decode())"
Полученную строку используйте в качестве значения для поля secretKey:
application:
scrambler:
# Впишите в переменную secretKey ключ шифрования данных. НЕ ДОПУСКАТЬ ПОТЕРЮ КЛЮЧА
# В случае утраты ключа расшифровка ранее отправленных сообщений станет невозможной
# Пример заполнения: secretKey: asdfghjklkqw
secretKey: **SECRETKEY**
dlp:
# Для включения DLP измените параметр isEnabled со значения false на значение true
# Дополнительно требуется установка и настройка соответствующего DLP-сервиса
isEnabled: false
fileChunkSize: 64000
# stubErrorText отвечает за появление ошибки в случае, когда не удалось выполнить декодирование сообщения. При необходимости можно изменить текст ошибки
stubErrorText: "Ошибка декодирования"
3. Перезапустите сервис dion-crypto-engine:
sudo systemctl restart dion-crypto-engine
4. Убедитесь, что служба успешно запущена:
sudo systemctl status dion-crypto-engine

После успешного запуска сервиса включите шифрование:
1. Войдите в Панель Администрирования.
2. В разделе Общие настройки → Чаты → Адреса сервиса шифрования укажите публичный IP-адрес и порт, по которым отвечает dion-crypto-engine.
| ВАЖНО! При включении шифрования через dion-crypto-engine вся прошлая переписка станет недоступной! |

В dion-crypto-engine реализован функционал интеграции с DLP-системой исключительно в пассивном режиме (режим оповещения).
Для передачи сообщений для инспекции в DLP-систему потребуется установить дополнительный компонент - DLP-adapter.
Скачать актуальный пакет DLP-adapter можно по здесь.

1. Выключите его в блоке application.dlp.isEnabled, заменив значение false на true.
application:
scrambler:
# Впишите в переменную secretKey ключ шифрования данных. НЕ ДОПУСКАТЬ ПОТЕРЮ КЛЮЧА
# В случае утраты ключа расшифровка ранее отправленных сообщений станет невозможной
# Пример заполнения: secretKey: asdfghjklkqw
secretKey: **SECRETKEY**
dlp:
# Для включения DLP измените параметр isEnabled со значения false на значение true
# Дополнительно требуется установка и настройка соответствующего DLP-сервиса
isEnabled: true
2. Укажите адрес хоста, на котором развернут DLP-adapter, и порт в поле services.grpc.dlp-adapter.hosts:
services:
grpc:
# Для включения работы DLP в чатах следует заполнить блок dlp-адаптер, а также включить DLP в блоке application - dlp
dlp-adapter:
# Впишите в переменную hosts: адрес и порт DLP адаптера
# Пример заполнения:
# hosts:
# - "10.20.30.40:9147"
hosts:
- "192.168.1.100:9147"
3. Для включения шифрования между dion-crypto-engine и DLP-adapter включите SSL, заменив значение параметра services.grpc.dlp-adapter.ssl.isEnabled c false на true, и укажите пути к сертификатам. Пропустите этот пункт, если шифрование не требуется:
ssl:
# Для включения SSL измените параметр isEnabled со значения false на значение true
isEnabled: true
server:
# Проверять подлинность TLS-сертификата сервера
# true - отключение проверки подлинности TLS-сертификата сервера
# false - включение проверки подлинности TLS-сертификата сервера
insecureSkipVerify: false
# Укажите сертификат доверенного корневого удостоверяющего центра
# Пример заполнения: caCert: "/home/dion/ca.crt"
caCert: "/home/dion/ca.crt"
client:
# Укажите приватный ключ
# Пример заполнения: caCert: "/home/dion/private.key"
privateKey: "/home/dion/private.key"
# Укажите клиентский сертификат
# Пример заполнения: caCert: "/home/dion/client.crt"
cert: "/home/dion/client.crt"
4. Перезапустите сервис dion-crypto-engine:
sudo systemctl restart dion-crypto-engine
4. Убедитесь, что служба успешно запущена:
sudo systemctl status dion-crypto-engine
5. Далее настройте DLP-adapter.