Thank you for reading this post, don't forget to subscribe!
Установка FreeIPA
Настройка Freeradius в связке с FreeIPA
разберем пример установки сервера FreeIPA (аналог Microsoft Active Directory, Samba DC) на Linux CentOS. В качестве клиентов будем использовать дистрибутивы на базе RPM (Red Hat, CentOS, …) и deb (Debian, Ubuntu, …).
Подготовка сервера
Для подготовки сервера безопасности с доступом к данным по LDAP необходим сервер с правильно настроенным временем. Также необходимо правильно настроить межсетевой экран и систему безопасности SELinux.
Время
Установим часовой пояс:
timedatectl set-timezone Europe/Moscow
* в данном примере используется московское время.
Затем устанавливаем и запускаем утилиту для синхронизации времени chrony.
yum install chrony
systemctl enable chronyd --now
Имя сервера
Для корректной работы сервера, необходимо, задать ему полное доменное имя (FQDN). Выполняем команду:
hostnamectl set-hostname ipa-server.test.local
* где ipa-server.test.local — имя сервера, которое будет использоваться.
Брандмауэр
Необходимо открыть несколько портов, которые используются службами FreeIPA:
firewall-cmd --permanent --add-port=53/{tcp,udp} --add-port=80/tcp --add-port=88/{tcp,udp} --add-port=123/udp --add-port=389/tcp --add-port=443/tcp --add-port=464/{tcp,udp} --add-port=636/tcp
firewall-cmd --reload
SELinux
Отключаем SELinux командами:
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
Установка и запуск FreeIPA
Установка выполняется из репозитория. Команды немного отличаются в зависимости от версии CentOS.
а) для CentOS 8:
dnf install @idm:DL1
dnf install ipa-server
* первая команда установит модуль DL1 Stream-репозитория. Вторая — сам freeipa.
б) для CentOS 7:
yum install ipa-server
Если мы хотим использовать наш сервер еще и как DNS, то устанавливаем:
yum install ipa-server-dns
После выполняем конфигурирование сервиса:
ipa-server-install
* если система ругнется на IPv6, переходим к решению.
На первый вопрос, хотим ли мы использовать и сконфигурировать DNS-сервер BIND отвечаем утвердительно:
Do you want to configure integrated DNS (BIND)? [no]: yes
На остальные запросы можно ответить по умолчанию, нажав Enter и оставив подставленные значения. Если возникнут ошибки, решение посмотрите ниже в данной инструкции.
Когда система запросит пароль для Directory Manager, необходимо придумать и ввести его дважды:
Directory Manager password:
Password (confirm):
… будет создана учетная запись для подключения к LDAP.
Затем также нужно придумать и задать пароль для IPA admin:
IPA admin password:
Password (confirm):
… будет создана учетная запись IPA Administrator для первого пользователя FreeIPA с правами администратора.
Для настройки DNS на первый запрос, хотим ли мы настроить перенаправления, отвечаем да:
Do you want to configure DNS forwarders? [yes]:
Система предложит сначала использовать DNS-серверы из настроек сети (если они прописаны) — если нас это устроит, оставляем значение по умолчанию:
Do you want to configure these servers as DNS forwarders? [yes]:
… также можно добавить дополнительные серверы:
Enter an IP address for a DNS forwarder, or press Enter to skip: 8.8.8.8
Также оставляем значение по умолчанию для попытки найти обратные зоны:
Do you want to search for missing reverse zones? [yes]
После система выведет информацию о конфигурации и попросит ее подтвердить — вводим yes:
Continue to configure the system with these values? [no]: yes
Начнется процесс конфигурации. После его завершения мы увидим подсказку со следующими шагами:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Next steps: 1. You must make sure these network ports are open: TCP Ports: * 80, 443: HTTP/HTTPS * 389, 636: LDAP/LDAPS * 88, 464: kerberos UDP Ports: * 88, 464: kerberos * 123: ntp 2. You can now obtain a kerberos ticket using the command: 'kinit admin' This ticket will allow you to use the IPA tools (e.g., ipa user-add) and the web user interface. |
… и так как порты мы уже настраивали, переходим ко второму шагу — проверим, что система может выдать билет:
kinit admin
… после вводим пароль администратора, который указывали при конфигурировании FreeIPA.
Проверяем, что билет получен:
klist
Ответ должен быть, примерно, следующим:
Ticket cache: KEYRING:persistent:0:0
Default principal: admin@test.LOCAL
Valid starting Expires Service principal
23.07.2019 08:53:02 24.07.2019 08:52:55 krbtgt/test.LOCAL@test.LOCAL
* где test.LOCAL — домен в моей системе. В данном примере мы получили билет для пользователя admin.
Настройка и подключение клиента
Клиентские компьютеры должны быть настроены на использование DNS-сервера, который мы сконфигурировали на сервере FreeIPA во время его установки. В сетевых настройках указываем использовать наш сервер ipa для разрешения имен и перезапускаем сетевую службу:
systemctl restart network || systemctl restart networking
Устанавливаем клиента.
а) на компьютеры с Red Hat / CentOS:
yum install freeipa-client
б) на компьютеры с Debian / Ubuntu:
apt-get install freeipa-client
Выполним конфигурирование клиента:
ipa-client-install --mkhomedir
… система на основе данных из DNS попробует определить настройки и отобразить их в консоли, например:
Discovery was successful!
Client hostname: freeipa-client.test.local
Realm: test.LOCAL
DNS Domain: test.LOCAL
IPA Server: ipa-server.test.local
BaseDN: dc=test,dc=local
Если эти настройки верны, отвечаем положительно на запрос Continue to configure the system with these values?
Continue to configure the system with these values? [no]: yes
Система спросит, от какого пользователя производить настройку — вводим admin:
User authorized to enroll computers: admin
… и пароль:
Password for admin@test.LOCAL:
Начнется процесс конфигурации — после его завершения:
…
Configured /etc/openldap/ldap.conf
NTP enabled
Configured /etc/ssh/ssh_config
Configured /etc/ssh/sshd_config
Configuring test.LOCAL as NIS domain.
Client configuration complete.
… сразу проверим, что клиент может получать билет от сервера:
kinit admin
… и вводим пароль от пользователя admin.
Проверяем, что билет получен:
klist
Ответ должен быть, примерно, следующим:
Ticket cache: KEYRING:persistent:0:0
Default principal: admin@test.LOCAL
Valid starting Expires Service principal
25.07.2019 23:39:56 26.07.2019 23:39:52 krbtgt/test.LOCAL@test.LOCAL
Клиент настроен.
Создание пользователей
Создадим пользователя. Для этого рассмотрим пример использования командной строки и веб-интерфейса.
Командная строка
Авторизуемся на FreeIPA:
kinit admin
Создаем нового пользователя командой:
ipa user-add test --first=Андрей --last=Б--password
* где test— логин; first — имя пользователя; last — фамилия; password — ключ для запроса пароля.
… после ввода команды система запросит пароль для создаваемого пользователя — вводим его дважды.
Мы должны увидеть сводку по параметрам для созданного пользователя:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Добавлен пользователь «test» ----------------------------- Логин пользователя: test Имя: Андрей Фамилия: Б Полное имя: Андрей Б Отображаемое имя: Андрей Б Инициалы: ДМ Домашний каталог: /home/test GECOS: Андрей Б Оболочка входа: /bin/sh Principal name: test@test.LOCAL Principal alias: test@test.LOCAL User password expiration: 20190725205853Z Электронный адрес: test@test.local UID: 1798800001 ID группы: 1798800001 Пароль: True Member of groups: ipausers Kerberos ключей доступно: True |
Примет более полной команды для создания пользователя:
ipa user-add test --first=Андрей --last=Б --cn="Б Андрей" --displayname="Б Андрей" --email=master@test.ru --password
* в данном примере мы использовали дополнительные поля:
- cn — полное имя.
- displayname — отображаемое имя.
- email — адрес электронной почты.
* более полный список атрибутов можно найти на странице с мануалом Fedora Project.
Веб-интерфейс
Открываем браузер и переходим по адресу имени сервера — в нашем примере, https://ipa-server.test.local. Закрываем всплывающее окно с запросом пароля. В появившейся странице авторизации вводим логин admin и его пароль.
Откроется страница управления пользователями:
На панели справа (над списком пользователей) кликаем по Добавить:
В открывшемся окне заполняем поля для создания пользователя и нажимаем по Добавить:
Проверка
На компьютере с клиентом вводим команду для проверки:
kinit test
… и вводим пароль от созданной учетной записи:
Password for test@test.LOCAL:
При вервом входе система попросит поменять пароль на новый:
Password expired. You must change it now.
Enter new password:
Enter it again:
SSH аутентификация через FreeIPA
По умолчанию, клиент конфигурируется на возможность входа по SSH с использованием пользователей из FreeIPA. Внесем некоторые изменения для удобства.
Открываем конфигурационный файл для pam:
vi /etc/pam.d/common-session
Добавим в конец одну строку:
1 2 |
... session required pam_mkhomedir.so skel=/etc/skel umask=0022 |
* данная настройка укажет на необходимость автоматического создания домашней директории для пользователя.
Готово.
Возможные ошибки
Разберем некоторые ошибки, которые могут возникнут в процессе установки FreeIPA.
1. ipapython.admintool: ERROR IPv6 stack is enabled in the kernel but there is no interface that has ::1 address assigned. Add ::1 address resolution to 'lo' interface. You might need to enable IPv6 on the interface 'lo' in sysctl.conf.
Ошибка появляется при попытке запустить команду ipa-server-install.
Причина: если в системе отключен IPv6 с помощью параметра в ядре net.ipv6.conf.all.disable_ipv6 или net.ipv6.conf.default.disable_ipv6, то команда выдаст ошибку, так как для локальной петли нам нужен IPv6. Если же IPv6 отключен через GRUB, то необходимо его включить.
Решение:
1. sysctl
Открываем конфигурационный файл sysctl:
vi /etc/sysctl.d/99-sysctl.conf
Добавляем строку:
net.ipv6.conf.lo.disable_ipv6 = 0
Применяем настройки:
sysctl -p /etc/sysctl.d/99-sysctl.conf
2. GRUB
Открываем конфигурационный файл grub:
vi /etc/default/grub
Находим строку опцию GRUB_CMDLINE_LINUX — в ее значении мы должны найти ipv6.disable=1:
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap ipv6.disable=1 crashkernel=auto rhgb quiet"
Удаляем данную опцию из значения — в моем случае получилось:
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap crashkernel=auto rhgb quiet"
Переконфигурируем grub:
grub2-mkconfig -o /boot/grub2/grub.cfg
Для применения, перезагрузим систему:
shutdown -r now
2. Invalid hostname 'XXX', must be fully-qualified
Появляется при запуске команды ipa-server-install.
Причина: имя нашего сервера не является FQDN (полным доменным).
Решение: задаем полное имя с доменом командой:
hostnamectl set-hostname ipa-server.test.local
* в данном примере у сервера будет имя ipa-server в домене test.local.
Настройка Freeradius в связке с FreeIPA
Так как Rocky Linux реализован на базе CentOS, данная инструкция подойдет и для последнего. Предполагается, что у нас уже настроен FreeIPA,
Подготовка сервера
Для корректной работы Freeradius с сервером LDAP необходимо настроить время, брандмауэр и отключить SELinux.
1. Время
Устанавливаем сервис для синхронизации времени и запускаем его:
yum install chrony
systemctl enable chronyd --now
Задаем часовой пояс:
timedatectl set-timezone Europe/Moscow
* в данном примере задается часовой пояс по московскому времени. Полный перечень вариантов можно посмотреть командой timedatectl list-timezones.
2. Firewalld
Создаем правило для разрешения сервиса radius (порты 1812 и 1813):
firewall-cmd --permanent --add-service=radius
firewall-cmd --reload
3. SELinux
В нашей инструкции мы просто отключим SELinux
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
4. Имя сервера
Задаем имя нашему серверу:
hostnamectl set-hostname freeradius.test.ru
Установка и настройка Freeradius
Установим сам Freeradius и настроим его для аутентификации с использованием конфигурационного файла.
Установка выполняется командой:
dnf install freeradius freeradius-utils
* мы установим не только сам freeradius, но и утилиты для работы с ним.
Разрешим автозапуск сервиса и запустим его:
systemctl enable radiusd
systemctl start radiusd
Открываем файл:
vi /etc/raddb/users
… и в самый низ добавляем:
test Cleartext-Password := "test123"
* мы создали пользователя test с паролем test123.
Перечитываем конфиг radius:
systemctl reload radiusd
Делаем тестовый запрос:
radtest test test123 localhost 1218 testing123
* где:
- test — учетная запись, которую мы проверяем.
- test123 — пароль от учетной записи test.
- localhost — сервер, к которому мы обращаемся (в нашем случае, локальный).
- 1218 — порт, на котором слушает запросы freeradius.
- testing123 — пароль для подключения клиентом к серверу radius. Данный пароль создается по умолчанию для локальных запросов.
Мы должны увидеть ответ на подобие:
…
Received Access-Accept Id 87 from 127.0.0.1:1812 to 127.0.0.1:56554 length 20
Access-Accept говорит нам о том, что пароль для пользователя test правильный. Сервер работает.
Freeradius + FreeIPA
Как говорилось выше, мы рассмотрим процесс аутентификации с LDAP на базе FreeIPA. Необходимо выполнить настройку как на стороне последнего, так и сервера RADIUS.
Подготовка LDAP
Все, что от нас требуется — создать отдельную учетную запись со стандартными правами. Это делается в веб-интерфейсе управления FreeIPA.
Переходим в раздел Идентификация - Пользователи:
Справа кликаем по Добавить:
Заполняем поля и сохраняем настройки.
После создания учетной записи необходимо войти под ней через веб-интерфейс и поменять пароль:
Готово. Переходим к настройкам Freeradius.
Настройка Freeradius
Устанавливаем дополнение к Freeradius для работы с ldap:
yum install freeradius-ldap
Активируем установленный модуль:
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Открываем на редактирование файл ldap:
vi /etc/raddb/mods-available/ldap
Внесем некоторые настройки в конфигурацию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
ldap { ... server="ldap://ipa01.test.ru" server="ldap://ipa02.test.ru" ... #port=389 port=636 ... identity="uid=freeradius,cn=users,cn=accounts,dc=test,dc=ru" password=freeradius135 ... base_dn="cn=users,cn=accounts,dc=test,dc=ru" ... user { ... base_dn="${..base_dn}" ... filter="(uid=%{%{Stripped-User-Name}:-%{User-Name}})" ... } ... tls { ... start_tls=yes ... } ... } |
* где:
- server — перечисление наших серверов FreeIPA. Если их несколько, создаем несколько строчек.
- port — порт, на котором слушает наш LDAP. Как правило, это 389 или 636 с TLS.
- identity — путь до учетной записи пользователя, под которой мы будем подключаться к Freeradius. Это та учетная запись, которую мы создали по инструкции выше.
- password — пароль для учетной записи, которую мы используем в опции identity.
- base_dn — базовый путь в ldap для поиска объектов.
- в секции user проверяем, чтобы значения для двух параметров base_dn и filter были такие.
- start_tls — задаем, если используем TLS (порт 636). Иначе, оставляем закомментированным.
Теперь настроим Freeradius, чтобы он выполнял аутентификацию в LDAP.
Открываем файл:
vi /etc/raddb/sites-enabled/default
Снимаем комментарий для строк:
1 2 3 |
Auth-Type LDAP { ldap } |
Открываем следующий файл:
vi /etc/raddb/users
В начало добавим строку:
DEFAULT Auth-Type = ldap
Перезапускаем сервис:
systemctl restart radiusd
Готово, можно проверить:
radtest ldap_user ldap_password localhost 1812 testing123
Мы должны увидеть что-то на подобие:
1 2 3 4 5 6 7 8 |
Sent Access-Request Id 115 from 0.0.0.0:33371 to 127.0.0.1:1812 length 79 User-Name = "ldap_user" User-Password = "ldap_password" NAS-IP-Address = 192.168.0.18 NAS-Port = 1812 Message-Authenticator = 0x00 Cleartext-Password = "ldap_password" Received Access-Accept Id 115 from 127.0.0.1:1812 to 127.0.0.1:33371 length 20 |
Решение проблем
Если в процессе настройки у нас возникла ошибка, необходимо сначала просмотреть логи freeradius:
tail -f /var/log/radius/radius.log
Если в данном логе нет ничего интересного, то останавливаем работу freeradius:
systemctl stop radiusd
И запускаем его в режиме отладки:
radiusd -X
Состояние работы сервиса будет выведено на экран.