Ldapscripts
Die ldapscripts sind Kommandozeilentools für die Verwaltung von Unix-Benutzern im LDAP.
Inhaltsverzeichnis |
Konfiguration
Unter Debian wird durch /usr/share/ldapscripts/runtime.debian eine systemspezifische Konfiguration geladen, bevor /etc/ldapscripts/ldapscripts.conf verarbeitet wird. Lenny versucht in runtime.debian aus /etc/pam_ldap.conf (aus libpam-ldap) LDAP-spezifische Informationen auszulesen und bezieht das Passwort aus /etc/ldap.secret.
/usr/share/ldapscripts/runtime.debian (Lenny):
getfield() { field="$1" pamfile='/etc/pam_ldap.conf' value=`egrep "^[ \\t]*$field[ \\t]+" $pamfile | sed -e 's,\(^\|[\t ]\+\),\t,g' | cut -f 3` echo ${value:-$2} } getsuffix() { field="$1" value=`getfield "$1" | sed -e "s/,.*$//"` echo ${value:-$2} } # LDAP Configuration SERVER=`getfield host ` BINDDN=`getfield rootbinddn ` BINDPWD=`cat /etc/ldap.secret` SUFFIX=`getfield base` GSUFFIX=`getsuffix nss_base_group 'ou=Group'` USUFFIX=`getsuffix nss_base_passwd 'ou=People'` MSUFFIX=`getsuffix nss_base_hosts 'ou=Hosts'`
Squeeze versucht diese Informationen aus /etc/libnss-ldap.conf (aus libnss-ldap) zu beziehen.
/usr/share/ldapscripts/runtime.debian (Squeeze):
getfield() { local field="$1" local nssconffile='/etc/libnss-ldap.conf' if [ -f "$nssconffile" ];then local value=$(awk "/^\s*$field/ {print \$2}" /etc/libnss-ldap.conf) else local value="$2" fi echo ${value:-$2} } getsuffix() { field="$1" value="$(getfield "$1" | sed -e "s/,.*$//")" echo ${value:-$2} } # LDAP Configuration SERVER=$(getfield uri "$(getfield host )") BINDDN=$(getfield rootbinddn ) if [ -f /etc/libnss-ldap.secret ];then BINDPWDFILE=/etc/libnss-ldap.secret elif [ -f /etc/ldap.secret ];then BINDPWDFILE=/etc/ldap.secret fi SUFFIX=`getfield base` GSUFFIX=`getsuffix nss_base_group 'ou=Group'` USUFFIX=`getsuffix nss_base_passwd 'ou=People'` MSUFFIX=`getsuffix nss_base_hosts 'ou=Hosts'`
Wird libnss-ldapd eingesetzt, existiert die /etc/libnss-ldap.conf nicht mehr. Unter Lenny gehört zu diesem Paket der nslcd und ein Teil der Informationen wäre in /etc/nss-ldapd.conf wiederzufinden. Unter Squeeze ist der nslcd in ein eigenes Paket verlagert und /etc/nss-ldapd.conf heißt jetzt /etc/nslcd.conf.
Aufgrund dieser Veränderungen müssen die LDAP-spezifischen Parameter in /etc/ldapscripts/ldapscripts.conf angepaßt werden. /etc/ldap.secret und /etc/pam_ldap.secret, wie in ldapscripts.conf vorgeschlagen, existieren bei Squeeze nicht mehr, sodaß das Passwort nur noch für ldapscripts selbst hinterlegt werden muß.
DEBIAN: values from /etc/pam_ldap.conf are used. trifft ebenfalls nicht mehr zu (s.o.).
Weiterhin wird /etc/adduser.conf ausgewertet und folgende Variablen gesetzt:
/usr/share/ldapscripts/runtime.debian (Squeeze):
# User properties [ -f /etc/adduser.conf ] && . /etc/adduser.conf USHELL=${DSHELL:-"/bin/bash"} UHOMES=${DHOME:-"/home"}"/%u" HOMESKEL=${SKEL:-"/etc/skel"} HOMEPERMS=${DIR_MODE:-"0755"}
(bei Lenny nur USHELL & UHOMES)
weitere Vorgabewerte bei Lenny:
# Start with these IDs *if no entry found in LDAP* UIDSTART=`getfield pam_min_uid 1000` GIDSTART=`getfield pam_min_gid 1000` MIDSTART="1000" CREATEHOMES="no"
Squeeze vergibt hier keine Vorgaben mehr.
Daraus resultiert unter Squeeze folgende Konfiguration.
/etc/ldapscripts/ldapscripts.conf:
SERVER="ldap://localhost" BINDDN="cn=admin,dc=debian,dc=local" BINDPWDFILE="/etc/ldapscripts/ldapscripts.passwd" SUFFIX="dc=debian,dc=local" GSUFFIX="ou=group" USUFFIX="ou=people" MSUFFIX="ou=hosts" # Start with these IDs *if no entry found in LDAP* GIDSTART="1000" # Group ID UIDSTART="1000" # User ID MIDSTART="10000" # Machine ID CREATEHOMES="yes" HOMEPERMS="751" ASKGECOS="yes" PASSWORDGEN=<ask> LOGFILE="/var/log/ldapscripts.log" TMPDIR="/tmp" ICONVBIN="/usr/bin/iconv" ICONVCHAR="ISO-8859-15" UUDECODEBIN="/usr/bin/uudecode" GETENTPWCMD="getent passwd" GETENTGRCMD="getent group" GTEMPLATE="/etc/ldapscripts/ldapaddgroup.template" UTEMPLATE="/etc/ldapscripts/ldapadduser.template" MTEMPLATE="/etc/ldapscripts/ldapaddmachine.template"
Es reicht, wenn "der Rest der Welt" das Homeverzeichnis (und damit auch blind Unterverzeichnisse, z.B. htdocs) betreten darf, Lesen ist nicht nötig. Die in der Config angegebenen Programme müssen natürlich auch installiert sein.
Unter Squeeze funktioniert das Erzeugen des Homeverzeichnis auch wieder.
Templates
Die Anpassung der Templates unter Lenny (s.u.) verursachte einen Fehler, der zumindest unter Squeeze lokalisiert werden konnte. Beim Anlegen eines Users mit ldapadduser wurde kein Passwort eingetragen, aber auch kein Fehler gemeldet. Die Ursache dafür ist im geänderten DN zu suchen. Eingetragen wurde im LDAP cn=<USERNAME>,$SUFFIX. Das Passwort dabei nicht direkt gesetzt, sondern in einem 2. Schritt. Hier wurde versucht, uid=<USERNAME>,$SUFFIX zu modifizieren. Obwohl das Attribut uid ebenso wie cn gesetzt war, ldappasswd benötigt aber den DN als Angabe. uid ist aber in ldapadduser hartverdrahtet.
TODO:
- Patch ausarbeiten! (Template nach dn: parsen)
- Patch für ASKGECOS (statt Fullname sn + givenName separat abfragen und für gecos und description zusammenfügen)
bisherige Konfiguration unter Lenny
/etc/ldapscripts (gekürzt):
## Server name SERVER=localhost ## Bind DN BINDDN='cn=admin,dc=debian,dc=local' ## Bind Password or file BINDPWDFILE="/etc/ldap.secret" ## Default suffix SUFFIX='dc=debian,dc=local' ## Group/User(aka People)/Machines (aka Hosts) Organizational Unit GSUFFIX='ou=group' USUFFIX='ou=people' MSUFFIX='ou=hosts' ## log everything that is performed by those scripts LOGFILE="/var/log/ldapscripts.log" ## Start with these IDs *if no entry found in LDAP* GIDSTART=1000 UIDSTART=1000 MIDSTART=10000 ## Ask for user's gecos (full name) ? ASKGECOS="yes" ## Does the script should create homes ? CREATEHOMES="yes" ## Default permissions for home directories HOMEPERMS="751" # You can specify custom LDIF templates here # Leave empty to use default templates # See *.template.sample for default templates GTEMPLATE="/etc/ldapscripts/ldapaddgroup.template" UTEMPLATE="/etc/ldapscripts/ldapadduser.template" MTEMPLATE="/etc/ldapscripts/ldapaddmachine.template"
Da unter Debian von den ldapscripts direkt auf /etc/ldap.secrets zugegriffen wird, passen wir BINDPWDFILE entsprechend an und ersetzen /etc/ldap.secret durch einen Link auf /etc/pam_ldap.secret. Das vermeidet spätere Inkonsistenzen bei einer Änderung.
Die Templates werden entsprechend kopiert und im Usertemplate werden 'dn' und 'description' angepaßt:
/etc/ldapscripts# diff ldapadduser.template.sample ldapadduser.template 1c1 < dn: uid=<user>,<usuffix>,<suffix> --- > dn: cn=<user>,<usuffix>,<suffix> 11c11 < description: User account --- > description: <gecos>
Description kann später im LDAP-Verzeichnis mit einem sinnvollerem Wert belegt werden, mit den Kommandozeilentools ist das leider nicht möglich. (Das Erzeugen des Homeverzeichnisses funktionierte später im Test leider trotzdem nicht, sodaß auf pam_mkhomedir ausgewichen werden mußte.)
ldapadduser erzeugt einen LDAP-Eintrag mit den Objektklassen 'account' und 'posixAccount'. Besser wäre jedoch 'inetOrgPerson' statt 'account', in Hinsicht auf die Nutzung der Daten für weitere Zwecke. Dies kann zwar im Usertemplate angepaßt werden, hat jedoch den Nachteil, daß ldapadduser Vor- und Nachnamen nicht getrennt abruft und somit keine passende Information für das Attribut 'sn' (surname = Familienname) hat. Mit Änderung von /usr/bin/ldapadduser (siehe ASKGECOS) für die Abfrage der korrekten Daten und /usr/share/ldapscripts/runtime (bei _filterldif) für die Ersetzung der neuen Platzhalter im Template ist dieses Problem für die Kommandozeile lösbar.
Alternativ kann phpldapadmin zum Anlegen der Benutzer verwendet werden oder eigene Skripte erstellt werden.
Benutzer/Gruppen anlegen, ändern oder löschen
Dem Debian-Schema folgend, wird (zuerst) für jeden Benutzer eine gleichnamige Gruppe angelegt, wobei auf die Angabe der GID i.a. verzichtet werden kann:
ldapaddgroup <groupname> [gid]
Daraufhin kann der Benutzer hinzugefügt werden, wobei auch hier auf die UID verzichtet werden kann:
ldapadduser <username> <groupname> [uid]
Den Benutzer zu weiteren Gruppen hinzufügen:
ldapaddusertogroup <username | uid> <groupname | gid>
Die primäre Gruppe ändern:
ldapsetprimarygroup <username | uid> <groupname | gid>
Den Benutzer umbenennen (das Homeverzeichnis bleibt dabei unverändert!):
ldaprenameuser <old username | uid> <new username>
Und die entsprechenden Kommandos zum löschen:
ldapdeletegroup <groupname | gid> ldapdeleteuser <username | uid> ldapdeleteuserfromgroup <username> <groupname | gid>