Ldapscripts

Aus ConfigWiki
Wechseln zu: Navigation, Suche

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. Bei 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 bei 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.

Bei Squeeze funktioniert das Erzeugen des Homeverzeichnis auch wieder.

Templates

Die Anpassung der Templates bei Lenny (s.u.) verursachte einen Fehler, der zumindest bei 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 bzw. besser _findentry() benutzen, siehe ldapsetpasswd)
  • 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>
Meine Werkzeuge