Zertifikat holen
- Wir befinden uns auf dem LDAP-Server in der DMZ
Installation
- Auf Rocky heißt das Paket openldap-servers – ldap-utils gibt es nicht, der Client heißt openldap-clients
- ldapscripts existiert nicht für RHEL/Rocky (auch nicht über EPEL) – Benutzerverwaltung erfolgt daher komplett über LDIF
- dnf install -y openldap-servers openldap-clients
Grundkonfiguration
- Anders als auf Debian gibt es keinen interaktiven Dialog – slapd wird direkt über cn=config konfiguriert
- Nach der Installation läuft slapd sofort, die Datenbank liegt unter /var/lib/ldap/
Dienst starten
- systemctl enable --now slapd
Port checken
LISTEN 0 2048 0.0.0.0:389 0.0.0.0:* users:(("slapd",pid=1365,fd=7))
Admin-Passwort setzen
- Das Passwort wird als SSHA-Hash erzeugt und dann per LDIF in cn=config eingetragen
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=it2XX,dc=int
-
replace: olcRootDN
olcRootDN: cn=admin,dc=it2XX,dc=int
-
replace: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/passwd.ldif
TLS konfigurieren
Rechte setzen
- Der User ldap muss Zertifikat und Schlüssel lesen können – auf Rocky heißt der User ldap, nicht openldap
- chown ldap:ldap /etc/ssl/own.crt /etc/ssl/own.key
- chmod 640 /etc/ssl/own.crt /etc/ssl/own.key
SELinux: Zertifikat freigeben
- SELinux verhindert standardmäßig dass slapd auf Dateien außerhalb seiner eigenen Verzeichnisse zugreift
- semanage fcontext -a -t cert_t "/etc/ssl/own\.(crt|key)"
- restorecon -Rv /etc/ssl/own.crt /etc/ssl/own.key
TLS in cn=config eintragen
dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/pki/tls/certs/ca-bundle.crt
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/own.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/own.key
- ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/tls.ldif
Ports prüfen
LISTEN 0 2048 0.0.0.0:389 0.0.0.0:* users:(("slapd",pid=788,fd=7))
LISTEN 0 2048 0.0.0.0:636 0.0.0.0:* users:(("slapd",pid=788,fd=10))
Funktionstest
- openssl s_client -connect ldap.it2XX.int:636 -showcerts
ldap.conf setzen
- Die systemweite LDAP-Client-Konfiguration – gilt für alle ldap*-Befehle
- vi /etc/openldap/ldap.conf
BASE dc=it2XX,dc=int
URI ldaps://ldap.it2XX.int
TLS_CACERT /etc/pki/tls/certs/ca-bundle.crt
Grundstruktur
Erstellen
dn: ou=users,dc=it2XX,dc=int
objectClass: organizationalUnit
ou: users
dn: ou=groups,dc=it2XX,dc=int
objectClass: organizationalUnit
ou: groups
dn: ou=hosts,dc=it2XX,dc=int
objectClass: organizationalUnit
ou: hosts
dn: ou=sudo,dc=it2XX,dc=int
objectClass: organizationalUnit
ou: sudo
Anlegen
- ldapadd -xD cn=admin,dc=it2XX,dc=int -w 123Start$ -H ldap://localhost -f /root/struktur.ldif
Kontrolle
Sudo-Schema laden
- Das Sudo-Schema ist nicht im Standard-slapd enthalten und wird manuell importiert
Sudo-Regeln anlegen
dn: cn=defaults,ou=sudo,dc=it2XX,dc=int
objectClass: sudoRole
cn: defaults
sudoOption: env_keep+=SSH_AUTH_SOCK
dn: cn=admin_role,ou=sudo,dc=it2XX,dc=int
objectClass: sudoRole
cn: admin_role
sudoUser: %sudo
sudoHost: ALL
sudoCommand: ALL
sudoRunAsUser: ALL
sudoRunAsGroup: ALL
- ldapadd -xD cn=admin,dc=it2XX,dc=int -w 123Start$ -H ldap://localhost -f /root/sudo_rule.ldif
Benutzer und Gruppen
- Auf Rocky gibt es kein ldapscripts – Benutzer und Gruppen werden per LDIF angelegt
Gruppen anlegen
dn: cn=it,ou=groups,dc=it2XX,dc=int
objectClass: posixGroup
cn: it
gidNumber: 10000
dn: cn=sudo,ou=groups,dc=it2XX,dc=int
objectClass: posixGroup
cn: sudo
gidNumber: 10001
- ldapadd -xD cn=admin,dc=it2XX,dc=int -w 123Start$ -H ldap://localhost -f /root/groups.ldif
Passwort-Hashes erzeugen
- Für jeden anzulegenden User vorab einen Hash erzeugen
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Benutzer anlegen
dn: uid=thomas,ou=users,dc=it2XX,dc=int
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
uid: thomas
cn: thomas
sn: thomas
uidNumber: 10000
gidNumber: 10000
homeDirectory: /home/thomas
loginShell: /bin/bash
userPassword: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
dn: uid=tina,ou=users,dc=it2XX,dc=int
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
uid: tina
cn: tina
sn: tina
uidNumber: 10001
gidNumber: 10000
homeDirectory: /home/tina
loginShell: /bin/bash
userPassword: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- ldapadd -xD cn=admin,dc=it2XX,dc=int -w 123Start$ -H ldap://localhost -f /root/users.ldif
Gruppenmitgliedschaft (sudo) zuweisen
- vi /root/group_membership.ldif
dn: cn=sudo,ou=groups,dc=it2XX,dc=int
changetype: modify
add: memberUid
memberUid: thomas
memberUid: tina
- ldapmodify -xD cn=admin,dc=it2XX,dc=int -w 123Start$ -H ldap://localhost -f /root/group_membership.ldif
Check
dn: cn=sudo,ou=groups,dc=it2XX,dc=int
objectClass: posixGroup
cn: sudo
gidNumber: 10001
memberUid: thomas
memberUid: tina
Firewall
- LDAP und LDAPS auf dem Server freigeben
- firewall-cmd --permanent --zone=public --add-service=ldap
- firewall-cmd --permanent --zone=public --add-service=ldaps
- firewall-cmd --reload
SSSD Anbindung
Installation
- Auf Rocky heißt das Paket sssd-ldap statt libpam-sss – authselect übernimmt die PAM-Integration
- dnf install -y sssd sssd-ldap oddjob oddjob-mkhomedir
Konfiguration
[sssd]
config_file_version = 2
services = nss, pam, sudo
domains = it2XX.int
[domain/it2XX.int]
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
access_provider = permit
sudo_provider = ldap
ldap_uri = ldaps://ldap.it2XX.int
ldap_search_base = dc=it2XX,dc=int
ldap_sudo_search_base = ou=sudo,dc=it2XX,dc=int
ldap_tls_cacert = /etc/pki/tls/certs/ca-bundle.crt
ldap_tls_reqcert = hard
cache_credentials = True
[nss]
filter_users = root,daemon,bin,sys,sync,games,man,lp,mail,news,uucp,proxy,nobody,systemd-network,systemd-resolve,dbus,polkitd,unbound,tss,sssd,chrony,sshd,rngd
[pam]
offline_credentials_expiration = 2
- chmod 600 /etc/sssd/sssd.conf
PAM-Integration
- Auf Rocky übernimmt authselect die PAM-Konfiguration – kein pam-auth-update wie auf Debian
- sssd und mkhomedir werden als Profile aktiviert
- authselect select sssd with-mkhomedir --force
- systemctl enable --now oddjobd
- systemctl restart sssd
NSS
- Nur Kontrolle – authselect hat nsswitch.conf bereits angepasst
passwd: sss files systemd
group: sss files systemd
shadow: files sss
hosts: files dns
sudoers: files sss
Tests
- Funktioniert nsswitch?
thomas:*:10000:10000:thomas:/home/thomas:/bin/bash
tina:*:10001:10000:tina:/home/tina:/bin/bash
it:*:10000:
- Kann ich mit su - einen Identitätswechsel vornehmen?
thomas@ldap:~$ exit
tina@ldap:~$ exit
Client-Anbindung
Installation
- dnf install -y sssd sssd-ldap oddjob oddjob-mkhomedir
| Paket |
Funktion
|
| sssd |
Hauptdienst zur zentralen Identitätsverwaltung
|
| sssd-ldap |
LDAP-Provider für SSSD
|
| oddjob |
D-Bus-Dienst der Hilfsskripte ausführt
|
| oddjob-mkhomedir |
Erstellt beim ersten Login automatisch das Home-Verzeichnis
|
SSSD Konfiguration
[sssd]
config_file_version = 2
services = nss, pam, sudo
domains = it2XX.int
[domain/it2XX.int]
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
access_provider = permit
sudo_provider = ldap
ldap_uri = ldaps://ldap.it2XX.int
ldap_search_base = dc=it2XX,dc=int
ldap_sudo_search_base = ou=sudo,dc=it2XX,dc=int
ldap_default_bind_dn = cn=admin,dc=it2XX,dc=int
ldap_default_authtok = 123Start$
ldap_tls_cacert = /etc/pki/tls/certs/ca-bundle.crt
ldap_tls_reqcert = hard
cache_credentials = True
[nss]
filter_users = root,daemon,bin,sys,sync,games,man,lp,mail,news,uucp,proxy,nobody,systemd-network,systemd-resolve,dbus,polkitd,unbound,tss,sssd,chrony,sshd,rngd
[pam]
offline_credentials_expiration = 2
- chmod 600 /etc/sssd/sssd.conf
- authselect select sssd with-mkhomedir --force
- systemctl enable --now oddjobd
- systemctl restart sssd
Tests
- getent passwd thomas
- id tina
- sudo -l -U thomas
Netzwerkverkehr prüfen
- Verschlüsselte Kommunikation über Port 636 verifizieren
- tcpdump -i any -nn port 636
14:29:33.586737 IP 10.88.213.100.52646 > 10.88.213.31.636: Flags [P.], seq 1:759, ack 3951, win 501, length 758
14:29:33.586816 IP 10.88.213.31.636 > 10.88.213.100.52646: Flags [P.], seq 4795:4831, ack 759, win 504, length 36
- Port 636
- Die Pakete gehen gezielt an den LDAPS-Port
- Flags [P.]
- Austausch verschlüsselter Anwendungsdaten nach dem TLS-Handshake
- Keine Klartextdaten
- Im Gegensatz zu Port 389 sind keine Benutzernamen oder Passwörter im Dump lesbar