Aller au contenu principal

FreeIPA - Gestion des identités

1. Informations​

1.1. ipa1.home.lab​

Caractéristique
RAM2 Go
CPU2 coeurs
Disque15 Go
OSAlma Linux
Hostnameipa1.home.lab
IP admin192.168.50.11

2. Configuration du réseau​

2.1. Désactiver IPv6​

  • Créer le fichier : /etc/sysctl.d/disable-ipv6.conf
/etc/sysctl.d/disable-ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 0
  • Appliquer les changements
$ sudo sysctl -p /etc/sysctl.d/disable-ipv6.conf

2.2. Configurer firewalld​

# HTTP, HTTPS
$ sudo firewall-cmd --permanent --add-port=80/tcp
$ sudo firewall-cmd --permanent --add-port=443/tcp
# LDAP, LDAPS
$ sudo firewall-cmd --permanent --add-port=389/tcp
$ sudo firewall-cmd --permanent --add-port=636/tcp
# KERBEROS
$ sudo firewall-cmd --permanent --add-port=88/tcp
$ sudo firewall-cmd --permanent --add-port=464/tcp
$ sudo firewall-cmd --permanent --add-port=88/udp
$ sudo firewall-cmd --permanent --add-port=464/udp
# DNS
$ sudo firewall-cmd --permanent --add-port=53/tcp
$ sudo firewall-cmd --permanent --add-port=53/udp
# NTP
$ sudo firewall-cmd --permanent --add-port=123/udp
# reload firewall rules
$ sudo firewall-cmd --reload

3. Configuration complémentaire​

3.1. Installer rng-tools​

$ sudo dnf install rng-tools
$ sudo systemctl enable --now rngd

4. Installation de FreeIPA​

4.1. Installer le package : ipa-server​

  • Installer les packages ipa-server et ipa-server-dns
sudo dnf install ipa-server ipa-server-dns
  • Installer le serveur FreeIPA
    • Pour la conf NTP, utiliser les serveurs
      • 0.pool.ntp.org
      • 1.pool.ntp.org
      • 2.pool.ntp.org
      • 3.pool.ntp.org
sudo ipa-server-install

Setup complete

Next steps:
1. You must make sure these network ports are open:
TCP Ports:
* 80, 443: HTTP/HTTPS * 389, 636: LDAP/LDAPS * 88, 464: kerberos
* 53: bind
UDP Ports:
* 88, 464: kerberos
* 53: bind
* 123: ntp

2. You can now obtain a kerberos ticket using the command: 'kinit admin'
This ticket will allow you to use the IPA tools (e.g., ipa user-add)
and the web user interface.

Be sure to back up the CA certificates stored in /root/cacert.p12
These files are required to create replicas. The password for these
files is the Directory Manager password
The ipa-server-install command was successful

4.2. Ajouter l'option mkhomedir à authselect​

  • Cette option permet de créer automatiquement le répertoire /home/$USER quand un utilisateur se connecte sur un serveur.
$ sudo auhselect enable-feature with-mkhomedir
$ sudo enable --now oddjobd.service

5. Création d'un utilisateur dans l'annuaire​

5.1. Ajout d'un utilisateur en CLI​

  • Ajouter un utilisateur tz
# kinit admin
# ipa user-add tz
# ipa passwd tz

6. Création des règles RBAC / HBAC​

6.1. Créer des règles RBAC / HBAC​

On va créer une règle HBAC allow_admin_users_services afin de définir un groupe d'utilisateurs autorisés à se connecter en SSH à l'ensemble des serveurs allow_all_hosts.

  • Créer un groupe allow_all_hosts
ipa hostgroup-add  --desc 'Host group which will have allow_admin_services HBAC enabled.' allow_all_hosts
  • Créer une règle HBAC allow_admin_users_services
ipa hbacrule-add allow_admin_users_services --usercat=all --servicecat=all --desc='Allow access to hosts in group allow_all_hosts to admin users.'
  • Ajouter tous les serveurs actuels au groupe allow_all_hosts
$ ipa host-find --raw --pkey-only --sizelimit=0 | awk '$1 == "fqdn:" { print "--hosts=" $2 }' | xargs -n100 ipa hostgroup-add-member allow_all_hosts
  • Modifier la règle HBAC allow_admin_users_services
$ ipa hbacrule-add-host allow_admin_users_services --hostgroups=allow_all_hosts
  • Désactiver la règle HBAC par défaut
$ ipa hbacule-disable allow_all
  • Vérifier la liste des règles HBAC
$ ipa hbacrule-show allow_all

7. Ajout d'un nouveau serveur au domaine home.lab​

7.1. Rejoindre un serveur au domaine home.lab​

  • Il faut que le serveur DNS soit le serveur FreeIPA (192.168.50.11) pour que les paramètres du domaine home.lab soient automatiquement détectés

  • Modifier le fichier /etc/NetworkManager/system-connections/*.conf

/etc/NetworkManager/system-connections/*.conf
dns=192.168.50.11;
  • Appliquer les paramètres réseau
$ sudo systemctl restart NetworkManager
  • Installer le paquet ipa-client
$ sudo yum install ipa-client
$ sudo ipa-client --mkhomedir

7.2. Ajouter le serveur au groupe "allow_all_hosts"​

  • sur le serveur FreIPA ipa1
$ kinit admin
$ ipa hostgroup-add-member allow_all_hosts --hosts=$host

7.3. Forcer la mise à jour du cache sssd​

  • sur le nouveau sserveur installé
$ sudo sss_cache -E

8. Configuration de l'Autorité de Certification​

8.1. Demander un certificat via une CSR (Certificate Signing Request) avec openssl​

8.1.1. Demander un certificat sans SAN (Subject Alt Name)​

  • Par exemple, pour générer un certificat pour vault1.home.lab
$ openssl req -new -newkey rsa:4096 -nodes \
-keyout serveur.key -out serveur.csr -subj "/CN=vault1.home.lab/O=HOME.LAB"
$ ipa cert-request serveur.csr --principal=host/vault1.home.lab@HOME.LAB --certificate-out=serveur.crt

8.1.2. Demander un certificat avec SAN (Subject Alt Name)​

$ openssl req -new -newkey rsa:4096 -nodes \
-keyout vault1.home.lab.key -out vault1.home.lab.csr \
-subj "/CN=vault1.home.lab/OU=HOME/O=LAB" \
-addext "subjectAltName=DNS:vault1,DNS:vault1.home.lab"
$ ipa cert-request serveur.csr --principal=host/mon.serveur.exemple.com --certificate-out=serveur.crt

8.2. Demander un certificat avec ipa-getcert​

  • Par exemple, pour vault1.home.lab
$ sudo ipa-getcert request \
-f /etc/pki/tls/certs/vault1.home.lab.pem \
-k /etc/pki/tls/private/vault1.home.lab.key \
-K host/vault1.home.lab \
-N "CN=vault1.home.lab" \
-D vault1.home.lab \
-D vault1
$ sudo chmod a+r /etc/pki/tls/certs/*.pem

9. Configuration des ACL pour le DNS​

  • J'ai plusieurs sous-réseaux dans mon HomeLab : il est nécessaire de modifier les ACL (Access Control List) du service DNS pour que l'ensemble des serveurs puissent interroger le serveur DNS de FreeIPA.

9.1. Modifier le fichier /etc/named/ipa-ext.conf​

acl "trusted_network" {
localnets;
localhost;
192.168.10.0/24;
192.168.20.0/24;
192.168.30.0/24;
192.168.32.0/19;
};

9.2. Modifier le fichier /etc/named/ipa-options-ext.conf​

/* Homelab */
allow-recursion { trusted_network; };
allow-query-cache { trusted_network; };

/* turns on IPv6 for port 53, IPv4 is on by default for all ifaces */
listen-on-v6 { any; };

/* dnssec-enable is obsolete and 'yes' by default */
dnssec-validation yes;

9.3. Redémarrer le service DNS​

$ sudo systemctl restart named

10. Durcissement​

  • Par défaut, les utilisateurs peuvent voir tous les attributs des serveurs, notamment l'attribut nsOsVersion indiquant la version du kernel, ce qui peut être une information sensible en cas de vulnérabilité sur la version du noyau linux.
ldapsearch -b "cn=computers,cn=accounts,dc=home,dc=lab" "(objectclass=*)" aci

10.1. Option 1 : modification des permissions via l'interface web​

  • Pour interdire l'accès à cet attribut, aller dans le menu Serveur IPA > Permissions et chercher System: Read Hosts
    • décocher l'attribut nsOsVersion

10.2. Option 2 : modification des permissions en ligne de commande​

$ ipa permission-show "System: Read Hosts"
Permission name: System: Read Hosts
Granted rights: compare, read, search
Effective attributes: cn, createtimestamp, description, enrolledby, entryusn, fqdn, ipaassignedidview, ipaclientversion,
ipakrbauthzdata, ipasshpubkey, ipauniqueid, krbcanonicalname, krblastpwdchange, krbpasswordexpiration,
krbprincipalaliases, krbprincipalauthind, krbprincipalexpiration, krbprincipalname, l, macaddress,
managedby, memberprincipal, modifytimestamp, nshardwareplatform, nshostlocation, nsosversion, objectclass,
serverhostname, usercertificate, userclass
Included attributes: createtimestamp, modifytimestamp, entryusn
Default attributes: serverhostname, ipaclientversion, fqdn, krbpasswordexpiration, ipasshpubkey, nshostlocation, krbcanonicalname,
userclass, krbprincipalaliases, nsosversion, krbprincipalexpiration, description, ipaassignedidview,
objectclass, enrolledby, usercertificate, ipakrbauthzdata, nshardwareplatform, macaddress, cn,
krbprincipalauthind, memberprincipal, l, ipauniqueid, krblastpwdchange, managedby, krbprincipalname
Bind rule type: all
Subtree: cn=computers,cn=accounts,dc=home,dc=lab
Type: host
Permission flags: SYSTEM, V2, MANAGED
$ ipa permission-mod "System: Read Hosts" --excludedattrs=nsosversion
  • Vous pouvez vérifier que l'attribut nsOsVersion n'est plus accessible
$ ipa permission-show "System: Read Hosts"
Permission name: System: Read Hosts
Granted rights: compare, read, search
Effective attributes: cn, createtimestamp, description, enrolledby, entryusn, fqdn, ipaassignedidview, ipaclientversion,
ipakrbauthzdata, ipasshpubkey, ipauniqueid, krbcanonicalname, krblastpwdchange, krbpasswordexpiration,
krbprincipalaliases, krbprincipalauthind, krbprincipalexpiration, krbprincipalname, l, macaddress,
managedby, memberprincipal, modifytimestamp, nshardwareplatform, nshostlocation, objectclass,
serverhostname, usercertificate, userclass
Included attributes: createtimestamp, modifytimestamp, entryusn
Excluded attributes: nsosversion
Default attributes: serverhostname, ipaclientversion, fqdn, krbpasswordexpiration, ipasshpubkey, nshostlocation, krbcanonicalname,
userclass, krbprincipalaliases, nsosversion, krbprincipalexpiration, description, ipaassignedidview,
objectclass, enrolledby, usercertificate, ipakrbauthzdata, nshardwareplatform, macaddress, cn,
krbprincipalauthind, memberprincipal, l, ipauniqueid, krblastpwdchange, managedby, krbprincipalname
Bind rule type: all
Subtree: cn=computers,cn=accounts,dc=home,dc=lab
Type: host
Permission flags: SYSTEM, V2, MANAGED