OpenAFS mit MIT-Kerberos5
Aus Gentoo Linux Wiki
| Installationsmethoden • LiveCDs • Kernel & Hardware • Laptops & Notebooks • Portage • System • Netzwerke & Services • X • Software • Anderes • alphabetischer HOWTO Index |
[Bearbeiten] Vorbemerkung
[Bearbeiten] Was ist OpenAFS
OpenAFS ist die freie Implementierung von AFS, eines verteilten Dateisystem. Im Gegensatz zu anderen Netzwerkdateisystem wie z.B. NFS oder CIFS muß der Client nicht wissen auf welchem Server die eingebundenen Volumen liegen, da er sie von jedem AFS-Server in der jeweiligen Zelle einbinden kann. Zudem wird der Datenstrom verschlüsselt und kann beinahe von jedem Betriebssystem eingebunden werden (es existieren sowohl Clients für Linux wie auch für Windows und Mac)
[Bearbeiten] Wieso MIT-Kerberos5
Zwar liefert OpenAFS einen Authentifizierungsserver mit, allerdings basiert dieser auf einer abgewandelten Version des Kerberos4-Protokolls, weshalb ich hier das Kerberos5-Protokoll bevorzuge.
Für alle die noch nie etwas von Kerberos gehört haben empfehle ich den Kerberos Dialog in 4 Akten und die RFC 1510
[Bearbeiten] Namensdefinition
Ich benutze in meinen Beispielen folgende Namen:
EXAMPLE.COM: Kerberos Realm (ersetzt diesen bitte durch euren Domainnamen in Großbuchstaben)
krb.example.com: Kerberos KDC Server Adresse
afs.example.com: OpenAFS Datenbank Server
example.com: OpenAFS Zelle
afsadmin: Name des AFS Administrators
home: Home Volumen
[Bearbeiten] Kerberos
[Bearbeiten] Installation
Für Gentoo:
:/$ echo "app-crypt/mit-krb5 krb4" >> /etc/portage/package.use :/$ emerge -av mit-krb5
(Kerberos4 Support wird benötigt, da OpenAFS eine abgewandelte Form der 4er Tickets benutzt.)
Für Debian:
:/$ apt-get install krb5-admin-server krb5-kdc libkrb53 krb5-config krb5-clients
[Bearbeiten] Konfiguration
[Bearbeiten] KDC
(Key Distribution Center).
/etc/krb5kdc/kdc.conf:
[kdcdefaults]
kdc_ports = 750,88
[realms]
EXAMPLE.COM = {
database_name = /var/lib/krb5kdc/principal
admin_keytab = /etc/krb5kdc/kadm5.keytab
acl_file = /etc/krb5kdc/kadm5.acl
key_stash_file = /etc/krb5kdc/stash
kdc_ports = 750,88
max_life = 10h 0m 0s
max_renewable_life = 8d 0h 0m 0s
master_key_type = des3-hmac-sha1
supported_enctypes = des3-hmac-sha1:normal des-cbc-crc:normal des:normal des:v4 des:norealm des:onlyrealm des:afs3
default_principal_flags = +preauth
}
[logging]
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmin.log
default = FILE:/var/log/krb5lib.log
[Bearbeiten] Kerberos Client
/etc/krb5.conf:
[libdefaults]
default_realm = EXAMPLE.COM
[realms]
EXAMPLE.COM = {
kdc = krb.example.com:88
admin_server = krb.example.com:749
default_domain = example.com
}
[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
[Bearbeiten] Initialisieren der Datenbank
kdb5_util create -s
[Bearbeiten] Anlegen der Principals
Wir benötigen zunächst zwei Principals. Einen für den Administrator und einen für den AFS Service selbst.
Dazu gehen wir in die Kerberos Console:
:/$ kadmin.local
und fügen die Principals wie folgt hinzu:
Für den AFS Administrator (der auch gleichzeitig unser Kerberos Administrator wird)
kadmin.local: ank afsadmin@EXAMPLE.COM kadmin.local: ank afsadmin/admin@EXAMPLE.COM
:/$ echo "afsadmin/admin@EXAMPLE.COM * " >> /etc/krb5kdc/kadm5.acl
Dieser Principal hat nun vollen Zugriff auf die Kerberos Datenbank
Für AFS selbst
kadmin.local: ank -randkey afs/example.com@EXAMPLE.COM (Es funktioniert zwar auch wenn der Zellenname nicht mitgegeben wird, allerdings gab es z.B. unter Suse10 mit dem pam Modul für AFS probleme)
(ank ist die Kurzform von addprinc, was wiederum die Kurzform von add_principal ist.)
Jetzt extrahieren wir den Schlüssel für AFS
kadmin.local: ktadd -e des-cbc-crc:afs3 -k /etc/krb5.keytab.afs afs/example.com
(Da AFS meines Wissens *noch* nicht alle Verschlüsselungstypen versteht erstellen wir eine Schlüssel mit nur einem Typ)
Nun lassen wir uns den Principal anzeigen:
kadmin.local: getprinc afs/example.com
Ihr solltet ungefähr sowas sehen:
Principal: afs@EXAMPLE.COM Expiration date: [never] Last password change: Wed Mar 29 23:24:32 CEST 2006 Password expiration date: [none] Maximum ticket life: 0 days 10:00:00 Maximum renewable life: 7 days 00:00:00 Last modified: Wed Mar 29 23:24:32 CEST 2006 (root/admin@EXAMPLE.COM) Last successful authentication: [never] Last failed authentication: [never] Failed password attempts: 0 Number of keys: 1 Key: vno 3 , DES cbc mode with CRC-32, no salt Attributes: Policy: [none]
Hier könnt ihr die KVNO ablesen. Nun verlassen wir die Console und übergeben AFS seinen Schlüssel
kadmin.local: quit
Bemerkung (für debian etch): bei mir hat "asetkey" erst funktioniert, NACHDEM ich den ganzen openafsZeug installiert habe!
:/$ asetkey add 3 /etc/krb5.keytab.afs afs/example.com
(Die Zahl 3 kommt von der "Key: vno" aus "getprinc afs", es kann auch sein, daß ihr eine andere Zahl bekommt, also bitte darauf achten)
[Bearbeiten] Starten des Kerberos Servers
Für Gentoo:
:/$ /etc/init.d/mit-krb5kdc start
:/$ /etc/init.d/mit-krb5kadmind start
Für Debian:
:/$ /etc/init.d/krb5-kdc start
:/$ /etc/init.d/krb5-admin-server start
[Bearbeiten] OpenAFS
[Bearbeiten] Installation
Für Gentoo:
USE="kerberos" emerge -av openafs openafs-kernel
Für Debian:
apt-get install openafs-client openafs-krb5 openafs-modules-source openafs-dbserver openafs-fileserver
[Bearbeiten] Konfiguration
Zunächst überprüft, daß kein AFS Dienst läuft:
:/$ ps ax | grep bos
(Sollte einer laufen killt ihn!)
[Bearbeiten] Setzen des Zellnamen
:/$ echo "example.com" > /etc/openafs/server/ThisCell
[Bearbeiten] Eintrag in die CellServ Datenbank
:/$ echo ">example.com #Example Cell" > /etc/openafs/server/CellServDB :/$ echo "192.168.1.1 #afs.example.com" >> /etc/openafs/server/CellServDB
!ACHTUNG! "#" ist in diesem Fall KEIN Kommentarzeichen!!!!!
[Bearbeiten] Starten des Basic Overseer Servers
:/$ bosserver -noauth
Das -noauth bewirkt, daß der Bosserver keine Authentifizierung verlangt.
!Achtung in diesem Zustand hat jeder Zugriff auf euren Server!
[Bearbeiten] Starten der einzelnen Dienste
Zunächst setzen wir nochmal über den Bosserver den Zellnamen
:/$ bos setcellname afs.example.com example.com -noauth
Nun überprüfen wir ob unser Server auch wirklich der erste Datenbankserver ist
:/$ bos listhosts afs.example.com -noauth
Starten des Backupservers:
Für Gentoo:
:/$ bos create afs.example.com buserver simple /usr/libexec/openafs/buserver -cell example.com -noauth
Für Debian:
:/$ bos create afs.example.com buserver simple /usr/lib/openafs/buserver -cell example.com -noauth
Der Backupserver ist später dazu da automatisch Backups ganzer Volumensets zu erstellen und sie an einen Tape Coordinator zu schicken
Starten des Protectionservers:
Für Gentoo:
:/$ bos create afs.example.com ptserver simple /usr/libexec/openafs/ptserver -cell example.com -noauth
Für Debian:
:/$ bos create afs.example.com ptserver simple /usr/lib/openafs/ptserver -cell example.com -noauth
Der Protectionserver übernimmt die Verwaltung der Zugriffsrechte
Starten des Volume Location Servers:
Für Gentoo:
:/$ bos create afs.example.com vlserver simple /usr/libexec/openafs/vlserver -cell example.com -noauth
Für Debian:
:/$ bos create afs.example.com vlserver simple /usr/lib/openafs/vlserver -cell example.com -noauth
Der Volume Location Server achtet darauf auf welchen Servern die einzelnen Volumen liegen.
Normalerweise würde man jetzt noch den kasserver starten, der für die Authentifizierung zuständig ist, aber diese Aufgabe übernimmt in unserem Fall der MIT-Kerberos Server
[Bearbeiten] Erstellung des Administrators
Nun erstellen wir den User, den wir vorhin in Kerberos erstellt haben, in der Openafs Datenbank. Dazu erstellen wir ihn erst ganz normal über den Protection Server, fügen ihn der Gruppe "System:administrators" hinzu und erstellen ihn nochmal beim Bosserver.
:/$ pts createuser -name afsadmin -cell example.com -noauth
:/$ pts adduser afsadmin system:administrators -cell example.com -noauth
:/$ pts membership afsadmin -cell example.com -noauth
:/$ bos adduser afs.example.com afsadmin -noauth
[Bearbeiten] Starten der restlichen Dienste
Für Gentoo:
:/$ bos create afs.example.com fs fs /usr/libexec/openafs/fileserver /usr/libexec/openafs/volserver /usr/libexec/openafs/salvager -cell example.com -noauth
Für Debian:
:/$ bos create afs.example.com fs fs /usr/lib/openafs/fileserver /usr/lib/openafs/volserver /usr/lib/openafs/salvager -cell example.com -noauth
[Bearbeiten] Herrunterfahren des Bosservers
:/$ bos shutdown afs.example.com -noauth
[Bearbeiten] Erstellung des Dateisystems
Der OpenAFS Datenbankserver benötigt min. eine Partition (loop device würde auch gehen). Als Dateisystem kann zwischen folgenden gewählt werden (reiserFS funktioniert nicht!):
- ext2
- ext3
- hfs
- xfs
- ufs
Nun mountet ihr diese nach /vicepa (für jede weitere Partition benutzt /vicepb,/vicepc,...). Sollte das Verzeichnis /afs bei euch noch nicht existieren erstellt es bitte auch noch
:/$ mkdir /afs
[Bearbeiten] Starten von OpenAFS
Wichtig! Jetzt muß AFS_DYNROOT in der /etc/openafs/afs.conf bzw. afs.conf.client auf "false" stehen, sonst schlägt das Erstellen der Mountpoints für root.cell und root.afs fehl! Später kann es wieder auf "true" gesetzt werden.
Für Gentoo:
:/$ /etc/init.d/<welchen Namen sich die Mantainer heute mal ausgedacht haben>-server start :/$ /etc/init.d/<welchen Namen sich die Mantainer heute mal ausgedacht haben>-client start
Für Debian:
:/$ /etc/init.d/openafs-fileserver start :/$ /etc/init.d/openafs-client start
(Achtet darauf, dass der Kerberos Server auch läuft!!)
[Bearbeiten] Erstellung der Verzeichnisstruktur
Zunächst müssen wir uns als Administrator anmelden, da nun der Bosserver ohne das -noauth flags läuft
:/$ kinit afsadmin
:/$ aklog
Jetzt können wir zunächst die einzelnen Volumen auf unserer ersten Partition erstellen:
:/$ vos create afs.example.com /vicepa root.afs -cell example.com
:/$ vos create afs.example.com /vicepa root.cell -cell example.com
[Bearbeiten] Setzen der Zugriffsrechte und erstellen der Mountpoints
Übersicht:
r (read) Dateien dürfen gelesen werden l (list) Dateien und Unterverzeichnisse dürfen aufgelistet werden i (insert) Dateien und Unterverzeichnisse dürfen hinzugefügt werden d (delete) Dateien und Unterverzeichnisse dürfen gelöscht werden w (write) Dateien dürfen geschrieben werden k (lock) Dateien dürfen gesperrt werden a (administer) ACL darf geändert werden
Setzen der notwendigen Rechte für /afs:
:/$ fs sa /afs system:anyuser rl
Erstellung eines Mountpoints für root.cell sowie Schreib/Lese Mountpoints für root.afs und root.cell.
:/$ fs mkm /afs/example.com root.cell
:/$ fs sa /afs/example.com system:anyuser rl
:/$ fs mkm /afs/.example.com root.cell -rw
:/$ fs mkm /afs/.root.afs root.afs -rw
[Bearbeiten] Semi-Standard
Wegen dem AFS-Semi-Standard erstellen wir nun noch zwei Volumen für "user" und "service"
:/$ vos create afs.example.com /vicepa user -cell example.com
:/$ vos create afs.example.com /vicepa service -cell example.com
:/$ fs mkm /afs/example.com/user user
:/$ fs mkm /afs/example.com/service service
:/$ fs sa /afs/example.com/user system:anyuser rl
:/$ fs sa /afs/example.com/service system:anyuser rl
[Bearbeiten] Erstellung der Replika
Nun können die Read-Only Replikas erstellt werden:
:/$ vos addsite afs.example.com /vicepa root.afs
:/$ vos addsite afs.example.com /vicepa root.cell
:/$ vos release root.afs
:/$ vos release root.cell
Zum Schluß überprüfen wir noch ob auch wirklich alles funktioniert hat und setzen Leserechte für alle User auf /afs und /afs/example.com
:/$ fs checkvolumes
[Bearbeiten] Gruppe anlegen
In OpenAFS gibt es drei System Gruppen:
system:anyuser (Jeder der kein gültiges Token für die Zelle besitzt befindet sich automatisch in dieser Gruppe)
system:authuser (Jeder der ein gültiges Token für die Zelle besitzt befindet sich automatisch in dieser Gruppe)
system:administrators (Administratoren Gruppe von OpenAFS, jeder der in diser Gruppe hat automatisch die "a"-Berechtigung im AFS-Baum)
Zusätzlich kann man mit folgendem Befehl weitere Gruppen hinzufügen:
:/$ pts creategroup <group>
[Bearbeiten] Benutzer anlegen
Um einen Benutzer anzulegen, muß dieser in Kerberos und in AFS eingetragen werden:
:/$ kadmin.local -q "ank <user>"
:/$ pts createuser <user> -id <uid>
:/$ pts adduser <user> -group <group>
!ACHTUNG! die <uid> des Users sollte mit der uid des Users im normalen System übereinstimmen, am besten ihr benutzt LDAP oder erstellt auf jedem Rechner den selben User (wird auf dauer vielleicht *etwas* anstrengend)
[Bearbeiten] Verzeichnis anlegen
Da wir im vorherigen Schritt einen User angelegt haben, sollte dieser nun auch ein Verzeichnis bekommen:
Zunächst erstellen wir einen neues Volumen mit maxquota 0 (unendlich), ihr könnt natürlich auch einen exakten Wert benutzen.
:/$ vos create afs.example.com /vicepa user.<user> -maxquota 0
Danach wird ein Mountpoint in unser user-Volumen erstellt:
:/$ fs mkm /afs/example.com/user/<user> user.<user>
Nun noch die Zugriffsrechte setzen:
:/$ fs sa /afs/example.com/user/<user> <user> all
Zudem erstellen wir noch ein Backup-volumen und erstellen den Mountpoint .backup, dadurch kann der User jederzeit auf das letzte Backup zugreifen.
:/$ vos backup user.<user>
:/$ fs mkm /afs/example.com/user/<user>/.backup user.<user>.backup
(Am besten ihr macht daraus ein Bash script *g*)
Um die Sache mit dem Backup ein bißchen zu automatisieren hab ich hier mal ein total schlechtes Bashscript vorbereitet:
#!/bin/sh vos listvol afs.example.com -localauth | sed 's/ .*//' | grep -e ^user | grep -v -e user$ -e readonly$ -e backup$ > /root/backupvol exec < /root/backupvol while read line do echo "Creating Backup of $line" vos backup $line -localauth echo "done" done
das ganze kann man nun in einen Crontab packen und jede Nacht durchlaufen lassen.
[Bearbeiten] Backup
Zunächst sollte man sich überlegen, von was man ein Backup machen will, wie oft und wohin? Ich mache derzeit jeden Monat ein Full-Backup (alle Daten werden gesichert) und jeden Tag ein Incrementelles-Backup (Nur die Veränderungen werden gesichert) von den Backup-Volumen und speichere dieses auf einem zweiten Server. Aber ihr könnt euch da frei entfalten wie und wo ihr was machen wollt.
[Bearbeiten] Tape Coordinator
Um ein Backup machen zu können müßt ihr zuerst den Tape Coordinator konfigurieren. Eigentlich ist er dazu gedacht Backups auf ein Tape zu schreiben, aber er kann auch so eingestellt werden, daß er auf eine gewöhnliche Festplatte speichert. Dazu erstelle wir nun zunächst auf dem Backupserver (der Einfachheit halber benutz ich jetzt den selben Server wie für den AFS Datenbank Server) das Verzeichnis "backup"
:/$ mkdir /var/lib/openafs/backup
In diesem Verzeichnis erstellen wir zuerst die Konfigurationsdatei des Tape Coordinators:
/var/lib/openafs/backup/tapeconfig:
500GB 0 /dev/FILE 0
die 500GB ist der freie Speicherplatz auf der jeweiligen Backupfestplatte.
Jetzt erstellen wir die Konfiguration für unser *imaginäres* Tape-Device (/dev/FILE)
/var/lib/openafs/backup/CFG_FILE:
FILE YES MOUNT /root/afsbackup UNMOUNT /root/afsbackup NAME_CHECK No ASK No
In dieser Konfigurationsdatei teilen wir dem Tape Coordinator mit, daß das Backup-Tape in Wirklichkeit eine Datei ist (FILE YES) und geben ihm auch gleich den Pfad zu einem Script an, welches er beim Mounten/Unmounten eines Tapes (wenn er sozusagen mit dem Backup anfangen will) ausführen soll, zudem soll er uns nicht nach weiteren Tapes fragen und keine Namensüberprüfung bei den Tapes durchführen. Dieses ist nützlich, da das ganze später automatisiert werden soll.
Nun fehlt nur noch das genannte Script, welches ich von der offiziellen OpenAFS Dokumentation übernommen habe
/root/afsbackup:
#! /bin/csh -f
set devicefile = $1
set operation = $2
set tries = $3
set tapename = $4
set tapeid = $5
set exit_continue = 0
set exit_abort = 1
set exit_interactive = 2
#--------------------------------------------
if (${tries} > 1) then
echo "Too many tries"
exit ${exit_interactive}
endif
if (${operation} == "labeltape") then
echo "Won't label a tape/file"
exit ${exit_abort}
endif
if ((${operation} == "dump") |\
(${operation} == "appenddump") |\
(${operation} == "restore") |\
(${operation} == "savedb") |\
(${operation} == "restoredb")) then
/bin/rm -f ${devicefile}
/bin/ln -s /pfad/zum/backup/${tapename}_${tapeid} ${devicefile}
if (${status} != 0) exit ${exit_abort}
endif
exit ${exit_continue}
Nun können wir den Tape Coordinator mal starten, wie ich bereits erwähnte habe ich zum testen den Tape Coordinator auf dem selben Server wie den OpenAFS Datenbank Server laufen, deshalb benutze ich hier das -localauth flag, solltet ihr zwei Server benutzen, müßt ihr entweder die KeyFile von AFS auf den anderen Server kopieren oder für das Backup einen neuen User anlegen der die entsprechenden Berechtigungen hat.
:/$ butc -localauth
(Am besten ihr startet ihn in einer neuen Console oder gleich über "screen" was am einfachsten geht.)
[Bearbeiten] Buserver
Nun wechseln wir in die interaktive console des Buservers:
:/$ backup
Dort erstellen wir zunächst ein Volumeset, d.h. es wird nicht ein einziges Volumen gesichert sondern eine beliebige Anzahl die einem bestimmten Regulären Ausdruck entspricht. Über addvolset geben wir dem Volumenset einen eindeutigen Namen.
backup> addvolset -name user backup> addvolentry -name user -server afs.example.com -partition /vicepa -volumes user..*.backup
Nun fügt euren Backupserver der Hostliste hinzu
backup> addhost -tapehost afs.example.com -portoffset 0
Und erstellt ein Dumplevel, die Struktur ist eine relativ einfache Baumstruktur, ganz oben steht das Full-Dump und alle unteren sind Incrementelle-Dumps des Full-Dumps (und die darunter wieder Incrementelle des übergeordneten Incrementellen-Dumps)
backup> adddump -dump /week -expires 6d
Wenn ihr alles zu eurer Zufriedenheit eingestellt habt können wir unseren ersten Dump ausführen
backup> dump -volumeset user -dump /week -portoffset 0
Überprüft dabei beide Consolen sowohl die Backup Console wie auch die, wo der Tape Coordinator läuft
[Bearbeiten] Ports
Für Kerberos sollten die folgenden Ports in der Firewall freigeschaltet werden:
88 (tcp/udp) Kerberos5 KDC 749 (tcp) Kerberos Admin Server (Passwort ändern für Unix/Linux) 464(tcp/udp) (passwort ändern für Windows) 4444 (udp) Kerberos 5 zu 4 Ticket Umwandlung
Für AFS werden folgende Ports benötigt
7000-7009 (udp) AFS 7020,7021 7025-7032 (udp) AFS Backup Server
[Bearbeiten] DNS
Damit man eure Zelle auch ausserhalb findet, könnt ihr entweder eure Zelle bei grand.central.org eintragen lassen, oder aber ihr tragt eure Zelle in einen DNS ein (oder ihr macht am besten beides)
krb IN A 192.168.1.1 afs IN A 192.168.1.1 _kerberos IN TXT "EXAMPLE.COM" _kerberos-master._udp IN SRV 0 0 88 krb _kerberos-adm._tcp IN SRV 0 0 749 krb _kpasswd._udp IN SRV 0 0 464 krb _kerberos._udp IN SRV 0 0 88 krb EXAMPLE.COM. IN AFSDB 1 afs.example.com.
(In diesem Beispiel wäre es natürlich sinnvoll nicht gerade die locale IP zu nutzen, ich habe dieses nur gemacht, damit die IP mit der oben verwendeten übereinstimmt) Eine öffentliche Zelle macht mit einer dynamischen IP wenig Sinn.
[Bearbeiten] Links
- http://www.openafs.org
- http://web.mit.edu/kerberos
- http://grand.central.org
- http://michigan.central.org/twiki
[Bearbeiten] Kontakt
Solltet ihr nicht weiterkommen oder sonst noch irgendwelche Fragen haben, findet ihr unter Kooky meine Emailadresse bzw. ICQ Nummer
Diesem Artikel ist eine Todo-Liste in der Diskussionsseite beigefügt. - Du kannst uns helfen, diesen Artikel zu erweitern, indem du die Punkte auf der Liste abarbeitest.
Wiki > Artikel nach Themen > HOWTOs
Wiki > Artikel nach Themen > System > Dateisystem
Wiki > Wartung > Todo
