FreeIPA для Linux-парка: централизованная аутентификация без Microsoft на 150 сотрудников
Меня зовут Семёнов Евгений Сергеевич, я директор АйТи Фреш и за 15 лет работы с гибридными инфраструктурами поднял около двух десятков FreeIPA-инсталляций — от скромных десятиузловых стендов до распределённых систем с репликами в трёх дата-центрах. В этой статье разбираю реальный проект: государственный подрядчик из Новосибирска, 150 сотрудников, 25 Linux-серверов и задача убрать Microsoft Active Directory из контура совсем — при сохранении дисциплины доступа.
Почему клиент пришёл именно к FreeIPA
Ситуация до нашего приезда выглядела грустно. На каждом сервере жила своя копия /etc/passwd, пароли не совпадали, SSH-ключи валялись в authorized_keys без ротации. Уволили сотрудника — админ лез руками на 25 машин. Один раз забыли про два сервера, учётка висела полгода.
В переговорах всплыли пять реальных болей:
- Нет единой точки аутентификации. Разработчики таскали в чат пароли, потому что на каждой ноде они были разные.
- Увольнение превращалось в ночной квест. Обход 25 хостов + хранилище ключей в Gitea + VPN-аккаунт — минимум два часа.
- Все в sudoers wheel. Принцип наименьших привилегий отсутствовал в принципе.
- Требование импортозамещения. Госконтракт напрямую запрещал Microsoft-инфраструктуру.
- Предстоящий аудит ИБ. Без централизованной аутентификации новый контракт они бы не подписали.
Я предложил FreeIPA, и мы вышли на проект. Восемь рабочих дней, бюджет 240 000 руб.
Архитектура и компоненты стека
FreeIPA по сути — это не один продукт, а пачка open-source компонентов, собранная в единый инсталлятор. Под капотом работают 389 Directory Server, MIT Kerberos KDC, Dogtag CA для PKI, интегрированный BIND DNS и клиентский SSSD для кеширования. Всё это управляется через CLI ipa и веб-интерфейс на 443-м порту.
Для нашего заказчика я выбрал такой сайзинг: основной сервер 4 vCPU и 8 ГБ RAM на Rocky Linux 9, реплика с такими же параметрами в отдельном гипервизоре. Диск — 40 ГБ, потому что база 389 DS растёт медленно, а логи Dogtag ротируются автоматически. Виртуалки разместили на нашем кластере Dell Xeon Platinum 8280 в дата-центре МТС Москва — через VPN-туннель до офиса клиента.
Установка сервера FreeIPA на Rocky Linux 9
Подготовка машины — четверть успеха. Сначала выставляем полный FQDN, настраиваем синхронизацию времени (Kerberos крайне не любит дрейф часов больше 5 минут) и открываем нужные порты:
hostnamectl set-hostname ipa.gk.local
echo "10.0.1.10 ipa.gk.local ipa" >> /etc/hosts
dnf install -y chrony
systemctl enable --now chronyd
chronyc tracking
firewall-cmd --permanent --add-service={freeipa-ldap,freeipa-ldaps,dns,ntp,http,https,kerberos,kpasswd}
firewall-cmd --reload
dnf update -y
Дальше ставим серверный модуль IDM и запускаем инсталлятор. Я всегда использую unattended-режим с заранее выставленными паролями, чтобы процесс не зависал на вопросах:
dnf install -y @idm:DL1
dnf install -y ipa-server ipa-server-dns ipa-server-trust-ad
ipa-server-install \
--realm=GK.LOCAL \
--domain=gk.local \
--ds-password='DirMgr-Str0ng!' \
--admin-password='Adm1n-Str0ng!' \
--hostname=ipa.gk.local \
--ip-address=10.0.1.10 \
--setup-dns \
--forwarder=8.8.8.8 \
--forwarder=1.1.1.1 \
--no-reverse \
--mkhomedir \
--unattended
Инсталляция занимает 12–15 минут. Внутри происходит генерация корневого сертификата Dogtag, инициализация Kerberos-реалма, запуск 389 DS и подъём DNS-зоны. После завершения проверяем:
kinit admin
ipa user-find --all
ipa config-show
Пользователи, группы и массовый импорт
Создаём базовые группы под отделы, а пользователей заливаем пачкой из CSV. У нашего клиента был экспорт из 1С:ЗУП — пригодилось. Скрипт на баше по файлу users.csv:
while IFS=',' read -r login first last email group; do
ipa user-add "$login" --first="$first" --last="$last" --email="$email" --password <<< 'Temp-P@ss2025!'
ipa group-add-member "$group" --users="$login"
done < users.csv
# Строгая политика паролей для админов
ipa pwpolicy-add sysadmins \
--maxlife=60 --minlife=1 --history=12 \
--minclasses=4 --minlength=14 \
--maxfail=3 --lockouttime=600 --priority=10
Раз — и 150 аккаунтов в LDAP. Пароль Temp-P@ss2025! с принудительной сменой на первом логине.
Подключение 25 серверов командой ipa-client-install
Это самый механический этап. На каждом клиентском хосте — один и тот же набор действий, только FQDN меняется. Мы завернули всё в Ansible-плейбук, чтобы прогнать за час. Базовый сценарий:
# На клиенте меняем DNS-резолвер на FreeIPA
nmcli con mod eth0 ipv4.dns 10.0.1.10
nmcli con up eth0
hostnamectl set-hostname web01.gk.local
echo "10.0.1.20 web01.gk.local web01" >> /etc/hosts
# Rocky/AlmaLinux
dnf install -y ipa-client
# Ubuntu/Debian
# apt install -y freeipa-client
ipa-client-install \
--domain=gk.local --realm=GK.LOCAL \
--server=ipa.gk.local \
--principal=admin --password='Adm1n-Str0ng!' \
--mkhomedir --enable-dns-updates --unattended
После регистрации хост появляется в базе FreeIPA, SSSD подтягивает конфигурацию автоматически. Проверяем, что пользователь резолвится и может залогиниться:
id ivanov
# uid=1234(ivanov) gid=1234(ivanov) groups=1234(ivanov),5001(developers)
ssh ivanov@web01.gk.local
HBAC и sudo — разграничение доступа
Без HBAC (Host-Based Access Control) любой пользователь FreeIPA получает шелл на любой машине, присоединённой к домену. Это классическая ошибка при первом развёртывании. Первым делом гасим дефолтное правило allow_all и строим матрицу групп.
| Правило | Кто | Куда | Сервисы |
|---|---|---|---|
| sysadmin-all-access | sysadmins | все хосты | sshd, login, sudo |
| developers-web | developers | web-servers | sshd, login |
| dba-db-access | dba | db-servers | sshd, login, sudo |
| monitoring | zbx-agent | все хосты | sshd |
| emergency | root-break-glass | все хосты | все (disabled) |
ipa hbacrule-disable allow_all
ipa hostgroup-add web-servers --desc="Веб-серверы"
ipa hostgroup-add-member web-servers --hosts=web01.gk.local --hosts=web02.gk.local
ipa hbacrule-add developers-web --desc="Devs -> web hosts"
ipa hbacrule-add-user developers-web --groups=developers
ipa hbacrule-add-host developers-web --hostgroups=web-servers
ipa hbacrule-add-service developers-web --hbacsvcs=sshd --hbacsvcs=login
# Проверка до применения
ipa hbactest --user=ivanov --host=db01.gk.local --service=sshd
# Access granted: False — то, что нужно
Sudo-правила строятся аналогично — через sudocmd, sudocmdgroup и sudorule. Например, дать разработчикам перезапускать только nginx и php-fpm на веб-узлах:
ipa sudocmd-add "/usr/bin/systemctl restart nginx"
ipa sudocmd-add "/usr/bin/systemctl restart php-fpm"
ipa sudocmdgroup-add nginx-restart
ipa sudocmdgroup-add-member nginx-restart \
--sudocmds="/usr/bin/systemctl restart nginx" \
--sudocmds="/usr/bin/systemctl restart php-fpm"
ipa sudorule-add dev-restart-web --hostcat=
ipa sudorule-add-user dev-restart-web --groups=developers
ipa sudorule-add-host dev-restart-web --hostgroups=web-servers
ipa sudorule-add-allow-command dev-restart-web --sudocmdgroups=nginx-restart
Dogtag CA и автовыпуск TLS-сертификатов
Встроенный удостоверяющий центр — один из моих любимых бонусов FreeIPA. Сертификаты для внутренних веб-сервисов выпускаются командой certmonger, продлеваются автоматически, и не приходится раз в год покупать Let's Encrypt-аналог или возиться с acme.sh там, где сервис недоступен из интернета.
# Регистрируем service principal
ipa service-add HTTP/web01.gk.local
# Запрашиваем сертификат и команду перезагрузки nginx
ipa-getcert request \
-K HTTP/web01.gk.local \
-D web01.gk.local \
-f /etc/pki/tls/certs/web01.pem \
-k /etc/pki/tls/private/web01.key \
-N CN=web01.gk.local \
-C '/usr/bin/systemctl reload nginx'
ipa-getcert list
# status: MONITORING — certmonger сам продлит за 28 дней до истечения
Корневой CA раздаётся клиентам через ipa-client-install автоматически — он ложится в /etc/ipa/ca.crt и добавляется в системный доверенный bundle. Браузеры на рабочих местах красного экрана не показывают.
Результаты внедрения и цифры
Проект закрыли ровно за 8 рабочих дней: два дня на развёртывание пары серверов с репликой, четыре — на подключение клиентов и настройку политик, два — на тест и обучение. Что получили по факту:
- Централизация 150 учёток в одной точке. Увольнение теперь — одна команда
ipa user-disable, 30 секунд. - 25 серверов в домене. SSH, sudo, сертификаты — везде из LDAP.
- Пройден аудит ИБ. Клиент получил новый госконтракт через три недели после внедрения.
- Экономия на лицензиях: аналог на Microsoft AD с Server+CAL вышел бы от 520 000 руб.
- Кеш SSSD: логины работают даже при падении IPA-сервера, пока кеш не истёк.
Грабли, на которые я наступал
За годы практики собрался список типичных провалов. Если вы поднимаете FreeIPA впервые, читайте внимательно — сэкономите часы:
- Неправильный FQDN. Если hostname возвращает короткое имя — инсталлятор упадёт на середине. Проверяйте
hostname -fДО запуска. - SELinux в permissive. Некоторые админы тушат SELinux — FreeIPA после этого глючит странно. Оставляйте enforcing.
- Конфликт DNS. Если в сети уже есть BIND/Windows DNS, продумайте делегирование поддомена. Я обычно беру
ipa.office.localи делаю subdomain-delegation. - Забытый allow_all. Не отключили — все юзеры ходят куда угодно. Стандартная дыра при первой инсталляции.
- Реплика без отдельного диска. 389 DS любит много мелких IOPS. Дайте SSD, не шпиндель.
- Забыли бэкап CA. Потеря корневого ключа Dogtag = переразвёртывание всего PKI. Скрипт
ipa-backupв cron, результат — в офсайт.
Развернём FreeIPA и уберём зависимость от Microsoft
Поднимаю FreeIPA под ключ в офисах от 30 Linux-хостов: двухрепличная схема, HBAC, sudo-правила, PKI на Dogtag, миграция пользователей из /etc/passwd, OTP-двухфакторка. Стандартный срок — 5–10 дней. Бесплатный аудит Linux-парка и план миграции — за 2 часа у вас в офисе.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — вопросы по FreeIPA
- Чем FreeIPA отличается от OpenLDAP?
- OpenLDAP — это просто каталог. FreeIPA — готовый стек из 389 Directory Server, MIT Kerberos, Dogtag CA, интегрированного DNS и SSSD. То есть вы получаете не только LDAP-хранилище, но и SSO, встроенный удостоверяющий центр, веб-панель управления и клиентскую часть из коробки.
- Что произойдёт при падении FreeIPA-сервера?
- Ранее вошедшие пользователи продолжат работать благодаря кешу SSSD (cache_credentials = True). Новые логины и изменения политик не применятся. Для продакшена я всегда поднимаю вторую реплику командой ipa-replica-install — отказоустойчивость становится штатной.
- Можно ли подключить к FreeIPA Ubuntu или Debian?
- Да. Ставите freeipa-client через apt, затем ipa-client-install с параметрами домена и realm. Клиентская часть на Ubuntu 22.04/24.04 работает стабильно, хотя сам сервер FreeIPA я рекомендую поднимать только на RHEL-совместимых дистрибутивах — Rocky Linux 9 или AlmaLinux 9.
- Поддерживает ли FreeIPA двухфакторку?
- Да, TOTP из коробки. Включается через ipa user-mod ivanov --user-auth-type=otp и добавление токена ipa otptoken-add. Пользователь привязывает Google Authenticator или FreeOTP по QR-коду. При логине пароль вводится слитно: пароль+6 цифр кода.
- Как перенести пользователей из /etc/passwd в FreeIPA?
- Парсите /etc/passwd скриптом на awk, выбираете учётки с UID >= 1000, затем скармливаете в ipa user-add. UID и GID сохраняются через параметры --uid и --gidnumber. Пароли придётся сбросить всем разом — хеши из shadow в FreeIPA напрямую не загружаются.