FreeIPA
FreeIPA - это комплексное решение по управлению безопасностью Linux-систем, 389 Directory Server, MIT Kerberos, NTP, DNS, Dogtag. Оно состоит из веб-интерфейса и интерфейса командной строки.
FreeIPA является интегрированной системой проверки подлинности и авторизации в сетевой среде Linux, FreeIPA сервер обеспечивает централизованную проверку подлинности, авторизацию и контроль за аккаунтами пользователей сохраняя сведения о пользователе, группах, узлах и других объектах необходимых для обеспечения сетевой безопасности.
Сайт проекта, демонстрация интерфейса.
Установка сервера FreeIPA
Устанавливать будем со встроенным DNS сервером и доменом EXAMPLE.TEST в локальной сети 192.168.135.0/24.
Для начала отключим ahttpd, работающий на порту 8080, во избежание конфликтов с разворачиваемым tomcat и отключим HTTPS в Apache2:
# service ahttpd stop # a2dissite 000-default_https # a2disport https # service httpd2 condreload
Установим необходимые пакеты:
# apt-get install freeipa-server freeipa-server-dns
Зададим имя сервера:
# hostnamectl set-hostname ipa.example.test
Для ускорения установки можно установить демон энтропии haveged:
# apt-get install haveged # systemctl enable haveged # systemctl start haveged
Запускаем скрипт настройки сервера:
В пакетном режиме:
# ipa-server-install -U --hostname=$(hostname) -r EXAMPLE.TEST -n example.test -p 12345678 -a 12345678 --setup-dns --no-forwarders --no-reverse
или интерактивно:
# ipa-server-install
Обратите внимание на ответы на вопросы, не совпадающие с предложенными:
Do you want to configure integrated DNS (BIND)? [no]: yes
остальные вопросы выбираем по умолчанию (можно просто нажать Enter). Так же при установке попросят ввести пароль администратора системы и пароль администратора каталогов.
Для возможности управлять FreeIPA сервером из командной строки необходимо получить билет Kerberos:
# kinit admin
Добавим в DNS запись о нашем сервере времени:
# ipa dnsrecord-add example.test _ntp._udp --srv-priority=0 --srv-weight=100 --srv-port=123 --srv-target=ipa.example.test.
Проверить работу ntp сервера можно командой:
# ntpdate -q localhost server 127.0.0.1, stratum 3, offset 0.000018, delay 0.02568 27 Apr 10:27:00 ntpdate[3491]: adjust time server 127.0.0.1 offset 0.000018 sec
Также доступен веб-интерфейс по адресу:
https://ipa.example.test/ipa/ui/
[error] CalledProcessError: Command '/sbin/systemctl restart httpd2.service' returned non-zero exit status 1
Выполните
# systemctl restart httpd2
Отмените установку:
# ipa-server-install -U --uninstallи повторите снова.
Установка сервера FreeIPA в режиме CA-less
Установим необходимые пакеты:
# apt-get install freeipa-server freeipa-server-dns
Зададим имя сервера:
# hostnamectl set-hostname ipa.example.test
Подготовим сертификаты для сервера FreeIPA:
# mkdir ~/test_ca
Создадим файл pwdfiles.txt с паролем, например 12345678:
# echo 12345678 > ~/test_ca/pwdfile.txt
Создадим базу данных NSS:
/usr/bin/certutil -d ~/test_ca -N -f ~/test_ca/pwdfile.txt
Создадим noise файл с рандомом:
# head -c20 /dev/random > ~/test_ca/noise.txt
Экспортируем переменную:
# export CERT_SERIAL=1
Создаем CA сертификат:
# /usr/bin/certutil -d ~/test_ca -S -n "CA" -s "CN=Certificate Authority" -x -t CT,,C -1 -2 -5 -m $CERT_SERIAL -v 120 -z ~/test_ca/noise.txt -f ~/test_ca/pwdfile.txt
Дайте следующие ответы:
Create key usage extension: 0 - Digital Signature 1 - Non-repudiation 5 - Cert signing key 9 - done Is this a critical extension [y/N]? y Create basic constraint extension Is this a CA certificate [y/N]? y Enter the path length constraint, enter to skip [<0 for unlimited path] 0 Is this a critical extension [y/N]? y Extensions: 5 - SSL 6 - S/MIME 7 - Object Signing CA 9 - done Is this a critical extension [y/N]? n
Создадим запрос сертификата:
# head -c20 /dev/random > ~/test_ca/noise.txt # /usr/bin/certutil -d ~/test_ca -R -s CN=$HOSTNAME,O=IPA -o /tmp/servercert.req -k rsa -g 2048 -z ~/test_ca/noise.txt -f ~/test_ca/pwdfile.txt -a
Подпишите запрос о выдаче сертификата сервера:
# export CERT_SERIAL=$(($CERT_SERIAL + 1)) # /usr/bin/certutil -d ~/test_ca -C -c "CA" -i /tmp/servercert.req -o /tmp/servercert.pem -m $CERT_SERIAL -v 120 -f ~/test_ca/pwdfile.txt -1 -5 -a
Дайте следующие ответы:
Create key usage extension: 2 - Key encipherment 9 - done n - not critical Create netscape cert type extension: 1 - SSL Server 9 - done n - not critical
Если вы хотите, вы можете создавать отдельные сертификаты для серверов HTTP и Directory.
Экспорт сертификатов в правильные форматы. Импортируем полученный сертификат:
# /usr/bin/certutil -d ~/test_ca -A -i /tmp/servercert.pem -n Server-Cert -a -t ,,
Экспортируем в PKCS#12:
# /usr/bin/pk12util -o ~/test_ca/servercert.p12 -n Server-Cert -d ~/test_ca -k ~/test_ca/pwdfile.txt -w ~/test_ca/pwdfile.txt
Экспортируйте сертификат CA в формате PEM:
# /usr/bin/certutil -d ~/test_ca -L -n "CA" -a > ~/test_ca/cacert.pem
Теперь установим CA-less IPA:
# export PWD=$(cat ~/test_ca/pwdfile.txt) # ipa-server-install --http_pkcs ~/test_ca/servercert.p12 --dirsrv_pkcs ~/test_ca/servercert.p12 --http_pin $PWD --dirsrv_pin $PWD --root-ca-file ~/test_ca/cacert.pem
Вы также можете указать при установке опции --pkinit-cert-file=Файл, содержащий сертификат SSL Kerberos KDC и закрытый ключ и --pkinit-pin=Пароль от закрытого ключа Kerberos KDC.
После установки выполните:
kinit admin
И после убедитесь что команды:
ipa cert-find ipa cert-show 1
Не срабатывают и выводят ошибки.
Настройка IPA CA-less репликации
Чтобы установить реплику, сначала создайте сертификаты для новой машины: создадим запрос сертификата и подпишем запрос о выдаче сертификата сервера и экспортируем сертификаты в правильные форматы, на этот раз задав $HOSTNAME имя хоста будущей реплики. Используйте Replica-Cert вместо Server-Cert и ~/test_ca/replicacert.p12 вместо ~/test_ca/servercert.p12: Создадим запрос сертификата для реплики:
# head -c20 /dev/random > ~/test_ca/noise.txt # /usr/bin/certutil -d ~/test_ca -R -s CN=Указать хост будущей реплики,O=IPA -o /tmp/replicacert.req -k rsa -g 2048 -z ~/test_ca/noise.txt -f ~/test_ca/pwdfile.txt -a
Подпишите запрос о выдаче сертификата реплики:
# /usr/bin/certutil -d ~/test_ca -C -c "CA" -i /tmp/replicacert.req -o /tmp/replicacert.pem -m 3 -v 120 -f ~/test_ca/pwdfile.txt -1 -5 -a
Дайте следующие ответы:
Create key usage extension: 2 - Key encipherment 9 - done n - not critical Create netscape cert type extension: 1 - SSL Server 9 - done n - not critical
Если вы хотите, вы можете создавать отдельные сертификаты для серверов HTTP и Directory.
Экспорт сертификатов в правильные форматы.
Импортируем полученный сертификат:
# /usr/bin/certutil -d ~/test_ca -A -i /tmp/replicacert.pem -n Replica-Cert -a -t ,,
Экспортируем в PKCS#12:
# /usr/bin/pk12util -o ~/test_ca/replicacert.p12 -n Replica-Cert -d ~/test_ca -k ~/test_ca/pwdfile.txt -w ~/test_ca/pwdfile.txt
Для domain-level 1
# ipa-replica-install --http-cert-file ~/test_ca/replicacert.p12 --dirsrv-cert-file ~/test_ca/replicacert.p12
Установка FreeIPA клиента и подключение к серверу
Установим необходимые пакеты:
# apt-get install freeipa-client libsss_sudo krb5-kinit bind-utils libbind zip
Зададим имя компьютера:
# hostnamectl set-hostname comp01.example.test
Добавим DNS сервер, для этого создадим файл /etc/net/ifaces/ens19/resolv.conf со следующим содержимым:
nameserver 192.168.135.1
192.168.135.1 - IP-адрес нашего FreeIPA сервера.
Укажем службе resolvconf использовать DNS FreeIPA и наш домен для поиска.
Для этого в файл /etc/resolvconf.conf добавим/отредактируем следующие параметры:
interface_order='lo lo[0-9]* lo.* ens19' search_domains=example.test
Где ens19 -интерфейс на котором доступен FreeIPA сервер, example.test - наш домен.
Обновим DNS адреса:
# resolvconf -u
После этого в файле /etc/resolv.conf должны появится строки:
search example.test nameserver 192.168.135.1
Запускаем скрипт настройки клиента: в пакетном режиме:
# ipa-client-install -U -p admin -w 12345678
или интерактивно:
# ipa-client-install
Если все настроено верно скрипт должен выдать такое сообщение:
'''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]:
Отвечаем yes вводим имя пользователя, имеющего право вводить машины в домен, и его пароль.
Пример успешного ввода в домен:
Discovery was successful!
Client hostname: ipa-client1.test1.alt
Realm: TEST1.ALT
DNS Domain: test1.alt
IPA Server: ipa-server.test1.alt
BaseDN: dc=test1,dc=alt
Synchronizing time with KDC...
Attempting to sync time using ntpdate. Will timeout after 15 seconds
Successfully retrieved CA cert
Subject: CN=Certificate Authority,O=TEST1.ALT
Issuer: CN=Certificate Authority,O=TEST1.ALT
Valid From: Wed Feb 15 15:17:45 2017 UTC
Valid Until: Sun Feb 15 15:17:45 2037 UTC
Enrolled in IPA realm TEST1.ALT
Created /etc/ipa/default.conf
Configured sudoers in /etc/nsswitch.conf
Configured /etc/sssd/sssd.conf
Configured passwd in /etc/nsswitch.conf
Configured group in /etc/nsswitch.conf
Configured gshadow in /etc/nsswitch.conf
Configured services in /etc/nsswitch.conf
Configured netgroup in /etc/nsswitch.conf
Configured shadow in /etc/nsswitch.conf
Configured /etc/nsswitch.conf
Configured PAM system-auth
Configured /etc/krb5.conf for IPA realm TEST1.ALT
trying https://ipa-server.test1.alt/ipa/json
Forwarding 'ping' to json server 'https://ipa-server.test1.alt/ipa/json'
Forwarding 'ca_is_enabled' to json server 'https://ipa-server.test1.alt/ipa/json'
Hostname (ipa-client1.test1.alt) does not have A/AAAA record.
Failed to update DNS records.
Missing A/AAAA record(s) for host ipa-client1.test1.alt: 10.10.10.206.
Missing reverse record(s) for address(es): 10.10.10.206.
Adding SSH public key from /etc/openssh/ssh_host_ecdsa_key.pub
Adding SSH public key from /etc/openssh/ssh_host_ed25519_key.pub
Adding SSH public key from /etc/openssh/ssh_host_dsa_key.pub
Adding SSH public key from /etc/openssh/ssh_host_rsa_key.pub
Forwarding 'host_mod' to json server 'https://ipa-server.test1.alt/ipa/json'
Could not update DNS SSHFP records.
SSSD enabled
Configured /etc/openldap/ldap.conf
NTP enabled
Configured /etc/openssh/ssh_config
Configured /etc/openssh/sshd_config
Configuring test1.alt as NIS domain.
Client configuration complete.
Hostname (ipa-client1.test1.alt) does not have A/AAAA record. Failed to update DNS records.Проверьте IP-адрес доменного DNS сервера в файле /etc/resolv.conf
В случае возникновения ошибки, необходимо перед повторной установкой запустить процедуру удаления:
# ipa-client-install -U --uninstall
Для работы sudo-политик для доменных пользователей на клиентской машине необходимо разрешить доступ к sudo:
# control sudo public
Вход пользователя
При первом входе пользователя будет запрошен текущий установленный администратором пароль и затем у пользователя запрашивается новый пароль и его подтверждение.
# systemctl stop sssd # rm -f /var/lib/sss/db/* # rm -f /var/lib/sss/mc/* # systemctl start sssd
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
Настройка репликации
На втором контроллере домена установим необходимые пакеты:
# apt-get install freeipa-client freeipa-server-dns
Зададим имя сервера:
# hostnamectl set-hostname ipabackup.example.test
Теперь развернём и настроим клиента:
# ipa-client-install -d \ --domain=example.test \ --server=ipa.example.test \ --realm=EXAMPLE.TEST \ --principal=admin \ --password=12345678 \ --enable-dns-updates -U
После выполнения этой операции хост ipabackup.example.test должен появиться в веб-интерфейсе FreeIPA. Переходим к настройке репликации LDAP-каталога:
# ipa-replica-install
Добавляем в DNS второй NTP-сервер:
# kinit admin # ipa dnsrecord-add example.test _ntp._udp --srv-priority=0 --srv-weight=100 --srv-port=123 --srv-target=ipabackup.example.test.
Настроим репликацию DNS-зон:
# ipa-dns-install
Наконец, настроим репликацию CA:
# ipa-ca-install
После настройки и репликации контроллеров посмотреть топологию можно в веб-интерфейсе FreeIPA (IPA Server -> Topology -> Topology Graph).
Настройка доверительных отношений с AD
FreeIPA использует Samba для интеграции в Active Directory. Для работы Samba необходим работающий стек IPv6.
Начальные данные:
- 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
Установим необходимые пакеты:
# apt-get install freeipa-server-trust-ad python-module-sss-murmur samba-winbind
Предварительная настройка IPA сервера
Настроим IPA для работы с доверительными отношениями:
# ipa-adtrust-install
Скрипт спросит необходимо ли конфигурировать slapi-nis плагин для поддержки работы старых клиентов (SSSD < 1.9) с пользователем из доверенного домена:
Enable trusted domains support in slapi-nis? [no]:
На IPA сервере добавлен хотя бы один пользователь (администратор сервера), поэтому скрипт предложит сгенерировать SID для всех существующих пользователей и груп:
Do you want to run the ipa-sidgen task? [no]:
Дата и время на серверах должны совпадать.
IPA сервер в своей работе использует следующие порты: <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
Они должны быть открыты и доступны.
Настроим Samba:
# net conf setparm global 'dedicated keytab file' /etc/samba/samba.keytab # systemctl restart ipa
Проверим проходит ли Samba аутентификацию Kerberos со стороны IPA сервера:
# kinit admin # smbclient -L dcf.domf.testf -k lp_load_ex: changing to config backend registry Domain=[DOMF] OS=[Windows 6.1] Server=[Samba 4.5.5] Sharename Type Comment --------- ---- ------- IPC$ IPC IPC Service (Samba 4.5.5) Domain=[DOMF] OS=[Windows 6.1] Server=[Samba 4.5.5] Server Comment --------- ------- Workgroup Master --------- -------
Настроим DNS на обоих серверах, чтобы они знали друг о друге:
На AD сервере создадим сервер условной пересылки для зоны IPA домена:
C:\> dnscmd 127.0.0.1 /ZoneAdd domf.testf /Forwarder 192.168.135.130
На IPA сервере так же добавим зону AD домена:
# ipa dnsforwardzone-add domc.testc --forwarder=192.168.135.150 --forward-policy=only
Проверка конфигурации DNS
На AD сервере:
Проверим наличие записей для работы сервисов IPA на DNS-сервере AD.
1. Запись отвечающая за работу сервисов Kerberos через UDP и LDAP через TCP:
C:\>nslookup.exe > set type=SRV > _kerberos._udp.domf.testf. _kerberos._udp.domf.testf. SRV service location: priority = 0 weight = 100 port = 88 svr hostname = dcf.domf.testf. > _ldap._tcp.domf.testf. _ldap._tcp.ipa.example.com SRV service location: priority = 0 weight = 100 port = 389 svr hostname = dcf.domf.testf.
2. Запись отвечающая за имя Kerberos realm IPA домена:
C:\>nslookup.exe > set type=TXT > _kerberos.domf.testf. _kerberos.domf.testf. text = "DOMF.TESTF"
3. После выполнения команды ipa-adtrust-install должны появится записи отвечающие за работу сервисов MS DC Kerberos через UDP и LDAP через TCP:
C:\>nslookup.exe > set type=SRV > _kerberos._udp.dc._msdcs.domf.testf. _kerberos._udp.dc._msdcs.domf.testf. SRV service location: priority = 0 weight = 100 port = 88 svr hostname = dcf.domf.testf. > _ldap._tcp.dc._msdcs.domf.testf. _ldap._tcp.dc._msdcs.domf.testf. SRV service location: priority = 0 weight = 100 port = 389 svr hostname = dcf.domf.testf.
Далее проверим наличие записей для работы сервисов AD на DNS-сервере AD.
4. Запись отвечающая за работу сервисов Kerberos через UDP и LDAP через TCP:
C:\>nslookup.exe > set type=SRV > _kerberos._udp.dc._msdcs.domc.testc. _kerberos._udp.dc._msdcs.domc.testc. SRV service location: priority = 0 weight = 100 port = 88 svr hostname = dcc.domc.testc. > _ldap._tcp.dc._msdcs.domc.testc. _ldap._tcp.dc._msdcs.domc.testc. SRV service location: priority = 0 weight = 100 port = 389 svr hostname = dcc.domc.testc.
На IPA сервере:
Проверим наличие записей для работы сервисов IPA на DNS-сервере IPA.
1. Запись отвечающая за работу сервисов Kerberos через UDP и LDAP через TCP:
# dig +short -t SRV _kerberos._udp.domf.testf. 0 100 88 dcf.domf.testf. # dig +short -t SRV _ldap._tcp.domf.testf. 0 100 389 dcf.domf.testf.
2. Запись отвечающая за имя Kerberos realm IPA домена:
dig +short -t TXT _kerberos.domf.testf. "DOMF.TESTF"
3. После выполнения команды ipa-adtrust-install должны появится записи отвечающие за работу сервисов MS DC Kerberos через UDP и LDAP через TCP:
# dig +short -t SRV _kerberos._udp.dc._msdcs.domf.testf. 0 100 88 dcf.domf.testf. # dig +short -t SRV _ldap._tcp.dc._msdcs.domf.testf. 0 100 389 dcf.domf.testf.
Далее проверим наличие записей для работы сервисов AD на DNS-сервере IPA. 4. Запись отвечающая за работу сервисов Kerberos через UDP и LDAP через TCP:
# dig +short -t SRV _kerberos._udp.dc._msdcs.domc.testc. 0 100 88 dcc.domc.testc. # dig +short -t SRV _ldap._tcp.dc._msdcs.domc.testc. 0 100 389 dcc.domc.testc.
Настройка доверия
Добавление двунаправленных доверительных отношений леса (Forest Trust) с AD:
Имя доменного администратора Windows должно быть на латинице, кириллицу (Администратор) IPA не принимает.
# kinit admin # ipa trust-add --type=ad domc.testc --admin Administrator --password --two-way=true Active Directory domain administrator's password: --------------------------------------------------- Added Active Directory trust for realm "domc.testc" --------------------------------------------------- Realm name: domc.testc Domain NetBIOS name: DOMC Domain Security Identifier: S-1-5-21-3611360735-1365415015-3217858865 SID blacklist incoming: S-1-5-20, S-1-5-3, S-1-5-2, S-1-5-1, S-1-5-7, S-1-5-6, S-1-5-5, S-1-5-4, S-1-5-9, S-1-5-8, S-1-5-17, S-1-5-16, S-1-5-15, S-1-5-14, S-1-5-13, S-1-5-12, S-1-5-11, S-1-5-10, S-1-3, S-1-2, S-1-1, S-1-0, S-1-5-19, S-1-5-18 SID blacklist outgoing: S-1-5-20, S-1-5-3, S-1-5-2, S-1-5-1, S-1-5-7, S-1-5-6, S-1-5-5, S-1-5-4, S-1-5-9, S-1-5-8, S-1-5-17, S-1-5-16, S-1-5-15, S-1-5-14, S-1-5-13, S-1-5-12, S-1-5-11, S-1-5-10, S-1-3, S-1-2, S-1-1, S-1-0, S-1-5-19, S-1-5-18 Trust direction: Two-way trust Trust type: Active Directory domain Trust status: Established and verified
Необходимо ввести пароль Administrator AD.
Далее необходимо запросить сервер AD о его доверенных доменах:
# ipa trust-fetch-domains domc.testc -------------------------------------------- List of trust domains successfully refreshed -------------------------------------------- Realm name: domd.domc.testc Domain NetBIOS name: DOMD Domain Security Identifier: S-1-5-21-2419724241-1549151283-3268040000 ------------------------------ Количество вернутых значений 1 ------------------------------
При этом IPA создаст нужные id-диапазоны для доверенных доменов.
Если мы добавим в лес еще один домен DOME.TESTE, то необходимо настроить DNS на обоих серверах, чтобы они видели друг друга.
И выполнить команду еще раз,чтобы IPA сервер узнал о нем:
# ipa trust-fetch-domains domc.testc -------------------------------------------- List of trust domains successfully refreshed -------------------------------------------- Realm name: dome.teste Domain NetBIOS name: DOME Domain Security Identifier: S-1-5-21-3615012966-1241218098-4147673574 ------------------------------ Количество вернутых значений 1 ------------------------------
Найти все доверенные домены можно и с помощью web-интерфейса. Для Перейдем в IPA Server -> Trusts и выберем нужный нам домен:
Нажмём кнопку Fetch domains это обновит список доверенных доменов:
Для того чтобы увидеть список всех доверенных доменов из леса используйте следующую команду:
# ipa trustdomain-find domc.testc Domain name: domc.testc Domain NetBIOS name: DOMC Domain Security Identifier: S-1-5-21-3611360735-1365415015-3217858865 Domain enabled: True Domain name: domd.domc.testc Domain NetBIOS name: DOMD Domain Security Identifier: S-1-5-21-2419724241-1549151283-3268040000 Domain enabled: True Domain name: dome.teste Domain NetBIOS name: DOME Domain Security Identifier: S-1-5-21-3615012966-1241218098-4147673574 Domain enabled: True ------------------------------ Количество вернутых значений 3 ------------------------------
Проверка конфигурации Kerberos
1. Запросим ticket для IPA пользователя:
# kinit admin
2. Запросим service ticket для сервиса из IPA домена:
# kvno -S host dcf.domf.testf host/dcf.domf.testf@DOMF.TESTF: kvno = 2
3. Запросим service ticket сервиса из AD домена:
# kvno -S cifs dcc.domc.testc cifs/dcc.domc.testc@: kvno = 3
Если запрос service ticket для сервиса из AD домена прошел успешно, то у нас должен появиться междоменный ticket-granting ticket, его имя krbtgt/DOMC.TESTC@DOMF.TESTF:
# klist Ticket cache: KEYRING:persistent:0:0 Default principal: admin@DOMF.TESTF Valid starting Expires Service principal 14.02.2017 15:43:46 15.02.2017 01:43:46 cifs/dcc.domc.testc@DOMC.TESTC 14.02.2017 15:43:46 15.02.2017 01:43:46 cifs/dcc.domc.testc@ 14.02.2017 15:43:46 15.02.2017 15:42:48 krbtgt/DOMC.TESTC@DOMF.TESTF 14.02.2017 15:43:25 15.02.2017 15:42:48 host/dcf.domf.testf@DOMF.TESTF 14.02.2017 15:42:53 15.02.2017 15:42:48 krbtgt/DOMF.TESTF@DOMF.TESTF
Проверка пользователей доверенного домена
Проверим имеет ли доступ к пользователям из доверенного домена рабочие станции IPA.
Для этого на рабочей станции IPA выполните команду:
# getent passwd u01domc@domc u01domc@domc.testc:*:328601108:328601108:u01domc:/home/domc.testc/u01domc:
Где u01domc это пользователь из AD домена. Обратите внимание, что не указана оболочка входа. Назначить оболочку входа для пользователей из доверенного домена можно добавив на сервере IPA в файл /etc/sssd/sssd.conf следующую строчку:
[domain/domf.testf] ... default_shell = /bin/bash ...
Вывод команды должен стать таким:
# getent passwd u01domc@domc u01domc@domc.testc:*:328601108:328601108:u01domc:/home/domc.testc/u01domc:/bin/bash
Создание аккаунта для доступа к 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-интерфейсе.
Дополнительные материалы
- Настройка репликации во FreeIPA 4.4 с domain level 1 — Блог Pixonic на Habrahabr
- [Система централизованного управления авторизацией пользователей на FreeIPA в Docker Система централизованного управления авторизацией пользователей на FreeIPA в Docker] — frol, Habrahabr