Difference between revisions of "Mac OS X"

From Univention Wiki

Jump to: navigation, search
m (Fix highlighting and category)
Line 18: Line 18:
 
Nach der Aktivierung des Protokolls „LDAPv3“ kann dieses über „Konfigurieren“ eingerichtet werden. In die Serverliste muss über „neu“ ein Eintrag hinzugefügt werden. Der Name ist frei wählbar, als Server wird der FQDN eines UCS LDAP-Servers (DC-Master, DC-Backup, DC-Slave) eingetragen. Der „LDAP-Pfad“ muss auf „<nowiki>RFC 2307 (UNIX)</nowiki>“ gesetzt werden. Der Verzeichnisdienste-Manager fragt anschliessend die LDAP-Basis (Variable „ldap/base“ aus Univention Baseconfig) als „Suchbeginn-Suffix“ ab. Die Anmeldung ist nach einiger Zeit bzw. einem Neustart von MacOS X möglich, um den zuständigen Dienst sofort neu zu starten kann folgender Befehl (in einem Terminal) verwendet werden:  
 
Nach der Aktivierung des Protokolls „LDAPv3“ kann dieses über „Konfigurieren“ eingerichtet werden. In die Serverliste muss über „neu“ ein Eintrag hinzugefügt werden. Der Name ist frei wählbar, als Server wird der FQDN eines UCS LDAP-Servers (DC-Master, DC-Backup, DC-Slave) eingetragen. Der „LDAP-Pfad“ muss auf „<nowiki>RFC 2307 (UNIX)</nowiki>“ gesetzt werden. Der Verzeichnisdienste-Manager fragt anschliessend die LDAP-Basis (Variable „ldap/base“ aus Univention Baseconfig) als „Suchbeginn-Suffix“ ab. Die Anmeldung ist nach einiger Zeit bzw. einem Neustart von MacOS X möglich, um den zuständigen Dienst sofort neu zu starten kann folgender Befehl (in einem Terminal) verwendet werden:  
  
sudo kill `cat /var/run/lookupd.pid`
+
<source lang=bash>
 +
sudo kill `cat /var/run/lookupd.pid`
 +
</source>
  
 
Zur Kontrolle kann über den Befehl „id“ abgefragt werden, ob Benutzer auf Mac OS X bekannt sind:  
 
Zur Kontrolle kann über den Befehl „id“ abgefragt werden, ob Benutzer auf Mac OS X bekannt sind:  
 
+
<source lang=bash>
id gregor  
+
id gregor  
uid=3499(gregor) gid=5225(Domain Users) groups=5225(Domain Users)
+
uid=3499(gregor) gid=5225(Domain Users) groups=5225(Domain Users)
 
+
</source>
 
'''<br>Einschränkungen:'''<br>In der beschriebenen Variante greift das System anonym auf das LDAP zu und kann daher nicht kontrollieren ob Passwörter abgelaufen sind. Dazu ist eine Kerberos-Anbindung notwendig (siehe unten).  
 
'''<br>Einschränkungen:'''<br>In der beschriebenen Variante greift das System anonym auf das LDAP zu und kann daher nicht kontrollieren ob Passwörter abgelaufen sind. Dazu ist eine Kerberos-Anbindung notwendig (siehe unten).  
  
Line 30: Line 32:
  
 
NFS Das Einbinden des Heimatverzeichnisses und anderer Freigaben über NFS erfolgt durch das automount-System von Mac OS X, d.h. die Verzeichnisse werden beim ersten Zugriff eingebunden. Die Konfiguration wird über NetInfo durchgeführt, der sich ebenfalls im „Finder“ unter „Programme“, „Dienstprogramme“ findet. Nach dem Start und einer evtl. notwendigen Authentifzierung können NFS-Zugriffe im Bereich „mounts“ eingetragen werden. Dazu wird „mounts“ ausgewählt und über „Neu“ ein neuer Eintrag erzeugt. Für den Zugriff auf eine Freigabe müssen folgende Eigenschaft/Wert-Paare erzeugt werden:  
 
NFS Das Einbinden des Heimatverzeichnisses und anderer Freigaben über NFS erfolgt durch das automount-System von Mac OS X, d.h. die Verzeichnisse werden beim ersten Zugriff eingebunden. Die Konfiguration wird über NetInfo durchgeführt, der sich ebenfalls im „Finder“ unter „Programme“, „Dienstprogramme“ findet. Nach dem Start und einer evtl. notwendigen Authentifzierung können NFS-Zugriffe im Bereich „mounts“ eingetragen werden. Dazu wird „mounts“ ausgewählt und über „Neu“ ein neuer Eintrag erzeugt. Für den Zugriff auf eine Freigabe müssen folgende Eigenschaft/Wert-Paare erzeugt werden:  
 
+
<source lang="ini">
name: &lt;Server&gt;:&lt;serverseitiger_Pfad&gt;
+
name: <Server>:<serverseitiger_Pfad>
dir: &lt;lokaler_Pfad&gt;
+
dir: <lokaler_Pfad>
opts: -P
+
opts: -P
type: nfs
+
type: nfs
 +
</source>
  
 
Die Werte entsprechen unter Linux einem mount-Befehl mit folgenden Paramtern:  
 
Die Werte entsprechen unter Linux einem mount-Befehl mit folgenden Paramtern:  
 
+
<source lang=bash>
mount -t &lt;type&gt; -o &lt;opts&gt; &lt;name&gt; &lt;dir&gt;
+
mount -t <type> -o <opts> <name> <dir>
 +
</source>
  
 
Soll das Verzeichnis „/mac-homes“ vom Server „DC Slave“ lokal als „/home“ eingebunden werden, müssen folgende Werte gesetzt werden:  
 
Soll das Verzeichnis „/mac-homes“ vom Server „DC Slave“ lokal als „/home“ eingebunden werden, müssen folgende Werte gesetzt werden:  
 
+
<source lang="ini">
name: DC-Slave:/mac-homes
+
name: DC-Slave:/mac-homes
dir: /home
+
dir: /home
opts: -P
+
opts: -P
type: nfs
+
type: nfs
 
+
</source>
 
'''<br>Einschränkungen:'''<br>Bei NFS an Mac OS X ist zu beachten, das die Kontrolle der Zugriffsrechte auf Seite von Mac OS X geprüft wird. Daher sollte unbedingt auf eine funktionierende Auflösung von Gruppenmitgliedschaften geachtet werden (Mac OS X unterstützt z.B. keine verschachtelten Gruppen).
 
'''<br>Einschränkungen:'''<br>Bei NFS an Mac OS X ist zu beachten, das die Kontrolle der Zugriffsrechte auf Seite von Mac OS X geprüft wird. Daher sollte unbedingt auf eine funktionierende Auflösung von Gruppenmitgliedschaften geachtet werden (Mac OS X unterstützt z.B. keine verschachtelten Gruppen).
  
Line 56: Line 60:
  
 
In der Datei ist folgender (ggf. ähnlich aussehender) Abschnitt zu suchen:
 
In der Datei ist folgender (ggf. ähnlich aussehender) Abschnitt zu suchen:
 
+
<source lang=xml>
                <key>system.login.console</key>
+
<key>system.login.console</key>
                <dict>
+
<dict>
                        <key>class</key>
+
        <key>class</key>
                        <string>evaluate-mechanisms</string>
+
        <string>evaluate-mechanisms</string>
                        <key>comment</key>
+
        <key>comment</key>
                        <string>Login mechanism based rule.  Not for general use, yet.
+
        <string>Login mechanism based rule.  Not for general use, yet.
                                builtin:krb5authenticate can be used to hinge local authentication on a successful kerberos authentication and kdc verification.
+
                builtin:krb5authenticate can be used to hinge local authentication on a successful kerberos authentication and kdc verification.
                                                                builtin:krb5authnoverify skips the kdc verification.  Both fall back on local authentication.</string>
+
                                                builtin:krb5authnoverify skips the kdc verification.  Both fall back on local authentication.</string>
                        <key>mechanisms</key>
+
        <key>mechanisms</key>
                        <array>
+
        <array>
                                <string>builtin:auto-login,privileged</string>
+
                <string>builtin:auto-login,privileged</string>
                                <string>loginwindow_builtin:login</string>
+
                <string>loginwindow_builtin:login</string>
                                <string>builtin:reset-password,privileged</string>
+
                <string>builtin:reset-password,privileged</string>
                                                                <string>authinternal</string>
+
                                                <string>authinternal</string>
                                <string>builtin:getuserinfo,privileged</string>
+
                <string>builtin:getuserinfo,privileged</string>
                                <string>builtin:sso,privileged</string>
+
                <string>builtin:sso,privileged</string>
                                <string>HomeDirMechanism:login,privileged</string>
+
                <string>HomeDirMechanism:login,privileged</string>
                                <string>HomeDirMechanism:status</string>
+
                <string>HomeDirMechanism:status</string>
                                <string>MCXMechanism:login</string>
+
                <string>MCXMechanism:login</string>
                                <string>loginwindow_builtin:success</string>
+
                <string>loginwindow_builtin:success</string>
                                <string>loginwindow_builtin:done</string>
+
                <string>loginwindow_builtin:done</string>
                        </array>
+
        </array>
                </dict>
+
</dict>
 
+
</source>
  
 
Die Zeile "<string>authinternal</string>" ist durch die Zeile "<string>builtin:krb5authnoverify,privileged</string>" zu ersetzen.
 
Die Zeile "<string>authinternal</string>" ist durch die Zeile "<string>builtin:krb5authnoverify,privileged</string>" zu ersetzen.
Line 87: Line 91:
  
 
Dieses Beispiel-Skript enthält zusaätzlich Passagen zur Integration in UCS@School, die variablen am Anfang des Skriptes müssen auf das jeweilige System angepasst werden:
 
Dieses Beispiel-Skript enthält zusaätzlich Passagen zur Integration in UCS@School, die variablen am Anfang des Skriptes müssen auf das jeweilige System angepasst werden:
 +
<source lang=bash>
 +
#!/bin/sh
 +
#
 +
#############################
 +
# CONFIG SECTION START
 +
#############################
 +
 +
OU="XXX" # Schul-Nummer
 +
LDAPBASEDN="dc=XXX"  # LDAP-Basis
 +
DNSZONE="XXX" # DNS-Basis
 +
LDAPSERVER="dc${OU}.${DNSZONE}"
 +
NFSSERVER="dc${OU}.${DNSZONE}"
 +
 +
#############################
 +
# CONFIG SECTION END
 +
#############################
 +
 +
createLink () {
 +
SRC="$1"
 +
DST="$2"
 +
# create symlink Documents
 +
if [ ! -e "$DST" ] ; then
 +
echo "symlink $DST does not exist -- creating symlink to $SRC"
 +
if [ -e "$SRC" ] ; then
 +
ln -s "$SRC" "$DST" 2>&1 || true
 +
else
 +
echo "$SRC does not exist"
 +
fi
 +
fi
 +
}
 +
 +
createDir() {
 +
DIR="$1"
 +
USR="$2"
 +
GRP="$3"
 +
if [ -n "$DIR" -a ! -e "$DIR" ] ; then
 +
echo "directory $DIR does not exist - creating dir"
 +
mkdir -p "$DIR" 2>&1 || true
 +
fi
 +
if [ -n "$DIR" ] ; then
 +
echo "changing owner to $USR"
 +
chown "$USR" "$DIR" 2>&1 || true
 +
if [ -n "$GRP" ] ; then
 +
echo "changing group to $GRP"
 +
chgrp "$GRP" "$DIR" 2>&1 || true
 +
fi
 +
fi
 +
}
 +
 +
#############################
 +
 +
 +
# append print stdout to /var/log/univention.login.log
 +
exec >> /var/log/univention.login.log
 +
 +
#
 +
echo "----------------------------------------"
 +
date
 +
echo "----------------------------------------"
 +
 +
USERNAME="$1"
 +
 +
echo "USERNAME: $USERNAME"
 +
 +
# uncomment following line for debug console
 +
# /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal
 +
 +
# check if ldap server is reachable
 +
ping -o -t 5 $LDAPSERVER
 +
RET="$?"
 +
echo "LDAPSERVER: $LDAPSERVER  RET=$RET"
 +
if [ "$RET" = "0" ] ; then
 +
 +
# get expire time
 +
A=$(ldapsearch -LLLx -h $LDAPSERVER -b "$LDAPBASEDN" uid=$USERNAME krb5PasswordEnd | grep -i ^krb5PasswordEnd | cut -d' ' -f2 | tr -c -d '[0-9]')
 +
if [ -n "$A" ] ; then
 +
echo "EXPIRETIME: $A"
 +
let A=$A
 +
 +
# get current time
 +
let B=$(date +%Y%m%d%H%M%S)
 +
echo "CURRENTTIME: $B"
 +
 +
if [ "$A" -lt "$B" ] ; then
 +
DOKILL=1
 +
NEWPWOK=0
 +
echo "Password expired - asking for new one"
 +
for i in 1 2 3 ; do
 +
if [ "$NEWPWOK" = "0" ] ; then
 +
echo "Asking for password: $i"
 +
/usr/bin/kpasswd $USERNAME < /dev/zero 2>&1
 +
if [ "$?" = "0" ] ; then
 +
echo "Password changed successfully"
 +
DOKILL=0
 +
NEWPWOK=1
 +
fi
 +
fi
 +
done
 +
if [ "$DOKILL" = "1" ] ; then
 +
echo "PWCHANGE FAILED - KILLING LOGIN WINDOW"
 +
kill $(ps ax | grep "[/]System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow console" | awk '{print $1}') 2>&1
 +
fi
 +
fi
 +
fi
 +
 +
fi
 +
 +
# test if NFSServer is reachable
 +
NFSHOST=$(echo $NFSSERVER | cut -d: -f1)
 +
ping -o -t 5 $NFSHOST
 +
RET="$?"
 +
echo "NFSHOST: $NFSHOST  RET=$RET"
 +
if [ "$RET" = "0" ] ; then
 +
 +
# Mount /home
 +
if [ "`mount | grep -c "$NFSSERVER:/home on"`" = "0" ] ; then
 +
if [ ! -e "/home" ] ; then
 +
echo "mountpoint /home does not exist... creating /home"
 +
mkdir -p /home 2>&1 || true
 +
echo "/home created"
 +
fi
 +
echo "Mounting /home"
 +
mount_nfs -P "$NFSSERVER:/home" /home 2>&1 || true
 +
fi
 +
 +
# Mount /home/groups
 +
if [ "`mount | grep -c "$NFSSERVER:/home/groups on"`" = "0" ] ; then
 +
if [ ! -e "/home/groups" ] ; then
 +
echo "mountpoint /home/groups does not exist... creating /home/groups"
 +
mkdir -p /home/groups 2>&1 || true
 +
echo "/home/groups created"
 +
fi
 +
echo "Mounting /home/groups"
 +
mount_nfs -P "$NFSSERVER:/home/groups" /home/groups 2>&1 || true
 +
fi
 +
 +
# create user's home directory if missing and make sure permissions are correct
 +
HOMEDIR=$(ldapsearch -LLLx -h $LDAPSERVER -b "$LDAPBASEDN" uid=$USERNAME homeDirectory | grep -i ^homeDirectory | cut -d' ' -f2)
 +
GIDNUMBER=$(ldapsearch -LLLx -h $LDAPSERVER -b "$LDAPBASEDN" uid=$USERNAME gidNumber | grep -i ^gidNumber | cut -d' ' -f2)
 +
UIDNUMBER=$(ldapsearch -LLLx -h $LDAPSERVER -b "$LDAPBASEDN" uid=$USERNAME uidNumber | grep -i ^uidNumber | cut -d' ' -f2)
 +
echo "HOMEDIR=$HOMEDIR"
 +
echo "UIDNUMBER=$UIDNUMBER"
 +
echo "GIDNUMBER=$GIDNUMBER"
  
#!/bin/sh
+
createDir "/home/$USERNAME" "$UIDNUMBER" "$GIDNUMBER"
#
+
createDir "/home/$USERNAME/Desktop" "$UIDNUMBER" "$GIDNUMBER"
#############################
+
createDir "/home/$USERNAME/Documents" "$UIDNUMBER" "$GIDNUMBER"
# CONFIG SECTION START
+
createDir "/home/$USERNAME/Eigene Dateien" "$UIDNUMBER" "$GIDNUMBER"
#############################
+
createDir "/home/$USERNAME/Library/Preferences" "$UIDNUMBER" "$GIDNUMBER"
+
 
OU="XXX" # Schul-Nummer
+
# remove old symlinks
LDAPBASEDN="dc=XXX"  # LDAP-Basis
+
find /home/$USERNAME -type l -print0 | xargs -0 -n10 rm -Rf
DNSZONE="XXX" # DNS-Basis
+
 
LDAPSERVER="dc${OU}.${DNSZONE}"
+
# create symlinks
NFSSERVER="dc${OU}.${DNSZONE}"
+
createLink "/home/$USERNAME/windows-profiles/WinXP/Desktop" "/home/$USERNAME/Desktop/WinXP-Desktop"
+
createLink "/home/$USERNAME/Eigene Dateien" "/home/$USERNAME/Desktop/Eigene_Dateien"
#############################
+
createLink "/home/groups/marktplatz" "/home/$USERNAME/Desktop/Marktplatz"
# CONFIG SECTION END
+
 
#############################
+
# create symlink to class directory on user's desktop
+
CLASSLIST=$(ldapsearch -LLLx -h $LDAPSERVER -b "cn=klassen,cn=schueler,cn=groups,ou=$OU,$LDAPBASEDN" "memberUid=$USERNAME" | grep ^cn | cut -d' ' -f2-)
createLink () {
+
for CLASS in $CLASSLIST ; do
SRC="$1"
+
SHAREPATH=$(ldapsearch -LLLx -h $LDAPSERVER -b "cn=klassen,cn=shares,ou=$OU,$LDAPBASEDN" "cn=$CLASS" univentionSharePath | grep ^univen | cut -d' ' -f2-)
DST="$2"
+
createLink "$SHAREPATH" "/home/$USERNAME/Desktop/$CLASS"
# create symlink Documents
+
done
if [ ! -e "$DST" ] ; then
+
fi
echo "symlink $DST does not exist -- creating symlink to $SRC"
+
 
if [ -e "$SRC" ] ; then
+
 
ln -s "$SRC" "$DST" 2>&1 || true
+
echo "LOGIN-HOOK DONE"
else
+
 
echo "$SRC does not exist"
+
 
fi
+
exit 0
fi
+
</source>
}
 
 
createDir() {
 
DIR="$1"
 
USR="$2"
 
GRP="$3"
 
if [ -n "$DIR" -a ! -e "$DIR" ] ; then
 
echo "directory $DIR does not exist - creating dir"
 
mkdir -p "$DIR" 2>&1 || true
 
fi
 
if [ -n "$DIR" ] ; then
 
echo "changing owner to $USR"
 
chown "$USR" "$DIR" 2>&1 || true
 
if [ -n "$GRP" ] ; then
 
echo "changing group to $GRP"
 
chgrp "$GRP" "$DIR" 2>&1 || true
 
fi
 
fi
 
}
 
 
#############################
 
 
 
# append print stdout to /var/log/univention.login.log
 
exec >> /var/log/univention.login.log
 
 
#
 
echo "----------------------------------------"
 
date
 
echo "----------------------------------------"
 
 
USERNAME="$1"
 
 
echo "USERNAME: $USERNAME"
 
 
# uncomment following line for debug console
 
# /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal
 
 
# check if ldap server is reachable
 
ping -o -t 5 $LDAPSERVER
 
RET="$?"
 
echo "LDAPSERVER: $LDAPSERVER  RET=$RET"
 
if [ "$RET" = "0" ] ; then
 
 
# get expire time
 
A=$(ldapsearch -LLLx -h $LDAPSERVER -b "$LDAPBASEDN" uid=$USERNAME krb5PasswordEnd | grep -i ^krb5PasswordEnd | cut -d' ' -f2 | tr -c -d '[0-9]')
 
if [ -n "$A" ] ; then
 
echo "EXPIRETIME: $A"
 
let A=$A
 
 
# get current time
 
let B=$(date +%Y%m%d%H%M%S)
 
echo "CURRENTTIME: $B"
 
 
if [ "$A" -lt "$B" ] ; then
 
DOKILL=1
 
NEWPWOK=0
 
echo "Password expired - asking for new one"
 
for i in 1 2 3 ; do
 
if [ "$NEWPWOK" = "0" ] ; then
 
echo "Asking for password: $i"
 
/usr/bin/kpasswd $USERNAME < /dev/zero 2>&1
 
if [ "$?" = "0" ] ; then
 
echo "Password changed successfully"
 
DOKILL=0
 
NEWPWOK=1
 
fi
 
fi
 
done
 
if [ "$DOKILL" = "1" ] ; then
 
echo "PWCHANGE FAILED - KILLING LOGIN WINDOW"
 
kill $(ps ax | grep "[/]System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow console" | awk '{print $1}') 2>&1
 
fi
 
fi
 
fi
 
 
fi
 
 
# test if NFSServer is reachable
 
NFSHOST=$(echo $NFSSERVER | cut -d: -f1)
 
ping -o -t 5 $NFSHOST
 
RET="$?"
 
echo "NFSHOST: $NFSHOST  RET=$RET"
 
if [ "$RET" = "0" ] ; then
 
 
# Mount /home
 
if [ "`mount | grep -c "$NFSSERVER:/home on"`" = "0" ] ; then
 
if [ ! -e "/home" ] ; then
 
echo "mountpoint /home does not exist... creating /home"
 
mkdir -p /home 2>&1 || true
 
echo "/home created"
 
fi
 
echo "Mounting /home"
 
mount_nfs -P "$NFSSERVER:/home" /home 2>&1 || true
 
fi
 
 
# Mount /home/groups
 
if [ "`mount | grep -c "$NFSSERVER:/home/groups on"`" = "0" ] ; then
 
if [ ! -e "/home/groups" ] ; then
 
echo "mountpoint /home/groups does not exist... creating /home/groups"
 
mkdir -p /home/groups 2>&1 || true
 
echo "/home/groups created"
 
fi
 
echo "Mounting /home/groups"
 
mount_nfs -P "$NFSSERVER:/home/groups" /home/groups 2>&1 || true
 
fi
 
 
# create user's home directory if missing and make sure permissions are correct
 
HOMEDIR=$(ldapsearch -LLLx -h $LDAPSERVER -b "$LDAPBASEDN" uid=$USERNAME homeDirectory | grep -i ^homeDirectory | cut -d' ' -f2)
 
GIDNUMBER=$(ldapsearch -LLLx -h $LDAPSERVER -b "$LDAPBASEDN" uid=$USERNAME gidNumber | grep -i ^gidNumber | cut -d' ' -f2)
 
UIDNUMBER=$(ldapsearch -LLLx -h $LDAPSERVER -b "$LDAPBASEDN" uid=$USERNAME uidNumber | grep -i ^uidNumber | cut -d' ' -f2)
 
echo "HOMEDIR=$HOMEDIR"
 
echo "UIDNUMBER=$UIDNUMBER"
 
echo "GIDNUMBER=$GIDNUMBER"
 
 
createDir "/home/$USERNAME" "$UIDNUMBER" "$GIDNUMBER"
 
createDir "/home/$USERNAME/Desktop" "$UIDNUMBER" "$GIDNUMBER"
 
createDir "/home/$USERNAME/Documents" "$UIDNUMBER" "$GIDNUMBER"
 
createDir "/home/$USERNAME/Eigene Dateien" "$UIDNUMBER" "$GIDNUMBER"
 
createDir "/home/$USERNAME/Library/Preferences" "$UIDNUMBER" "$GIDNUMBER"
 
 
# remove old symlinks
 
find /home/$USERNAME -type l -print0 | xargs -0 -n10 rm -Rf
 
 
# create symlinks
 
createLink "/home/$USERNAME/windows-profiles/WinXP/Desktop" "/home/$USERNAME/Desktop/WinXP-Desktop"
 
createLink "/home/$USERNAME/Eigene Dateien" "/home/$USERNAME/Desktop/Eigene_Dateien"
 
createLink "/home/groups/marktplatz" "/home/$USERNAME/Desktop/Marktplatz"
 
 
# create symlink to class directory on user's desktop
 
CLASSLIST=$(ldapsearch -LLLx -h $LDAPSERVER -b "cn=klassen,cn=schueler,cn=groups,ou=$OU,$LDAPBASEDN" "memberUid=$USERNAME" | grep ^cn | cut -d' ' -f2-)
 
for CLASS in $CLASSLIST ; do
 
SHAREPATH=$(ldapsearch -LLLx -h $LDAPSERVER -b "cn=klassen,cn=shares,ou=$OU,$LDAPBASEDN" "cn=$CLASS" univentionSharePath | grep ^univen | cut -d' ' -f2-)
 
createLink "$SHAREPATH" "/home/$USERNAME/Desktop/$CLASS"
 
done
 
fi
 
 
 
echo "LOGIN-HOOK DONE"
 
 
 
exit 0
 
  
 
Diese Datei muß auf das MacOSX-System nach /etc/ als "logon.hook.univention" kopiert werden. Anschließend sind folgende Befehle auszuführen:
 
Diese Datei muß auf das MacOSX-System nach /etc/ als "logon.hook.univention" kopiert werden. Anschließend sind folgende Befehle auszuführen:
 
+
<source lang=bash>
  sudo chown root:wheel /etc/logon.hook.univention
+
sudo chown root:wheel /etc/logon.hook.univention
  sudo chmod 755 /etc/logon.hook.univention
+
sudo chmod 755 /etc/logon.hook.univention
  sudo defaults write com.apple.loginwindow LoginHook /etc/logon.hook.univention
+
sudo defaults write com.apple.loginwindow LoginHook /etc/logon.hook.univention
 +
</source>
  
 
== Weitere Möglichkeiten ==
 
== Weitere Möglichkeiten ==
Line 271: Line 277:
  
 
[[Category:Howtos]]
 
[[Category:Howtos]]
 +
[[Category:Other_Operating_Systems]]

Revision as of 09:15, 11 June 2012

Template:Cool Solutions Repository

Produktlogo UCS Version 2.3

Übersicht

Mac OS X als UNIX/BSD-Derivat kann vergleichbar anderen Linux/Unix-Systemen nach der entsprechenden UCS-Dokumentation angebunden werden.

Für einige Versionen von Mac OS X wurden diese Informationen etwas konkretisiert, die hier beschriebenen Schritte sind aber abhängig von der jeweiligen Mac OS X und UCS - Version und müssen daher ausführlich getestet und angepasst werden. Daher sind diese Schritte nicht Teil der Standard-Dokumentation.

Einbindung von Mac OS X 10.3 (Panther)

Mac OS X Clients können in den Vertrauenskontext von UCS integriert werden, jedoch derzeit nur eingeschränkt. Es besteht die Möglichkeit, die Benutzerauthentifizierung gegen LDAP durchzuführen und die Heimatverzeichnisse per NFS von einem UCS System einzubinden. Die beschriebenen Schritte wurden mit Mac OS X 10.3 durchgeführt. In älteren Versionen von OS X sind eventuell abweichende Verfahren anzuwenden.

Zugriff auf das LDAP-Verzeichnis

Die Verwaltung des LDAP-Zugriffs erfolgt durch den „Verzeichnisdienste“-Manager, zu finden im „Finder“ unter „Programme“, „Dienstprogramme“. Vor dem Verändern von Einstellungen muss evtl. eine Authentifizierung durchgeführt werden („Zugriff freischalten“ im unteren Bereich des Fensters).

Nach der Aktivierung des Protokolls „LDAPv3“ kann dieses über „Konfigurieren“ eingerichtet werden. In die Serverliste muss über „neu“ ein Eintrag hinzugefügt werden. Der Name ist frei wählbar, als Server wird der FQDN eines UCS LDAP-Servers (DC-Master, DC-Backup, DC-Slave) eingetragen. Der „LDAP-Pfad“ muss auf „RFC 2307 (UNIX)“ gesetzt werden. Der Verzeichnisdienste-Manager fragt anschliessend die LDAP-Basis (Variable „ldap/base“ aus Univention Baseconfig) als „Suchbeginn-Suffix“ ab. Die Anmeldung ist nach einiger Zeit bzw. einem Neustart von MacOS X möglich, um den zuständigen Dienst sofort neu zu starten kann folgender Befehl (in einem Terminal) verwendet werden:

sudo kill `cat /var/run/lookupd.pid`

Zur Kontrolle kann über den Befehl „id“ abgefragt werden, ob Benutzer auf Mac OS X bekannt sind:

id gregor 
uid=3499(gregor) gid=5225(Domain Users) groups=5225(Domain Users)


Einschränkungen:

In der beschriebenen Variante greift das System anonym auf das LDAP zu und kann daher nicht kontrollieren ob Passwörter abgelaufen sind. Dazu ist eine Kerberos-Anbindung notwendig (siehe unten).

Einbinden von Freigaben und Heimatverzeichnissen

NFS Das Einbinden des Heimatverzeichnisses und anderer Freigaben über NFS erfolgt durch das automount-System von Mac OS X, d.h. die Verzeichnisse werden beim ersten Zugriff eingebunden. Die Konfiguration wird über NetInfo durchgeführt, der sich ebenfalls im „Finder“ unter „Programme“, „Dienstprogramme“ findet. Nach dem Start und einer evtl. notwendigen Authentifzierung können NFS-Zugriffe im Bereich „mounts“ eingetragen werden. Dazu wird „mounts“ ausgewählt und über „Neu“ ein neuer Eintrag erzeugt. Für den Zugriff auf eine Freigabe müssen folgende Eigenschaft/Wert-Paare erzeugt werden:

name: <Server>:<serverseitiger_Pfad>
dir: <lokaler_Pfad>
opts: -P
type: nfs

Die Werte entsprechen unter Linux einem mount-Befehl mit folgenden Paramtern:

mount -t <type> -o <opts> <name> <dir>

Soll das Verzeichnis „/mac-homes“ vom Server „DC Slave“ lokal als „/home“ eingebunden werden, müssen folgende Werte gesetzt werden:

name: DC-Slave:/mac-homes
dir: /home
opts: -P
type: nfs


Einschränkungen:

Bei NFS an Mac OS X ist zu beachten, das die Kontrolle der Zugriffsrechte auf Seite von Mac OS X geprüft wird. Daher sollte unbedingt auf eine funktionierende Auflösung von Gruppenmitgliedschaften geachtet werden (Mac OS X unterstützt z.B. keine verschachtelten Gruppen).

Kerberos-Authentifikation aktivieren

Mac OS X unterstütz die Nutzung des UCS Kerberos, die Konfiguration ist aber sehr spezifsch je Mac OS X Version. Das prinzipielle Vorgehen:

Für die Aktivierung der Kerberos-Authentifizierung muß ein Login als Administrator erfolgen. Anschließend das Programm "Terminal" starten und die Datei "/etc/authorization" editieren.

In der Datei ist folgender (ggf. ähnlich aussehender) Abschnitt zu suchen:

<key>system.login.console</key>
<dict>
        <key>class</key>
        <string>evaluate-mechanisms</string>
        <key>comment</key>
        <string>Login mechanism based rule.  Not for general use, yet.
                builtin:krb5authenticate can be used to hinge local authentication on a successful kerberos authentication and kdc verification.
                                                builtin:krb5authnoverify skips the kdc verification.  Both fall back on local authentication.</string>
        <key>mechanisms</key>
        <array>
                <string>builtin:auto-login,privileged</string>
                <string>loginwindow_builtin:login</string>
                <string>builtin:reset-password,privileged</string>
                                                <string>authinternal</string>
                <string>builtin:getuserinfo,privileged</string>
                <string>builtin:sso,privileged</string>
                <string>HomeDirMechanism:login,privileged</string>
                <string>HomeDirMechanism:status</string>
                <string>MCXMechanism:login</string>
                <string>loginwindow_builtin:success</string>
                <string>loginwindow_builtin:done</string>
        </array>
</dict>

Die Zeile "<string>authinternal</string>" ist durch die Zeile "<string>builtin:krb5authnoverify,privileged</string>" zu ersetzen.

Damit das System bei Passwort-Ablauf auch eine Änderung vorschlägt und nicht nur die Anmeldung verweigert, kann man bei älteren Mac OS X Versionen einen Skript als "LoginHook" implementieren und anlegen.

Dieses Beispiel-Skript enthält zusaätzlich Passagen zur Integration in UCS@School, die variablen am Anfang des Skriptes müssen auf das jeweilige System angepasst werden:

#!/bin/sh
#
#############################
# CONFIG SECTION START
#############################

OU="XXX" # Schul-Nummer
LDAPBASEDN="dc=XXX"  # LDAP-Basis
DNSZONE="XXX" # DNS-Basis
LDAPSERVER="dc${OU}.${DNSZONE}"
NFSSERVER="dc${OU}.${DNSZONE}"

#############################
# CONFIG SECTION END
#############################

createLink () {
SRC="$1"
DST="$2"
# create symlink Documents
if [ ! -e "$DST" ] ; then
echo "symlink $DST does not exist -- creating symlink to $SRC"
if [ -e "$SRC" ] ; then
ln -s "$SRC" "$DST" 2>&1 || true
else
echo "$SRC does not exist"
fi
fi
}

createDir() {
DIR="$1"
USR="$2"
GRP="$3"
if [ -n "$DIR" -a ! -e "$DIR" ] ; then
echo "directory $DIR does not exist - creating dir"
mkdir -p "$DIR" 2>&1 || true
fi
if [ -n "$DIR" ] ; then
echo "changing owner to $USR"
chown "$USR" "$DIR" 2>&1 || true
if [ -n "$GRP" ] ; then
echo "changing group to $GRP"
chgrp "$GRP" "$DIR" 2>&1 || true
fi
fi
}

#############################


# append print stdout to /var/log/univention.login.log
exec >> /var/log/univention.login.log

#
echo "----------------------------------------"
date
echo "----------------------------------------"

USERNAME="$1"

echo "USERNAME: $USERNAME"

# uncomment following line for debug console
# /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal

# check if ldap server is reachable
ping -o -t 5 $LDAPSERVER
RET="$?"
echo "LDAPSERVER: $LDAPSERVER   RET=$RET"
if [ "$RET" = "0" ] ; then

# get expire time
A=$(ldapsearch -LLLx -h $LDAPSERVER -b "$LDAPBASEDN" uid=$USERNAME krb5PasswordEnd | grep -i ^krb5PasswordEnd | cut -d' ' -f2 | tr -c -d '[0-9]')
if [ -n "$A" ] ; then
echo "EXPIRETIME: $A"
let A=$A

# get current time
let B=$(date +%Y%m%d%H%M%S)
echo "CURRENTTIME: $B"

if [ "$A" -lt "$B" ] ; then
DOKILL=1
NEWPWOK=0
echo "Password expired - asking for new one"
for i in 1 2 3 ; do
if [ "$NEWPWOK" = "0" ] ; then
echo "Asking for password: $i"
/usr/bin/kpasswd $USERNAME < /dev/zero 2>&1
if [ "$?" = "0" ] ; then
echo "Password changed successfully"
DOKILL=0
NEWPWOK=1
fi
fi
done
if [ "$DOKILL" = "1" ] ; then
echo "PWCHANGE FAILED - KILLING LOGIN WINDOW"
kill $(ps ax | grep "[/]System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow console" | awk '{print $1}') 2>&1
fi
fi
fi

fi

# test if NFSServer is reachable
NFSHOST=$(echo $NFSSERVER | cut -d: -f1)
ping -o -t 5 $NFSHOST
RET="$?"
echo "NFSHOST: $NFSHOST   RET=$RET"
if [ "$RET" = "0" ] ; then

# Mount /home
if [ "`mount | grep -c "$NFSSERVER:/home on"`" = "0" ] ; then
if [ ! -e "/home" ] ; then
echo "mountpoint /home does not exist... creating /home"
mkdir -p /home 2>&1 || true
echo "/home created"
fi
echo "Mounting /home"
mount_nfs -P "$NFSSERVER:/home" /home 2>&1 || true
fi

# Mount /home/groups
if [ "`mount | grep -c "$NFSSERVER:/home/groups on"`" = "0" ] ; then
if [ ! -e "/home/groups" ] ; then
echo "mountpoint /home/groups does not exist... creating /home/groups"
mkdir -p /home/groups 2>&1 || true
echo "/home/groups created"
fi
echo "Mounting /home/groups"
mount_nfs -P "$NFSSERVER:/home/groups" /home/groups 2>&1 || true
fi

# create user's home directory if missing and make sure permissions are correct
HOMEDIR=$(ldapsearch -LLLx -h $LDAPSERVER -b "$LDAPBASEDN" uid=$USERNAME homeDirectory | grep -i ^homeDirectory | cut -d' ' -f2)
GIDNUMBER=$(ldapsearch -LLLx -h $LDAPSERVER -b "$LDAPBASEDN" uid=$USERNAME gidNumber | grep -i ^gidNumber | cut -d' ' -f2)
UIDNUMBER=$(ldapsearch -LLLx -h $LDAPSERVER -b "$LDAPBASEDN" uid=$USERNAME uidNumber | grep -i ^uidNumber | cut -d' ' -f2)
echo "HOMEDIR=$HOMEDIR"
echo "UIDNUMBER=$UIDNUMBER"
echo "GIDNUMBER=$GIDNUMBER"

createDir "/home/$USERNAME" "$UIDNUMBER" "$GIDNUMBER"
createDir "/home/$USERNAME/Desktop" "$UIDNUMBER" "$GIDNUMBER"
createDir "/home/$USERNAME/Documents" "$UIDNUMBER" "$GIDNUMBER"
createDir "/home/$USERNAME/Eigene Dateien" "$UIDNUMBER" "$GIDNUMBER"
createDir "/home/$USERNAME/Library/Preferences" "$UIDNUMBER" "$GIDNUMBER"

# remove old symlinks
find /home/$USERNAME -type l -print0 | xargs -0 -n10 rm -Rf

# create symlinks
createLink "/home/$USERNAME/windows-profiles/WinXP/Desktop" "/home/$USERNAME/Desktop/WinXP-Desktop"
createLink "/home/$USERNAME/Eigene Dateien" "/home/$USERNAME/Desktop/Eigene_Dateien"
createLink "/home/groups/marktplatz" "/home/$USERNAME/Desktop/Marktplatz"

# create symlink to class directory on user's desktop
CLASSLIST=$(ldapsearch -LLLx -h $LDAPSERVER -b "cn=klassen,cn=schueler,cn=groups,ou=$OU,$LDAPBASEDN" "memberUid=$USERNAME" | grep ^cn | cut -d' ' -f2-)
for CLASS in $CLASSLIST ; do
SHAREPATH=$(ldapsearch -LLLx -h $LDAPSERVER -b "cn=klassen,cn=shares,ou=$OU,$LDAPBASEDN" "cn=$CLASS" univentionSharePath | grep ^univen | cut -d' ' -f2-)
createLink "$SHAREPATH" "/home/$USERNAME/Desktop/$CLASS"
done
fi


echo "LOGIN-HOOK DONE"


exit 0

Diese Datei muß auf das MacOSX-System nach /etc/ als "logon.hook.univention" kopiert werden. Anschließend sind folgende Befehle auszuführen:

sudo chown root:wheel /etc/logon.hook.univention
sudo chmod 755 /etc/logon.hook.univention
sudo defaults write com.apple.loginwindow LoginHook /etc/logon.hook.univention

Weitere Möglichkeiten

Einzelne Kunden haben das UCS-LDAP um die LDAP-Schemata der Mac OS X Verzeichnisdienstimplementierung erweitert. Damit ist eine Verwaltung der Mac OS X Systeme über die Server-Tools von Mac OS X unter Nutzung des UCS LDAP und der UCS-Benutzer/Gruppen möglich.

Personal tools