Всё о Jabber. От приложения до своего XMPP сервера

Привет, друг! Итак, почему jabber? Тайна переписки, которая является составляющим элементом конфиденциальность личной жизни — это такая штука, которая гарантируется гражданам законодательством любой страны. Более того, государство обещает защищать это твоё право. а всякие коммерческие структуры, от мала до велика, во всех этих своих лицензионных соглашениях и прочих политиках конфиденциальности, божаться охранять твоё право на неприкосновенность переписки.

Как анонимно общаться в сети. Все про Jabber

И всё это звучит прекрасно и крайне обнадёживающе. Но, к сожалению, так сложилось, что заглянуть в твои секретики, хотят все без исключения, начиная от государственных структур, заканчивая хацкерами. С хацкерами, кстати, всё более менее понятно. Они никому ничего не обещали, да и переписка простых смертных их далеко не всегда интересует. А вот с государством всё сложнее. Во первых государство всегда оставляет себе лазейки в законах. Я имею ввиду нарушение конфиденциальности личной жизни на законных основаниях. Это всякие прелюстрации корреспонденции, снятие информации с каналов связи и прочие ништяки, являющиеся монопольным правом правоохранительных органов.

Сложность для них в том, что чтобы использовать способы описанные в законе об оперативно-розыскной деятельности, нужно выполнить некоторые требования законов. Т.е. писать много букв, идти в суд за санкцией, короче иметь дело с бюрократической системой. Как результат, использовать этот способ для реализации целей тотального контроля, физически невозможно. Он более подходит для приземления индивидуально выбранных персонажей. Поэтому государство решает эту проблему другими способами. Начиная от создания всяких систем мониторинга, фильтрации и т.д., заканчивая тупо нагибаловом месенджеров и социальных сетей.

Что такое jabber и xmpp?

Ну да ладно, меня, как обычно унесло в рассуждения. На самом деле кто и зачем хочет порыться в твоей личной жизни, особо не важно. Важно то что, наверное, любому человеку это не понравиться. И, я думаю, ты согласишься со мной, что каждый имеет право на неприкосновенность своих секретов. Причем без всяких «но», и независимо от рода деятельности. Ну, а учитывая, что на желание иметь такое право, всем вокруг, как бы, всё-равно, то реализовывать это право нам придется самостоятельно. И именно поэтому сегодня мы будем разговаривать о том, как общаться так, что бы посторонние личности, в погонах или без них, не могли перехватить и посмотреть нашу переписку. Т.е. про Jabber и все, что с этим связанно. От клиентских приложений на компьютере и телефоне, до собственного сервера.

jabber сервер

Начнём с самого простого, т.е. с общего понимания всего процесса. Для начала, что вообще такое XMPP и Jabber. По сути — это одно и тоже. Просто Jabber это более раннее название, которое полюбилось пользователям. Поэтому XMPP до сих пор называют Jabber. Ну, а если говорить о конкретном определении, то — это расширяемый протокол обмена сообщениями о присутствии. А если проще, то — это открытый протокол обмена мгновенными сообщениями. Основными плюсами, из-за которых стоит использовать Jabber, можно считать его открытость, децентрализованность и поддержку шифрования. Справедливости ради стоит сказать, что минусы тоже есть. Но они больше должны волновать владельцев серверов, пользователей это особо не касается.

Теперь переходим к вопросу наиболее актуальному для большинства пользователей. А именно к применению клиентских приложений использующих протокол XMPP.

GPA

Но перед тем как использовать месенджеры, нужно позаботиться о шифровании и ключах шифрования. Утилит умеющих решать этот вопрос довольно много. Наверно самыми распространенными можно считать GPA и gpg4usb. Принцип их использования одинаковый, поэтому я покажу, что нужно делать на примере утилиты GPA. В некоторые дистрибутивы Linux она установлена по-умолчанию (например Parrot OS), или ее можно установить:

sudo apt install gpa

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

GPA

Всё, ключ готов. Теперь сохраним его открытую часть в файл. Для этого давим кнопку «Экспорт ключей» и сохраняем куда удобно.

PSI+

Из Jabber-клиентов, лично мне, больше всего нравится PSI+, поэтому начну именно с него. У него есть клиенты для Windows, MacOS и Linux. Но мы, по понятным (надеюсь) причинам, будем рассматривать варианты для Linux.

Для начала устанавливаем:

sudo apt install psi-plus psi-plus-plugins 

Если, вдруг, ты используешь дистрибутив Linux в репозиториях которого нет PSI+, то его можно добавить:

sudo add-apt-repository ppa:psi-plus/ppa
sudo apt update 

При первом запуске, нам предложат использовать уже существующий аккаунт или создать новый.

psi+

Если аккаунта у тебя нет, смело дави «Зарегистрировать новый». В открывшемся окне нужно ввести имя сервера на котором ты хочешь создать аккаунт. Я, естественно, буду показывать на примере нашего сервера.

psi+

После нажатия кнопки «Далее» программа ругнётся на сертификат, сообщив нам что он самоподписан, смело жми «Доверять».

В следующем открывшемся окне, нужно придумать себе имя пользователя и пароль (опционально можно ввести email и полное имя). И всё, аккаунт создан, о чём ты увидишь соответствующее сообщение. По умолчанию, автоматическое подключение к серверу выключено, поэтому нужно в выпадающем списке внизу программы выбрать «Доступен» чтобы подключится к серверу. Также будет предложена возможность заполнить vCard — это твоя визитка, тут по желанию.

psi+

Шифрование в PSI+

Теперь нужно установить плагины для шифрования сообщений и проверки подлинности контакта. Нажимаем «Настройки» и выбираем вкладку «Плагины». Здесь нужно выбрать плагины GnuPG Key Manager и Off-the-Record Messaging Plugin и нажать ОК.

После этого жмём правой кнопкой на наше имя и выбираем «Настройки аккаунта». И во вкладке «Аккаунт» убираем отметку «Вести историю сообщений», затем переходим во вкладку «Подробности» и жмём кнопку «Выбрать ключ». В появившемся списке мы увидим ранее созданный нами ключ в программе GPA, выбираем его и нажимаем ОК. Нас попросят ввести пароль от ключа, а потом перезапустить соединение.

Теперь вернёмся в настройки, и в списке плагинов нажмём на гаечный ключ возле плагина Off-the-Record Messaging Plugin, там переходим в вкладку «Мои личные ключи» и нажимаем «Генерировать новый ключ», и после сообщения что ключ сгенерирован, жмём ОК.

На этом настройка Psi+ закончена. Остальные настройки можешь покрутить «под себя», это дело индивидуальное, какие-то советы тут давать не вижу смысла. Ну, а чтобы продемонстрировать как это всё работает на примере, покажу установку и настройку не менее популярного месенджера Pidgin. А потом посмотрим как происходит сама беседа.

Pidgin

Начинаем с установки:

sudo apt install pidgin pidgin-otr

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

pidgin

Следующим шагом идём в настройки и в вкладке журналы, отключаем запись сообщений. Потом нажимаем Средства-Модули и ставим галку возле плагина Off-the-Record. После чего нажимаем «Настроить модуль», в появившемся окне нажимаем «Создать».

pidgin

Теперь добавим собеседника. При нажатии кнопки «Добавить собеседника» нам нужно ввести имя нужного нам пользователя в формате имя@домен и нажать «добавить». Нужный пользователь получит запрос на добавление и приняв его мы можем начинать общение.

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

  • Вопрос и ответ — нужно придумать секретный вопрос и ввести правильный ответ на него
  • Общий секрет — что-то что известно только тебе и собеседнику
  • Проверка отпечатка — любым способом передаем свой отпечаток собеседнику и он сравнивает с тем который видит в беседе

Если личность подтверждена, нажимаем «Авторизовать» и можем спокойно общаться. Наша переписка надёжно защищена.

PGP шифрование

Но, мы можем пойти дальше и, если оба абонента будут использовать Psi+, то ещё и включить шифрование PGP. После чего обменяться публичными ключами. Это обеспечит нам максимальный уровень защищенности переписки. Даже если переписку вдруг получится перехватить или сервер взломают, наши разговоры расшифровать всё равно не получится.

psi+

Для того чтобы всё это заработало, каждый из участников разговора должен нажать кнопку включения PGP (показано на рисунке). А потом нажать кнопку обмена публичными ключами. Теперь включено шифрование. Что, совместно с подтверждением личности, и использованием OTR, даёт нам очень высокий уровень безопасности переписки. Пожалуй, наверно, максимально возможный уровень защиты разговора.

А мы плавно переходим к использованию Jabber на мобильных телефонах.

Jabber на iOS и Android

Для Android оптимальным Jabber-клиентом я считаю Xabber. Оно максимально простое и при этом достаточно удобное, исходный код открыт, оно бесплатное, есть поддержка OTR, и возможность подключить одновременно несколько аккаунтов, что порой очень полезно. Короче, пожалуй, лучший выбор. Хотя, как всегда — это дело вкуса, я рекомендую только то, что больше нравится мне.

Для iOS, вполне обычная практика сделать приложение платным или разрешить использовать только аккаунты на сервере разработчиков приложения. Ну и про открытый исходный код можно только мечтать. Но если всё-таки очень хочется, на мой взгляд оптимальный вариант это JabMe. Конечно чересчур просто, нет вообще никаких настроек, но зато быстро и бесплатно.

Как запустить свой Jabber-сервер

Зачем тебе нужен свой Jabber-сервер придумай сам, мы философствовать на эту тему не будем. А я просто покажу как запустить свой сервер. Как для доступа из локальной сети так и из глобальной.

Запускать и настраивать мы будем Openfire, это, как по мне, оптимальное решение. Установка и запуск достаточно простые, а ещё он имеет приятный и интуитивно понятный графический интерфейс, что само по себе прекрасно.

Что касается операционной системы, то самым логичным вариантом будет какое-нибудь серверное решение, например Ubuntu Server.

Для начала нам понадобится установить зависимости, такая одна — это Java:

sudo apt-get install openjdk-8-jdk

Теперь ставим серверные приколюхи, а именно Apache, PHP, MySQL:

sudo apt install apache2 php php-mbstring mariadb-server php-mysql

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

sudo mysql -u root mysql
DROP USER 'root'@'localhost';
CREATE USER 'root'@'localhost' IDENTIFIED BY 'ПАРОЛЬ';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
CREATE DATABASE openfire CHARACTER SET='utf8';
CREATE USER `openfire`@'localhost' IDENTIFIED BY 'ПАРОЛЬ'; 
GRANT ALL PRIVILEGES ON `openfire`.* TO 'openfire'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
use openfire;
alter database character set utf8;
alter database collate utf8_general_ci;
quit

Динамический IP и jabber-сервер

Следующий подготовительный этап, это решение проблемы динамического IP. Но заниматься этим нужно, если хочется чтоб сервер был доступен из Интернета. Если планируется использовать сервер только в локальной сети, этот пункт смело пропускай.

Оптимальным вариантом решения этого вопроса будет использование утилиты ddclient. Которая будет, с заданным интервалом проверять наш внешний IP и если он изменится, автоматически будет обновлять IP у нашего хоста (мы его сейчас создадим).

Для начала регистрируемся на любом сервисе предоставляющем услуги динамического DNS. Я буду использовать https://dyn.com/. Для его использования нужно создать новый хост и указать текущий внешний IP.

dyndns

Устанавливаем ddclient и зависимости:

sudo apt install ddclient ssh libio-socket-ssl-perl

Он в процессе установки будет задавать вопросы. Как ты на них ответишь особо не важно, потому что все настройки мы после отредактируем вручную. Для этого открываем файл /etc/ddclient.conf и в нём вписываем такие строки:

daemon=600
syslog=yes
mail-failure=root 
pid=/var/run/ddclient.pid
ssl=yes
use=web, web=checkip.dyndns.com/, web-skip='IP Address'
login=твой логин
password='твой пароль'
protocol=dyndns2
server=members.dyndns.org
test.dyndns-ip.com         #созданный тобой хост

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

sudo /etc/init.d/ddclient restart
sudo /etc/init.d/ddclient status

Что бы убедится что IP обновляется можно заглянуть в логи:

tail -f /var/log/syslog

Установка Openfire

Подготовительные этапы окончены, можем скачивать и устанавливать Openfire. Сам сервер можно скачать здесь: https://www.igniterealtime.org/downloads/index.jsp#openfire или командой:

wget https://www.igniterealtime.org/downloadServlet?filename=openfire/openfire_4.4.2_all.deb \
-O openfire.deb

Не забудь чекнуть последнюю версию. Устанавливаем и проверяем чтобы работало:

sudo dpkg -i openfire_4.4.1_all.deb
systemctl status openfire

Теперь нужно импортировать базу данных:

sudo mysql -u root -p
use openfire;
source /usr/share/openfire/resources/database/openfire_mysql.sql;
show tables;

Всё готово, открываем браузер и переходим по адресу http://localhost:9090 и попадаем в консоль администратора Openfire, которая предложит нам сделать первичную настройку.

Настройка сервера Openfire

Первый шаг — это выбор языка:

openfire jabber

Вводим доменное имя, которое мы зарегистрировали в DynDNS, порты оставляем без изменений:

openfire jabber

Следующий шаг — выбор базы данных. Если выбрать «Встроенная база данных» — будет использоваться база данных самого Openfire. Но внешние базы намного производительней, поэтому выбираем «Стандартное подключение к базе данных»:

openfire

И переходим к настройке самой базы данных. В выпадающем списке выбираем MySQL, в графе URL базы данных вписываем:

jdbc:mysql://localhost:3306/openfire?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&serverTimezone=UTC

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

openfire jabber

Следующий шаг — создание учётной записи администратора (по умолчанию имя — admin). Вводим электронную почту и придумываем пароль:

openfire

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

openfire jabber

На настройках в админке не вижу смысла останавливаться дополнительно, тут есть довольно подробные описания всех пунктов. Каждый сможет настроить в зависимости от своих желаний и потребностей, тоже самое касается и установки дополнительных плагинов.

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

Твой Pulse.