Настройка FreeIPA клиента руками
Потребовалось мне завести хост во 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
.
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!