FreeIPA: различия между версиями
Нет описания правки |
|||
(не показано 65 промежуточных версий 13 участников) | |||
Строка 3: | Строка 3: | ||
FreeIPA является интегрированной системой проверки подлинности и авторизации в сетевой среде Linux, FreeIPA сервер обеспечивает централизованную проверку подлинности, авторизацию и контроль за аккаунтами пользователей сохраняя сведения о пользователе, группах, узлах и других объектах необходимых для обеспечения сетевой безопасности. | FreeIPA является интегрированной системой проверки подлинности и авторизации в сетевой среде Linux, FreeIPA сервер обеспечивает централизованную проверку подлинности, авторизацию и контроль за аккаунтами пользователей сохраняя сведения о пользователе, группах, узлах и других объектах необходимых для обеспечения сетевой безопасности. | ||
Сайт проекта | [https://www.freeipa.org/ Сайт проекта], [https://ipa.demo1.freeipa.org/ipa/ui/ демонстрация интерфейса]. | ||
== Установка сервера FreeIPA == | == Установка сервера FreeIPA == | ||
;[[FreeIPA/Установка_сервера_FreeIPA]] | |||
:Установка сервера FreeIPA | |||
;[[FreeIPA/Установка_сервера_FreeIPA#Установка_сервера_FreeIPA_в_режиме_CA-less]] | |||
:Установка сервера FreeIPA в режиме CA-less | |||
{{Note|Если выдаёт <pre>[error] CalledProcessError: Command '/sbin/systemctl restart httpd2.service' returned non-zero exit status 1</pre> | {{Note|Если выдаёт <pre>[error] CalledProcessError: Command '/sbin/systemctl restart httpd2.service' returned non-zero exit status 1</pre> | ||
Строка 52: | Строка 20: | ||
== Установка FreeIPA клиента и подключение к серверу == | == Установка FreeIPA клиента и подключение к серверу == | ||
;[[FreeIPA/Клиент]] | |||
:Установка FreeIPA клиента и подключение к серверу | |||
;[[FreeIPA/Ansible]] | |||
:Установка FreeIPA клиентов с помощью Ansible | |||
{{Attention|Если при входе в домен возникает такая ошибка: | |||
<pre>Hostname (ipa-client1.test1.alt) does not have A/AAAA record. | |||
Failed to update DNS records.</pre> | |||
Проверьте IP-адрес доменного DNS сервера в файле {{path|/etc/resolv.conf}}}} | |||
Для работы sudo-политик для доменных пользователей на клиентской машине необходимо разрешить доступ к sudo: | Для работы sudo-политик для доменных пользователей на клиентской машине необходимо разрешить доступ к sudo: | ||
<pre># control sudo public</pre> | <pre># control sudo public</pre> | ||
=== Вход пользователя === | === Вход пользователя === | ||
При первом входе пользователя будет запрошен текущий установленный администратором пароль и затем у пользователя запрашивается новый пароль и его подтверждение. | При первом входе пользователя будет запрошен текущий установленный администратором пароль и затем у пользователя запрашивается новый пароль и его подтверждение. | ||
{{Attention| | {{Attention|Если машина до этого была в других доменах или есть проблемы со входом пользователей рекомендуется очистить кэш sssd: | ||
<pre># systemctl stop sssd | |||
# rm -f /var/lib/sss/db/* | |||
# rm -f /var/lib/sss/mc/* | |||
# systemctl start sssd</pre>}} | |||
== Настройка репликации == | |||
;[[FreeIPA/Настройка_репликации]] | |||
:Настройка репликации | |||
;[[FreeIPA/Настройка_репликации#С_интегрированным_DNS_и_без_CA]] | |||
:Настройка IPA CA-less репликации | |||
== Настройка доверительных отношений с AD == | == Настройка доверительных отношений с AD == | ||
;[[FreeIPA/Интеграция_с_AD]] | |||
:Настройка доверительных отношений с AD | |||
''' | {{Attention|Для корректной работы сервера IPA с пользователями доверенного домена AD необходимо обеспечить доступ сервиса sssd к /etc/krb5.keytab см. [https://bugzilla.altlinux.org/33115 bug 33115]}} | ||
{{Attention|Для входа AD пользователя в ALT рабочую станцию из IPA вводим имя пользователя в формате '''DOMC'''\username или '''DOMC.TESTC'''\username или username@'''domc''' username@'''domc.testc'''}} | |||
{{Attention|Для входа IPA пользователя в windows рабочую станцию из AD вводим имя пользователя в формате '''DOMF.TESTF'''\username}} | |||
<pre> | |||
== Конфигурация == | |||
< | ;[[FreeIPA/OTP]] | ||
:Двухфакторная аутентификация | |||
== Создание аккаунта для доступа к LDAP == | |||
Некоторые сервисы использующие LDAP требуют предварительно настроенной учетной записи. Использование обычной учетной записи пользователя предпочтительней, но не всегда это целесообразно делать. Можно сделать системную учетную запись следующим образом на сервере FreeIPA используя пароль Directory : | |||
<pre># ldapmodify -x -D 'cn=Directory Manager' -W | |||
'' | dn: uid=system,cn=sysaccounts,cn=etc,dc=example,dc=test | ||
< | changetype: add | ||
objectclass: account | |||
objectclass: simplesecurityobject | |||
uid: ldapaccount | |||
userPassword: secret123 | |||
passwordExpirationTime: 20380119031407Z | |||
nsIdleTimeout: 0 | |||
<blank line> | |||
^D</pre> | |||
Замените пароль на более сложный. Параметр {{path|passwordExpirationTime: 20380119031407Z}} означает, что срок действия пароля неограничен | |||
Причина использования такой учетной записи, а не создание обычной учетной записи пользователя IPA, и использование этой системы заключается в том, что системная учетная запись существует только для привязки к LDAP. Это не настоящий пользователь POSIX, он не может войти в систему и ему не принадлежат файлы. У этого пользователя нет особых прав и он не может ничего записывать какие-либо данные на сервер LDAP FreeIPA, только права на чтение. | |||
== Добавление расширенных полей в ldap == | |||
Если необходимо добавить поля в вашу схему ldap, то реализация этого возможна через команду ldapmodify и добавление своих плагинов для отображения этих полей в WebUi.<br> | |||
Обычно файлы модификации схемы являются типом ''.ldif''.<br> | |||
Пример:<br> | |||
Содержание файла addExtField.ldif <br> | |||
<pre>dn: cn=schema | |||
changetype: modify | |||
add: attributeTypes | |||
attributeTypes: ( 2.25.28639311321113238241701611583088740684.14.2.2 NAME 'favoriteColorName' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Extending FreeIPA' ) | |||
dn: cn=schema | |||
changetype: modify | |||
add: attributeTypes | |||
attributeTypes: ( 2.25.28639311321113238241701611583088740684.14.2.3 NAME 'redirects' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Extending FreeIPA') | |||
dn: cn=schema | |||
changetype: modify | |||
add: attributeTypes | |||
attributeTypes: ( 2.25.28639311321113238241701611583088740684.14.2.4 NAME 'attbool' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 X-ORIGIN 'Extending FreeIPA') | |||
dn: cn=schema | |||
changetype: modify | |||
add: objectclasses | |||
objectclasses: ( 2.25.28639311321113238241701611583088740684.14.2.1 NAME 'customPerson' SUP person STRUCTURAL MAY ( favoriteColorName $ attbool $ redirects ) X-ORIGIN 'Extending FreeIPA' )</pre> | |||
Детальное пояснение для блока:<br> | |||
> | <pre>dn: cn=schema | ||
changetype: modify | |||
add: attributeTypes | |||
attributeTypes: ( 2.25.28639311321113238241701611583088740684.14.2.2 | |||
NAME 'favoriteColorName' | |||
EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch | |||
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 | |||
X-ORIGIN 'Extending FreeIPA' )</pre> | |||
'''dn''' - dn, в котором будет проводиться изменение. Добавление/удаление классов и т.д.<br> | |||
'''changetype''' - атрибут, отвечающий за тип изменений, которые будут происходить.(add, delete, modify, modrdn)<br> | |||
< | |||
> | |||
'''add: attributeTypes''' - добавление атрибута, далее идёт описание атрибута.<br> | |||
'''2.25.28639311321113238241701611583088740684.14.2.2''' - уникальный идентификатор атрибута. Можно написать любой.<br> | |||
'''NAME 'favoriteColorName' ''' - По другому можно назвать - primary name. Название атрибута.<br> | |||
''' | '''EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch''' - эти атрибуты заданы для проверки соответствия содержания атрибута правилам caseIgnoreMatch <br> | ||
'''SYNTAX 1.3.6.1.4.1.1466.115.121.1.15''' - OID типа данных <br> | |||
< | |||
Все изменения в схеме производятся от пользователя - Directory manager.<br> | |||
Изменение схемы ldap: | |||
0 100 | |||
<pre>$ ldapmodify -D "cn=Directory Manager" -W -f addExtField.ldif</pre> | |||
После изменения схемы, путем добавления нового objectclass, нужно чтобы эти поля еще можно было редактировать в web-интерфейсе. Для этого необходимо сделать палагин. В примере использовано 3 атрибута, для них сделаем 3 отдельных плагина: | |||
1. Создание папки: | |||
<pre>mkdir -p /usr/share/ipa/ui/js/plugins/favoriteColorName</pre> | |||
2. Создание самого плагина: | |||
<pre>mcedit /usr/share/ipa/ui/js/plugins/favoriteColorName/favoriteColorName.js</pre> | |||
Тело плагина: | |||
<pre>define(['freeipa/phases','freeipa/user'], | |||
function(phases, user_mod) { | |||
// helper function | |||
function get_item(array, attr, value) { | |||
for (var i=0,l=array.length; i<l; i++) { | |||
if (array[i][attr] === value) return array[i]; | |||
} | |||
return null; | |||
} | |||
var color_plugin = {}; | |||
color_plugin.add_favorite_color = function() { | |||
var facet = get_item(user_mod.entity_spec.facets, '$type', 'details'); | |||
var section = get_item(facet.sections, 'name', 'identity'); | |||
section.fields.push({ | |||
name: 'favoritecolorname', | |||
label: 'Цвет' | |||
}); | |||
return true; | |||
}; | |||
phases.on('customization', color_plugin.add_favorite_color); | |||
return color_plugin; | |||
});</pre> | |||
В схеме бы добавлен атрибут типа boolean, для него можно сделать радиокнопки:<br> | |||
<pre>define(['freeipa/phases','freeipa/user'], | |||
function(phases, user_mod) { | |||
// helper function | |||
function get_item(array, attr, value) { | |||
for (var i=0,l=array.length; i<l; i++) { | |||
if (array[i][attr] === value) return array[i]; | |||
} | |||
return null; | |||
} | |||
var attrbool_plugin = {}; | |||
attrbool_plugin.add_bool = function() { | |||
var facet = get_item(user_mod.entity_spec.facets, '$type', 'details'); | |||
var section = get_item(facet.sections, 'name', 'identity'); | |||
section.fields.push( | |||
{ | |||
$type: 'radio',. | |||
options:[{label:'True',value:'TRUE'},{label:'False',value:'FALSE'}], | |||
label:'Blood type', | |||
name: 'attbool'} | |||
); | |||
return true; | |||
}; | |||
phases.on('customization', attrbool_plugin.add_bool); | |||
return attrbool_plugin; | |||
}); | |||
</pre> | |||
После необходимо добавить новое поле в "Default user objectclasses" (находится IPA Server -> Configuration) созданный objectclass (customPerson) и появятся поля в web-интерфейсе. Для того чтобы пользователь мог их редактировать, необходимо изменить привилегии в группе ipausers. <br> | |||
== Использование haproxy для высокой доступности FreeIPA == | |||
'''Требуется:''' | |||
Сервер №1 c freeipa: dc1.testbc.testgl | |||
Сервер №2 с репликой freeipa: dc2.testbc.testgl | |||
Сервер №3 с haproxy: haproxy.testbc.testgl | |||
[[Файл:Схема.png]] | |||
'''Настройка:''' | |||
Инструкция для настройки сервера №1 и №2: [[FreeIPA]] | |||
На сервере №3: | |||
Установить | |||
<pre># apt-get install haproxy</pre> | |||
Сохранить оригинальный конфигурационный файл: | |||
<pre>cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxyBAK.cfg</pre> | |||
Изменить конфигурацию: | |||
<pre> | |||
cat << EOF > /etc/haproxy/haproxy.cfg | |||
global | |||
log 127.0.0.1 local2 | |||
chroot /var/lib/haproxy | |||
pidfile /var/run/haproxy.pid | |||
maxconn 4000 | |||
user _haproxy | |||
group _haproxy | |||
daemon | |||
stats socket /var/lib/haproxy/stats | |||
# LDAP and LDAP/STARTTLS | |||
frontend ldap_service_front | |||
mode tcp | |||
bind *:389 | |||
description LDAP Service | |||
option socket-stats | |||
option tcpka | |||
timeout client 3600s | |||
default_backend ldap_service_back | |||
backend ldap_service_back | |||
server ldap-1 dc1.testbc.testgl:389 check fall 1 rise 3 inter 2s weight 150 | |||
server ldap-2 dc2.testbc.testgl:389 check fall 1 rise 3 inter 2s weight 100 | |||
mode tcp | |||
balance roundrobin | |||
option tcpka | |||
option ldap-check | |||
timeout server 1800s | |||
timeout connect 1s | |||
frontend ldaps_service_front | |||
mode tcp | |||
bind *:636 | |||
description LDAP Service | |||
option socket-stats | |||
option tcpka | |||
timeout client 3600s | |||
default_backend ldap_service_back | |||
backend ldaps_service_back | |||
server ldap-1 dc1.testbc.testgl:636 check fall 1 rise 3 inter 2s weight 150 | |||
server ldap-2 dc1.testbc.testgl:636 check fall 1 rise 3 inter 2s weight 150 | |||
mode tcp | |||
balance roundrobin | |||
option tcpka | |||
option ssl-hello-chk | |||
timeout server 1800s | |||
EOF | |||
</pre> | |||
Запустить сервис haproxy: | |||
<pre>#systemctl start haproxy</pre> | |||
Проверить работу можно с помощью ldapsearch сделав один из серверов недоступным: | |||
<pre>ldapsearch -x -h haproxy.testbc.testgl -b dc=testbc,dc=testgl uid=admin</pre> | |||
Результат: ldap всегда доступен. | |||
== Automember rebuild membership == | |||
Пользовательские или хост группы можно легко перестроить на основе новых или обновленных правил automember. Команда automember rebuild только добавляет новые отношения для групп, она не удаляет те, которые не соответствуют правилам automember. Недавно добавленная команда вызовет задачу в rebuild automember, создав запись LDAP в cn = automember rebuild membership, cn = tasks, cn = config. Плагин automember в настоящее время проверяет операции Add(добавления), чтобы увидеть, есть ли запись соответствует одному из определенных правил automember. Существующие записи не проверяются когда они изменяются. Чтобы применить правило для всех записей, надо добавить задачу к плагину automember. Создатель задачи обеспечит фильтр поиска и базу. Все совпадающие записи будут проверяться в соответствии с определенными правилами automember, чтобы увидеть если они должны быть добавлены в какие-либо группы. Это позволяет добавить запуск атрибуты(значения) после того, как запись была первоначально добавлена, а затем вызвать задачу(выполнить) обновления automember. Ipa automember-rebuild может использоваться для восстановления членства для всех объектов определенного типа: | |||
<pre> | |||
$ ipa automember-rebuild --type=group | |||
$ ipa automember-rebuild --type=hostgroup | |||
</pre> | |||
Он также может использоваться для восстановления членства для указанных записей: | |||
<pre> | |||
$ ipa automember-rebuild --hosts=HOSTNAME1 --hosts=HOSTNAME2 | |||
$ ipa automember-rebuild --users=LOGIN1 --users=LOGIN2 | |||
</pre> | |||
Добавление новой группы хостов: | |||
<pre> | |||
$ ipa hostgroup-add --desc="Web Servers" webservers | |||
</pre> | |||
Добавить новый хост: | |||
<pre> | |||
$ ipa host-add web1.example.com --force | |||
</pre> | |||
Добавить automember rule: | |||
<pre> | |||
$ ipa automember-add --type=hostgroup webservers | |||
$ ipa automember-add-condition --key=fqdn --type=hostgroup --inclusive-regex=^web[1-9]+\.example\.com webservers | |||
</pre> | |||
Функция automember теперь работает для новых добавленных записей. Если мы добавим новый хост, он будет автоматически помещен в соответствующую группу хостов: | |||
<pre> | |||
$ ipa host-add web2.example.com --force | |||
$ ipa hostgroup-show webservers | |||
Host-group: webservers | |||
Description: Web Servers | |||
Member hosts: web2.example.com | |||
</pre> | |||
Однако старая запись хоста для web1.example.com по-прежнему не является членом или хост-группой веб-серверов. Введя новые команды automember-rebuild, мы сделаем это возможным: | |||
<pre> | |||
$ ipa automember-rebuild --type=hostgroup | |||
or | |||
$ ipa automember-rebuild --hosts=web1.example.com | |||
</pre> | |||
Хост добавится в новую группу: | |||
<pre> | |||
$ ipa hostgroup-show webservers | |||
Host-group: webservers | |||
Description: Web Servers | |||
Member hosts: web2.example.com, web1.example.com | |||
</pre> | |||
Тоже самое можно сделать в web-интерфейсе. | |||
== IPA Automount NFS == | |||
Установим nfs-server: | |||
<pre> apt-get install nfs-server </pre> | |||
Включим SECURE_NFS: | |||
<pre>echo 'SECURE_NFS=yes' >> /etc/sysconfig/nfs</pre> | |||
Добавим сервис в автозапуск: | |||
<pre>systemctl enable --now nfs-server</pre> | |||
Добавим список экспорта и применим изменения: | |||
<pre> | |||
# mkdir -p /exports/test_share | |||
# echo '/exports/test_share client1.testbc.testbe(rw,no_subtree_check,sec=krb5p)' >> /etc/exports | |||
# exportfs -vra | |||
</pre> | |||
На IPA сервере: | |||
<pre># kinit admin</pre> | |||
Добавить ipa сервис где nfs.testbc.testbe наш nfs сервер: | |||
<pre># ipa service-add nfs/nfs.testbc.testbe</pre> | |||
Добавляем в keytab: | |||
<pre># ipa-getkeytab -s freeipa.testbc.testbe -p nfs/nfs.testbc.testbe -k /etc/krb5.keytab</pre> | |||
Проверим наличие: | |||
<pre># klist -k /etc/krb5.keytab | |||
Keytab name: FILE:/etc/krb5.keytab | |||
KVNO Principal | |||
---- ---------- | |||
2 host/nfs.testbc.testbe@TESTBC.TESTBE | |||
1 nfs/nfs.testbc.testbe@TESTBC.TESTBE</pre> | |||
Перезапустим nfs сервер: | |||
<pre># systemctl restart nfs-server</pre> | |||
Добавим правила автомонтирования: | |||
<pre> | |||
# ipa automountmap-add default auto.test | |||
# ipa automountkey-add default --key "/-" --info auto.test auto.master | |||
# ipa automountkey-add default --key "/mnt/testshare" --info "-fstype=nfs4,rw,sec=krb5p,hard nfs.testbc.testbe:/exports/test_share" auto.test | |||
</pre> | |||
Удалим пустую карту монтирования: | |||
<pre># ipa automountkey-del --key '/-' --info 'auto.direct' default auto.master</pre> | |||
Настройка клиента: | |||
ipa-client-install | |||
Устанавливаем пакет freeipa-client-automount: | |||
<pre> # apt-get install freeipa-client-automount </pre> | |||
Проверим доступность nfs: | |||
<pre># showmount -e nfs.testbc.testbe</pre> | |||
Настроим автомонтирование: | |||
<pre># ipa-client-automount --location default</pre> | |||
На IPA сервере: | |||
Создадим пользователя: | |||
<pre># ipa user-add ipatest --first ipatest --last ipatest</pre> | |||
Предоставим пользователю права на запись: | |||
<pre># mkdir /exports/test_share/testdir | |||
# chown ipatest:ipatest /exports/test_share/testdir</pre> | |||
Создадим домашнюю папку пользователя на nfs сервере: | |||
<pre># mkhomedir_helper ipatest | |||
# echo '/home client1.testbc.testbe(rw,no_subtree_check,sec=krb5p)' >> /etc/exports | |||
# exportfs -vra | |||
</pre> | |||
Добавим правила автомонтирования: | |||
<pre>ipa automountmap-add default auto.home | |||
ipa automountkey-add default --key "/home" --info auto.home auto.master | |||
ipa automountkey-add default --key "*" --info "-fstype=nfs4,rw,sec=krb5p,hard nfs.testbc.testbe:/home/&" auto.home</pre> | |||
Проверяем на клиенте: | |||
<pre>$ df -h</pre> | |||
Для отладки используйте: | |||
NFS/autofs/sssd-autofs: | |||
<pre>systemctl stop autofs | |||
<pre> | automount -fd -vvv</pre> | ||
krb5: | |||
<pre>sed -i '/^GSSD_OPTIONS=/{s/"$/ -vvv"/g}' /etc/sysconfig/nfs | |||
systemctl restart rpc-gssd</pre> | |||
<pre> | |||
== Дополнительные материалы == | |||
* [https://habrahabr.ru/company/pixonic/blog/325546/ Настройка репликации во FreeIPA 4.4 с domain level 1] — Блог Pixonic на Habrahabr | |||
* [Система централизованного управления авторизацией пользователей на FreeIPA в Docker Система централизованного управления авторизацией пользователей на FreeIPA в Docker] — frol, Habrahabr | |||
[[Категория:Корпоративная инфраструктура]] | [[Категория:Корпоративная инфраструктура]] |
Текущая версия от 07:08, 15 февраля 2023
FreeIPA - это комплексное решение по управлению безопасностью Linux-систем, 389 Directory Server, MIT Kerberos, NTP, DNS, Dogtag. Оно состоит из веб-интерфейса и интерфейса командной строки.
FreeIPA является интегрированной системой проверки подлинности и авторизации в сетевой среде Linux, FreeIPA сервер обеспечивает централизованную проверку подлинности, авторизацию и контроль за аккаунтами пользователей сохраняя сведения о пользователе, группах, узлах и других объектах необходимых для обеспечения сетевой безопасности.
Сайт проекта, демонстрация интерфейса.
Установка сервера FreeIPA
- FreeIPA/Установка_сервера_FreeIPA
- Установка сервера FreeIPA
- FreeIPA/Установка_сервера_FreeIPA#Установка_сервера_FreeIPA_в_режиме_CA-less
- Установка сервера FreeIPA в режиме CA-less
[error] CalledProcessError: Command '/sbin/systemctl restart httpd2.service' returned non-zero exit status 1
Выполните
# systemctl restart httpd2
Отмените установку:
# ipa-server-install -U --uninstallи повторите снова.
Установка FreeIPA клиента и подключение к серверу
- FreeIPA/Клиент
- Установка FreeIPA клиента и подключение к серверу
- FreeIPA/Ansible
- Установка FreeIPA клиентов с помощью Ansible
Hostname (ipa-client1.test1.alt) does not have A/AAAA record. Failed to update DNS records.Проверьте IP-адрес доменного DNS сервера в файле /etc/resolv.conf
Для работы sudo-политик для доменных пользователей на клиентской машине необходимо разрешить доступ к sudo:
# control sudo public
Вход пользователя
При первом входе пользователя будет запрошен текущий установленный администратором пароль и затем у пользователя запрашивается новый пароль и его подтверждение.
# systemctl stop sssd # rm -f /var/lib/sss/db/* # rm -f /var/lib/sss/mc/* # systemctl start sssd
Настройка репликации
- FreeIPA/Настройка_репликации
- Настройка репликации
- FreeIPA/Настройка_репликации#С_интегрированным_DNS_и_без_CA
- Настройка IPA CA-less репликации
Настройка доверительных отношений с AD
- FreeIPA/Интеграция_с_AD
- Настройка доверительных отношений с AD
Конфигурация
- FreeIPA/OTP
- Двухфакторная аутентификация
Создание аккаунта для доступа к LDAP
Некоторые сервисы использующие LDAP требуют предварительно настроенной учетной записи. Использование обычной учетной записи пользователя предпочтительней, но не всегда это целесообразно делать. Можно сделать системную учетную запись следующим образом на сервере FreeIPA используя пароль Directory :
# ldapmodify -x -D 'cn=Directory Manager' -W dn: uid=system,cn=sysaccounts,cn=etc,dc=example,dc=test changetype: add objectclass: account objectclass: simplesecurityobject uid: ldapaccount userPassword: secret123 passwordExpirationTime: 20380119031407Z nsIdleTimeout: 0 <blank line> ^D
Замените пароль на более сложный. Параметр passwordExpirationTime: 20380119031407Z означает, что срок действия пароля неограничен Причина использования такой учетной записи, а не создание обычной учетной записи пользователя IPA, и использование этой системы заключается в том, что системная учетная запись существует только для привязки к LDAP. Это не настоящий пользователь POSIX, он не может войти в систему и ему не принадлежат файлы. У этого пользователя нет особых прав и он не может ничего записывать какие-либо данные на сервер LDAP FreeIPA, только права на чтение.
Добавление расширенных полей в ldap
Если необходимо добавить поля в вашу схему ldap, то реализация этого возможна через команду ldapmodify и добавление своих плагинов для отображения этих полей в WebUi.
Обычно файлы модификации схемы являются типом .ldif.
Пример:
Содержание файла addExtField.ldif
dn: cn=schema changetype: modify add: attributeTypes attributeTypes: ( 2.25.28639311321113238241701611583088740684.14.2.2 NAME 'favoriteColorName' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Extending FreeIPA' ) dn: cn=schema changetype: modify add: attributeTypes attributeTypes: ( 2.25.28639311321113238241701611583088740684.14.2.3 NAME 'redirects' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Extending FreeIPA') dn: cn=schema changetype: modify add: attributeTypes attributeTypes: ( 2.25.28639311321113238241701611583088740684.14.2.4 NAME 'attbool' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 X-ORIGIN 'Extending FreeIPA') dn: cn=schema changetype: modify add: objectclasses objectclasses: ( 2.25.28639311321113238241701611583088740684.14.2.1 NAME 'customPerson' SUP person STRUCTURAL MAY ( favoriteColorName $ attbool $ redirects ) X-ORIGIN 'Extending FreeIPA' )
Детальное пояснение для блока:
dn: cn=schema changetype: modify add: attributeTypes attributeTypes: ( 2.25.28639311321113238241701611583088740684.14.2.2 NAME 'favoriteColorName' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Extending FreeIPA' )
dn - dn, в котором будет проводиться изменение. Добавление/удаление классов и т.д.
changetype - атрибут, отвечающий за тип изменений, которые будут происходить.(add, delete, modify, modrdn)
add: attributeTypes - добавление атрибута, далее идёт описание атрибута.
2.25.28639311321113238241701611583088740684.14.2.2 - уникальный идентификатор атрибута. Можно написать любой.
NAME 'favoriteColorName' - По другому можно назвать - primary name. Название атрибута.
EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch - эти атрибуты заданы для проверки соответствия содержания атрибута правилам caseIgnoreMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 - OID типа данных
Все изменения в схеме производятся от пользователя - Directory manager.
Изменение схемы ldap:
$ ldapmodify -D "cn=Directory Manager" -W -f addExtField.ldif
После изменения схемы, путем добавления нового objectclass, нужно чтобы эти поля еще можно было редактировать в web-интерфейсе. Для этого необходимо сделать палагин. В примере использовано 3 атрибута, для них сделаем 3 отдельных плагина:
1. Создание папки:
mkdir -p /usr/share/ipa/ui/js/plugins/favoriteColorName
2. Создание самого плагина:
mcedit /usr/share/ipa/ui/js/plugins/favoriteColorName/favoriteColorName.js
Тело плагина:
define(['freeipa/phases','freeipa/user'], function(phases, user_mod) { // helper function function get_item(array, attr, value) { for (var i=0,l=array.length; i<l; i++) { if (array[i][attr] === value) return array[i]; } return null; } var color_plugin = {}; color_plugin.add_favorite_color = function() { var facet = get_item(user_mod.entity_spec.facets, '$type', 'details'); var section = get_item(facet.sections, 'name', 'identity'); section.fields.push({ name: 'favoritecolorname', label: 'Цвет' }); return true; }; phases.on('customization', color_plugin.add_favorite_color); return color_plugin; });
В схеме бы добавлен атрибут типа boolean, для него можно сделать радиокнопки:
define(['freeipa/phases','freeipa/user'], function(phases, user_mod) { // helper function function get_item(array, attr, value) { for (var i=0,l=array.length; i<l; i++) { if (array[i][attr] === value) return array[i]; } return null; } var attrbool_plugin = {}; attrbool_plugin.add_bool = function() { var facet = get_item(user_mod.entity_spec.facets, '$type', 'details'); var section = get_item(facet.sections, 'name', 'identity'); section.fields.push( { $type: 'radio',. options:[{label:'True',value:'TRUE'},{label:'False',value:'FALSE'}], label:'Blood type', name: 'attbool'} ); return true; }; phases.on('customization', attrbool_plugin.add_bool); return attrbool_plugin; });
После необходимо добавить новое поле в "Default user objectclasses" (находится IPA Server -> Configuration) созданный objectclass (customPerson) и появятся поля в web-интерфейсе. Для того чтобы пользователь мог их редактировать, необходимо изменить привилегии в группе ipausers.
Использование haproxy для высокой доступности FreeIPA
Требуется:
Сервер №1 c freeipa: dc1.testbc.testgl
Сервер №2 с репликой freeipa: dc2.testbc.testgl
Сервер №3 с haproxy: haproxy.testbc.testgl
Настройка:
Инструкция для настройки сервера №1 и №2: FreeIPA
На сервере №3:
Установить
# apt-get install haproxy
Сохранить оригинальный конфигурационный файл:
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxyBAK.cfg
Изменить конфигурацию:
cat << EOF > /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user _haproxy group _haproxy daemon stats socket /var/lib/haproxy/stats # LDAP and LDAP/STARTTLS frontend ldap_service_front mode tcp bind *:389 description LDAP Service option socket-stats option tcpka timeout client 3600s default_backend ldap_service_back backend ldap_service_back server ldap-1 dc1.testbc.testgl:389 check fall 1 rise 3 inter 2s weight 150 server ldap-2 dc2.testbc.testgl:389 check fall 1 rise 3 inter 2s weight 100 mode tcp balance roundrobin option tcpka option ldap-check timeout server 1800s timeout connect 1s frontend ldaps_service_front mode tcp bind *:636 description LDAP Service option socket-stats option tcpka timeout client 3600s default_backend ldap_service_back backend ldaps_service_back server ldap-1 dc1.testbc.testgl:636 check fall 1 rise 3 inter 2s weight 150 server ldap-2 dc1.testbc.testgl:636 check fall 1 rise 3 inter 2s weight 150 mode tcp balance roundrobin option tcpka option ssl-hello-chk timeout server 1800s EOF
Запустить сервис haproxy:
#systemctl start haproxy
Проверить работу можно с помощью ldapsearch сделав один из серверов недоступным:
ldapsearch -x -h haproxy.testbc.testgl -b dc=testbc,dc=testgl uid=admin
Результат: ldap всегда доступен.
Automember rebuild membership
Пользовательские или хост группы можно легко перестроить на основе новых или обновленных правил automember. Команда automember rebuild только добавляет новые отношения для групп, она не удаляет те, которые не соответствуют правилам automember. Недавно добавленная команда вызовет задачу в rebuild automember, создав запись LDAP в cn = automember rebuild membership, cn = tasks, cn = config. Плагин automember в настоящее время проверяет операции Add(добавления), чтобы увидеть, есть ли запись соответствует одному из определенных правил automember. Существующие записи не проверяются когда они изменяются. Чтобы применить правило для всех записей, надо добавить задачу к плагину automember. Создатель задачи обеспечит фильтр поиска и базу. Все совпадающие записи будут проверяться в соответствии с определенными правилами automember, чтобы увидеть если они должны быть добавлены в какие-либо группы. Это позволяет добавить запуск атрибуты(значения) после того, как запись была первоначально добавлена, а затем вызвать задачу(выполнить) обновления automember. Ipa automember-rebuild может использоваться для восстановления членства для всех объектов определенного типа:
$ ipa automember-rebuild --type=group $ ipa automember-rebuild --type=hostgroup
Он также может использоваться для восстановления членства для указанных записей:
$ ipa automember-rebuild --hosts=HOSTNAME1 --hosts=HOSTNAME2 $ ipa automember-rebuild --users=LOGIN1 --users=LOGIN2
Добавление новой группы хостов:
$ ipa hostgroup-add --desc="Web Servers" webservers
Добавить новый хост:
$ ipa host-add web1.example.com --force
Добавить automember rule:
$ ipa automember-add --type=hostgroup webservers $ ipa automember-add-condition --key=fqdn --type=hostgroup --inclusive-regex=^web[1-9]+\.example\.com webservers
Функция automember теперь работает для новых добавленных записей. Если мы добавим новый хост, он будет автоматически помещен в соответствующую группу хостов:
$ ipa host-add web2.example.com --force $ ipa hostgroup-show webservers Host-group: webservers Description: Web Servers Member hosts: web2.example.com
Однако старая запись хоста для web1.example.com по-прежнему не является членом или хост-группой веб-серверов. Введя новые команды automember-rebuild, мы сделаем это возможным:
$ ipa automember-rebuild --type=hostgroup or $ ipa automember-rebuild --hosts=web1.example.com
Хост добавится в новую группу:
$ ipa hostgroup-show webservers Host-group: webservers Description: Web Servers Member hosts: web2.example.com, web1.example.com
Тоже самое можно сделать в web-интерфейсе.
IPA Automount NFS
Установим nfs-server:
apt-get install nfs-server
Включим SECURE_NFS:
echo 'SECURE_NFS=yes' >> /etc/sysconfig/nfs
Добавим сервис в автозапуск:
systemctl enable --now nfs-server
Добавим список экспорта и применим изменения:
# mkdir -p /exports/test_share # echo '/exports/test_share client1.testbc.testbe(rw,no_subtree_check,sec=krb5p)' >> /etc/exports # exportfs -vra
На IPA сервере:
# kinit admin
Добавить ipa сервис где nfs.testbc.testbe наш nfs сервер:
# ipa service-add nfs/nfs.testbc.testbe
Добавляем в keytab:
# ipa-getkeytab -s freeipa.testbc.testbe -p nfs/nfs.testbc.testbe -k /etc/krb5.keytab
Проверим наличие:
# klist -k /etc/krb5.keytab Keytab name: FILE:/etc/krb5.keytab KVNO Principal ---- ---------- 2 host/nfs.testbc.testbe@TESTBC.TESTBE 1 nfs/nfs.testbc.testbe@TESTBC.TESTBE
Перезапустим nfs сервер:
# systemctl restart nfs-server
Добавим правила автомонтирования:
# ipa automountmap-add default auto.test # ipa automountkey-add default --key "/-" --info auto.test auto.master # ipa automountkey-add default --key "/mnt/testshare" --info "-fstype=nfs4,rw,sec=krb5p,hard nfs.testbc.testbe:/exports/test_share" auto.test
Удалим пустую карту монтирования:
# ipa automountkey-del --key '/-' --info 'auto.direct' default auto.master
Настройка клиента: ipa-client-install Устанавливаем пакет freeipa-client-automount:
# apt-get install freeipa-client-automount
Проверим доступность nfs:
# showmount -e nfs.testbc.testbe
Настроим автомонтирование:
# ipa-client-automount --location default
На IPA сервере: Создадим пользователя:
# ipa user-add ipatest --first ipatest --last ipatest
Предоставим пользователю права на запись:
# mkdir /exports/test_share/testdir # chown ipatest:ipatest /exports/test_share/testdir
Создадим домашнюю папку пользователя на nfs сервере:
# mkhomedir_helper ipatest # echo '/home client1.testbc.testbe(rw,no_subtree_check,sec=krb5p)' >> /etc/exports # exportfs -vra
Добавим правила автомонтирования:
ipa automountmap-add default auto.home ipa automountkey-add default --key "/home" --info auto.home auto.master ipa automountkey-add default --key "*" --info "-fstype=nfs4,rw,sec=krb5p,hard nfs.testbc.testbe:/home/&" auto.home
Проверяем на клиенте:
$ df -h
Для отладки используйте:
NFS/autofs/sssd-autofs:
systemctl stop autofs automount -fd -vvv
krb5:
sed -i '/^GSSD_OPTIONS=/{s/"$/ -vvv"/g}' /etc/sysconfig/nfs systemctl restart rpc-gssd
Дополнительные материалы
- Настройка репликации во FreeIPA 4.4 с domain level 1 — Блог Pixonic на Habrahabr
- [Система централизованного управления авторизацией пользователей на FreeIPA в Docker Система централизованного управления авторизацией пользователей на FreeIPA в Docker] — frol, Habrahabr