Action disabled: register

OpenLDAP mit Samba als PDC (neues backend)

Hauseigenes Apt-Repo: https://apt.iteas.at

Verwendetes System: Debian 6.0, Debian 9.3 und Ubuntu 16.04.3

Wichtige INFO: 12.2017
Ich hab Freigabeeinstellungen auf Debian 9.3 (Samba Version 4.5.12) und Ubuntu 16.04.3 (Samba Version 4.3.11) getestet. Anscheindend ist die Sambaversion von Ubuntu Schrott. Kopiert schreibend gerade mal mit 35 bis 65MB/s. Bei Debian, gleich Config kopierte ich schreibend mit 115MB/s. Das ganze gilt auf der virtualsierten Ebene von Proxmox. Ubuntu ist als LXC (lokales ZFS) oder Ubuntu mit KVM gleich langsam. Ubuntu auf eine PHY Maschine funktioniert mit den gleichen spezifikationen super schnell. Debian hingeben ist überall supernschell, also volle Gigabit. Warum auch immer…

Daran sollte man denken. Ich habe Samba und LDAP auf einem Ubuntuserver laufen. Die Freigaben sind aber auf einem Debian. Ist mit LXC ja kein Problem.

Seit Version 2.4 arbeitet OpenLDAP mit einem Onlinebackend. Das erlaubt es die Konfiguration im Betrieb zu bearbeiten ohne den Dienst neu starten zu müssen. Alle Konfigurationen liegen seit dieser Änderung unter /etc/ldap/slapd.d/, und nicht mehr in der Datei slapd.conf. Man sollte sich von der sichtbaren Klartextstruktur dieser Datenbank-Datei(en) nicht in die Irre leiten lassen. Jede Datei unterhalb von slapd.d/ enthält zusätzlich alle erforderlichen operationellen Attribute, die für die online- Funktionalität der Online-Konfiguration unabdingbar sind, allen voran natürlich der modifyTimestamp. Er sorgt dafür, dass jede online durchgeführte Änderung sofort aktiv wird. Von einer direkten Manipulation unterhalb von slapd.d/ per Editor ist in jedem Fall abzuraten. Da die Timestamps auf diesem Weg nicht aktualisiert werden.

Eine Änderung von Attributwerten in der Online-Konfiguration sollten stets über ldap*-Befehle erfolgen, ob dies nun manuell per LDIF-Files und den entsprechenden Kommandozeilentools oder über ein grafisches Werkzeug geschieht, spielt keine Rolle.

Ziel: Ziel ist es eine schöne Weboberfläche namens Ldap-Account-Manager mit dem man bequem User für Windows und Linux im gesamten Netzwerk nur einmal anlegt, Hosts und Domänen zuweisen kann, ACLs vergben, und wenn man möchte LDAP auch als Adressdatenbank nutzen. Ein langer weg, aber schaffbar.

aptitude install openldap-utils ldap-server samba smbclient samba-doc samba-tools smbldap-tools finger phpldapadmin ldap-account-manager libsasl2-modules-gssapi-mit sasl2-bin libsasl2-modules-ldap

Es wird hier nur das Passwort abgefragt. Alles weitere muss man erst selber konfigurieren.

Die slapd.d/-Konfiguration wird - wie ein normaler Tree - in Form eines LDAP-Verzeichnisbaumes gespeichert. Die verwendeten Objektklassen und Attribute (die allesamt üblicherweise mit olc* beginnen) werden dabei über ein vordefiniertes bzw. hartverdrahtetes Schema (cn=schema) unseres slapd zur Verfügung gestellt. z.B.

Alte slapd.conf Direktive rootdn cn=ldapadmin,dc=local,dc=site
Neue slapd.d/ Direktive olcRootDN: cn=ldapadmin,dc=local,dc=site

Um einen Account zu erstellen muss man sich zuerst eine brauchbare Konfiguration schreiben, die spielt man dann direkt in die Onlinekonfiguration ein. Man erstellt sich also eine Datei; vorzugsweise nennen wir sie slapd.conf und fügt folgende brauchbare Zeilen ein. Im Verzeichnis /etc/ldap/slapd.d/ besteht ein symbolischer Link der auf slapd.conf zeigt. Vorerst setzen wir noch ein verschlüsseltes Passwort mit

slappasswd -s <Klartextpasswort>
{SSHA}7/esxW/+XxfabHAu6zDfd32ap3/BBJFM+8U

Den verschlüsselten Teil trägt man dann auch in die slapd.conf ein. rootpw {SSHA}7/esxW/+XxfabHA4563bDfd32ap3/BBJFM+8U

slapd.conf
<#allow bind_v2
 
# Schema and objectClass definitions
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema
include         /etc/ldap/schema/samba.schema
include         /etc/ldap/schema/collective.schema
include         /etc/ldap/schema/corba.schema
include         /etc/ldap/schema/duaconf.schema
include         /etc/ldap/schema/dyngroup.schema
include         /etc/ldap/schema/java.schema
include         /etc/ldap/schema/misc.schema
include         /etc/ldap/schema/openldap.schema
include         /etc/ldap/schema/ppolicy.schema
 
 
# Where the pid file is put. The init.d script
# will not stop the server if you change this.
pidfile         /var/run/slapd/slapd.pid
 
# List of arguments that were passed to the server
argsfile        /var/run/slapd/slapd.args
 
# Read slapd.conf(5) for possible values
loglevel        none
 
# Where the dynamically loaded modules are stored
modulepath      /usr/lib/ldap
moduleload      back_hdb
 
# The maximum number of entries that is returned for a search operation
sizelimit 500
 
# The tool-threads parameter sets the actual amount of cpu's that is used
# for indexing.
tool-threads 1
 
#######################################################################
# Specific Backend Directives for hdb:
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
backend         hdb
 
#######################################################################
# Specific Backend Directives for 'other':
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
#backend                <other>
 
database        config
rootdn          cn=config
rootpw          {SSHA}7/eWD/+XxW9bHAu6zDoAGp3/BBJFM+8U
 
#######################################################################
# Specific Directives for database #1, of type hdb:
# Database specific directives apply to this databasse until another
# 'database' directive occurs
database        hdb
 
# The base of your directory in database #1
suffix          "dc=darkwolf,dc=lan"
 
# rootdn directive for specifying a superuser on the database. This is needed
# for syncrepl.
# rootdn          "cn=ldap-dc1,dc=darkwolf,dc=lan"
 
# Where the database file are physically stored for database #1
directory       "/var/lib/ldap"
 
# The dbconfig settings are used to generate a DB_CONFIG file the first
# time slapd starts.  They do NOT override existing an existing DB_CONFIG
# file.  You should therefore change these settings in DB_CONFIG directly
# or remove DB_CONFIG and restart slapd for changes to take effect.
 
# For the Debian package we use 2MB as default but be sure to update this
# value if you have plenty of RAM
dbconfig set_cachesize 0 2097152 0
 
# Sven Hartge reported that he had to set this value incredibly high
# to get slapd running at all. See http://bugs.debian.org/303057 for more
# information.
 
# Number of objects that can be locked at the same time.
dbconfig set_lk_max_objects 1500
# Number of locks (both requested and granted)
dbconfig set_lk_max_locks 1500
# Number of lockers
dbconfig set_lk_max_lockers 1500
 
# Indexing options for database #1
index           objectClass eq
# Save the time that the entry gets modified, for database #1
lastmod         on
 
# Checkpoint the BerkeleyDB database periodically in case of system
# failure and to speed slapd shutdown.
checkpoint      512 30
 
# Where to store the replica logs for database #1
# replogfile    /var/lib/ldap/replog
 
# The userPassword by default can be changed
# by the entry owning it if they are authenticated.
# Others should not be able to see it, except the
# admin entry below
# These access lines apply to database #1 only
access to attrs=userPassword,shadowLastChange
        by dn="cn=admin,dc=darkwolf,dc=lan" write
        by anonymous auth
        by self write
        by * none
 
# Ensure read access to the base for things like
# supportedSASLMechanisms.  Without this you may
# have problems with SASL not knowing what
# mechanisms are available and the like.
# Note that this is covered by the 'access to *'
# ACL below too but if you change that as people
# are wont to do you'll still need this if you
# want SASL (and possible other things) to work 
# happily.
access to dn.base="" by * read
 
# The admin dn has full write access, everyone else
# can read everything.
access to *
        by dn="cn=admin,dc=darkwolf,dc=lan" write
        by * read>

Als nächstes müssen wir sicher gehen das auch alle erforderlichen Schemas in /etc/ldap/schema vorhanden sind. Wenn wir uns das Verzeichnis ansehen werden wir feststellen dass, das Schema für Samba fehlt. Dies besorgen wir uns aus dem zuvor installierten samba-doc Paket.

gunzip /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz
cp -v /usr/share/doc/samba-doc/examples/LDAP/samba.schema /etc/ldap/schema

Den Tree durchsuchen ohne Passwort, nur Daten abfragen

ldapsearch -x -b dc=darkwolf,dc=lan '(objectclass=*)'

Den Tree durchsuchen und gleichzeitig das Passwort testen

ldapsearch -x -W -D cn=admin,dc=darkwolf,dc=lan '(objectclass=*)'

Gefunden wird logischer weise nichts, da ja noch keine Einträge in „admin“ vorhanden sind. Aber wir haben ein fehlerfreies Suchergebnis.

Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1

So, jetzt müssen wir die slapd.conf nur mehr in das Onlineprofil übernehmen. Der Vorgang gestaltet sich relativ einfach:

/etc/init.d/slapd stop
mv slapd.d slapd.d.bck
mkdir slapd.d
slaptest -f slapd.conf -F slapd.d
chown -R openldap:openldap slapd.d 
/etc/init.d/slapd start

Nun könnten wir die slapd.conf sorglos löschen. Von dem ist aber abzuraten, da wir bei späteren Konfigurationsänderungen diese mit dieser Datei leichter vollziehen können. Wir können nun beginnen Daten einzutragen.

Daten mit Hilfe einer LDIF einspielen

ldapadd -f database.ldif -x -D "cn=admin,dc=darkwolf,dc=lan" -W

Mit Hilfe eines Webminterface (empfohlen)

phpLDAPadmin (also known as PLA) is a web-based LDAP client. It provides easy, anywhere-accessible, multi-language administration for your LDAP server. Its hierarchical tree-viewer and advanced search functionality make it intuitive to browse and administer your LDAP directory. Since it is a web application, this LDAP browser works on many platforms, making your LDAP server easily manageable from any location. phpLDAPadmin is the perfect LDAP browser for the LDAP professional and novice alike. Its user base consists mostly of LDAP administration professionals. Aufrufen lässt sich das Interface unter http://localhost/phpldapadmin

Konfiguration

  • /etc/phpldapadmin/config.php

LDAP Account Manager ist ein Webfrontend für die Verwaltung diverser Kontotypen in einem LDAP-Verzeichnis. Es wurde in PHP geschrieben. Im Gegensatz zu Programmen wie phpLDAPadmin liegt der Schwerpunkt auf der kontobasierten Verwaltung. Der Benutzer erhält eine abstraktere Sicht auf das LDAP-Verzeichnis. Das Programm ist unter der GNU General Public License lizenziert. Aufrufen lässt sich das Interface unter http://localhost/lam

Konfiguration

  • direkt im Webinterface
  • /var/lib/ldap-account-manager/config/lam.conf, oder eben das verwendete Profil

Dies wäre z.B. die Hostextension. Mit ihr ist es möglich User nur auf bestimmte Hosts zu zulassen. Hierfür sind die zwei folgenden Schemen notwendig.

  • ldapns.schema (für dieses Schema wird clientseitig immer das Paket libpam-ldap benötigt, da sonst der Hostfilter nicht beachtet wird, pam muss man bei der Installation die Dateien common-* überschreiben lassen) Der Filter zieht aber nicht mehr sobald ein SSH Schlüssel hinterlegt wurde.
  • openssh-lpk_openldap.schema

TLS-Konfiguration mit SASLMech EXTERNAL

Transport Layer Security (TLS), weitläufiger bekannt unter der Vorgängerbezeichnung Secure Sockets Layer (SSL), ist ein hybrides Verschlüsselungsprotokoll zur sicheren Datenübertragung im Internet. Seit Version 3.0 wird das SSL-Protokoll unter dem neuen Namen TLS weiterentwickelt und standardisiert, wobei Version 1.0 von TLS der Version 3.1 von SSL entspricht. Im OSI-Modell ist TLS in Schicht 6 (der Darstellungsschicht) angeordnet. Im TCP/IP Modell ist TLS oberhalb der Transportschicht (zum Beispiel TCP) und unterhalb Anwendungsprotokollen wie HTTP oder SMTP angesiedelt. In den Spezifikationen wird dies dann zum Beispiel als „HTTP over TLS“ bezeichnet. Sollen jedoch beide Protokolle zusammengefasst betrachtet werden, wird üblicherweise ein „S“ für Secure dem Protokoll der Anwendungsschicht angehängt (zum Beispiel HTTPS). TLS arbeitet transparent, so dass es leicht eingesetzt werden kann, um Protokollen ohne eigene Sicherheitsmechanismen abgesicherte Verbindungen zur Verfügung zu stellen. Zudem ist es erweiterbar, um Flexibilität und Zukunftssicherheit bei den verwendeten Verschlüsselungstechniken zu gewährleisten. Im ersten Schritt benötigen wir Zertifikate, OpenSSL hilft uns dabei. Um eine verschlüsselte Verbindung zwischen der Client-Applikation und dem Server aufzubauen, benötigen wir in unserer Konfiguration mehrere Dinge: das eigentliche Zertifikat, den Schlüssel und eine sogenannte Certification Authority (CA). Diese CA (oder auch rootCA) wird benötigt, um den unsignierten Zertifikats-Request zu signieren und damit ein deute zu beglaubigen; Marke: Du kriegt jetzt einen Stempel und Unterschrift - test and approved.

cd /etc/ssl
cp openssl.cnf openssl.cnf-orig

Das Konfig muss abgeändert werden.

[ policy_match ]
# countryName wurde deaktiviert, domainComponent hinzugefügt
domainComponent = match
...
[ policy_anything ]
# countryName wurde deaktiviert, domainComponent hinzugefügt
domainComponent = optional
...
[ req_distinguished_name ]
# countryName wurde deaktiviert, domainComponent hinzugefügt
# die 0. und 1. vor den Einträgen bewirken eine multible
# Verwendbarkeit und Verkettung der Parameter --> darkwolf.lan
...
0.domainComponent               = TLD Domaenen-Komponente (dc=lan)
0.domainComponent_default       = lan
1.domainComponent               = Zweite Domaenen-Komponente (dc=darkwolf)
1.domainComponent_default       = darkwolf
stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Oesterreich
localityName                    = Locality Name (eg, city)
localityName_default            = Gnas
0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Open Source IT
...
commonName                      = Common Name (eg, YOUR name)
commonName_max                  = 64
# Der Parameter '''commonName''' ist einer der wichtigsten, da TLS den DN aus dem
# Zertifikat ausliest. Stimmt der DN nicht mit dem echten '''FQHN/Usernamen'''
# überein, kommt es zu Problemen!

Generieren des Zertifikates:

Zuerst wird nach einem Zertifikatsnamen und einem Passwort gefragt. Hier etwas beliebiges ausdenken und eingeben. Danach sollte man alles mit ENTER bestätigen können. Am Ende wird man dann wieder nach dem zuvor vergebenen Passwort gefragt.

cd /usr/lib/ssl/misc
./CA.pl -newca
  • Das Zertifikat liegt unter /usr/lib/ssl/misc/demoCA/cacert.pem
  • Der Schlüssel liegt unter /usr/lib/ssl/misc/demoCA/private/cakey.pem

Da wir nun stolze Besitzer einer eigenen CA sind, mit der wir unserer Zertifikate signieren können.

Nun können wir uns als Nächstes an die Erstellung des eigentlichen Zertifikates machen. Das läuft in zwei Schritten ab. Zunächst erstellen wir ein unsigniertes Zertifikat (einen so genannten Zertifikats-Request), welches anschließend mit unserer CA signiert und somit beglaubigt wird.

./CA.pl -newreq

Das Vorgehen und die Eingaben gestalten sich analog zum vorherigen Schritt. Da wir jedoch nun einen expliziten Zertifikats-Request für unseren Server ldap-dc.darkwolf.lan erstellen, muss der Common Name im Zertifikats-DN auch exakt so lauten. Die letzte Zeile des Dialogs sagt uns, wo wir den Zertifikats-Request finden können, nämlich in der Datei newreq.pem

Request is in newreq.pem, private key is in newkey.pem
./CA.pl -sign

Hierbei signieren wir unseren eben erstellten Zertifikats-Request (newreq.pem) mit unserer CA, am Ende erhalten wir das signierte Zertifikat newcert.pem. Als Passwort benötigen wir das des Schlüssels des CA und bestätigen die beiden Signierungs-Abfragen mit [y] (yes).

Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem

Wir müssen nun das Passwort aus dem Zertifikats-Request bzw. der Request-Key-Datei extrahieren, da wir sonst bei jedem Start von Slapd das Zertifikat beglaubigen und das Passwort eingeben müssten. Der Passworteintrag wird bei diesem Vorgang in die ldapkey.pem geschrieben.

cd /usr/lib/ssl/misc
openssl rsa -in newkey.pem -out ldapkey.pem

Um alles schön übersichtlich zu halten, legen wir nun unterhalb unseres eigentlichen OpenLDAP-Konfigurationsordners (/etc/ldap) einen Ordner names 'certs' an. Dorthin kopieren wir die zuvor generierten Dateien: cacert.pem, newcert.pem und ldapkey.pem. Anschließend nicht vergessen, den Ordner und die Zertifikate für den User/die Gruppe lesbar zu machen, mit deren Rechten unser slapd läuft.

mkdir /etc/ldap/certs
cp /usr/lib/ssl/misc/demoCA/cacert.pem /etc/ldap/certs/
cp /usr/lib/ssl/misc/newcert.pem /etc/ldap/certs/
cp /usr/lib/ssl/misc/ldapkey.pem /etc/ldap/certs/
chown -R openldap:openldap /etc/ldap/certs/
chmod -R 440 /etc/ldap/certs/
chmod +x /etc/ldap/certs/

Folgende Einträge müssen wir in der slapd.conf (globale Sektion) vornehmen damit LDAP auch verschlüsselt kommuniziert.

TLSCertificateFile      /etc/ldap/certs/newcert.pem
TLSCertificateKeyFile   /etc/ldap/certs/ldapkey.pem
TLSCACertificateFile    /etc/ldap/certs/cacert.pem
TLSVerifyClient         allow
# Verfahren fuer Handshake, sollte auf demand gesetzt sein

'Allow' besagt, dass auch für den Fall, dass kein oder ein ungültiges Zertifikat vom Client kommt, die Ausführung trotzdem fortgesetzt wird. Sobald die TLS-Funktionalität ausgiebig und erfolgreich getestet wurde, sollte der Parameter später in jedem Fall auf 'demand' umgestellt werden.

Die Erstellung aller weiteren Zertifikate entspricht den bereits in den Schritten 6.1, 6.2 und 6.3 beschriebenen Vorgehensweisen. Erstellen wir nun gleich unseren Client tftp.darkwolf.lan. Wichtig ist das der Common Name jedes weiteren Servers/Client/Users entsprechend seines FQHN's bzw. LDAP-cn's angepasst wird.

Suchanfragen mit TLS:

ldapsearch -x uid=ml -b dc=darkwolf,dc=lan '(objectclass=*)' -ZZ

ldapsearch -d -1 -x uid=ml -b dc=darkwolf,dc=lan '(objectclass=*)' -ZZ

ldapsearch -h ldapserver.local -ZZ -x -D "cn=Manager,dc=darkwolf,dc=lan" -W

ldapsearch -h ldapserver.local -ZZ -x -D "cn=Manager,dc=darkwolf,dc=lan" -W -d 255

Bei der Installation der Pakete werden einige Daten wie cn des Administrators der LDAP-Datenbank abgefragt, ebenso wie Hostname/IP des LDAP-Servers. Diese können auch jederzeit nach der Installation verändert werden. Daher ist es am einfachsten, während der Installation die Abfragen einfach mit ⏎ zu bestätigen.

aptitude install libnss-ldap libpam-ldap nscd portmap finger libpam-foreground

Die Pakete nscd und portmap sind Abhängigkeiten, welche unerlässlich sind, um sich mit einem LDAP Server zu authentifizieren. Sie benötigen keine weitere Konfiguration.

Ausdruck Beispielwert Kommentar
Hostldap-dc.darkwolf.lanDie Host-Adresse vom LDAP Server, die IP (hier 10.0.0.2) statt des Hostnamens beschleunigt die Authentifizierung geringfügig.
BASEDNdc=darkwolf,dc=lanSuchbasis auf dem Server (engl. Base Distinguished Name)
ROOTBINDDNcn=admin,dc=darkwolf,dc=lanDer LDAP Server Administrator Account Name
ldap_version3Heute meist Version 3, allerdings ist Version 2 des LDAP Protokolls noch vertreten.
secretgeheimesPWdas LDAP - Passwort des LDAP - Administrator Accounts (ROOTBINDDN)

PAM (Pluggable Authentication Modules [for Linux]) ist eine praktische Sammlung von Modulen, die die Authentifizierung für Benutzer, aber auch Maschinen oder Dienste übernehmen. Folgend werden einige Module dahingehend verändert, damit eine erfolgreiche Benutzerauthentifizierung mittels LDAP möglich und effizient wird. Wenn ein Verzeichnis (/etc/pam.d/) existiert ist in der Regel /etc/pam.conf leer, da alles modular konfiguriert wird, um individuell auf Wünsche der Authentifizierung eingehen zu können. Damit die Authentifizierung funktioniert, müssen die bestehenden Einträge in /etc/pam.d/common-* auskommentiert und folgende hinzugefügt werden:

nano /etc/pam.d/common-auth
auth    sufficient      pam_ldap.so
auth    required        pam_unix.so use_first_pass nullok_secure

auth ist für die Sicherheit zuständig, ob der User, der er vorgibt zu sein auch wirklich dieser ist und somit ein Passwort verlangt.

nano /etc/pam.d/common-account
account sufficient      pam_ldap.so
account required        pam_unix.so use_first_pass
# account [default=bad success=ok user_unknown=ignore] pam_ldap.so | Diese Eintrag sollte genommen werden falls man in der /etc/ldap.conf mit den Optionen pam_groupdn und pam_member_attribute arbeitet, da sonst
# diese Optionen nicht greifen.

account prüft die Berechtigung, ob ein User den Dienst benutzen darf, oder ob vielleicht sein Passwort abgelaufen ist.

nano /etc/pam.d/common-password
password   sufficient pam_ldap.so
password   required   pam_unix.so use_first_pass nullok obscure min=4 max=8 md5

password spezifiziert, wie ein Passwort gewechselt wird und wie dieses zusammengesetzt werden muss.

nano /etc/pam.d/common-session
session required        pam_unix.so
session optional        pam_foreground.so

session übernimmt alle wichtigen Prioritätsaufgaben und regelt die Prozesse wie das zur Verfügung stellen des Heimatverzeichnisses.

nano /etc/ldap/ldap.conf
HOST    192.168.1.5 # IP des LDAP Servers
BASE    dc=darkwolf,dc=lan # BASE DN

Die meisten Daten wurden vom Assistenten schon eingebracht. Sie sollte durchgesehen und event. Ergänzungen eingebracht werden. In der ldap.conf sind die wichtigsten LDAP-Angaben untergebracht, die weit ins Detail verfeinert werden können, zunächst reicht es jedoch wenn, dort die Adresse des LDAP-Servers und die Suchbasis, in der man sich authentifizieren will, angegeben wird. Durch das Konfigurationsscript wird die URI des LDAP-Servers verlangt. Die Vorgabe in dieser Zeile lautet ldapi:/// anschließend wird die Adresse (IP:Port) des LDAP-Servers verlangt, dabei muss ldapi:/ auf ldap: geändert werden.

NSS - Modul - Konfiguration

NSS (System Databases and Name Service Switch configuration) gibt im System an, wo sich welche Datenbanken (Aliase, Benutzer, Gruppen, Netzwerke…etc.) befinden und in welcher Reihenfolge sie abgefragt oder genutzt werden sollen. So kann man für jede Datenbank individuell angeben wie der LookUp Prozess funktionieren soll. (/etc/nsswitch.conf)

nano /etc/libnss-ldap.conf
host 192.168.1.5
base dc=darkwolf,dc=lan
ldap_version 3

Auch hier werden die Suchbasis und der Host angegeben.

Vor der nächsten Änderung ist abzuraten!!!

Falls Sie bemerkt haben, dass eine der Zeilen, die Sie in Ihre /etc/ldap.conf kopiert haben, auskommentiert war (die rootbinddn Zeile): Sie brauchen sie nicht, außer Sie wollen das Passwort eines Benutzers als Superuser ändern. In diesem Fall müssen Sie das root-Passwort im Klartext in die Datei /etc/ldap.secret schreiben. Dies ist GEFÄHRLICH und sollte chmod 600 erhalten. Von dem ist also abzuraten. Richtiger weise habe ich es aber dokumentiert.

nano /etc/libnss-ldap.secret
geheimesPW in Klartext

chmod 640 /etc/libnss-ldap.secret

Das Passwort sollte auch hier in einer Datei gespeichert sein, die vor fremden Zugriffen geschützt ist!

nano /etc/nsswitch.conf

Nachdem man die nsswitch.conf editiert hat, könnte kein sudo mehr erfolgreich sein, wenn man sich vertan hat oder etwas Anderes nicht stimmt, denn dann möchte Ubuntu bereits auf den LDAP-Server zugreifen. Sorgfalt ist also geboten. Wenn man sich trotz aller Vorsicht ausgesperrt, hilft nur noch ein Start im Rettungsmodus oder von einer Live-CD um den Fehler zu korrigieren oder die alte nsswitch.conf wieder herzustellen. Im Artikel Recovery Modus ist auch ein weiterer Hinweis, wie man an das Root-Filesystem gelangt, um Fehler zu korrigieren oder Einträge rückgängig zu machen.

nano /etc/nsswitch.conf

passwd:         files ldap
group:          files ldap
shadow:         files ldap
hosts:          files dns
networks:       files

Zuerst sollte man noch die erforderlichen Dienste neu laden oder den PC/VM neu starten.

/etc/init.d/nscd restart
service portmap restart
/etc/init.d/libnss-ldap restart

Jetzt ist es an der Zeit, die Konfiguration zu testen.

getent passwd

Es sollten die Benutzeraccounts vom LDAP-Repository angezeigt werden.

Funktionierts? Dann:

su <benutzerID des LDAP-Servers> 

Wird man nun nach einem Passwort gefragt, ist die LDAP-Authentifizierung schon aktiv. Ausser natürlich bei root.

Um die Config von Samba neu einzulesen wird davon abegraten Samba neu zu starten, da das Protokoll sehr lange braucht um wieder vollwertig verfügbar zu sein, immerhin wird das ganze Netzwerk gescannt und der Cache befüllt. Die Config kann man mit folgendem Befehl neu einlesen: smbcontrol all reload-config

Als ersters übergeben wir Samba das LDAPpasswort. Dies wird verschlüsselt in einer Datenbankfile gespeichert.

smbpasswd -w <ldappasswort>
Setting stored password for "cn=admin,dc=darkwolf,dc=lan" in secrets.tdb

Mit der Installation des nächsten Tools hat man die Möglichkeit auch von einem Windowsrechner sein Passwort wie gewohnt zu ändern. Diese Änderungen gelten dann für das LDAP.

aptitude install make gcc libc-dev
wget http://www.nomis52.net/data/mkntpwd.tar.gz
tar zxvf mkntpwd.tar.gz
cd mkntpwd
make
cp mkntpwd /usr/local/bin/

Nachdem man folgende Beispieldateien konfiguriert hat, kann man sich die Struktur im LDAP anlegen lassen. Hierbei wird auch die Domäne angelegt.

zcat /usr/share/doc/smbldap-tools/examples/slapd.conf.gz
/usr/share/doc/smbldap-tools/smbldap-tools.pdf.gz
/usr/share/doc/smbldap-tools/configure.pl.gz

Damit das nachfolgende Script läuft muss die smb.conf und die dazugehörigen Dateien smbldap_bind.conf und smbldap.conf im Verzeichnis /etc/smbldap-tools/ bereit liegen.

Beispiel:

smbldap_bind.conf
############################
# Credential Configuration #
############################
# Notes: you can specify two differents configuration if you use a
# master ldap for writing access and a slave ldap server for reading access
# By default, we will use the same DN (so it will work for standard Samba
# release)
#slaveDN="cn=Manager,dc=company,dc=com"
#slavePw="secret"
masterDN="cn=admin,dc=darkwolf,dc=lan"
masterPw="geheim"
smbldap.conf
# $Source: $
# $Id: smbldap.conf,v 1.18 2005/05/27 14:28:47 jtournier Exp $
#
# smbldap-tools.conf : Q & D configuration file for smbldap-tools
 
#  This code was developped by IDEALX (http://IDEALX.org/) and
#  contributors (their names can be found in the CONTRIBUTORS file).
#
#                 Copyright (C) 2001-2002 IDEALX
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU General Public License
#  as published by the Free Software Foundation; either version 2
#  of the License, or (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
#  USA.
 
#  Purpose :
#       . be the configuration file for all smbldap-tools scripts
 
##############################################################################
#
# General Configuration
#
##############################################################################
 
# Put your own SID. To obtain this number do: "net getlocalsid".
# If not defined, parameter is taking from "net getlocalsid" return
SID="S-1-5-21-22302fdf498-4864d36853-922s697"
 
# Domain name the Samba server is in charged.
# If not defined, parameter is taking from smb.conf configuration file
# Ex: sambaDomain="IDEALX-NT"
sambaDomain="DARKWOLF.LAN"
 
##############################################################################
#
# LDAP Configuration
#
##############################################################################
 
# Notes: to use to dual ldap servers backend for Samba, you must patch
# Samba with the dual-head patch from IDEALX. If not using this patch
# just use the same server for slaveLDAP and masterLDAP.
# Those two servers declarations can also be used when you have 
# . one master LDAP server where all writing operations must be done
# . one slave LDAP server where all reading operations must be done
#   (typically a replication directory)
 
# Slave LDAP server
# Ex: slaveLDAP=127.0.0.1
# If not defined, parameter is set to "127.0.0.1"
#slaveLDAP="127.0.0.1"
 
# Slave LDAP port
# If not defined, parameter is set to "389"
#slavePort="389"
 
# Master LDAP server: needed for write operations
# Ex: masterLDAP=127.0.0.1
# If not defined, parameter is set to "127.0.0.1"
masterLDAP="ldap-dc.darkwolf.lan"
 
# Master LDAP port
# If not defined, parameter is set to "389"
masterPort="389"
 
# Use TLS for LDAP
# If set to 1, this option will use start_tls for connection
# (you should also used the port 389)
# If not defined, parameter is set to "1"
ldapTLS="1"
 
# How to verify the server's certificate (none, optional or require)
# see "man Net::LDAP" in start_tls section for more details
#verify="require"
 
# CA certificate
# see "man Net::LDAP" in start_tls section for more details
#cafile="/etc/smbldap-tools/ca.pem"
 
# certificate to use to connect to the ldap server
# see "man Net::LDAP" in start_tls section for more details
#clientcert="/etc/smbldap-tools/smbldap-tools.pem"
 
# key certificate to use to connect to the ldap server
# see "man Net::LDAP" in start_tls section for more details
#clientkey="/etc/smbldap-tools/smbldap-tools.key"
 
# LDAP Suffix
# Ex: suffix=dc=IDEALX,dc=ORG
suffix="dc=darkwolf,dc=lan"
 
# Where are stored Users
# Ex: usersdn="ou=Users,dc=IDEALX,dc=ORG"
# Warning: if 'suffix' is not set here, you must set the full dn for usersdn
usersdn="ou=users,ou=people,${suffix}"
 
# Where are stored Computers
# Ex: computersdn="ou=Computers,dc=IDEALX,dc=ORG"
# Warning: if 'suffix' is not set here, you must set the full dn for computersdn
computersdn="ou=machines,${suffix}"
 
# Where are stored Groups
# Ex: groupsdn="ou=Groups,dc=IDEALX,dc=ORG"
# Warning: if 'suffix' is not set here, you must set the full dn for groupsdn
groupsdn="ou=windowsusergroups,ou=group,${suffix}"
 
# Where are stored Idmap entries (used if samba is a domain member server)
# Ex: groupsdn="ou=Idmap,dc=IDEALX,dc=ORG"
# Warning: if 'suffix' is not set here, you must set the full dn for idmapdn
idmapdn="ou=Idmap,${suffix}"
 
# Where to store next uidNumber and gidNumber available for new users and groups
# If not defined, entries are stored in sambaDomainName object.
# Ex: sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"
# Ex: sambaUnixIdPooldn="cn=NextFreeUnixId,${suffix}"
sambaUnixIdPooldn="sambaDomainName=${sambaDomain},dc=darkwolf,dc=lan"
 
# Default scope Used
scope="sub"
 
# Unix password encryption (CRYPT, MD5, SMD5, SSHA, SHA, CLEARTEXT)
hash_encrypt="SSHA"
 
# if hash_encrypt is set to CRYPT, you may set a salt format.
# default is "%s", but many systems will generate MD5 hashed
# passwords if you use "$1$%.8s". This parameter is optional!
crypt_salt_format="%s"
 
##############################################################################
# 
# Unix Accounts Configuration
# 
##############################################################################
 
# Login defs
# Default Login Shell
# Ex: userLoginShell="/bin/bash"
userLoginShell="/bin/zsh"
 
# Home directory
# Ex: userHome="/home/%U"
userHome="/home/%U"
 
# Default mode used for user homeDirectory
userHomeDirectoryMode="700"
 
# Gecos
userGecos="System User"
 
# Default User (POSIX and Samba) GID
defaultUserGid="513"
 
# Default Computer (Samba) GID
defaultComputerGid="515"
 
# Skel dir
skeletonDir="/etc/skel"
 
# Default password validation time (time in days) Comment the next line if
# you don't want password to be enable for defaultMaxPasswordAge days (be
# careful to the sambaPwdMustChange attribute's value)
defaultMaxPasswordAge="45"
 
##############################################################################
#
# SAMBA Configuration
#
##############################################################################
 
# The UNC path to home drives location (%U username substitution)
# Just set it to a null string if you want to use the smb.conf 'logon home'
# directive and/or disable roaming profiles
# Ex: userSmbHome="\\PDC-SMB3\%U"
userSmbHome="\\ldap-dc\%U"
 
# The UNC path to profiles locations (%U username substitution)
# Just set it to a null string if you want to use the smb.conf 'logon path'
# directive and/or disable roaming profiles
# Ex: userProfile="\\PDC-SMB3\profiles\%U"
userProfile="\\ldap-dc\profiles\%U"
 
# The default Home Drive Letter mapping
# (will be automatically mapped at logon time if home directory exist)
# Ex: userHomeDrive="H:"
userHomeDrive="U:"
 
# The default user netlogon script name (%U username substitution)
# if not used, will be automatically username.cmd
# make sure script file is edited under dos
# Ex: userScript="startup.cmd" # make sure script file is edited under dos
userScript="logon.bat"
 
# Domain appended to the users "mail"-attribute
# when smbldap-useradd -M is used
# Ex: mailDomain="idealx.com"
#mailDomain="idealx.com"
 
##############################################################################
#
# SMBLDAP-TOOLS Configuration (default are ok for a RedHat)
#
##############################################################################
 
# Allows not to use smbpasswd (if with_smbpasswd == 0 in smbldap_conf.pm) but
# prefer Crypt::SmbHash library
with_smbpasswd="1"
smbpasswd="/usr/bin/smbpasswd"
 
# Allows not to use slappasswd (if with_slappasswd == 0 in smbldap_conf.pm)
# but prefer Crypt:: libraries
with_slappasswd="1"
slappasswd="/usr/sbin/slappasswd"
 
# comment out the following line to get rid of the default banner
# no_banner="1"
smb.conf
[global]
 
   workgroup = DARKWOLF
   server string = LDAP-Samba PDC
   netbios name = ldap-dc
   server max protocol = NT1
   client ipc min protocol = SMB3_10
   security = user
   encrypt passwords = yes
   load printers = no
 
   log level = 1
   log file = /var/log/samba/log.%m
   max log size = 50
 
   passdb backend = ldapsam:ldap://ldap-dc.darkwolf.lan
 
   ldap admin dn = cn=admin,dc=darkwolf,dc=lan
   ldap passwd sync = yes
   ldap machine suffix = ou=machines,dc=darkwolf,dc=lan
   ldap User suffix = ou=users,ou=people,dc=darkwolf,dc=lan
   ldap Group Suffix = ou=windowsusergroups,ou=group,dc=darkwolf,dc=lan
   ldap suffix = dc=darkwolf,dc=lan
   ldap ssl = off
 
   tls enabled  = yes
   idmap config * : range = 10000-40000
 
   add user script = /usr/sbin/smbldap-useradd -m "%u"
   add machine script = /usr/sbin/smbldap-useradd -w "%u"
 
   add group script = /usr/sbin/smbldap-groupadd -p "%g"
   add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g"
   delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g"
   set primary group script = /usr/sbin/smbldap-usermod -g "%g" "%u"
   delete group script = /usr/sbin/smbldap-groupdel "%g"
   delete user script = /usr/sbin/smbldap-userdel "%u" -r "%u"
 
 
   local master = yes
   os level = 200
   domain master = yes
   preferred master = yes
   domain logons = yes
   wins support = yes
   dns proxy = no
 
   logon path = \\%N\profiles\%U
 
#============================ Share Definitions ==============================
[netlogon]
   comment = Network Logon Service
   path = /var/lib/samba/netlogon
   guest ok = yes
   browseable = no
   write list = root
 
 
[profiles]
   path = /var/lib/samba/profiles
   comment = Users profiles
   browseable = No
   read only = No
   force create mode = 0600
   force directory mode = 0700
   csc policy = disable
   store dos attributes = yes
   vfs objects = acl_xattr
 
 
[homes]
   path = /home/%U
   browseable = no
   valid users = %S
   read only = no
   create mask = 0664
   directory mask = 0775
 
[public]
   comment = Public Stuff
   path = /home/public
   writable = yes
   public = yes
   browseable = yes
   write list = @ldapbenutzer
 
 
[printers]
   comment = All Printers
   browseable = no
   path = /var/spool/samba
   printable = yes
   guest ok = no
   read only = yes
   create mask = 0700
 
[print$]
   comment = Printer Drivers
   path = /var/lib/samba/printers
   browseable = yes
   read only = yes
   guest ok = no
smbldap-populate

Am Ende wird man gefragt nach einem neue Rootpasswort. Dies wäre ein LDAP-Rootuser z.B. zum Hinzufügen eines Windowsrechner zur Domäne. Hier sollte man vorzugsweise das gleiche Passwort wie für den LDAPserver verwenden. Den User sollte man auch nur bei Verwendung aus dem Webinterface aktivieren.

Mit dem nächsten Befehlt sieht man ob man Zugriff auf die Datenbank hat, und wie die SID des Domänencontrollers heist.

net getlocalsid
net getdomainsid

Vorausetztung ist natürlich das der Client bereits am LDAP-Server hängt. Für die Anbindung an die Sambadomäne muss man Samba installieren und konfigurieren. Hier eine Minimalconfig mit 2 Freigaben.

smb.conf
[global]
 
   workgroup = DARKWOLF
   server string = Datenserver
   dns proxy = no
   security = domain
   log file = /var/log/samba/log.%m
   max log size = 1000
   panic action = /usr/share/samba/panic-action %d
   server role = standalone server
   passdb backend = tdbsam
   obey pam restrictions = yes
   unix password sync = yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
   pam password change = yes
   map to guest = bad user
   usershare allow guests = yes
 
#======================= Share Definitions =======================
 
[homes]
   path = /home/%U
   browseable = no
   valid users = %S
   read only = no
   create mask = 0664
   directory mask = 0775
 
[public]
   comment = Public Stuff
   path = /home/public
   writable = yes
   public = yes
   browseable = yes
   write list = @ldapbenutzer

Lokalen Rootgenutzer zu Samba hinzufügen. Kann man, muss man aber unter normalen Umständen nicht.

smbpasswd -a root

Beitreten einer Domäne:

net rpc join

Danach kann das ganze noch überprüfen:

net rpc info
net getdomainsid
smbclient -L /localhost