Freeradius в связке с FreeIPA на Rocky Linux

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

Нач­нет­ся про­цесс кон­фи­гу­ра­ции. После его завер­ше­ния мы уви­дим под­сказ­ку со сле­ду­ю­щи­ми шагами:

… и так как пор­ты мы уже настра­и­ва­ли, пере­хо­дим ко вто­ро­му шагу — про­ве­рим, что систе­ма может выдать билет:

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 — ключ для запро­са пароля.

… после вво­да коман­ды систе­ма запро­сит пароль для созда­ва­е­мо­го поль­зо­ва­те­ля — вво­дим его дважды.

Мы долж­ны уви­деть свод­ку по пара­мет­рам для создан­но­го пользователя:

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

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

Доба­вим в конец одну строку:

* дан­ная настрой­ка ука­жет на необ­хо­ди­мость авто­ма­ти­че­ско­го созда­ния домаш­ней дирек­то­рии для пользователя.

Гото­во.

Возможные ошибки

Раз­бе­рем неко­то­рые ошиб­ки, кото­рые могут воз­ник­нут в про­цес­се уста­нов­ки 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

Вне­сем неко­то­рые настрой­ки в конфигурацию:

 

* где:

  • 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

Сни­ма­ем ком­мен­та­рий для строк:

Откры­ва­ем сле­ду­ю­щий файл:

vi /etc/raddb/users

В нача­ло доба­вим строку:

DEFAULT     Auth-Type = ldap

Пере­за­пус­ка­ем сервис:

systemctl restart radiusd

Гото­во, мож­но проверить:

radtest ldap_user ldap_password localhost 1812 testing123

Мы долж­ны уви­деть что-то на подобие:

Решение проблем

Если в про­цес­се настрой­ки у нас воз­ник­ла ошиб­ка, необ­хо­ди­мо сна­ча­ла про­смот­реть логи freeradius:

tail -f /var/log/radius/radius.log

Если в дан­ном логе нет ниче­го инте­рес­но­го, то оста­нав­ли­ва­ем рабо­ту freeradius:

systemctl stop radiusd

И запус­ка­ем его в режи­ме отладки:

radiusd -X

Состо­я­ние рабо­ты сер­ви­са будет выве­де­но на экран.