· 18 мин чтения

FreeIPA для Linux-парка: централизованная аутентификация без Microsoft на 150 сотрудников

Меня зовут Семёнов Евгений Сергеевич, я директор АйТи Фреш и за 15 лет работы с гибридными инфраструктурами поднял около двух десятков FreeIPA-инсталляций — от скромных десятиузловых стендов до распределённых систем с репликами в трёх дата-центрах. В этой статье разбираю реальный проект: государственный подрядчик из Новосибирска, 150 сотрудников, 25 Linux-серверов и задача убрать Microsoft Active Directory из контура совсем — при сохранении дисциплины доступа.

Почему клиент пришёл именно к FreeIPA

Ситуация до нашего приезда выглядела грустно. На каждом сервере жила своя копия /etc/passwd, пароли не совпадали, SSH-ключи валялись в authorized_keys без ротации. Уволили сотрудника — админ лез руками на 25 машин. Один раз забыли про два сервера, учётка висела полгода.

В переговорах всплыли пять реальных болей:

Я предложил 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-accesssysadminsвсе хостыsshd, login, sudo
developers-webdevelopersweb-serverssshd, login
dba-db-accessdbadb-serverssshd, login, sudo
monitoringzbx-agentвсе хостыsshd
emergencyroot-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 рабочих дней: два дня на развёртывание пары серверов с репликой, четыре — на подключение клиентов и настройку политик, два — на тест и обучение. Что получили по факту:

Грабли, на которые я наступал

За годы практики собрался список типичных провалов. Если вы поднимаете FreeIPA впервые, читайте внимательно — сэкономите часы:

Развернём 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 напрямую не загружаются.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.