Найти в Дзене
Врач и компьютер

Делаем свой мессенджер (с шифрованием и мультиплатформенностью)

Раз я медицинский работник меня вечно сопровождают персональные данные пациентов по работе, и все мы люди уже привыкли в своей работе использовать Мессенджеры типа WhatsApp, Telegram и т.п.

Многие из нас задумывались как обезопасить себя, а точнее персональные данные пациентов, при этом не нарушать законодательство. Понятно что чаще всего проверяющим плевать на персональные данные, но когда дело дойдёт до конкретного судебного случая, тогда и начнут мучать по каждому поводу, так что лучше всего этот повод не давать.

И так сегодня мы настроем свой чат-мессенджер на базе Delta Chat , программа с открытым исходным кодом. Прелесть её в том что она имеет вид как мессенджер, а по факту это почтовый клиент т.е. все способы шифрования для почты можно использовать в неё, просто надо правильно настроить почтовый сервер и тогда всё будет храниться в вашей защищённой сети или где то на выделенном сервере, и даже если кто то этот сервер похитит/изымет то все данные на нём будут зашифрованы и бесполезны.

Для начала нам нужен сервер, желательно примерно такой конфигурации:

  • 1 процессор
  • 1 Гб оперативки
  • 10 Гб жесткий диск

Естественно с доступом по SSH.

Естественно можно это всё закрутить на имеющемся почтовом сервере или уже установленном сервере с Linux, но лучше не смешивать всё в одну кучу, с учётом что уже давно всё легко виртуализируется.

Я для своих целей использую хостинг РуВеб тарифы весьма хорошие на мой взгляд, можно конечно найти и бесплатный сервер по это дело, но сейчас не об этом.

Мне на ближайшие несколько месяцев точно хватит тарифа KVM-NANO, с учётом реферальной системы мне оно вообще бесплатно, написал пару статей в своё время и теперь регулярно получаю по партнёрской программе доход. Плюс с учётом скидок если покупать на 3 года к примеру вообще выйдет менее 100 рублей такой сервер. Так что рекомендую, пользуйтесь моей реферальной ссылкой https://ruweb.net/?from=26399

С сервером определились, теперь начнём его настройку.

При создании сервера обычно указывается hostname, его надо заранее придумать, потом поменять не получиться т.к. чаще всего это имя привязано к билинговой системе, но если железка ваша то конечно проблем таких не будет.

В этой стате будут использованы с личными доработками и правками несколько других статей, сами понимаете что программы развиваются и регулярно что то меняется, поэтому если мануалу хотя бы 1 год, с большой долей вероятности он уже не работает на 100% и придётся включать свои мозги:

Для начала нам потребуется домен, надеюсь он у вас есть, у домена как правило есть доступ к настройке DNS записей, так что нам надо их настроить примерно так:

chat.my.ru A <ip>

chat MX chat.my.ru

У всех регистраторов домена свои панели управления, так что тут уж сами, у меня была проблема в этом месте т.к. домен 3 уровня то ему пришлось прописывать А и АААА записи т.е. ip обычны и ipv6 иначе при получении сертификата для шифрования были проблемы, не получалось подтвердить права на домен, а соответственно ключи не делаются.

Настройку рекомендую продолжать только когда настроите и проверите все эти записи хотя бы тут https://2whois.ru/?t=dns обновляются они не быстро, в самом печальном случаи до 72 часов.

Систему для установки я выбрал CentOS 8 т.к. она одна из самых консервативных в плане защиты, можно на любой другой но могут возникнуть какие то трудности.

Установим postfix, dovecot и nginx (nginx — для получения сертификатов let's encrypt, wget — для установки certbot-auto, nano — редактор):

dnf install postfix dovecot nginx wget nano -y

Разрешим Postfix принимать почту извне и настроим hostname, domain и origin сервера, так как почтовый домен и адрес сервера совпадают, то домен будет везде одинаковым:

postconf -e "inet_interfaces = all"
postconf -e "myhostname = chat.my.ru"
postconf -e "mydomain = chat.my.ru"
postconf -e "myorigin = chat.my.ru"

Откроем порты 80, 143, 443, 465, 587, 993 в firewall:

firewall-cmd --permanent --add-service={http,https,smtps,smtp-submission,imap,imaps}
systemctl reload firewalld

Создадим настройки сайта для нашего доменного имени, что бы получить сертификаты let's encrypt используя certbot-auto

nano /etc/nginx/conf.d/chat.my.ru.conf
server { listen 80; listen [::]:80; server_name
chat.my.ru; root /usr/share/nginx/html/; }

Запускаем nginx

systemctl enable nginx
systemctl start nginx

Установим certbot-auto:

Тут я столкнулся с первой сложностью, в старых статьях это всё делается в 5-6 строчек, но разработчики всё усложнили так что пользуемся сайтом разработчика и проходим квест установки по полной:

Заходим на сайт и выбираем свою систему https://certbot.eff.org/lets-encrypt/centosrhel8-nginx

sudo dnf install epel-release
sudo dnf upgrade
sudo yum install snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx
certbot-auto certonly -a nginx --agree-tos --staple-ocsp --email my_mail@chat.my.ru -d chat.my.ru

После всего этого сгенерируются сертификаты для сайта (в дальнейшем мы будем их использовать для TLS-шифрования соединения с сервером), проверьте что они у вас появились:

/etc/letsencrypt/live/chat.my.ru/fullchain.pem

/etc/letsencrypt/live/chat.my.ru/privkey.pem

Исправим соответственно файл конфигурации Postfix, что бы разрешить прием писем на портах 465 и 587:

nano /etc/postfix/master.cf
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_tls_wrappermode=no
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
-o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth

Выполним команды, что бы указать расположение TLS сертификата и личного ключа сервера:

postconf "smtpd_tls_cert_file = /etc/letsencrypt/live/chat.my.ru/fullchain.pem"
postconf "smtpd_tls_key_file = /etc/letsencrypt/live/chat.my.ru/privkey.pem"

При необходимости можем включить логирование TLS подключений:

postconf "smtpd_tls_loglevel = 1"
postconf "smtp_tls_loglevel = 1"

Добавим в конец файла конфигурации Postfix требование использовать протоколы не ниже TLS 1.2:

nano /etc/postfix/main.cf
smtp_tls_mandatory_protocols = >=TLSv1.2
smtp_tls_protocols = >=TLSv1.2

Включим и запустим Postfix:

systemctl start postfix
systemctl enable postfix

Дальше настраиваем Dovecot:

dnf install dovecot -y
systemctl start dovecot
systemctl enable dovecot

Изменим файл конфигурации Dovecot:

nano /etc/dovecot/dovecot.conf
protocols = imap lmtp

Настроим хранилище писем, что бы письма сохранялись в папках пользователей:

nano /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir
mail_privileged_group = mail

Добавим Dovecot в группу mail что бы Dovecot мог читать входящие:

gpasswd -a dovecot mail

Запретим авторизацию без TLS шифрования:

nano /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes

Добавим автоподстановку домена при авторизации (только по имени пользователя):

auth_username_format = %n

Изменим расположение сертификата, ключа, расположения файла с ключом Диффи-Хеллмана, минимальную версию TLS 1.2 и предпочтение выбора протоколов шифрования сервера, а не клиента:

nano /etc/dovecot/conf.d/10-ssl.conf
ssl_cert = </etc/letsencrypt/live/secureim.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/secureim.example.com/privkey.pem
ssl_dh = </etc/dovecot/dh.pem
ssl_min_protocol = TLSv1.2
ssl_prefer_server_ciphers = yes

Сгенерируем ключ Диффи-Хеллмана, генерация ключа реально занимает продолжительное время:

openssl dhparam -out /etc/dovecot/dh.pem 4096

Изменим секцию service auth, так что бы Postfix смог подключиться к серверу авторизации Dovecot:

nano /etc/dovecot/conf.d/10-master.conf
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0600
user = postfix
group = postfix
}
}

Включим автосоздание системных почтовых папок (на тот случай, если мы будем пользоваться сервером в том числе и для обычной почты) добавив строку auto = create в секции почтовых папок:

nano /etc/dovecot/conf.d/15-mailboxes.conf
mailbox Drafts {
auto = create
special_use = \Drafts
}
mailbox Junk {
auto = create
special_use = \Junk
}
mailbox Trash {
auto = create
special_use = \Trash
}
mailbox Sent {
auto = create
special_use = \Sent
}
mailbox "Sent Messages" {
auto = create
special_use = \Sent
}

Настроим сервис LMTP следующим образом:

nano /etc/dovecot/conf.d/10-master.conf
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}

Добавим следующие настройки в конец файла, что бы сообщить Postfix доставлять письма в локальное хранилище через сервис Dovecot LMTP. Так же отключим SMTPUTF8, так как Dovecot LMTP не поддерживает это расширение:

nano /etc/postfix/main.cf
mailbox_transport = lmtp:unix:private/dovecot-lmtp
smtputf8_enable = no

Создадим пользователей которые будут использовать сервер, создав соответствующую запись в системе и задав ей пароль, который будет использоваться для авторизации через smtps и imaps:

adduser user1
passwd user1

Перезапустим Dovecot и Postfix:

systemctl restart dovecot
systemctl restart postfix

Добавим в /etc/crontab задачу для автоматического обновления сертификатов:

nano /etc/crontab
30 2 * * * root /usr/local /bin/certbot-auto renew --post-hook "nginx -s reload"

В принципе система настроена, осталось только установить клиенты и сделать учётные записи для пользователей.

Клиенты для всех и вся берём с официального сайта разработчика https://delta.chat/ru/download

Вариантов более чем достаточно
Вариантов более чем достаточно

По идее Delta Chat не требует от нас создавать свою какую то почту, он легко вам подключит для общения mail.ru yandex.ru и т.п. сервисы, но мы то хотим защищённую свою почту/чат, что мы выше и сделали

При входе указываем логин и пароль созданный чуть выше user1@chat.my.ru и пароль указанный выше при создании учётки

Согласитесь очень знакомая картинка
Согласитесь очень знакомая картинка

Создавать новых пользователей в консоли не очень удобно, поэтому для себя я установил панель управления CockpitWebConsole:

yum install cockpit

Затем включите и запустите службу cockpit.socket для подключения к системе через веб-консоль и проверьте службу и запустите процессы, используя следующие команды:

systemctl start cockpit.socket
systemctl enable --now cockpit.socket
systemctl status cockpit.socket
ps auxf|grep cockpit

Настроим firewall, красненькое при установке это нормально

firewall-cmd --add-service=cockpit --permanent
firewall-cmd --reload

Вход в панель управления:

https://chat.my.ru:9090

будет предупреждение что не настроен сертификат безопасности, ну тут не особо важно на мой взгляд, просто соглашаемся с рисками.

Входим под пользователем с правами root или под самими пользователем root, иначе вы не сможете добавлять необходимые права и создавать учёные записи.

-4

Как видите всё русифицировано и лаконично, ничего лишнего. В разделе "Учётные записи" добавляем нужных пользователей, тут же можете назначать администраторские права и блокировать или удалять учётки.

-5

При необходимости адрес этой панели можете сообщить пользователям, для того чтобы они имели возможность зайти и поменять пароль самостоятельно, других админских функций у них в панели не будет, так что можно не переживать.

Спасибо тем кто дочитал до конца, как говорится подписывайтесь и ставьте лайки.

PS: есть свои особенности - при работе с разных устройств свои шифрованные сообщения могут быть прочитаны только на том устройстве с которого отправлены, возможно как то это решается, но я ещё не нашел как.