Настройка FreeIPA клиента руками

4 мин

Потребовалось мне завести хост во FreeIPA, но ipa-client-install не захотел работать, т.к. не хочет он работать, с каких-то времен, с TLD. А переделывать чужую архитектуру нельзя. Так что пришлось мне заводить хост руками, о чем я и решил написать эту заметку.

Для примера я буду использовать следующие данные:

  • Имя хоста: host01
  • IP адрес: 192.0.2.10/24
  • Домен: example.com
  • FreeIPA сервер: ipa01.example.com
  • Первый DNS сервер: 192.0.2.1/24
  • Второй DNS сервер: 192.0.2.2/24

Вы можете заполнить следующий шаблон своими данными, чтобы просто копировать примеры. Я использую полное имя для переменной HOST и таким образом пример подходит для использования поддоменов, например host01.subdomain.example.com.

export HOST=host01.example.com
export IP=192.0.2.10
export DOMAIN=example.com
export IPA_SERVER=ipa01.example.com
export NS1=192.0.2.1
export NS2=192.0.2.2

Для начала поставим необходимые пакеты.

apt update && apt install sssd sssd-tools libnss-sss libpam-sss ca-certificates krb5-user libnss3-tools libsss-sudo

Настроим DNS. Здесь предполагается, что вы управляете resolv.conf вручную. В противном случае используйте соответствующие инструменты, для настройки DNS.

sed -i '1s/^/nameserver '${NS1}'\n/' /etc/resolv.conf
sed -i '1s/^/nameserver '${NS2}'\n/' /etc/resolv.conf

Настроим имя хоста.

hostnamectl set-hostname ${HOST}

Добавим имя в hosts.

echo "${IP}    $(hostname)" >> /etc/hosts

Создадим конфиг sssd.

mkdir -p /etc/sssd/
echo "[domain/${DOMAIN}]
id_provider = ipa
ipa_server = _srv_, ${IPA_SERVER}
ipa_domain = ${DOMAIN}
ipa_hostname = $(hostname)
auth_provider = ipa
chpass_provider = ipa
access_provider = ipa
cache_credentials = True
ldap_tls_cacert = /etc/ipa/ca.crt
krb5_store_password_if_offline = True
krb5_validate = False
[sssd]
services = nss, pam, ssh, sudo
domains = ${DOMAIN}
[nss]
homedir_substring = /home

[pam]

[sudo]

[autofs]

[ssh]

[pac]

[ifp]

[secrets]

[session_recording]" > /etc/sssd/sssd.conf
chmod 600 /etc/sssd/sssd.conf

Сгенерируем секрет для nssdb.

mkdir -p /etc/ipa/nssdb
cat /dev/urandom \
| tr -dc 'A-Za-z0-9!@#$%^&*()_+-=,.|:;' \
| head -c 42 > /etc/ipa/nssdb/pwdfile.txt

Копируем корневой сертификат с FreeIPA сервера /etc/ipa/ca.crt и размещаем его на хосте в там же. по этому Создаем базу nssdb.

/usr/bin/certutil -d /etc/ipa/nssdb -N -f /etc/ipa/nssdb/pwdfile.txt -@ /etc/ipa/nssdb/pwdfile.txt

Создаем конфиг ldap.

Внимание!
Если вы используете TLD, подправьте BASE, оставив один dc
export DC1=$(echo ${IPA_SERVER} | rev | cut -d "." -f 1 | rev)
export DC2=$(echo ${IPA_SERVER} | rev | cut -d "." -f 2 | rev)
mkdir -p /etc/ldap
echo "#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

#BASE   dc=example,dc=com
#URI    ldap://ldap.example.com ldap://ldap-provider.example.com:666

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

# TLS certificates (needed for GnuTLS)
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt
URI ldaps://${IPA_SERVER}
BASE dc=${DC2},dc=${DC1}
SASL_MECH GSSAPI" > /etc/ldap/ldap.conf

Сконфигурируем NSS.

echo '# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference` and `info` packages installed, try:
# `info libc "Name Service Switch"` for information about this file.


passwd:     files sss
shadow:     files sss
group:      files sss

hosts:      files dns myhostname

bootparams: nisplus [NOTFOUND=return] files

ethers:     files
netmasks:   files
networks:   files
protocols:  files
rpc:        files
services:   files sss

netgroup:   nisplus sss

publickey:  nisplus

automount:  files nisplus sss
aliases:    files nisplus

sudoers: files sss' > /etc/nsswitch.conf

Добавим корневой сертификат в /etc/ssl/certs/ca-certificates.crt.

echo "##### ${DOMAIN} CA CERT ######" >> /etc/ssl/certs/ca-certificates.crt
cat /etc/ipa/ca.crt >> /etc/ssl/certs/ca-certificates.crt

Теперь добавим хост в FreeIPA и сгенерируем keytab. Следующий шаг нужно выполнить на сервере FreeIPA, поэтому там нет переменных, а данные следует подставить вручную.

ipa host-add --force --ip-address=192.0.2.10 host01.example.com
ipa-getkeytab -s ipa01.example.com -p host/host01.example.com@EXAMPLE.COM -k /root/krb5.keytab

После чего нужно скопировать /root/krb5.keytab с сервера в /etc на хосте.

Теперь настроим Kerberos.

export DOMAIN_UP=$(echo "${DOMAIN}" | tr '[:lower:]' '[:upper:]')
echo "includedir /etc/krb5.conf.d/
includedir /var/lib/sss/pubconf/krb5.include.d/

[libdefaults]
  default_realm = ${DOMAIN_UP}
  dns_lookup_realm = true
  dns_lookup_kdc = true
  rdns = false
  dns_canonicalize_hostname = false
  ticket_lifetime = 24h
  forwardable = true
  udp_preference_limit = 0


[realms]
  ${DOMAIN_UP} = {
    pkinit_anchors = FILE:/var/lib/ipa-client/pki/kdc-ca-bundle.pem
    pkinit_pool = FILE:/var/lib/ipa-client/pki/ca-bundle.pem
  }


[domain_realm]
  .${DOMAIN} = ${DOMAIN_UP}
  ${DOMAIN} = ${DOMAIN_UP}
  $(hostname) = ${DOMAIN_UP}" > /etc/krb5.conf

Затем нужно скопировать /var/lib/ipa-client/pki/kdc-ca-bundle.pem и /var/lib/ipa-client/pki/ca-bundle.pem с FreeIPA сервера и разместить на хосте в тех же директориях.

Теперь настроим SPAKE Preauthentication.

mkdir -p /etc/krb5.conf.d
echo "[libdefaults]
spake_preauth_groups = edwards25519" > /etc/krb5.conf.d/spake.conf

Включим создание домашних директорий

echo "session optional        pam_mkhomedir.so" >> /etc/pam.d/common-session

Настроим SSH.

sed -i '/GSSAPIAuthentication/c\GSSAPIAuthentication yes' /etc/ssh/sshd_config
sed -i '/#PermitRootLogin prohibit-password/c\PermitRootLogin no' /etc/ssh/sshd_config
echo "AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys
AuthorizedKeysCommandUser nobody" >> /etc/ssh/sshd_config

И перезапустим службы.

systemctl restart sssd.service
systemctl restart sshd.service

Готово! Теперь можно заходить под учетными данными FreeIPA!