Mac OS X

From Univention Wiki

Revision as of 09:15, 11 June 2012 by Meybohm (talk | contribs) (Fix highlighting and category)
Jump to: navigation, search

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