FreeIPA: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
 
(не показана 71 промежуточная версия 13 участников)
Строка 3: Строка 3:
FreeIPA является интегрированной системой проверки подлинности и авторизации в сетевой среде Linux, FreeIPA сервер обеспечивает централизованную проверку подлинности, авторизацию и контроль за аккаунтами пользователей сохраняя сведения о пользователе, группах, узлах и других объектах необходимых для обеспечения сетевой безопасности.
FreeIPA является интегрированной системой проверки подлинности и авторизации в сетевой среде Linux, FreeIPA сервер обеспечивает централизованную проверку подлинности, авторизацию и контроль за аккаунтами пользователей сохраняя сведения о пользователе, группах, узлах и других объектах необходимых для обеспечения сетевой безопасности.


Сайт проекта: http://www.freeipa.org/
[https://www.freeipa.org/ Сайт проекта], [https://ipa.demo1.freeipa.org/ipa/ui/ демонстрация интерфейса].


== Установка сервера FreeIPA ==
== Установка сервера FreeIPA ==
Устанавливать будет со встроенным DNS сервером и доменом EXAMPLE.TEST в локальной сети 192.168.135.0/24.<br>
;[[FreeIPA/Установка_сервера_FreeIPA]]
Для начала отключим ahttpd, работающий на порту 8080, во избежание конфликтов с разворачиваемым tomcat и отключим HTTPS в Apache2:
:Установка сервера FreeIPA
# service ahttpd stop
# a2dissite 000-default_https
# service httpd2 condreload


Установим необходимые пакеты:
;[[FreeIPA/Установка_сервера_FreeIPA#Установка_сервера_FreeIPA_в_режиме_CA-less]]
<pre># apt-get install freeipa-server freeipa-server-dns</pre>
:Установка сервера FreeIPA в режиме CA-less
Зададим имя сервера:
<pre># hostnamectl set-hostname ipa.example.test</pre>
Запускаем скрипт настройки сервера:
В пакетном режиме:
# ipa-server-install -U --hostname=$(hostname) -r EXAMPLE.TEST -n example.test -p 12345678 -a 12345678 --setup-dns --no-forwarders --no-reverse
или интерактивно:
<pre># ipa-server-install</pre>
 
{{Attention|Пароли должны быть не менее 8 символов}}
 
Обратите внимание на ответы на вопросы, не совпадающие с предложенными:
Do you want to configure integrated DNS (BIND)? [no]: yes
Do you want to configure DNS forwarders? [yes]: no
Do you want to search for missing reverse zones? [yes]: no
 
остальные вопросы выбираем по умолчанию (можно просто нажать Enter). Так же при установке попросят ввести пароль администратора системы и пароль администратора каталогов.<br>
 
После окончания установки настроим сервер времени, чтобы компьютеры в локальной сети могли к нему подключаться.<br>
Для этого добавим в файл {{path|/etc/ntp.conf}} следующую строчку:
<pre>restrict 192.168.135.0 mask 255.255.255.0 nomodify</pre>
Перезапустим службу:
<pre># systemctl restart ntpd</pre>
Для возможности управлять FreeIPA сервером из командной строки необходимо получить билет Kerberos:
<pre># kinit admin</pre>
Добавим в DNS запись о нашем сервере времени:
<pre># ipa dnsrecord-add example.test _ntp._udp --srv-priority=0 --srv-weight=100 --srv-port=123 --srv-target=ipa.example.test.</pre>
 
Также доступен веб-интерфейс по адресу:
<pre>https://ipa.example.test/ipa/ui/</pre>


{{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/Клиент]]
<pre># apt-get install freeipa-client libsss_sudo</pre>
:Установка FreeIPA клиента и подключение к серверу
Зададим имя компьютера:
 
<pre># hostnamectl set-hostname comp01.example.test</pre>
;[[FreeIPA/Ansible]]
Добавим DNS сервер, для этого создадим файл {{path|/etc/net/ifaces/ens19/resolv.conf}} со следующим содержимым:
:Установка FreeIPA клиентов с помощью Ansible
<pre>nameserver 192.168.135.1</pre>
192.168.135.1 - IP-адрес нашего FreeIPA сервера.<br>
Укажем службе resolvconf использовать DNS FreeIPA и наш домен для поиска.<br>
Для этого в файл {{path|/etc/resolvconf.conf}} добавим/отредактируем следующие параметры:
<pre>interface_order='lo lo[0-9]* lo.* ens19'
search_domains=example.test</pre>
Где ens19 -интерфейс на котором доступен FreeIPA сервер, example.test - наш домен.<br>
Обновим DNS адреса:
<pre># resolvconf -u</pre>
После этого в файле {{path|/etc/resolv.conf}} должны появится строки:
<pre>search example.test
nameserver 192.168.135.1</pre>
Запускаем скрипт настройки клиента:
в пакетном режиме:
# ipa-client-install -U -p admin -w 12345678
или интерактивно:
<pre># ipa-client-install</pre>
Если все настроено верно скрипт должен выдать такое сообщение:
<pre>'''Discovery was successful!'''
Client hostname: comp02.example.test
Realm: EXAMPLE.TEST
DNS Domain: example.test
IPA Server: ipa.example.test
BaseDN: dc=example,dc=test
Continue to configure the system with these values? [no]:</pre>
Отвечаем {{cmd|yes}} вводим имя пользователя, имеющего право вводить машины в домен, и его пароль.<br>


В случае возникновения ошибки, необходимо перед повторной установкой запустить процедуру удаления:
{{Attention|Если при входе в домен возникает такая ошибка:
# ipa-client-install -U --uninstall
<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|Запрос нового пароля не работает в LightDM. Для этой процедуры зайдите под именем этого пользователя в консоли или по SSH.}}
{{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 использует Samba для интеграции в Active Directory. Для работы Samba необходим работающий стек IPv6.<br>
Начальные данные:
* IP адрес IPA сервера: '''192.168.135.130'''
* Имя IPA сервера: '''dcf'''
* Имя IPA домена: '''domf.testf'''
* NetBIOS имя IPA домена: '''DOMF'''
* IP адрес AD DC: '''192.168.135.150'''
* Имя AD DC: '''dcc'''
* Имя AD домена: '''domc.testc'''
* NetBIOS имя AD домена: '''DOMC'''


Установим необходимые пакеты:
;[[FreeIPA/Интеграция_с_AD]]
<pre># apt-get install freeipa-server-trust-ad python-module-sss-murmur samba-winbind</pre>
:Настройка доверительных отношений с AD
Выполним предварительную настройку IPA сервера для работы с доверием:
 
<pre># ipa-adtrust-install --netbios-name=DOMF</pre>
{{Attention|Для корректной работы сервера IPA с пользователями доверенного домена AD необходимо обеспечить доступ сервиса sssd к /etc/krb5.keytab см. [https://bugzilla.altlinux.org/33115 bug 33115]}}
Дата и время на серверах должны совпадать.<pre>
{{Attention|Для входа AD пользователя в ALT рабочую станцию из IPA вводим имя пользователя в формате '''DOMC'''\username или '''DOMC.TESTC'''\username или username@'''domc''' username@'''domc.testc'''}}
IPA сервер в своей работе использует следующие порты:
{{Attention|Для входа IPA пользователя в windows рабочую станцию из AD вводим имя пользователя в формате '''DOMF.TESTF'''\username}}
<pre>TCP ports: 80, 88, 443, 389, 636, 88, 464, 53, 135, 138, 139, 445, 1024-1300
 
UDP ports: 88, 464, 53, 123, 138, 139, 389, 445</pre>
== Конфигурация ==
Они должны быть открыты и доступны.
;[[FreeIPA/OTP]]
Настроим Samba:<br>
:Двухфакторная аутентификация
<pre># net conf setparm global 'dedicated keytab file' /etc/samba/samba.keytab
 
# systemctl restart ipa</pre>
== Создание аккаунта для доступа к LDAP ==
Настроим DNS на обоих серверах, чтобы они знали друг о друге:<br>
Некоторые сервисы использующие LDAP требуют предварительно настроенной учетной записи. Использование обычной учетной записи пользователя предпочтительней, но не всегда это целесообразно делать. Можно сделать системную учетную запись следующим образом на сервере FreeIPA используя пароль Directory  :
На AD сервере создадим сервер условной пересылки для зоны IPA домена:
<pre># ldapmodify -x -D 'cn=Directory Manager' -W
<pre>C:\> dnscmd 127.0.0.1 /ZoneAdd domf.testf /Forwarder 192.168.135.130</pre>
dn: uid=system,cn=sysaccounts,cn=etc,dc=example,dc=test
На IPA сервере так же добавим зону AD домена:
changetype: add
<pre>ipa dnsforwardzone-add domc.testc --forwarder=192.168.135.150 --forward-policy=only</pre>
objectclass: account
Проверка конфигурации DNS:<br>
objectclass: simplesecurityobject
На AD сервере:
uid: ldapaccount
<pre><pre>C:\> nslookup
userPassword: secret123
> set type=srv
passwordExpirationTime: 20380119031407Z
> _ldap._tcp.domc.testc
nsIdleTimeout: 0
> _ldap._tcp.domf.testf
<blank line>
> quit</pre></pre>
^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:
 
<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 сервере:
На IPA сервере:
<pre># dig SRV _ldap._tcp.domf.testf
Создадим пользователя:
# dig SRV _ldap._tcp.domc.testc</pre>
<pre># ipa user-add ipatest --first ipatest --last ipatest</pre>
Добавление двунаправленных доверительных отношений леса (Forest Trust) с AD:<br>
Предоставим пользователю права на запись:
<pre># kinit admin
<pre># mkdir /exports/test_share/testdir
# ipa trust-add --type=ad domc.testc --admin Administrator --password --two-way=true</pre>
# chown ipatest:ipatest /exports/test_share/testdir</pre>
Необходимо ввести пароль Administrator AD.<br>
Создадим домашнюю папку пользователя на nfs сервере:
Далее необходимо запросить сервер AD о его доверенных доменах:
<pre># mkhomedir_helper ipatest
<pre># ipa trust-fetch-domains domc.testc</pre>
# echo '/home client1.testbc.testbe(rw,no_subtree_check,sec=krb5p)' >> /etc/exports
При этом IPA создаст нужные id-диапазоны для доверенных доменов.<br>
# exportfs -vra
Для того чтобы увидеть список всех доверенных доменов из леса используйте следующую команду:
</pre>
<pre># ipa trustdomain-find domc.testc</pre>
Добавим правила автомонтирования:
{{Attention|Для входа IPA пользователя в рабочую станцию из AD вводим имя пользователя в формате '''DOMF.TESTF'''\username}}
<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
automount -fd -vvv</pre>
krb5:
<pre>sed -i '/^GSSD_OPTIONS=/{s/"$/ -vvv"/g}' /etc/sysconfig/nfs
systemctl restart rpc-gssd</pre>


== Дополнительные материалы ==
* [https://habrahabr.ru/company/pixonic/blog/325546/ Настройка репликации во FreeIPA 4.4 с domain level 1] — Блог Pixonic на Habrahabr
* [Система централизованного управления авторизацией пользователей на FreeIPA в Docker Система централизованного управления авторизацией пользователей на FreeIPA в Docker] — frol, Habrahabr


[[Категория:Корпоративная инфраструктура]]
[[Категория:Корпоративная инфраструктура]]

Текущая версия от 10:08, 15 февраля 2023

Freeipa-logo-small.png

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

Вход пользователя

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

Внимание! Если машина до этого была в других доменах или есть проблемы со входом пользователей рекомендуется очистить кэш sssd:
# 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
Внимание! Для корректной работы сервера IPA с пользователями доверенного домена AD необходимо обеспечить доступ сервиса sssd к /etc/krb5.keytab см. bug 33115
Внимание! Для входа AD пользователя в ALT рабочую станцию из IPA вводим имя пользователя в формате DOMC\username или DOMC.TESTC\username или username@domc username@domc.testc
Внимание! Для входа IPA пользователя в windows рабочую станцию из AD вводим имя пользователя в формате DOMF.TESTF\username


Конфигурация

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

Схема.png

Настройка:

Инструкция для настройки сервера №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