Rocky ldap: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
|||
| (23 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
= | = Installation = | ||
=== DATEN === | |||
{| class="wikitable" style="background-color: #f2f2f2;" | |||
! 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 | |||
|} | |||
{{Vorlage:Rocky Setup}} | |||
= 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 = | = 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 | |||
<pre> | |||
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 | |||
</pre> | |||
* 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 | ||
<pre> | |||
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 | |||
</pre> | |||
* 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 | |||
<pre> | |||
BASE dc=it2XX,dc=int | |||
URI ldaps://ldap.it2XX.int | |||
TLS_CACERT /etc/pki/tls/certs/ca-bundle.crt | |||
</pre> | |||
= | = Grundstruktur = | ||
== Erstellen == | |||
* vi /root/struktur.ldif | |||
<pre> | |||
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 | |||
</pre> | |||
== 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 | |||
<pre> | |||
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 | |||
</pre> | |||
* 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 | |||
<pre> | |||
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="" | |||
</pre> | |||
* 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 = | ||
*[[Was ist SSSD?]] | |||
* | |||
== | == 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 | |||
<pre> | |||
[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 | |||
</pre> | |||
* 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 | |||
= | {| class="wikitable" | ||
! 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 | |||
* vi /etc/ | |||
<pre> | <pre> | ||
[daemon] | [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 | |||
</pre> | </pre> | ||
* 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 | |||
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