Rocky ldap: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| (7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 24: | Zeile 24: | ||
| '''GW''' || 10.88.2XX.1 || GATEWAY | | '''GW''' || 10.88.2XX.1 || GATEWAY | ||
|- | |- | ||
| − | | '''NS''' || | + | | '''NS''' || 10.88.2XX.21 || Resolver |
|- | |- | ||
| '''FQDN''' || ldap.it2XX.int || Fully Qualified Domain Name | | '''FQDN''' || ldap.it2XX.int || Fully Qualified Domain Name | ||
| Zeile 31: | Zeile 31: | ||
|} | |} | ||
{{Vorlage:Rocky Setup}} | {{Vorlage:Rocky Setup}} | ||
| + | |||
= Zertifikat holen = | = Zertifikat holen = | ||
;Wir befinden uns auf dem LDAP-Server in der DMZ | ;Wir befinden uns auf dem LDAP-Server in der DMZ | ||
| − | * wget -nv -O /tmp/ | + | * wget -nv -O /tmp/own.int.tgz https://web.samogo.de/certs/it2XX.int.tgz |
| − | * tar -C /tmp -xvzf /tmp/ | + | * tar -C /tmp -xvzf /tmp/own.int.tgz |
* mv /tmp/fullchain.pem /etc/ssl/own.crt | * mv /tmp/fullchain.pem /etc/ssl/own.crt | ||
* mv /tmp/privkey.pem /etc/ssl/own.key | * mv /tmp/privkey.pem /etc/ssl/own.key | ||
| Zeile 40: | Zeile 41: | ||
= Installation = | = Installation = | ||
;Auf Rocky heißt das Paket openldap-servers – ldap-utils gibt es nicht, der Client heißt openldap-clients | ;Auf Rocky heißt das Paket openldap-servers – ldap-utils gibt es nicht, der Client heißt openldap-clients | ||
| − | + | ||
* dnf install -y openldap-servers openldap-clients | * dnf install -y openldap-servers openldap-clients | ||
| Zeile 51: | Zeile 52: | ||
== Port checken == | == Port checken == | ||
| − | * ss -4lntp | grep slapd | + | *ss -4lntp | grep slapd |
| − | LISTEN 0 2048 0.0.0.0:389 0.0.0.0:* users:(("slapd",pid= | + | LISTEN 0 2048 0.0.0.0:636 0.0.0.0:* users:(("slapd",pid=15221,fd=9)) |
| + | LISTEN 0 2048 0.0.0.0:389 0.0.0.0:* users:(("slapd",pid=15221,fd=7)) | ||
| + | ;Erkenntnis: Openldap lauscht sowohl auf ldap(389) als auch auf ldaps(636) | ||
| + | Wenn ihr aber genauer hinschaut seht ihr das kein Zertifikat hinterlegt ist. | ||
| + | *openssl s_client -host ldap.it213.int -port 636 -showcerts | ||
| + | Dieses müssen wir selbst einbauen. | ||
== Admin-Passwort setzen == | == Admin-Passwort setzen == | ||
| Zeile 101: | Zeile 107: | ||
</pre> | </pre> | ||
* ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/tls.ldif | * ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/tls.ldif | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
== Funktionstest == | == Funktionstest == | ||
| Zeile 123: | Zeile 124: | ||
* vi /root/struktur.ldif | * vi /root/struktur.ldif | ||
<pre> | <pre> | ||
| − | dn: dc= | + | dn: dc=it2XX,dc=int |
objectClass: top | objectClass: top | ||
objectClass: dcObject | objectClass: dcObject | ||
objectClass: organization | objectClass: organization | ||
| − | o: | + | o: it2XX |
| − | dc: | + | dc: it2XX |
| − | dn: ou=users,dc= | + | dn: ou=users,dc=it2XX,dc=int |
objectClass: organizationalUnit | objectClass: organizationalUnit | ||
ou: users | ou: users | ||
| − | dn: ou=groups,dc= | + | dn: ou=groups,dc=it2XX,dc=int |
objectClass: organizationalUnit | objectClass: organizationalUnit | ||
ou: groups | ou: groups | ||
| − | dn: ou=hosts,dc= | + | dn: ou=hosts,dc=it2XX,dc=int |
objectClass: organizationalUnit | objectClass: organizationalUnit | ||
ou: hosts | ou: hosts | ||
| − | dn: ou=sudo,dc= | + | dn: ou=sudo,dc=it2XX,dc=int |
objectClass: organizationalUnit | objectClass: organizationalUnit | ||
ou: sudo | ou: sudo | ||
| + | |||
</pre> | </pre> | ||
| Zeile 192: | Zeile 194: | ||
* vim /usr/local/etc/ldapscripts/ldapscripts.conf | * vim /usr/local/etc/ldapscripts/ldapscripts.conf | ||
<pre> | <pre> | ||
| − | SERVER="ldap://ldap. | + | SERVER="ldap://ldap.it2XX.int" |
| − | SUFFIX="dc= | + | SUFFIX="dc=it2XX,dc=int" |
GSUFFIX="ou=groups" | GSUFFIX="ou=groups" | ||
USUFFIX="ou=users" | USUFFIX="ou=users" | ||
MSUFFIX="ou=hosts" | MSUFFIX="ou=hosts" | ||
| − | BINDDN="cn=admin,dc= | + | BINDDN="cn=admin,dc=it2XX,dc=int" |
USHELL="/bin/bash" | USHELL="/bin/bash" | ||
UHOMES="/home/%u" | UHOMES="/home/%u" | ||
| Zeile 227: | Zeile 229: | ||
UTEMPLATE="" | UTEMPLATE="" | ||
MTEMPLATE="" | MTEMPLATE="" | ||
| + | |||
</pre> | </pre> | ||
| Zeile 266: | Zeile 269: | ||
= SSSD Anbindung = | = SSSD Anbindung = | ||
| + | *[[Was ist SSSD?]] | ||
== Installation == | == Installation == | ||
Aktuelle Version vom 9. Juli 2026, 10:58 Uhr
Installation
DATEN
| Parameter | Wert | Erläuterung |
|---|---|---|
| VM Name | ldap | Name der VM |
| Disk | 20GB | Vorgabe übernehmen |
| CPU | 4 Cores | Kerne |
| Ram | 4 GB | Speicher |
| Netzwerk (NIC) | DMZ | Interface-Zuweisung in VirtualBox |
| Admin | root | Passwort: radler |
| User | kit | Passwort: kit |
| IP | 10.88.2XX.31/24 | Statische IP |
| CIDR | 24 | Classless Inter-Domain Routing Präfixlänge |
| GW | 10.88.2XX.1 | GATEWAY |
| NS | 10.88.2XX.21 | Resolver |
| FQDN | ldap.it2XX.int | Fully Qualified Domain Name |
| DOM | it2XX.int | Domain Name |
Hostname
- hostnamectl set-hostname FQDN
Netzwerk
- nmcli con mod enp0s3 ipv4.addresses IP/CIDR
- nmcli con mod enp0s3 ipv4.gateway GW
- nmcli con mod enp0s3 ipv4.dns NS
- nmcli con mod enp0s3 ipv4.method manual
- nmcli con mod enp0s3 ipv4.dns-search DOM
- nmcli con mod enp0s3 connection.autoconnect yes
- nmcli con up enp0s3
Hintergrund
- Die Verbindungen findet ihr hier
- DIR: /etc/NetworkManager/system-connections/
- In unserem Fall
- cat /etc/NetworkManager/system-connections/enp0s3.nmconnection
[connection] id=enp0s3 uuid=40ff96e5-0c0d-31de-9bf0-f75da265425b type=ethernet autoconnect-priority=-999 interface-name=enp0s3 timestamp=1784278716 [ethernet] [ipv4] address1=192.168.3.127/24 dns=192.168.20.1; dns-search=it.int; gateway=192.168.3.254 method=manual [ipv6] addr-gen-mode=eui64 method=auto [proxy]
Zertifikat holen
- Wir befinden uns auf dem LDAP-Server in der DMZ
- wget -nv -O /tmp/own.int.tgz https://web.samogo.de/certs/it2XX.int.tgz
- tar -C /tmp -xvzf /tmp/own.int.tgz
- mv /tmp/fullchain.pem /etc/ssl/own.crt
- mv /tmp/privkey.pem /etc/ssl/own.key
Installation
- Auf Rocky heißt das Paket openldap-servers – ldap-utils gibt es nicht, der Client heißt openldap-clients
- 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
- ss -4lntp | grep slapd
LISTEN 0 2048 0.0.0.0:636 0.0.0.0:* users:(("slapd",pid=15221,fd=9))
LISTEN 0 2048 0.0.0.0:389 0.0.0.0:* users:(("slapd",pid=15221,fd=7))
- Erkenntnis
- Openldap lauscht sowohl auf ldap(389) als auch auf ldaps(636)
Wenn ihr aber genauer hinschaut seht ihr das kein Zertifikat hinterlegt ist.
- openssl s_client -host ldap.it213.int -port 636 -showcerts
Dieses müssen wir selbst einbauen.
Admin-Passwort setzen
- Das Passwort wird als SSHA-Hash erzeugt und dann per LDIF in cn=config eingetragen
- slappasswd
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- vi /tmp/passwd.ldif
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
- vi /tmp/tls.ldif
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
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
- vi /root/struktur.ldif
dn: dc=it2XX,dc=int objectClass: top objectClass: dcObject objectClass: organization o: it2XX dc: it2XX 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
- ldapsearch -x -LLL
Cousine und Nis Schema hinzufügen
- ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
- ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
Sudo-Schema laden
- Das Sudo-Schema ist nicht im Standard-slapd enthalten und wird manuell importiert
- wget https://xinux.de/downloads/script/sudo.ldif
- ldapadd -Y EXTERNAL -H ldapi:/// -f sudo.ldif
Sudo-Regeln anlegen
- vi /root/sudo_rule.ldif
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
- dnf install -y make pwgen
- git clone https://github.com/martymac/ldapscripts.git
- cd ldapscripts
- make install
Konfiguration
- vim /usr/local/etc/ldapscripts/ldapscripts.conf
SERVER="ldap://ldap.it2XX.int" SUFFIX="dc=it2XX,dc=int" GSUFFIX="ou=groups" USUFFIX="ou=users" MSUFFIX="ou=hosts" BINDDN="cn=admin,dc=it2XX,dc=int" USHELL="/bin/bash" UHOMES="/home/%u" CREATEHOMES="yes" HOMESKEL="/etc/skel" BINDPWDFILE="/usr/local/etc/ldapscripts/ldapscripts.passwd" GIDSTART="10000" # Group ID UIDSTART="10000" # User ID MIDSTART="20000" # Machine ID GCLASS="posixGroup" # Leave "posixGroup" here if not sure ! PASSWORDGEN="pwgen" RECORDPASSWORDS="no" PASSWORDFILE="/var/log/ldapscripts_passwd.log" LOGTOFILE="yes" LOGFILE="/var/log/ldapscripts.log" LOGTOSYSLOG="no" SYSLOGFACILITY="local4" SYSLOGLEVEL="info" LDAPSEARCHBIN="/usr/bin/ldapsearch" LDAPADDBIN="/usr/bin/ldapadd" LDAPDELETEBIN="/usr/bin/ldapdelete" LDAPMODIFYBIN="/usr/bin/ldapmodify" LDAPMODRDNBIN="/usr/bin/ldapmodrdn" LDAPPASSWDBIN="/usr/bin/ldappasswd" LDAPSEARCHOPTS="-o ldif-wrap=no" GETENTPWCMD="" GETENTGRCMD="" GTEMPLATE="" UTEMPLATE="" MTEMPLATE=""
- echo -n "123Start$" > /usr/local/etc/ldapscripts/ldapscripts.passwd
- chmod 600 /usr/local/etc/ldapscripts/ldapscripts.passwd
Gruppen
- ldapaddgroup it
- ldapaddgroup sudo
Benutzer
- ldapadduser thomas it
- ldapadduser tina it
Kontrolle
- ldapsearch -x
Passwort
- ldapsetpasswd thomas
- ldapsetpasswd tina
Gruppe zuweisen
- ldapaddusertogroup thomas sudo
- ldapaddusertogroup tina sudo
Check
- ldapsearch -xLLL cn=sudo
dn: cn=sudo,ou=groups,dc=it213,dc=int objectClass: posixGroup cn: sudo gidNumber: 10001 description: Group account 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
- vi /etc/sssd/sssd.conf
[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
- authselect hat nsswitch.conf schon angepasst, sudo muss noch dazu
- echo "sudoers: files sss" >> /etc/nsswitch.conf
- grep sss /etc/nsswitch.conf | grep "^[^#]"
passwd: files sss systemd group: files [SUCCESS=merge] sss [SUCCESS=merge] systemd netgroup: sss files automount: sss files services: sss files sudoers: files sss
Tests
- Funktioniert nsswitch?
- getent passwd thomas
thomas:*:10000:10000:thomas:/home/thomas:/bin/bash
- getent passwd tina
tina:*:10001:10000:tina:/home/tina:/bin/bash
- getent group it
it:*:10000:
- Kann ich mit su - einen Identitätswechsel vornehmen?
- su - thomas
thomas@ldap:~$ exit
- su - tina
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
- vi /etc/sssd/sssd.conf
[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
- echo "sudoers: files sss" >> /etc/nsswitch.conf
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