LDAP-Scripte gefixt und genauer im Bericht beschrieben

This commit is contained in:
Alfred Krohmer 2013-11-26 11:31:01 +01:00
parent ff2c9d467b
commit 75a032abe4
3 changed files with 54 additions and 2 deletions

View File

@ -27,6 +27,8 @@ do
continue
fi
line="`echo $line | cut -d ' ' -f 1`"
echo "Deleting user ${line}..."
ldapdelete -x -w "$SECRET" -D cn=admin,dc=zotac,dc=lctp "cn=$line,ou=users,dc=zotac,dc=lctp" >/dev/null

View File

@ -5,6 +5,8 @@ import crypt
import base64
import grp
import pwd
import random
import os
ldif_add = """dn: cn=%(name)s,ou=users,dc=zotac,dc=lctp
gidNumber: %(gid)s
@ -25,6 +27,13 @@ objectClass: posixGroup
gidNumber: %(gid)s
cn: %(name)s"""
alpha_low = "abcdefghijklmnopqrstuvwxyz"
alpha_up = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
num = "0123456789"
special = "!$%/()=?[]{}+#<>,;:.-_"
user_alphabet = alpha_low + num + '_'
passwd_alphabet = alpha_low + alpha_up + num + special
if len(sys.argv) < 2:
print("Usage: %s <users-file>" % sys.argv[0], file=sys.stderr)
exit(1)
@ -35,9 +44,37 @@ groups = [gr.gr_name for gr in grp.getgrall()]
last_uid = max([user.pw_uid for user in pwd.getpwall()])
last_gid = max([user.gr_gid for user in grp.getgrall()])
def isValidPassword(pw):
if not (9 <= len(pw) <= 128):
return False
pwset = set(pw)
if not (pwset & set(alpha_low)) or \
not (pwset & set(alpha_up)) or \
not (pwset & set(num)) or \
not (pwset & set(special)):
return False
return True
pwdfile = open(sys.argv[1] + ".passwords", "w")
os.fchown(pwdfile.fileno(), 0, 0)
os.chmod(pwdfile.fileno(), 0o600)
for line in open(sys.argv[1]).readlines():
line = line.strip()
user, password = line.split(maxsplit=1)
line = line.strip().lower()
user = line[:]
for i in range(len(user)):
c = user[i]
if c not in user_alphabet:
user = user[0:i] + '_' + user[i+1:]
user = user.strip('_')
password = ""
while not isValidPassword(password):
password = ''.join([passwd_alphabet[random.randrange(len(passwd_alphabet))] for i in range(random.randrange(10, 16))])
print("%s %s" % (user, password), file=pwdfile)
if user in users:
print("Skipping user %s (multiple occurences or user already existing)" % user, file=sys.stderr)

View File

@ -70,3 +70,16 @@ Das Script erstellt das Home-Verzeichnis des Nutzers, ändert den Besitzer und d
\paragraph{Anlegen und Löschen von Benutzern}
Zum Anlegen und Löschen von Benutzern aus einer Text-Datei (wie in der Aufgabe gefordert) haben wir die Scripte {\tt ldap-users2ldif} (erstellt einen {\tt .ldif} Output anhand der Text-Datei), {\tt ldap-add-ldif} (fügt die im {\tt .ldif} Format vorliegenden Benutzerbeschreibungen zur LDAP-Datenbank hinzu) und {\tt ldap-delete-users} (löscht die in einer Text-Datei aufgelisteten Benutzer aus der LDAP-Datenbank) geschrieben (siehe Dateien in {\tt aufgabe3.5/ldap-tools}).
Für eine Datei, z.B. {\tt user.txt}, die die hinzuzufügenden Benutzernamen zeilenweise enthält:
\begin{itemize}
\item {\tt sudo ldap-users2ldif user.txt > user.txt.ldif} \\
erstellt eine {\tt .ldif}-Datei; erstellt außerdem {\tt user.txt.passwords}, die die Benutzernamen und Passwörter zeilenweise enthält; die Benutzernamen werden escaped (nur Kleinbuchstaben, Zahlen und »\_«, invalide Zeichen durch »\_« ersetzt, »\_« am Anfang und am Ende gestript); Passwörter zufällig erzeugt (mindestens jeweils ein Großbuchstabe, Kleinbuchstabe, Sonderzeichen und mindestens eine Zahl, zwischen 10 und 16 Zeichen lang); bereits existierende Benutzer oder doppelt vorkommende Nutzer werden mit einer Warnmeldung quittiert und ignoriert
\item {\tt sudo ldap-add-ldif user.txt.ldif} \\
fügt die {\tt .ldif}-Datei zu LDAP hinzu
\item {\tt sudo ldap-delete-users user.txt.passwords} \\
löscht die in der erzeugten Datei {\tt user.txt.passwords} zeilenweise aufgelisteten Benutzer und entfernt ihr Home-Verzeichnis (diese Datei ist notwendig, weil die Benutzernamen unter Umständen escaped wurden)
\end{itemize}