Введение: зачем нужен SSO в медицине?
Коллеги, представьте ситуацию: в поликлинике работают сотни сотрудников — врачи, медсёстры, регистраторы. Каждому нужно входить в МИС. Пароли забываются, их приходится сбрасывать, а если сотрудник уволен, нужно успеть заблокировать его доступ везде.
SSO (Single Sign-On) — технология единого входа — решает эти проблемы:
- Упрощение входа: Пользователь входит один раз в систему (на компьютере), и доступ к Самсону получает автоматически.
- Централизованное управление: Вы меняете пароль или блокируете учётную запись в домене — доступ к МИС закрывается мгновенно.
Для реализации SSO мы выбрали Kerberos, так как это протокол, поддерживаемый и Windows-доменами (AD), и Linux-решениями (FreeIPA, Samba, Альт Кентавр). Под капотом Самсона за работу с Kerberos отвечает специальный GSS-плагин для MySQL.
Важное предупреждение: Это руководство для опытных администраторов, знакомых с Linux и доменными технологиями. Мы будем настраивать сервер БД MySQL (MariaDB) так, чтобы он доверял вашему домену.
Шаг 0. Предположения и требования
Я не буду описывать здесь настройку самого домена, так как вариантов много. Но вот что уже должно быть создано до начала:
- Работающий домен Kerberos (KDC). Это может быть:
- Windows Server (2008 R2 и новее) с Active Directory.
- Linux-контроллер, например, на базе Альт 7.0 Кентавр (отличный вариант для учебных целей и не только) или FreeIPA.
- Samba4 DC.
- Сервер с CentOS 6 / Альт / аналогичный дистрибутив, где будет стоять MySQL (база Самсона). В инструкции используется CentOS 6 как целевая платформа.
- Настроенный DNS. Критично! Ваш сервер БД должен по IP-адресу определяться по имени (FQDN), и наоборот (наличие A и PTR записей). Если DNS не настроен, можно использовать
/etc/hosts, но это путь к боли. - Синхронизация времени (NTP). Kerberos очень чувствителен к рассинхронизации часов.
Шаг 1. Подготовка сервера БД (Linux-клиента)
Заходим на наш будущий сервер БД (назовём его dbserv.testdomain.org). Все действия — от root.
- Устанавливаем необходимые пакеты:
yum install krb5-libs krb5-workstation bind-utils ntpdate -y
Для Альт Linux: apt-get install krb5-libs krb5-workstation bind-utilskrb5-libs— библиотеки,krb5-workstation— утилиты (kinit,klist,ktutil,kvno),bind-utils—nslookupиdigдля проверки DNS.
- Настраиваем
/etc/krb5.conf. Это главный файл конфигурации Kerberos.
Есть два подхода:
А) Оптимистичный (доверяем DNS):
[libdefaults]
default_realm = TESTDOMAIN.ORG
dns_lookup_realm = true
dns_lookup_kdc = true
Б) Консервативный (прописываем всё руками):
[libdefaults]
default_realm = TESTDOMAIN.ORG
dns_lookup_realm = false
dns_lookup_kdc = false
[realms]
TESTDOMAIN.ORG = {
kdc = 10.0.0.0:88 (IP-адрес вашего KDC (контроллера домена) }
[domain_realm]
.testdomain.org = TESTDOMAIN.ORG
testdomain.org = TESTDOMAIN.ORG
ГдеTESTDOMAIN.ORG— имя вашего realm (обычно пишется капсом), аtestdomain.org— DNS-имя домена. - Проверяем связь с доменом.
Пробуем получить билет для любого пользователя домена (например, администратора):
kinit administrator@TESTDOMAIN.ORG
Вас попросят ввести пароль. Если команда выполнилась без ошибок, смотрим тикет:
klist
Вы должны увидеть выданный билет. Если ошибка — проверяйте DNS и время.
Шаг 2. Создание принципала сервиса и keytab-файла
Чтобы сервер БД мог участвовать в аутентификации, для него нужно создать в домене специальную учетную запись — принципала сервиса (Service Principal). Имя принципала будет выглядеть так: s11/dbserv.testdomain.org@TESTDOMAIN.ORG, где s11 — это идентификатор сервиса (в нашем случае — плагина для MySQL).
Вариант А: Ваш KDC — Linux (например, Альт Кентавр)
Выполняем команды на самом сервере KDC:
- Создаём принципала со случайным ключом:
kadmin.local -q ‘addprinc -randkey s11/dbserv.testdomain.org’ - Экспортируем ключи в keytab-файл:
kadmin.local -q ‘ktadd -e aes256-cts-hmac-sha1-96:normal -k /tmp/s11.krb5.keytab s11/dbserv.testdomain.org’
Вариант Б: Ваш KDC — Windows Server (Active Directory)
Этот вариант чуть сложнее, так как требует создания «заглушки».
- Создайте обычную тестовую учётную запись пользователя, например,
dummy_s11_dbserv. Задайте ей пароль (допустим,Pa$$w0rd1234). Эта учётка нужна только для маппинга. - На контроллере домена откройте командную строку от имени администратора и выполните команду
ktpass(я разбил строку для читаемости):
ktpass -princ s11/dbserv.testdomain.org@TESTDOMAIN.ORG ^
-mapuser dummy_s11_dbserv@TESTDOMAIN.ORG ^
-crypto AES256-SHA1 ^
-ptype KRB5_NT_PRINCIPAL ^
-pass Pa$$w0rd123 ^
-out C:\TMP\s11.krb5.keytab
Эта команда свяжет принципала сервиса с созданным пользователем и создаст keytab-файл. - Проверка:
На сервере БД выполните команду:
kvno s11/dbserv.testdomain.org@TESTDOMAIN.ORG
Если она возвращает номер версии ключа, аklistпоказывает тикет — всё хорошо.
Шаг 3. Установка и настройка GSS-плагина для MySQL
Теперь работаем снова на сервере БД.
- Устанавливаем плагин.
Предположим, у вас есть готовый RPM-пакетmysql-plugin-krb5gss-0.3-s4el6.x86_64.rpm.
Установите его:
rpm -ivh mysql-plugin-krb5gss-0.3-s4el6.x86_64.rpm
Или, если пакета нет, потребуется сборка из исходников (это отдельная тема). - Размещаем keytab-файл.
Перенесите полученный на прошлом шаге файлs11.krb5.keytabна сервер БД в каталог/etc/s11/и выставите правильные права доступа:
mkdir -p /etc/s11
chown mysql:mysql /etc/s11/krb5.keytab
chmod 400 /etc/s11/krb5.keytab
Путь и имя файла должны соответствовать тому, что мы пропишем в конфиге MySQL. - Регистрируем плагин и функции в MySQL.
Подключаемся к MySQL под root’ом и выполняем:
INSTALL PLUGIN krb5gss SONAME ‘plugin_krb5gss.so’;
CREATE FUNCTION krb5gss_init RETURNS INTEGER SONAME ‘plugin_krb5gss.so’;
CREATE FUNCTION krb5gss_step RETURNS INTEGER SONAME ‘plugin_krb5gss.so’;
CREATE FUNCTION krb5gss_response RETURNS STRING SONAME ‘plugin_krb5gss.so’;
CREATE FUNCTION krb5gss_username RETURNS STRING SONAME ‘plugin_krb5gss.so’;
CREATE FUNCTION krb5gss_clean RETURNS STRING SONAME ‘plugin_krb5gss.so’; - Настраиваем конфигурационный файл MySQL (
/etc/my.cnf).
В секцию[mysqld]добавьте:
[mysqld]
krb5gss_service=s11@dbserv.testdomain.org krb5gss_keytab=/etc/s11/krb5.keytab
Плагин умеет определять эти параметры самостоятельно (по умолчанию: имя сервиса —s11@хостнейм, keytab —/etc/s11/krb5.keytab), но я предпочитаю явное указание. - Перезапускаем MySQL:
systemctl restart mysql - Проверяем, что плагин загрузился и работает.
Снова заходим в MySQL и выполняем диагностические команды:
— Проверяем переменные плагина
SHOW VARIABLES LIKE ‘krb5%’;
— Должны увидеть наши настройки: krb5gss_keytab, krb5gss_service и др.
— Инициализируем GSS-контекст
SELECT krb5gss_init(); — Если вернулось ‘1’ — всё ОК. Если ‘-1’ — ошибка.
— Очищаем контекст
SELECT krb5gss_clean();
Еслиkrb5gss_init()возвращает -1, смотрим лог MySQL (/var/log/mysql.logилиjournalctl).
Частая причина — проблема с обратным DNS, из-за которой библиотеки Kerberos не могут правильно сопоставить имя сервиса и IP.
Иногда помогает включение опции:
SET @@global.krb5gss_noname_in_gss_acquire_cred = ON;
Но лучше проверить файл/etc/hosts. Убедитесь, что строка с вашим сервером выглядит так:
10.0.2.102 dbserv.testdomain.org dbserv
а не так (это частая ошибка):
10.0.2.102 dbserv dbserv.testdomain.org
Kerberos делает двойное преобразование: имя → IP → имя. Итоговое имя должно совпадать с исходным FQDN.
Шаг 4. Финальная проверка и использование
Теперь всё готово. Пользователь заходит на свой рабочий компьютер (входящий в домен), получает билет Kerberos (автоматически при входе в Windows или через kinit в Linux). Когда он запускает клиент Самсона, тот должен передать эти credentials серверу БД через плагин.
Важно: Логин пользователя в операционной системе должен совпадать с его логином в базе данных Самсона.
Заключение и ссылки
SSO для Самсона — задача нетривиальная, но благодарная. Она серьёзно повышает безопасность и удобство работы в крупном медицинском учреждении. Данная инструкция — отправная точка. Если у вас есть опыт настройки такого или похожего решения, или вы столкнулись с ошибками — обязательно пишите в комментариях или создавайте тему на форуме!
Полезные ссылки:


