Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
NEU!<br />
Jetzt mit<br />
<strong>ADMIN</strong><br />
IT-Praxis & Strategie<br />
DDOS<br />
Aus und gegen <strong>Clouds</strong><br />
VHDX<br />
Interessante Features des<br />
Formats<br />
LSI-MegaRAID-<br />
Controller mit SSD<br />
<strong>Freie</strong> <strong>Clouds</strong><br />
Automatisieren in Eigenregie<br />
Praxiserprobt: CloudStack<br />
AWS-kompatibel: Eucalyptus<br />
Shooting Star: OpenStack<br />
Integrator: OpenNebula<br />
NetBSD auf dem<br />
Raspberry Pi<br />
05/2013<br />
September<br />
Die ultimative Pentest-Plattform<br />
Mit extra-Beilage<br />
“Storage”<br />
Bareos<br />
Was der Bacula-Fork kann<br />
PostgreSQL 9.3<br />
Neues im kommenden<br />
Release<br />
www.admin-magazin.de<br />
Oracle 12c<br />
Paradigmenwechsel<br />
zur Cloud-DB<br />
D EUR 9,80<br />
A EUR 10,80 - BeNeLux EUR 11,25<br />
CH sfr 19,60 - E / I EUR 12,75<br />
4 196360 509805 05
Sackgasse<br />
Editorial<br />
Der Preis des Privaten<br />
Seit der Antike kennt die Mathematik Mittelwerte. Immer dienten sie der<br />
Vereinfachung. Wo die Rechen- und Speicherkapazitäten nicht ausreichten,<br />
um eine große Zahl an Beobachtungen individuell zu betrachten, da<br />
verwendete man stellvertretend den Mittelwert. Das Ergebnis war damit im<br />
Einzelfall nicht exakt – diesen Preis musste man zahlen – doch der Durchschnitt<br />
ist der Wahrheit nahe.<br />
Nun ist es wie immer: Man tut, was man kann. Und heute kann man eben<br />
Exabyte-weise Daten speichern, mit Trillionen Operationen pro Sekunde<br />
berechnen und rund um den Globus in Echtzeit verknüpfen. Das macht den<br />
Mittelwert überflüssig. Computer erkennen heute in einem unvorstellbaren<br />
Datenmeer Unterschiede und Gemeinsamkeiten mit der Granularität eines Tropfens. Von der NSA können,<br />
aber brauchen wir dabei noch nicht einmal reden. Allein der amerikanische Werbevermarkter bluekai etwa<br />
pflegt Profile von 150 Millionen Amerikanern, die nach bis zu 30 000 verschiedenen Kriterien sortiert sind.<br />
Heute erkennt man den gut verdienenden männlichen Akademiker zwischen 30 und 40 zuverlässig aus der<br />
Millionenmasse, der sich für einen Whiskykenner hält, gebrauchte Sportwagen fährt und auf dem Balkon Tomaten<br />
züchtet. Seine Hotelbuchung macht man automatisch 10 Prozent teurer – wie bei allen, die mit Apple-<br />
Notebooks surfen.<br />
Muss wohl auf Dienstreise sein, sagt der Algorithmus, der die Daten aus dem Smart Grid liest, sonst ging Freitag<br />
Abend immer die Waschmaschine an. Aber die Mails werden aus Bremen abgerufen, also ist er nicht weit.<br />
Amazon weiß, dass er im Urlaub Schweden-Krimis auf seinem Kindle liest, die Postanschrift deutet auf Eigentumswohnung.<br />
Neulich hat er Thai-Curry bestellt. Wohl Hobbykoch. Ein Fall für die WMF-Werbung mit den<br />
teuren Damaszener-Messern.<br />
Alles hat seinen Preis: Der Mittelwert und sein Gegenstück, der gläserne Mensch, die Hyper-Individualisierung.<br />
Die bedeutet das „Ende der Privatheit“ (Mark Zuckerberg). Dafür opfern wir die informationelle Selbstbestimmung.<br />
Dafür begeben wir uns in die Gefahr, von der vorauseilenden Folgsamkeit des Durchleuchteten<br />
angesteckt zu werden. Oder vom Zynismus – angesichts der unabwendbaren Ver-Öffentlichung alles Privaten.<br />
Dafür liefern wir uns dem nie verblassenden Gedächtnis der Automaten aus. Dafür lassen wir uns mit unerbetenen<br />
Informationen überschütten. Dafür schwören wir ungewollt und ohne Not den Offenbarungseid.<br />
Man kann nichts dagegen tun? Man könnte. Mails verschlüsseln zum Beispiel, beim Surfen immer Anonymisierer<br />
wie Tor nutzen, sozialen Netzen auch mal fernbleiben. Dann fände man, zumindest hier und da, wieder<br />
Deckung hinter dem Durchschnitt. Aber auch das hat seinen Preis: Es kostet Bequemlichkeit.<br />
@ leserbriefe@admin-magazin.de<br />
www.facebook.com/adminmagazin www.twitter.com/admagz<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
3
Service<br />
<strong>ADMIN</strong><br />
IT-Praxis & Strategie<br />
Inhalt<br />
05/2013<br />
Skalieren und Automatisieren in eigener<br />
Regie. Alles dazu in unserem Cloud-<br />
Schwerpunkt ab Seite 22.<br />
Liebling<br />
Eucalyptus - die Amazonkompatible<br />
freie Cloud mit 40Koalas<br />
kommerziellem Ableger.<br />
Login<br />
Security<br />
Schwerpunkt: <strong>Freie</strong> <strong>Clouds</strong><br />
8 Vorgelesen<br />
Bücher über Sicherheitsfragen und erste<br />
Schritte mit dem Raspberry Pi.<br />
10 Branchen-News<br />
Neues von Firmen und Projekten.<br />
16 Krieg in den Wolken<br />
Verteilte Denial-of-Service-Attacken aus<br />
und gegen <strong>Clouds</strong>.<br />
28 Griff zu den Sternen<br />
OpenNebula<br />
– der große<br />
Integrator unter<br />
den freien Cloud-<br />
Lösungen.<br />
14 Spaziergang<br />
Linux automatisch<br />
verwalten<br />
mit dem<br />
Spacewalk-<br />
Framework.<br />
Service<br />
3 Editorial<br />
4 Inhalt<br />
6 Heft-CD<br />
114 Impressum und <strong>Vorschau</strong><br />
Schwerpunkt: <strong>Freie</strong> <strong>Clouds</strong><br />
22 Bausteinprinzip<br />
OpenStack: Der Shooting Star unter den<br />
<strong>Clouds</strong>.<br />
34 Gut vernetzt<br />
Praxiserprobte und bewährte Cloud<br />
auch für sehr große Installationen.<br />
40 Koalas Liebling<br />
Die eigene AWS-kompatible Cloud<br />
gelingt mit Eucalyptus.<br />
4 Ausgabe 05-2013 Admin www.admin-magazin.de
Inhalt<br />
Service<br />
Einstöpseln<br />
Paradigmenwechsel mit<br />
84Zum<br />
Oracle 12c.<br />
was recht ist<br />
Die Praxis der Rechteverwaltung<br />
bei MS 62Alles,<br />
Exchange.<br />
Licht gebracht<br />
PostgreSQL-Notifications<br />
94Ans<br />
mit Perl programmieren.<br />
Know-how<br />
48 Datenbank-Tuning<br />
Zahlreiche interessante neue Features<br />
im kommenden PostgreSQL 9.3 unter<br />
der Lupe.<br />
56 Besser sichern<br />
Der Bacula-<br />
Fork Bareos<br />
kommt mit<br />
beachtenswerten<br />
Neuerungen.<br />
62 Alles, was recht ist<br />
Die Rechteverwaltung in MS Exchange in<br />
der Praxis.<br />
Netzwerk<br />
68 Leitstandstechnik<br />
Open-Source-Netzwerkzukunft: Software<br />
Defined Networks und der Floodlight-<br />
OpenFlow-Controller.<br />
Programmieren<br />
94 Ans Licht gebracht<br />
PostgreSQL-Notifications mit Perl programmieren.<br />
Virtualisierung<br />
76 Moderne Bilder<br />
Das neue VHDX-Format für virtuelle Festplatten<br />
im Überblick.<br />
80 Technisches K.O.<br />
Wider das<br />
Udev-Namenschaos:<br />
So<br />
lassen sich<br />
Devices richtig<br />
und dauerhaft<br />
benennen.<br />
Test<br />
84 Datenbank zum Einstöpseln<br />
Oracle Database 12c: Cloud Computing<br />
mit Multitenant-Architektur.<br />
92 Rennfieber<br />
Im Test: Beschleunigerkarte Nytro Mega-<br />
RAID 8110-4i von LSI.<br />
FreeX<br />
101 FreeX<br />
Artikel und Workshops aus der FreeX.<br />
102 Scharf gewürzt<br />
Capsicum – mehr<br />
Sicherheit für<br />
FreeBSD durch<br />
Sandboxing.<br />
108 Netberry<br />
Anstelle von Linux: NetBSD auf dem<br />
Raspberry Pi.<br />
Mehr Infos auf Seite 6<br />
• Hunderte Pentest-Tools<br />
• Von den Machern von BackTrack<br />
• Spezialdistribution für Profis<br />
www.admin-magazin.de Admin Ausgabe 05-2013<br />
5
SErvice<br />
Heft-CD<br />
Heft-CD<br />
Auf dem beiliegenden Datenträger finden Sie die neueste<br />
Version der Pentesting-Distribution Kali Linux.<br />
◗ Spezielle Linux-Distribution mit dem Ziel, professionelles<br />
Penetration Testing und Security Auditing zu verzahnen.<br />
◗ Von den Machern des bekannten BackTrack<br />
◗ GPG-signierte Pakete und Repositories<br />
◗ Mehr als 300 Penetration-Test-Tools<br />
◗ Umfangreicher Wireless-Support<br />
Legen Sie einfach die CD in das Laufwerk ein und starten<br />
Sie den Rechner. Möglicherweise müssen Sie noch im BIOS<br />
die richtige Boot-Reihenfolge einstellen. Danach können Sie<br />
die Software entweder von der CD booten oder auf dem<br />
Rechner als Betriebssystem installieren.<br />
n<br />
Info<br />
[1] Kali Linux: [http://www.kali.org]<br />
CD kaputt?<br />
Wir schicken Ihnen kostenlos eine<br />
Ersatz-CD zu, E-Mail genügt:<br />
info@admin-magazin.de<br />
6 Ausgabe 05-2013 Admin www.admin-magazin.de
Login<br />
Bücher<br />
Bücher für Bastler und Philosophen<br />
Vorgelesen<br />
Diesen Monat haben wir das Buch eines Krypto-Gurus gelesen und eine<br />
Einführung in das Basteln mit Linux und dem Minirechner Raspberry Pi.<br />
Oliver Frommel, Jens-Christoph Brendel<br />
Der Sicherheitsexperte Bruce Schneier<br />
hatte in Insiderkreisen lange Zeit einen<br />
Ruf als führender Kryptografie-Experte.<br />
Sein Buch „Applied Cryptography“ galt<br />
lange Zeit als Standardwerk. Heute<br />
mischt er in der Kryptografie-Welt immer<br />
noch mit, wie seine Einreichung zum<br />
Wettbewerb für eine SHA-3-Hashfunktion<br />
zeigt. Immer öfter beschäftigt er sich aber<br />
seit einigen Jahren mit Überlegungen zu<br />
Sicherheitsfragen auf einer gesellschaftlichen<br />
Ebene, insbesondere seit den Anschlägen<br />
vom 11. September 2001. Dabei<br />
vertritt er eine eher gemäßigte Haltung,<br />
die viele der getroffenen Maßnahmen in<br />
Frage stellt.<br />
Auf Vertrauensbasis<br />
In die gleiche Kerbe schlägt sein Buch<br />
„Liars and Outliers“, das unter dem Titel<br />
„Die Kunst des Vertrauens“ nun auf<br />
deutsch vorliegt. Wörtlich bedeutet der<br />
Titel „Lügner und Ausreißer“, und um<br />
gesellschaftlich konformes Verhalten<br />
und Ausreißer geht es auch in Schneiers<br />
Werk. Dabei stellt er zunächst verschiedene<br />
Regulierungsmechanismen vor, die<br />
dafür sorgen sollen, dass die Gesellschaft<br />
weitgehend reibungslos funktioniert. Es<br />
sind dies etwa der moralische Druck,<br />
der durch die Erziehung vermittelt wird.<br />
In die gleiche Richtung geht es, wenn<br />
Individuen zur Aufrechterhaltung ihrer<br />
Reputation im Sinn der Gesellschaft handeln.<br />
Tun sie dies nicht freiwillig, kann<br />
die Gesellschaft durch institutionellen<br />
Druck (etwa Gesetze) versuchen, dafür<br />
zu sorgen. Schneier zeigt dabei auch,<br />
dass dies in manchen Fällen den umgekehrten<br />
Effekt hat.<br />
Die Notwendigkeit für Vertrauen als<br />
Basis für Gesellschaften leitet Schneier<br />
historisch-evolutionär ab und zieht sogar<br />
neurologische Argumente dafür heran.<br />
Warum das in der „realen Welt“ nicht immer<br />
wie gewünscht funktioniert, versucht<br />
ein eigenes Kapitel zu erklären. Letztlich<br />
argumentiert Schneier dafür, das (verlorene?)<br />
Vertrauen wiederzugewinnen und<br />
abzuwägen, wieviel „Abweichung“ eine<br />
Gesellschaft vertragen kann.<br />
Weil er dabei versucht, seinen Argumenten<br />
einen soziologisch-wissenschaftlichen<br />
Anstrich zu geben, ist das Buch etwas<br />
trockener als es sein müsste und kommt<br />
immer wieder auf dieselben Aspekte des<br />
Themas zurück. Alleine die Anmerkungen<br />
und Literaturhinweise nehmen beinahe<br />
150 Seiten ein, was aber auch der<br />
Typografie geschuldet ist. Es ist schade,<br />
dass „Die Kunst des Vertrauens“ so theoretisch<br />
ausgefallen ist, denn in Zeiten, in<br />
denen die Paranoia die Gesellschaft wie<br />
auch Firmen regiert, könnte ein wenig<br />
mehr Vertrauen und Gelassenheit nicht<br />
schaden.<br />
Kleincomputer ganz groß<br />
Während das Herumbasteln am Computer<br />
eher auf dem Rückzug ist, erlebt die<br />
Beschäftigung mit Westentaschenrechnern<br />
wie dem Raspberry Pi paradoxerweise<br />
einen Hype. Also sehen hier auch<br />
Verlage eine Marktlücke für neue <strong>Magazin</strong>e<br />
oder Bücher wie den vorliegenden<br />
Titel „Linux mit Raspberry Pi“ von Christian<br />
Immler aus dem Franzis-Verlag.<br />
Das Buch setzt keine Vorkenntnisse voraus<br />
und begleitet den Leser von den<br />
allerersten Schritten bis zu mäßig komplexen<br />
Projekten. Los geht es mit der<br />
Installation des Linux-Derivats Raspbian,<br />
auf dem so gut wie alle Experimente des<br />
Buchs basieren.<br />
Anschließend wird mit steigendem<br />
Schwierigkeitsgrad erläutert, wie man Linux<br />
bedient, Office-Software oder Spiele<br />
installiert, den Raspberrry Pi als Mediacenter<br />
nutzen kann oder als WLAN-<br />
Zugangspunkt. Die Beschreibungen sind<br />
gut verständlich und mit vielen Bildern<br />
versehen, sodass es nicht zu schwierig<br />
sein sollte, sie nachzuvollziehen.<br />
Was dem Rezensenten aber nicht sofort<br />
einleuchtete, war die Frage, worin bei<br />
den vorgestellten Anwendungen nun der<br />
Reiz liegt. Jeder Aldi-Laptop bringt sie<br />
Out-of-the-Box mit. Ja, es gibt auch ein<br />
kurzes Kapitel über Hardwaresteuerung<br />
via GPIO. Das gipfelt im Beispiel einer<br />
blinkenden LED. Dafür aber bräuchte<br />
man im richtigen Leben genau zwei Transistoren,<br />
Kondensator, Diode und zwei<br />
Widerstände – aber keinen Rechner. n<br />
Liars and Outliers<br />
Bruce Schneier<br />
Die Kunst des Vertrauens:<br />
Liars and Outliers<br />
Deutsche Ausgabe, mitp 2012<br />
ISBN: 978-3-8266-9216-1<br />
464 Seiten, 30 Euro<br />
Raspberry Pi<br />
Christian Immler:<br />
Linux mit Raspberry Pi<br />
1. Auflage, Franzis Verlag 2013<br />
ISBN: 978-3-645-60263-1<br />
319 Seiten, 30 Euro<br />
8 Ausgabe 05-2013 Admin www.admin-magazin.de
Login<br />
News<br />
+++ neueste Nachrichten immer auf http://www.admin-magazin.de +++++ neueste Nachrichte<br />
Neue Software und Produkte<br />
Branchen-News<br />
Neuer IBM-Mainframe<br />
IBM hat mit dem zBC 12<br />
einen neuen Abkömmling<br />
seiner kleineren<br />
Business-Familie von<br />
Mainframes vorgestellt.<br />
Der neue Rechner, der<br />
ab einem Einstiegspreis<br />
von 100 000 Dollar zu<br />
haben sein wird, steigert<br />
bei einer Taktfrequenz<br />
von 4,2 GHz die Leistung<br />
gegenüber seinem Vorgänger<br />
um 36 Prozent.<br />
Für Linux-Anwendungen In die zEC/zBC-12-Mainframe-Familie<br />
können sogar 62 Prozent investiert IBM dieses Jahr 50 Mio. Dollar.<br />
mehr virtuelle Server gelauncht<br />
werden – das alles bei gleichem Energieverbrauch und<br />
sogar sinkenden Preisen für Spezialprozessoren.<br />
Das neue System profitiert weiter von etlichen neuen Features,<br />
von denen einige zuvor bereits in der größeren Enterprise-<br />
Variante zEC12 eingeführt wurden. Darunter eine spezielle<br />
Steckkarte für die Datenkompression, zusätzlicher SSD-Speicher<br />
als RAM-Ersatz, eine Software, die nach 90-tägigem Training<br />
automatisch abnormes Systemverhalten erkennt und meldet<br />
sowie eine Erweiterung der 10-GBit-Ethernet-Technologie für<br />
besonders schnellen Datenaustausch via Remote-DMA.<br />
Insgesamt konnte IBMs Mainframe-Sparte ihren Umsatz gegenüber<br />
dem Vergleichsquartal des letzten Jahres um 11 Prozent<br />
steigern, die installierte Kapazität wuchs sogar um 23 Prozent.<br />
Dafür investiert IBM allein in diesem Jahr über 50 Millionen<br />
US-Dollar in die Entwicklung der zEC/zBC-12-Familie und erwartet,<br />
dass Mainframes in Rechenzentren noch jahrzehntelang<br />
unverzichtbar bleiben werden – übrigens gerade auch für<br />
Cloud-Infrastrukturen.<br />
In eigener Sache<br />
Der Verlag freut sich, Ihnen mitteilen zu können, dass das <strong>ADMIN</strong>-<br />
<strong>Magazin</strong> ab sofort monatlich erscheint. Wir gehen damit einen Schritt in<br />
die entgegengesetzte Richtung vieler Mitbewerber: Wir stocken unsere<br />
Mannschaft auf und verdoppeln die Zahl der jährlichen Ausgaben, um<br />
Ihnen noch mehr praxisrelevante, verständliche und sofort nützliche<br />
Informationen für den Admin-Alltag anbieten zu können. Zu diesem<br />
Schritt hat uns nicht zuletzt das positive Feedback auf die zurückliegenden<br />
Ausgaben ermuntert. Gerne greifen wir bei der Gestaltung der<br />
kommenden Hefte auch Ihre Anregungen auf, die Sie uns in einer E-Mail<br />
an [redaktion@admin‐magazin. de] mitteilen können.<br />
IDC-Cloud-Studie 2013<br />
Unter dem Titel „Cloud Computing in Deutschland 2013“ hat<br />
IDC eine seit einigen Jahren existierende Studienreihe fortgesetzt.<br />
In diesem Jahr untersucht die Studie, inwieweit die<br />
Anforderungen der Fachabteilungen und letztlich ein Wandel<br />
der Geschäftsmodelle das Cloud Computing vorantreibt. Das<br />
Optimieren der Geschäftsprozesse war jedenfalls unter den<br />
260 befragten Firmen aller Größenklassen und Branchen das<br />
meistgenannte Unternehmensziel (28 Prozent). Von einer Cloud<br />
verspricht man sich dabei schnellere und flexiblere Abläufe, die<br />
sich einfacher implementieren und mobil nutzen lassen. Aus<br />
Sicht der IT-Abteilung spielt zusätzlich das Self-Service-Modell<br />
und die vereinfachte Integration vom neuen Filialen oder Niederlassungen<br />
eine große Rolle.<br />
Als größte Herausforderung wird nach wie vor die Sicherheit<br />
eingestuft. Das zweitgrößte Problem ist die ungenügende Zusammenarbeit<br />
von IT und Fachbereich. Technische Schwierigkeiten<br />
tauchen erst an vierter Stelle auf. In der Folge beobachtet<br />
die Studie auch eine häufige Inanspruchnahme öffentlicher<br />
Cloud-Services an der IT-Abteilung vorbei, die allerdings erst<br />
recht Sicherheitsrisiken heraufbeschwört, schlecht unterstützt<br />
wird und einer Integration der Dienste im Wege steht. Ein Nutzen<br />
ist so nur kurzfristig ausweisbar.<br />
Infolge der zunehmenden strategischen Orientierung auf Cloud<br />
Services und der wachsenden Rolle der Fachbereiche sieht die<br />
Studie einen Rollenwandel des CIO und der IT-Mannschaft hin<br />
zu Integratoren und Beratern.<br />
TKMon vereinfacht Icinga-Administration<br />
Ein neues Web-Interface soll die Verwaltung des Monitoring-<br />
Pakets Icinga vereinfachen. Mit Version 1.3 ist das erste stabile<br />
Release des Icinga-Frontends TKMon erschienen. Die webbasierte<br />
grafische Benutzeroberfläche soll das Monitoring-Paket<br />
auch Administratoren zugänglich machen, die wenig Erfahrung<br />
mit Linux haben. TKMon wurde von der Firma Netways zusammen<br />
mit der Thomas Krenn AG entwickelt, die für die eigenen<br />
Server noch ein zusätzliches Add-on anbietet, das im Fehlerfall<br />
den hauseigenen Support alarmiert.<br />
Überwacht werden können mit der Kombination aus Icinga<br />
und TKMon beispielsweise Serverdienste, aber über die IPMI-<br />
Schnittstelle auch die Hardware selbst. Die Software steht unter<br />
der GPL zur Verfügung. Mehr Informationen sind unter der<br />
Adresse [http://www.thomas‐krenn.com/de/oss/tkmon.html]<br />
zu finden. Für Ubuntu gibt es dort auch Paketquellen, mit denen<br />
sich TKMon einfach installieren lässt. Für Support und den Austausch<br />
zwischen Anwendern gibt es eine eigene Mailingliste.<br />
10 Ausgabe 05-2013 Admin www.admin-magazin.de
n immer auf http://www.admin-magazin.de ++++ neueste Nachrichten immer auf http://www.<br />
News<br />
Login<br />
Kaspersky-Malware-Report<br />
Kaspersky Lab veröffentlicht seinen Malware-Report für das<br />
zweite Quartal 2013. Für die deutschen Anwender gab es demnach<br />
zwischen April und Juni 2013 weniger Bedrohungen, dafür<br />
läuft immer mehr Schadsoftware über Deutschland. Weltweit<br />
gesehen steigt die Anzahl mobiler Schädlinge stark an. Und die<br />
virtuelle Währung Bitcoin rückt ebenfalls immer mehr in den<br />
Fokus von Cyber-Kriminellen.<br />
Auch im zweiten Quartal 2013 waren Surfer durch Angriffe aus<br />
dem Internet stark gefährdet. Das Kaspersky Security Network<br />
(KSN) meldet für den Zeitraum April bis Juni 2013 weltweit<br />
genau 577 159 385 Attacken von Internet-Ressourcen. Damit<br />
wurden 35,2 Prozent aller Rechner mindestens einmal während<br />
des Surfens angegriffen.<br />
Kaspersky Lab betrachtet für seine Analyse auch die Herkunftsländer<br />
der Schadprogramme. Und hier gab es im zweiten Quartal<br />
für Deutschland, das bislang auf Platz vier der Weltrangliste<br />
schädlicher Quellen landete, eine unrühmliche Veränderung.<br />
Mit 14,5 Prozent (11,5 im Vorquartal) tauscht Deutschland jetzt<br />
mit den Niederlanden den dritten Platz. Mit anderen Worten<br />
kommt inzwischen jedes siebte gefundene Schadprogramm aus<br />
Deutschland. An der Spitze liegen hier weiter die USA (24,4<br />
Prozent) und Russland (20,7 Prozent).<br />
Mobile Geräte geraten immer mehr ins Visier von Cyber-Kriminellen.<br />
So musste das KSN zwischen April und Juni 29 695<br />
neue Modifikationen von Schadprogrammen für mobile Geräte<br />
verzeichnen. Praktisch alle neuen Schädlinge greifen dabei<br />
Android-Geräte an. Die Experten von Kaspersky Lab zählen<br />
nicht die einzelnen modifizierten Apps, sondern die sogenannten<br />
Schadcode-Samples, welche in unterschiedlichen Apps<br />
zum Einsatz kommen können. Damit warten inzwischen wohl<br />
deutlich mehr als 100 000 schädliche Apps auf den Download<br />
durch arglose Anwender.<br />
Eingeteilt nach Angriffsarten bestehen die im KSN verzeichneten<br />
mobilen Schadcodes zu 32,3 Prozent aus Backdoors, zu<br />
27,7 Prozent aus SMS-Trojanern, und zu 23,2 Prozent aus klassischen<br />
Trojanern. Spionage-Trojaner kommen auf 4,9 Prozent.<br />
Dass Cyber-Kriminelle mit der Zeit gehen, zeigt auch das Phänomen<br />
der sich rasch verbreitenden virtuellen Währung Bitcoin.<br />
Sie ist nicht nur Zahlungsmittel im Internet, sondern lässt<br />
sich inzwischen auch in reale, harte Währungen konvertieren<br />
– mit zwar stark schwankenden, in der Tendenz aber steigenden<br />
Wechselkursen. Inzwischen ist ein Bitcoin bis zu 130 US-Dollar<br />
wert.<br />
Die Tatsache, dass sich Bitcoins durch Rechenleistung generieren<br />
lassen (Bitcoin-Mining), keiner staatlichen Regulierung<br />
oder Kontrolle unterliegen und sich Zahlungsvorgänge in dieser<br />
Währung nicht verfolgen lassen, macht sie für Cyberkriminelle<br />
extrem attraktiv. So deckte Kaspersky Lab im April 2013 eine<br />
Kampagne auf, bei der die Kommunikationssoftware Skype von<br />
Cyber-Kriminellen genutzt wurde, um Bitcoin-Mining zu betreiben.<br />
Über Social-Engineering-Tricks wurden Skype-Anwender<br />
zur Installation entsprechender Malware veranlasst. Die Kampagne<br />
erreichte Klickraten von bis zu 2 000 Stück pro Stunde. Die<br />
auf den missbrauchten Computern generierten Bitcoins wurden<br />
natürlich an den Account der Kriminellen gesendet.<br />
Dell aktualisiert sein Switch-OS FTOS<br />
Dell hat das einheitliche Betriebssystem seiner Netzwerk-Switche<br />
auf die neue Firmware-Release FTOS 9.2 aktualisiert. Mit<br />
dem neuen Release sorgt Dell für eine bessere Unterstützung<br />
der Protokolle VLT (Virtual Link Trunking) und IPv6, eine Optimierung<br />
der Prozeduren und des Managements der Switche.<br />
Das neue Betriebssystem FTOS 9.2 unterstützt die Switch-<br />
Plattformen S4810, S4820T, Z9000 sowie die Blade Switche MXL<br />
und I/O Aggregator und damit die wichtigsten Komponenten<br />
der Dell-Active-Fabric-Architektur.<br />
FTOS 9.2 optimiert außerdem die Integration von iSCSI und unterstützt<br />
dabei das Monitoring von iSCSI-Sessions in einem VLT-<br />
Kontext. Das Session-Monitoring wird nun über das gesamte<br />
VLT-System synchronisiert und bietet eine ausfallsichere Überwachungsfunktion<br />
über alle VLT-Knoten. Das entsprechende<br />
Optimierungspaket ist für iSCSI-Storage-Arrays von Dell Equal-<br />
Logic und Dell Compellent verfügbar.<br />
Bereits seit der Version 9.1 ist OpenFlow zur Unterstützung<br />
von SDN-Lösungen in FTOS integriert. Die Interoperabilität der<br />
Switche S4810, S4820T, Z9000 und MXL mit den Controllern<br />
von Big Switch ist getestet, sodass Anwender hier auf validierte<br />
Lösungen mit Applikationen wie „Big Virtual Switch“ und „Big<br />
Tap“ zurückgreifen können.<br />
Anzeige<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
11
Login<br />
News<br />
+++ neueste Nachrichten immer auf http://www.admin-magazin.de +++++ neueste Nachrichte<br />
SMS trotzt App-Boom<br />
Stetiger Anstieg der SMS-Nutzung in den letzten Jahren.<br />
Seit Jahren wird der drohende Niedergang der SMS beschrieben,<br />
ausgelöst unter anderem durch die zunehmende Konkurrenz<br />
von Smartphone-Apps. Doch die Handy-Kurzmitteilung trotzt<br />
dem App-Boom. Viele neue Anwendungen für SMS sind in den<br />
vergangenen Jahren hinzugekommen: etwa die Benachrichtigung<br />
über Flugverspätungen, den Parkscheinkauf oder die<br />
Mobile-TAN fürs Online-Banking. Entsprechend steigt die Zahl<br />
der verschickten Kurznachrichten seit Jahren unaufhörlich.<br />
2012 wurden in Deutschland über 59 Milliarden SMS versendet,<br />
ein Plus von fast 8 Prozent gegenüber dem Vorjahr. 2013 werden<br />
nach BITKOM-Berechnungen voraussichtlich 63 Milliarden<br />
SMS versendet, eine Steigerung um gut 6 Prozent. Im Schnitt<br />
verschickt jeder Deutsche mittlerweile 740 SMS pro Jahr. 1999<br />
waren es erst 44 SMS.<br />
Allerdings lässt die wirtschaftliche Bedeutung der Kurznachrichten<br />
nach. So ist der Anteil des Short Messaging Service<br />
(SMS) und des Mobile Multimedia Service (MMS) am Umsatz<br />
mit mobilen Datendiensten seit Jahren rückläufig. 2009 lag er<br />
über 50 Prozent, 2012 nur bei rund 35 Prozent. Viele Kunden<br />
nutzen Mobilfunkverträge mit einer SMS-Flatrate. Zudem können<br />
Kurznachrichten netzintern mittlerweile meist kostenlos<br />
verschickt werden. Fast 70 Prozent aller SMS werden netzintern<br />
versendet.<br />
Lange bevor die E-Mail mobil wurde, ermöglichte die SMS,<br />
Nachrichten unabhängig von Ort und Zeit zu übermitteln. Die<br />
Vorteile der SMS: Sie funktionierte ab etwa 1994 auf jedem<br />
Handy, benötigt keine Internetverbindung und keine gesonderte<br />
Anmeldung. Günstige Preise und die Einführung der Prepaid-<br />
Karten Ende der 90er Jahre führten zu einem Handy- und damit<br />
zu einem SMS-Boom. MMS, also Bilder und Filme, können seit<br />
einigen Jahren ebenfalls per Handy verschickt und empfangen<br />
werden.<br />
In Deutschland gibt es rund 113 Millionen Mobilfunkverträge,<br />
fast 1,4 pro Einwohner. Laut einer repräsentativen Umfrage im<br />
BITKOM-Auftrag haben 87 Prozent aller Deutschen ab 14 Jahre<br />
mindestens ein Handy. Dabei geht der Trend klar zu Smartphones:<br />
Auch ältere Menschen steigen derzeit auf die modernen<br />
Geräte um. Aktuell besitzen 40 Prozent aller Deutschen ab 14<br />
Jahren ein Smartphone.<br />
Tablets werden Allrounder<br />
Was stellt man mit einem Tablet-Rechner an? Der Branchenverband<br />
BITKOM erfragte unter 509 Tablet-Nutzern ab 14 Jahren<br />
Details zur Verwendung der mobilen Geräte. Mehr als jeder<br />
zweite Tablet-Nutzer (56 Prozent) spielt auf seinem Gerät, 53<br />
Prozent kaufen damit in Online-Shops ein. Auch zum Betrachten<br />
von Fotos (48 Prozent), zum Besuch sozialer Netzwerke (46<br />
Prozent) und zum Surfen parallel zum Fernsehen als sogenannter<br />
Second Screen (46 Prozent) werden die Geräte eingesetzt.<br />
Zudem liest mehr als jeder dritte Tablet-Nutzer (37 Prozent)<br />
auf seinem Gerät Zeitschriften und Zeitungen, jeder vierte<br />
(24 Prozent) bearbeitet darauf Dokumente. Zudem setzt jeder<br />
Neunte (11 Prozent) es als Fernbedienung für TV-Geräte oder<br />
Musikanlagen ein.<br />
Am häufigsten werden die flachen Computer mit Touch-Display<br />
allerdings zum Schreiben von E-Mails genutzt (64 Prozent der<br />
Tablet-Nutzer), am zweithäufigsten werden sie zum Surfen<br />
im Internet (60 Prozent) verwendet. „Tablet-Computer sind<br />
Alleskönner. Sie werden für eine breite Palette an Aufgaben<br />
genutzt“, sagt Michael Schidlack, BITKOM-Experte für Unterhaltungselektronik.<br />
Zwischen den Altersklassen gibt es deutliche Unterschiede.<br />
Jüngere Tablet-Nutzer zwischen 20 und 29 Jahren setzen es<br />
häufiger für den Medienkonsum ein. 71 Prozent von ihnen<br />
nutzen ihr Gerät zum Spielen von Gaming-Apps. Bei den 50-<br />
bis 59-Jährigen sind es dagegen nur 47 Prozent. Ähnlich sieht<br />
es auch beim Musikhören und Filmeschauen aus. Jeder zweite<br />
der 20- bis 29-Jährigen (55 Prozent) spielt auf seinem Tablet-<br />
Computer Musik ab, 42 Prozent lassen darauf Filme und Serien<br />
laufen. Bei den 50- bis 59-Jährigen sind es dagegen nur 35<br />
beziehungsweise 17 Prozent. Schidlack: „Für viele jüngere<br />
Menschen ist der Tablet-Computer zur zentralen Drehscheibe<br />
für den Medienkonsum geworden. Die Möglichkeit, den Touch-<br />
Rechner immer mitnehmen zu können, sowie die eingebauten<br />
hochauflösenden Bildschirme und eine stetig wachsende Zahl<br />
von Apps aus dem Medienbereich machen ihn als Unterhaltungsgerät<br />
zunehmend beliebter.“<br />
Die Nachfrage nach Tablet-Computern steigt weiterhin sehr<br />
stark. In diesem Jahr soll der Absatz die 5-Millionen-Marke<br />
in Deutschland durchbrechen. 2012 wurden 4,4 Millionen der<br />
flachen Computer mit Touch-Display verkauft. Mittlerweile besitzt<br />
jeder zehnte Deutsche einen Tablet-Computer. Zudem fällt<br />
der Durchschnittspreis der Geräte. 2011 wurden im Schnitt 575<br />
Euro für ein Tablet ausgegeben. Im vergangenen Jahr waren es<br />
nur noch 475 Euro. .<br />
12 Ausgabe 05-2013 Admin www.admin-magazin.de
News<br />
Login<br />
n immer auf http://www.admin-magazin.de ++++ neueste Nachrichten immer auf http://www.<br />
GlusterFS 3.4 verbessert<br />
Das verteilte Linux-Dateisystem GlusterFS wurde von den Entwicklern<br />
in der neuesten Version 3.4 mit einigen nützlichen<br />
Features ausgestattet. So stellt GlusterFS virtuellen Qemu-Maschinen<br />
nun Storage über die Libgfapi zur Verfügung, was den<br />
Zugriff erheblich beschleunigt. Auch zwei andere Änderungen<br />
verbessern die Performance bei der Verwendung von GlusterFS<br />
als Storage für virtuelle Maschinen.<br />
Ebenso wurde die synchrone Replizierung im neuen Release beschleunigt.<br />
Ressource-Agenten ermöglichen es, GlusterFS in eine<br />
Cluster-Umgebung zu integrieren, die kompatibel zum Open<br />
Cluster Framework (OCF) ist – wie etwa Pacemaker. Schließlich<br />
können Anwender und Programmierer nun Posix-ACLs verwenden,<br />
wenn sie GlusterFS-Speicher über NFSv3 anbieten.<br />
CoreOS: minimalistisches Linux<br />
Unter dem Namen „CoreOS“ arbeiten Entwickler nach eigenen<br />
Worten an einem „Linux für die Container-Welt“. Dabei handelt<br />
es sich um eine extrem abgespeckte Linux-Variante, die im wesentlichen<br />
nur aus einem Kernel und Systemd besteht. Darüber<br />
hinaus soll die Root-Partition nur lesbar sein, um die Konsistenz<br />
des Systems zu gewährleisten.<br />
Anwendungen lassen sich auf diesem System in Linux-Containern<br />
mit LXC installieren, womit die Isolation der damit<br />
realisierten Dienste gewährleistet ist. Als Management-Software<br />
für die Container setzen die CoreOS-Entwickler auf das ebenfalls<br />
recht neue Docker. Eine Komponente namens Etcd sorgt<br />
dafür, dass sich die Konfiguration über mehrere Server hinweg<br />
verteilen lässt. Darüber hinaus unterstützt Etcd auch Service<br />
Discovery.<br />
Wer CoreOS ausprobieren möchte, kann sich auf der Website<br />
für eine Alpha-Version anmelden, die vermutlich die Distribution<br />
fertiger Images beinhaltet, die auf einer Vielzahl von<br />
Plattformen betrieben werden können, nämlich Amazon EC2,<br />
Rackspace Cloud, Digital Ocean, Linode, Azure, Softlayer, physische<br />
Server von Hetzner, OVH, OpenStack, Virtualbox, KVM,<br />
Xen, VMware und echter Hardware.<br />
Microsoft veröffentlicht HTTP-2.0-Server<br />
Für Tests bietet Microsoft den Quellcode eines Webservers an,<br />
der wesentliche Teile des kommenden HTTP-2.0-Standards implementiert.<br />
Er basiert auf dem Katana-Projekt, im Rahmen dessen<br />
Microsoft einen in C# geschriebenen Web-Stack unter einer<br />
Open-Source-Lizenz anbietet. Der Code ist unter der Adresse<br />
[https://github.com/MSOpenTech/http2‐katana] zu finden.<br />
Implementiert sind bisher die Features Header Compression,<br />
Stream Multiplexing und Steuerungsmechanismen wie ALPN<br />
(Application Layer Protocol Negotiation) und HTTP-Upgrade.<br />
Server Push und Flow Control fehlen bislang noch.<br />
Um Clients zu testen, bietet Microsoft unter den folgenden<br />
Adressen auch laufende Server im Netz an:<br />
HTTP: [http://http2katanatest.cloudapp.net:8080]<br />
HTTPS mit ALPN: [https://http2katanatest.cloudapp.<br />
net:8443]<br />
Eine weitere Implementation des Drafts in der Programmiersprache<br />
C hat Tatsuhiro Tsujikawa vorgelegt. Sie ist unter [https://<br />
github.com/tatsuhiro‐t/nghttp2] zu finden.<br />
MySQL Workbench aktualisiert<br />
MySQL Workbench ist ein umfangreiches Visualisierungswerkzeug,<br />
das Datenmodellierung, SQL-Entwicklung und Administration<br />
von Server-Konfiguration, Benutzerkontenverwaltung,<br />
Migration und weitere Verwaltungsfunktionen in nur einem<br />
Tool vereint. Nun erschien es in einer neuen Version. Die neugestaltete<br />
GUI beinhaltet einen modernisierten Home Screen<br />
mit optimierter Benutzeroberfläche. Dabei erlaubt eine vertikale<br />
Ergebnisanzeige nun die Darstellung von Ergebnissen als<br />
Spalten-Wert-Paar; ideal für Abfragen mit vielen Spalten, aber<br />
wenig Zeilen. Eine verbesserte Server-Status-Anzeige stellt nun<br />
Status und Konfiguration übersichtlicher dar.<br />
MySQL Workbench 6.0 Enterprise Edition bietet zusätzliche<br />
Features, unter anderem MySQL Enterprise Backup GUI, welches<br />
nun Setup, Durchführung und Planung von Backup-Operationen<br />
erlaubt. MySQL Audit Log Inspector erlaubt Nutzern<br />
Audit Daten von MySQL Enterprise Audit zu durchsuchen.<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
13
Login<br />
Admin-Story<br />
© NASA<br />
Linux-Systeme verwalten mit Spacewalk<br />
Spaziergang<br />
Mit dem Spacewalk-Server existiert ein umfangreiches Framework zum<br />
Verwalten von Linux-Systemen. Geht es dann um die Automatisierung von<br />
Aufgaben, stehen die XML-RPC-basierte API und das Spacecmd-Tool zur<br />
Auswahl. Dieser Artikel stellt die beiden Varianten gegenüber. Thorsten Scherf<br />
Das Management-Framework Spacewalk<br />
war bereits Thema in einer früherer<br />
<strong>ADMIN</strong>-Ausgabe [1]. Ich möchte<br />
daher an dieser Stelle einmal von der<br />
bekannten Weboberfläche weggehen und<br />
stattdessen skriptbasierte Lösungen aufzeigen,<br />
um Aufgaben zu erledigen. Zum<br />
einen existiert hier mit der Spacewalk-<br />
API eine sehr umfangreiche Variante, um<br />
nur alle erdenklichen Aufgaben auf dem<br />
Server durchzuführen. Allerdings muss<br />
der Admin teilweise doch recht komplexe<br />
Skript-Konstrukte bauen, wenn es<br />
darum geht, umfangreiche Arbeiten auf<br />
dem Server zu erledigen. Welche Sprache<br />
hierfür zum Einsatz kommt, ist erstmal<br />
nebensächlich, wichtig ist lediglich, dass<br />
sie XML-RPC-Aufrufe unterstützt. Überwiegend<br />
wird man hier jedoch Perl- und<br />
Python-Skripte vorfinden.<br />
Das Tool Spacecmd greift ebenfalls auf<br />
die XML-RPC-basierte API des Spacewalk-Servers<br />
zurück, kapselt deren Aufrufe<br />
aber in handliche Optionen. Das Tool<br />
wird entweder im interaktiven Modus<br />
gestartet und nimmt dann entsprechende<br />
Anweisungen entgegen oder aber man<br />
übergibt alle notwendigen Optionen und<br />
kann das Tool somit auch in eigenen<br />
Bash-Skripten verwenden. Mancher Admin<br />
hantiert doch lieber mit der Bash<br />
als mit ellenlangen Python- oder Perl-<br />
Programmen. Nachfolgend werden die<br />
beiden Varianten gegenübergestellt und<br />
miteinander verglichen.<br />
Spacewalk-API<br />
Üblicherweise erfordert jedes Skript, das<br />
mit der Spacewalk-API sprechen möchte,<br />
ein Client- und ein Session-Objekt. Das<br />
Session-Objekt dient zur Authentifizierung<br />
auf dem Server und ist bei jedem<br />
Methoden-Aufruf mit anzugeben. Damit<br />
nun nicht in jedem Skript der Benutzername<br />
und das Passwort für den Zugriff<br />
auf den Server mit angegeben werden<br />
muss, bietet es sich an, ein Modul zu<br />
schreiben und dieses in die jeweiligen<br />
Skripte einzubinden.<br />
Listing 1 zeigt ein Beispiel für ein solches<br />
Modul für die Skriptsprache Perl. Dieses<br />
Modul speichert man entweder im Ordner<br />
mit den API-Skripten ab oder legt es<br />
besser noch in das Verzeichnis der Perl-<br />
Module. Welche das sind, zeigt beispielsweise<br />
der Aufruf von »perl ‐V« an. Das<br />
Modul erfordert eine Konfigura tionsdatei<br />
»/etc/sysconfig/spacewalk_api.conf«, in<br />
der, mit Leerzeichen getrennt, der Spacewalk-Server<br />
sowie der Benutzername<br />
und Passwort für den Zugriff auf den<br />
Server aufgeführt sind. Über die Angabe<br />
von »use RHNSession« im Header eines<br />
API-Skriptes kann man nun auf dieses<br />
Modul zurückgreifen.<br />
Das Skript in Listing 2 zeigt ein einfaches<br />
Beispiel. Es bindet das soeben erzeugte<br />
Modul wie beschrieben ein und ruft die<br />
Methode »channel.listSoftwareChannels«<br />
Listing 1: »RHNSession.pm«<br />
01 package RHNSession;<br />
02 <br />
03 use strict;<br />
04 use Exporter;<br />
05 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);<br />
06 <br />
07 $VERSION = 1.0;<br />
08 @ISA = qw(Exporter);<br />
09 @EXPORT = ();<br />
10 @EXPORT_OK = qw(Session);<br />
11 %EXPORT_TAGS = ( DEFAULT => [qw(&Session)] );<br />
12 <br />
13 sub Session {<br />
14 open(IN, "/etc/sysconfig/spacewalk_api.conf") or die "Spacewalk‐API<br />
Config nicht gefunden: $!";<br />
15 $_ = ;<br />
16 my ($server, $user, $pass) = (split);<br />
17 close(IN);<br />
18 <br />
19 my $client = new Frontier::Client(url => "http://$server/rpc/api");<br />
20 my $session = $client‐>call('auth.login', $user, $pass);<br />
21 <br />
22 return ($client, $session);<br />
23 }<br />
14 Ausgabe 05-2013 Admin www.admin-magazin.de
Admin-Story<br />
Login<br />
Abbildung 1: Der Spacewalk-Server bietet jede Menge XML-RPCbasierte<br />
Methoden zur Automatisierung von Aufgaben an.<br />
auf dem Spacewalk-Server auf, die dann<br />
eine Liste der verfügbaren Software-<br />
Kanäle auf dem Bildschirm ausgibt –<br />
zugegebenermaßen ein recht einfaches<br />
Skript.<br />
Mit der Spacewalk-API lassen sich aber<br />
natürlich auch komplexere Aufgaben<br />
erledigen, wie beispielsweise das Erzeugen<br />
oder Modifizieren von Softwareund<br />
Konfigurations-Kanälen, Kickstart-<br />
Dateien oder Systemgruppen. Eine Liste<br />
der zur Verfügung stehenden Methoden<br />
erhält man unter der URL [http://<br />
spacewalk‐server/ rhn/ apidoc/] (Abbildung<br />
1). Hier finden sich auch einige Beispiele<br />
für Perl- und Python-Skripte, die<br />
auf die Spacewalk-API zurückgreifen.<br />
Spacecmd<br />
Man kann sich vorstellen, dass je nach<br />
Anforderung die Skripte recht umfangreich<br />
werden. Das Tool »spacecmd« verbirgt<br />
diese Komplexität und macht es<br />
auch Spacewalk-Einsteigern recht leicht,<br />
komplexe Aufgaben über einfache Bash-<br />
Skripte zu automatisieren. Das Tool ist<br />
mittlerweile Teil der offiziellen Spacewalk-Quellen<br />
und steht somit über die<br />
Website [2] zum Download bereit.<br />
Beim Aufruf von Spacecmd werden die<br />
beiden Konfigurationsdateien »/etc/<br />
spacecmd.conf« und »~/.spacecmd/<br />
config ausgewertet«. Hier lassen sich Ser-<br />
ver- und Authentifizierungs-<br />
Informationen hinterlegen:<br />
[spacecmd]<br />
server=sat.virt.tuxgeek.de<br />
username=admin<br />
password=pw<br />
nossl=0<br />
Im interaktiven Modus bietet<br />
das Tool eine Tab Completion<br />
an, was sehr hilfreich ist,<br />
wenn man nach einer Methode<br />
sucht, deren Namen<br />
aber nicht im Kopf hat.<br />
Um nun das Beispiel aus Listing<br />
2 mit dem Spacewalk-<br />
Tool zu implementieren, reicht<br />
es aus, im interaktiven Modus<br />
einfach das Kommando<br />
»softwarechannel_list« einzugeben.<br />
Das Ergebnis wird<br />
identisch mit dem des Perl-<br />
Skriptes sein. Lediglich der<br />
Aufwand für die Entwicklung<br />
des Skriptes ist geringer.<br />
Für komplexere Aufgaben bietet es sich<br />
an, die Spacecmd-Aufrufe in einem Bash-<br />
Skript zusammenzuführen. Listing 3<br />
zeigt ein einfaches Beispiel, das herausbekommt,<br />
welche Systeme auf welche<br />
Software-Kanäle des Spacewalk-Servers<br />
zurückgreifen. Das Ergebnis des ersten<br />
Spacecmd-Aufrufs wird dabei in der Variablen<br />
»CHANNELS« gespeichert. Anschließend<br />
iteriert man durch die Liste<br />
und übergibt jedes Element – in der Variablen<br />
»c« gespeichert – an den zweiten<br />
Spacecmd-Aufruf. Alles weitere ist nur<br />
noch Kosmetik.<br />
Fazit<br />
Nahezu alle Aufgaben des Spacewalk-<br />
Servers lassen sich mit beiden hier vorgestellen<br />
Varianten automatisieren. Wer<br />
weniger komplexe Skripte haben möchte,<br />
greift dabei bevorzugt auf Spacecmd zurück.<br />
Ich würde den direkten Zugriff auf<br />
Der Autor<br />
Thorsten Scherf arbeitet als Principal Consultant<br />
für Red Hat EMEA. Er ist oft<br />
als Vortragender auf Konferenzen<br />
anzutreffen. Wenn<br />
ihm neben der Arbeit noch<br />
Zeit bleibt, nimmt er gerne<br />
an Marathonläufen teil.<br />
die Spacewalk-API mittels Perl oder Python<br />
nur dann empfehlen, wenn umfangreiche<br />
Aufgaben anstehen.<br />
Sollte eine Methode über die API zur<br />
Verfügung stehen, aber noch nicht im<br />
Spacecmd-Tool implementiert sein, hilft<br />
entweder eine freundliche Anfrage auf<br />
der Mailingliste des Projekts [3] oder<br />
man legt selbst Hand an. Mittels »git<br />
clone git://git.fedorahosted.org/spacewalk.git«<br />
holt man sich die Quellen des<br />
Spacewalk-Servers auf den eigenen Rechner.<br />
Im Unterverzeichnis »spacecmd/src/<br />
lib«befinden sich die einzelnen Module,<br />
welche die API-Methoden implementieren.<br />
(ofr)<br />
n<br />
Infos<br />
[1] Thorsten Scherf, Linux-Systeme mit Spacewalk<br />
verwalten, <strong>ADMIN</strong> 4/2010: [http://<br />
www. admin‐magazin. de/ Das‐Heft/ 2010/ 04/<br />
Linux‐Systeme‐mit‐Spacewalk‐verwalten]<br />
[2] Spacecmd-Repository: [http:// yum.<br />
spacewalkproject. org/ nightly/ Fedora/]<br />
[3] Mailingliste: [https:// www. redhat. com/<br />
mailman/ listinfo/ spacewalk‐list]<br />
Listing 3: »SystemToSWChannel.sh«<br />
01 #!/bin/sh<br />
02 <br />
Listing 2: »listSoftwareChannels.pl«<br />
01 #!/usr/bin/perl<br />
02 <br />
03 use strict;<br />
04 use Frontier::Client;<br />
05 use RHNSession;<br />
06 <br />
07 my ($client, $session) = RHNSession::Session;<br />
08 <br />
09 my $channels = $client‐>call('channel.<br />
listSoftwareChannels', $session);<br />
10 <br />
11 foreach my $channel (@$channels) {<br />
12 print $channel‐>{'label'} . "\n";<br />
13 }<br />
14 <br />
15 $client‐>call('auth.logout', $session);<br />
03 CHANNELS=$(spacecmd ‐‐ softwarechannel_list 2>/dev/<br />
null)<br />
04 <br />
05 for c in $CHANNELS<br />
06 do<br />
07 echo "Systeme die auf den Channel $c zurückgreifen:"<br />
08 spacecmd ‐‐ softwarechannel_listsystems $c 2>/dev/<br />
null<br />
09 echo<br />
10 done<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
15
Security<br />
DDoS<br />
© jager, 123RF<br />
Verteilte Denial-of-Service-Attacken aus und gegen <strong>Clouds</strong><br />
Krieg in den Wolken<br />
Seit Monaten verschärfen sich DDoS-Attacken mit besonders raffinierten Methoden. Die Angreifer bedienen sich<br />
der Cloud und zielen auf sie. Ihre skalierbare Architektur bietet dann nicht nur keinen Schutz, sondern ermöglicht<br />
es dem Angreifer im Gegenteil, konventionelle Abwehrmechanismen aufzuheben. Dieser Beitrag erklärt, wie<br />
eine DDoS-Attacke in der Wolke zustande kommt und wie man sich verteidigt. Filipe Martins und Anna Kobylinska<br />
Eine rekordverdächtige DDoS-Attacke<br />
auf Spamhaus [1] (Abbildung 1), einen<br />
Verwalter von Real-Time-DNS-Blacklists,<br />
legte im März dieses Jahres mit einer<br />
Datenflut von bis zu 300 GBit/s Teile<br />
des Internets lahm. Wer grundlos auf<br />
eine solche schwarze Liste gelangt war,<br />
konnte während des Angriffs nicht mehr<br />
verlangen, von ihr gelöscht zu werden.<br />
Unschuldige Domains blieben so gesperrt<br />
und viele legitime E-Mails konnten nicht<br />
zugestellt werden.<br />
Erst nachdem Spamhaus den kalifornischen<br />
Cloud-Sicherheitsanbieter Cloud-<br />
Flare [2] mit der Verteidigung seiner<br />
Infrastruktur beauftragt hatte, konnte<br />
sich der Dienst online zurückmelden.<br />
Doch die Angreifer ließen nicht locker.<br />
Eine Woche später, am 23. März, brach<br />
schließlich LINX, einer der Backbone-Betreiber<br />
des Internets, unter einer Gesamtdatenlast<br />
von 1,5 Terabit pro Sekunde<br />
zusammen.<br />
Andere Beispiele: Ab Sonntag, dem<br />
10. März 2013, hat eine DDoS-Attacke<br />
die Webseite des deutschen Portals Finanzwelt<br />
(Abbildung 2) [3] für mehrere<br />
Tage außer Betrieb genommen. Im Herbst<br />
letzten Jahres fiel die Internet-Infrastruktur<br />
des deutschen Stromnetzbetreibers<br />
50Hertz kurzfristig der DDoS-Attacke<br />
eines Botnets zum Opfer. Im selben Zeitraum<br />
mussten sich mehrere US-Finanzhäuser<br />
gegen DDoS-Attacken verteidigen.<br />
Beim DDoS-Angriff auf das kalifornische<br />
Geldinstitut Bank of the West konnten die<br />
Täter das entstandene Chaos nutzen, um<br />
völlig unbemerkt nahezu eine Milliarde<br />
US-Dollar (700 Millionen Euro) von den<br />
Accounts ahnungsloser Bankkunden zu<br />
entwenden.<br />
DDoS heute: Viele Vektoren<br />
und DNS-verstärkt<br />
Heutige DDoS-Attacken in der Wolke<br />
haben mit der chaotischen Datenflut einer<br />
konventionellen DDoS-Attacke der<br />
vergangenen Jahre nur noch wenig gemeinsam.<br />
Laut einer Studie von Arbor<br />
Networks lag eine typische DDoS-Attacke<br />
16 Ausgabe 05-2013 Admin www.admin-magazin.de
DDoS<br />
Security<br />
Abbildung 1: Spamhaus, eine Organisation zur Spam-Bekämpfung durch schwarze<br />
Listen, fiel im März dieses Jahres der größten DDoS-Attacke der Internet-<br />
Geschichte zum Opfer.<br />
Bei reflexiven DNS-Attacken sendet der<br />
Angreifer seine DNS-Anfragen nicht diim<br />
vergangenen Jahr bei einer Bitrate<br />
von 1,48 GBit/s. Bei nahezu jedem zweiten<br />
Vorfall im Jahr 2012 handelte es sich<br />
um sorgfältig inszenierte Multi-Vektor-<br />
Angriffe, die zum Teil ununterbrochen<br />
mehrere Wochen lang anhielten.<br />
Multi-Vektor-Angriffe adressieren abwechselnd<br />
und systematisch verschiedene<br />
Schwächen der Infrastruktur des<br />
Opfers und terrorisieren den Geschädigten<br />
mit immer neuen DDoS-Offensiven.<br />
Unterläuft dem Angegriffenen im Eifer<br />
des Gefechts dann ein Fehler in der Konfiguration,<br />
kann das schnell fatale Folgen<br />
haben.<br />
Eine besonders beliebte Form von DDoS-<br />
Attacken in der Wolke nutzt die Schwächen<br />
des DNS-Systems aus: die DNS-<br />
Flut-Attacke. Angreifer erzeugen dabei<br />
DNS-Pakete und senden diese über das<br />
UDP-Protokoll an DNS-Server, um sie mit<br />
Anfragen zu überfluten und ihre Rechenzeit-Ressourcen<br />
aufzubrauchen. Diese<br />
Angriffsmethode kommt sehr oft vor, da<br />
sie relativ einfach umzusetzen ist, eine<br />
enorme Hebelwirkung haben kann und<br />
Angreifern erlaubt, ihre Identität hinter<br />
Dritten zu verstecken.<br />
DNS-Server sind<br />
als Auskunftsdienst<br />
ausgelegt.<br />
Einige Anbieter<br />
betreiben ihre<br />
DNS-Server als<br />
sogenannte Open-<br />
DNS-Resolver; in<br />
dieser Konfiguration<br />
werden auch<br />
rekursive Anfragen<br />
der Namensauflösung<br />
von außerhalb<br />
der jeweiligen<br />
administrativen<br />
Domain beantwortet.<br />
Anfragen,<br />
die sich auf große<br />
Bereiche des Internets<br />
beziehen, können dadurch massive<br />
Datenvolumen zu Tage fördern. Laut<br />
des Geschäftsführers von CloudFlare,<br />
Matthew Prince, wurde die spektakuläre<br />
DDoS-Attacke auf Spamhaus durch lediglich<br />
36 Byte große Datenpakete getrieben,<br />
die pro Anfrage eine jeweils 3000 Byte<br />
lange Antwort auslösten.<br />
Während ein gewöhnlicher Desktop-PC<br />
von der Stange circa 1 000 DNS-Anfragen<br />
pro Sekunde erzeugen kann, geht ein einzelner<br />
DNS-Server üblicherweise bei ungefähr<br />
10 000 DNS-Anfragen pro Sekunde<br />
schon mal in die Knie. Bricht ein DNS-<br />
Server unter Last zusammen, sind davon<br />
gleich mehrere Hosts schwer betroffen.<br />
Zudem verlassen sich fast alle Domain-<br />
Besitzer auf das technische Minimum<br />
von genau zwei DNS-Servern und da sie<br />
die Anforderung an die geografische Dispersion<br />
völlig außer acht lassen, sind bei<br />
dem geringsten DDoS-Befall gleich alle<br />
Dienste außer Betrieb.<br />
Reflexive DNS-Attacken<br />
rekt an das Opfer, sondern an Dritte, die<br />
gar nicht das eigentliche Ziel des DNS-<br />
Angriffs sind. Er fälscht hierbei die IP-<br />
Adresse der Quelle der DNS-Anfrage so,<br />
dass sie der des Opfers entspricht. Wenn<br />
die angesprochenen Hosts nun ordnungsgemäß<br />
auf die Anfrage reagieren,<br />
richten sie ihre Antwort an die gefälschte<br />
Quelladresse und überfluten damit das<br />
eigentliche Angriffsziel mit Daten. So<br />
macht sich der reflexive DNS-Angriff<br />
den immensen Verstärkungsfaktor des<br />
DNS-Systems zu Nutze, denn die DNS-<br />
Antwort ist in der Regel drei- bis zehnmal<br />
umfangreicher als die auslösende DNS-<br />
Anfrage selbst.<br />
Bei einer reflexiven DNS-Attacke kann<br />
der Betroffene auch dann zum Opfer werden,<br />
wenn er gar nicht über eigene DNS-<br />
Server verfügt. Die Angreifer brauchen<br />
aber seine Internetbandbreite auf und/<br />
oder setzen die Firewall außer Gefecht.<br />
Bei reflexiven DNS-Angriffen in der<br />
Wolke unterscheidet man zwischen drei<br />
Versionen mit jeweils verschiedenen<br />
Verstärkungsstufen: native oder selektive<br />
Angriffe und ausgefeilte Angriffe.<br />
Im Falle von reflexiven DNS-Angriffen<br />
vom Typ nativ sind die Antwortpakete<br />
deutlich umfangreicher als die Anfrage-<br />
Pakete. Der Verstärkungsfaktor beträgt<br />
hier lediglich drei bis vier.<br />
Eine selektive reflexive DNS-Attacke<br />
nutzt den Umstand, dass DNS-Antworten<br />
keine einheitliche Länge besitzen. Manche<br />
DNS-Antworten fallen recht kurz aus,<br />
Anzeige<br />
Was ist DDoS?<br />
Bei DDoS (Distributed Denial of Service) handelt<br />
es sich um eine verteilte Attacke, die mithilfe<br />
von Anfragen aus einer Vielzahl von Quellen den<br />
betroffenen Dienst lahmlegt.<br />
Volumetrische DDoS-Attacken generieren eine<br />
Datenflut, mit der sie die Bandbreite ausschöpfen<br />
und die Datenübertragung stilllegen. TCP-<br />
State-Exhaustion-Attacken nehmen sich die Verbindungsstatus-Tabellen<br />
von Firewalls vor, um<br />
diese Elemente der Infrastruktur außer Gefecht<br />
zu setzen und das nun nicht mehr geschützte<br />
Netzwerk zu unterwandern. Angriffe auf der Applikationsebene<br />
adressieren treffsicher Schwächen<br />
der betroffenen Software-Architektur mit<br />
dem geringstmöglichen Datenaufkommen, das<br />
gerade einen Schaden verursacht.<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
17
Security<br />
DDoS<br />
Abbildung 2: Die Webseite dieses deutschen Finanzportals war im März aufgrund<br />
einer DDoS-Attacke mehrere Tage nicht erreichbar.<br />
andere sind wiederum um ein Vielfaches<br />
länger. Bei dieser Angriffsmethode identifiziert<br />
der Angreifer zuerst die Domains,<br />
die eine besonders lange DNS-Antwort<br />
zurückliefern. Das resultiert typischerweise<br />
in einer bis zu zehnfachen Verstärkung.<br />
Im Falle von Spamhaus konnten die Angreifer<br />
allerdings durch das Anfragen von<br />
Informationen über die Domain »ripe.<br />
net« einen Verstärkungsfaktor von 100<br />
zustande bringen. Weil sie die Attacke<br />
mit Hilfe eines ferngesteuerten Botnets<br />
über sagenhafte 30 000 DNS-Resolver verteilt<br />
auf Spamhaus richten konnten, ist<br />
dies keinem der einzelnen Betreiber der<br />
DNS-Server aufgefallen.<br />
Das Repertoire von reflexiven DNS-Attacken<br />
ist damit noch nicht ausgeschöpft.<br />
Einige Angreifer nutzen selbsterstellte<br />
Top-Level-Domains, die einzig und allein<br />
dazu dienen, ausgefeilte DNS-Attacken<br />
auszuführen. Diese Domains erlauben<br />
es den Tätern, DNS-Antworten zu missbrauchen,<br />
die einen bis zu 100-fachen<br />
Verstärkungsfaktor zu Tage fördern.<br />
Rekursive und DNS-<br />
Attacken mit Datenmüll<br />
Die rekursiven DNS-Attacken machen<br />
sich zunutze, dass ein DNS-Server, der<br />
auf eine Anfrage keine Auskunft erteilen<br />
kann, versucht, die fehlenden Informationen<br />
von anderen DNS-Servern anzufordern.<br />
Der Server muss dabei vergleichsweise<br />
viele Ressourcen<br />
reservieren<br />
(CPU-Zyklen,<br />
Arbeitsspeicher<br />
und Bandbreite),<br />
um diese Anfragen<br />
weiterzuleiten und<br />
zu verwalten. Indem<br />
ein Angreifer<br />
Informationen zu<br />
nicht existierende<br />
DNS-Einträgen<br />
anfordert, kann er<br />
einen DNS-Server<br />
leicht überlasten<br />
und seinen Ausfall<br />
verursachen.<br />
Eine DNS-Attacke<br />
mit Datenmüll<br />
überflutet den<br />
DNS-Server durch<br />
das Zustellen großer Datenmengen an<br />
den UDP-Port 53 (seltener UDP-Port 80).<br />
In jedem Szenario mit der Ausnahme<br />
eines DNS-Servers besteht für das Opfer<br />
die Möglichkeit, den betroffenen Port zu<br />
sperren. Der DNS-Server kann aber nicht<br />
den Port sperren, über den er seinen<br />
Dienst anbietet.<br />
Anycast zur Verteidigung<br />
gegen DNS-Fluten<br />
Bei der Verteidigung von Spamhaus hat<br />
CloudFlare, der zuständige Anbieter des<br />
Content Delivery Networks (CDN), seinen<br />
Kunden mit einem geschickten Trick<br />
aus der Affäre gezogen: Mit Hilfe der Adressierungsart<br />
»Anycast«, mit Lastverteilern<br />
und einem eigenen CDN mit Knoten<br />
in insgesamt 23 Datenzentren ließ sich<br />
die Datenflut in der Wolke abfangen.<br />
Die häufigste Adressierungsart im Internet<br />
ist »Unicast«, bei der eine eindeutige<br />
IP-Adresse zu genau einem Host gehört.<br />
Bei Anycast wird dagegen ein und dieselbe<br />
IP-Adresse mehreren Hosts zugewiesen<br />
und der Router stellt die Datenpakete<br />
an denjenigen Host mit der Zieladresse<br />
zu, der geografisch am nächsten<br />
liegt. Dadurch nehmen die Datenpakete<br />
immer den kürzesten Weg und landen<br />
dabei nicht auf einem, sondern auf einer<br />
Vielzahl von Servern. Im Falle von Spamhaus<br />
streute CloudFlare die betroffenen<br />
IP-Adressen auf diese Weise über 23 verschiedene<br />
Datenzentren. Dort wurde der<br />
auf das jeweilige Datenzentrum entfallende<br />
Bruchteil der Anfragen erst einmal<br />
nach verschiedenen Kriterien gefiltert.<br />
Die Datenpakete wurden schließlich erst<br />
dann an Spamhaus weitergeleitet, nachdem<br />
sie Tests ihrer Legitimität bestanden<br />
hatten. So konnte CloudFlare die Spreu<br />
vom Weizen trennen und die bösartigen<br />
Anfragen verwerfen.<br />
CloudFlare treibt die Anycast-Idee dabei<br />
auf die Spitze und weist ein und dieselbe<br />
IP-Adresse allen seinen Kunden zu. Diese<br />
Strategie, die der Anbieter auf den Namen<br />
Global-Anycast-DNS taufte, macht<br />
es den Angreifern unmöglich, auf ihr Ziel<br />
zu fokussieren. Lastverteiler leiten die<br />
Anfragen immer an das nächstgelegene<br />
Datenzentrum mit freien Kapazitäten<br />
um. So kann kein einzelnes Element der<br />
Cloud-Infrastruktur auf Grund der Datenflut<br />
zusammenbrechen (kein Single Point<br />
of Failure).<br />
Global-Anycast-DNS ist bei CoudFlare bereits<br />
im Umfang des Gratis-Basis-Abonnements<br />
enthalten. Ähnliche Dienste<br />
wie CloudFlare haben auch andere CDN-<br />
Anbieter kostenpflichtig im Programm,<br />
darunter Akamai, neuStar, OpenDNS und<br />
Prolexic.<br />
SMURF, ACK-Reflection- und<br />
SYN-Flood-Attacken<br />
In einer SMURF-Attacke sendet der Angreifer<br />
ICMP-Pakete mit einer gefälschten<br />
Absender-IP, die auf das Opfer verweist,<br />
an Dritte. Die Angreifer nehmen<br />
sich dabei einen Router vor, der für die<br />
Weiterleitung von ICMP-Anfragen an andere<br />
Geräte verantwortlich ist. Indem die<br />
Täter die zugehörige Broadcast-Adresse<br />
(X.X.X.255) ansprechen, können sie alle<br />
Geräte in dem jeweiligen Netzwerk hinter<br />
dem Router erreichen. Mangels eines<br />
Handshake-Verfahrens beim Verbindungsaufbau<br />
können Empfänger legitime<br />
von nicht legitimen Anfragen nicht unterscheiden,<br />
und indem sie auf die ICMP-<br />
Anfrage vorschriftsmäßig antworten,<br />
bombardieren sie mit ihren IP-Paketen<br />
das Opfer. Um eine solche Attacke zu<br />
verhindern, genügt es, die Weiterleitung<br />
der ICMP-Anfragen durch die betroffenen<br />
Router zu unterbinden.<br />
Eine ACK-Reflection-Attacke macht sich<br />
den sogenannten TCP-Drei-Wege-Handschlag<br />
zunutze. Ein TCP-Client initiiert<br />
18 Ausgabe 05-2013 Admin www.admin-magazin.de
DDoS<br />
Security<br />
den Verbindungsaufbau durch das Abschicken<br />
eines SYN-Pakets. Beim Empfang<br />
dieses Pakets an einem offenen Port<br />
antwortet der Server mit dem SYN-/ACK-<br />
Paket, um den Verbindungsaufbau zu akzeptieren.<br />
Er reserviert Arbeitsspeicher,<br />
schreibt in die Logs und wartet auf die<br />
abschließende ACK-Antwort des Kommunikationspartners,<br />
die den Empfang der<br />
Nachricht bestätigen soll. Bei einer ACK-<br />
Reflection-Attacke ist die Absender-IP<br />
in der SYN-Anfrage allerdings gefälscht,<br />
sodass der Server seine Antwort an den<br />
falschen Adressaten sendet, nämlich an<br />
das Opfer.<br />
Für eine erfolgreiche Abwehr muss der<br />
Empfänger der Nachricht unverlangt eingehende<br />
Handshake-Pakete verwerfen.<br />
DDoS mit Web Workers und<br />
Cross-Origin-Anfragen<br />
Bei einer DDoS-Attacke mit Web Workers<br />
machen sich die Angreifer einen<br />
Teil der HTML-5-Spezifikation zunutze:<br />
Cross-Origin-Requests. Im ersten Schritt<br />
locken sie Webbesucher auf eine Webseite,<br />
indem sie ihnen den Link zum Beispiel<br />
in einem Bild oder mit einem Skript<br />
wie ein Kuckucksei unterschieben. Die<br />
Webseite startet dann einen Web Worker,<br />
der den Browser dazu bringt, Cross-<br />
Origin-Anfragen an das Opfer zu versenden.<br />
Diese richten sich vorzugsweise an<br />
eine URL, die dem Server Schwerstarbeit<br />
verursacht. Allerdings würde der<br />
weitere Anfragen verhindern, wenn er<br />
keine gültige Antwort mit dem Header<br />
»Access‐Control‐Allow‐Origin« erhält.<br />
Deshalb muss die URL bei jedem Zugriff<br />
leicht modifiziert werden. Mit nur 6000<br />
ahnungslosen Benutzern eines Browsers<br />
wie Chrome lässt sich so eine Flut von bis<br />
zu einer Million Anfragen pro Sekunde<br />
generieren.<br />
Diese Art der Attacke lässt sich genauso<br />
leicht verhindern wie auslösen: Da alle<br />
Cross-Origin-Anfragen den Origin-Header<br />
beinhalten, genügt eine Einstellung in der<br />
Firewall, um solche Anfragen anhand des<br />
Headers zu unterbinden.<br />
DDoS auf Applikationsebene<br />
Neuerdings zielen DDoS-Attacken zunehmend<br />
auf ganz konkrete, gut dokumentierte<br />
Schwächen bestimmter Server-<br />
Dienste; man spricht hierbei von DDoS<br />
auf Applikationsebene (die siebente<br />
Ebene des OSI-Modells) (Abbildung 3).<br />
Angreifer gehen hier im Prinzip wie bei<br />
der sogenannten Slow-Read-Attacke auf<br />
den Webserver Apache vor:<br />
Apache öffnet für jede einzelne Verbindung<br />
einen neuen Thread und behält ihn<br />
für die Dauer der Kommunikation bei.<br />
Angreifer nutzen dieses Verhalten aus,<br />
indem sie Apache mit sorgsam dosierten<br />
Datenpaketen, extrem langsam und<br />
aus möglichst vielen Quellen gleichzeitig<br />
beliefern. So lassen sich die Kapazitäten<br />
von Apache nämlich am einfachsten<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
19
Security<br />
DDoS<br />
ausschöpfen. Laut der IT-<br />
Research-Firma Gartner soll<br />
rund ein Viertel aller DDoS-<br />
Attacken in 2013 auf Applikationsebene<br />
stattfinden.<br />
DDoS via HTTP<br />
Die Abwehr einer ACK-Reflection<br />
und SYN-Flops-Attacke<br />
verläuft nach demselben<br />
Prinzip – unabhängig davon,<br />
ob die Angreifer HTTP oder<br />
HTTPS einsetzen. Dies trifft jedoch auf<br />
DDoS-Attacken auf Applikationsebene<br />
überhaupt nicht mehr zu. Leider sind die<br />
Lösungen zur Schadenbegrenzung bei einer<br />
DDoS-Attacke nur auf das Abschirmen<br />
von DDoS via HTTP ausgelegt.<br />
Datenübertragung via HTTPS wandert im<br />
Internet verschlüsselt durch die Firewalls,<br />
andere Rechner und Router bis hin zum<br />
Lastverteiler oder am Ende zum Webserver.<br />
Die DDoS-Schutzmaßnahmen des<br />
Cloud-Anbieters und sogar die eigenen<br />
Abwehrmechanismen des Geschädigten<br />
sind komplett wirkungslos, solange die<br />
Datenpakete verschlüsselt weitergeleitet<br />
werden.<br />
Mit WordPress im DDoS-<br />
Botnet<br />
Seit 2012 zeichnet sich ein neuer Trend<br />
ab: die Täter verschaffen sich zunehmend<br />
Kontrolle nicht über Desktop-PCs<br />
sondern über hochleistungsfähige Server<br />
in der Cloud, um sorgfältig inszenierte<br />
DDoS-Attacken auszuführen. Bei den<br />
DDoS-Attacken auf US-Finanzinstitute im<br />
vergangenen Jahr konnten die Täter mit<br />
einer Handvoll Server die zwanzigfache<br />
Wirkung eines gewöhnlichen Desktop-<br />
Botnets erreichen.<br />
Es verschärfen sich daher Brute-Force-<br />
Attacken auf WordPress-Seiten in der<br />
Wolke. Ein Botnet aus über 90 000 IP-<br />
Adressen feuert an das beliebte CMS-<br />
System Benutzername-Passwort-Kombinationen.<br />
Das soll den Tätern Zugriff auf<br />
seine Upload-Fähigkeiten verschaffen.<br />
Die Täter installieren dann ihre Skripte<br />
und richten eine Hintertür ein, um den<br />
jeweiligen Webserver in ihr bestehendes<br />
Botnet dauerhaft einzugliedern.<br />
Das Problem der zunehmenden Verbreitung<br />
von DDoS-Attacken trifft besonders<br />
Prozent<br />
45<br />
40<br />
35<br />
30<br />
25<br />
20<br />
15<br />
10<br />
5<br />
0<br />
DDoS-Attacken<br />
stark Unternehmen mit einer skalierbaren<br />
Infrastruktur. Noch vor einigen Jahren<br />
war es üblich, unter DDoS einen Teil<br />
der Last in die Cloud auszulagern, um<br />
aus der elastischen Skalierbarkeit der<br />
Wolke einen Nutzen zu ziehen. Inzwischen<br />
sind die Angriffsmethoden so raffiniert<br />
geworden, dass der größte Vorteil<br />
der Cloud, nämlich deren Skalierbarkeit,<br />
dem Geschädigten zum Verhängnis werden<br />
kann.<br />
Skalierbarkeit: ein<br />
zweischneidiges Schwert<br />
IT-Sicherheitsexperten konnten ihre Bemühungen<br />
bisher auf zwei Phasen einer<br />
DDoS-Konfrontation fokussieren: präventive<br />
Maßnahmen und nachträgliche<br />
Verbesserungen. Die eigentliche DDoS-<br />
Attacke konnte man bisher aussitzen.<br />
Das ist bei DDoS aus der Wolke nicht<br />
mehr möglich. Wer die Zwei-Phasen-<br />
Verteidigung heute noch in die Praxis<br />
umsetzt, zieht den Kürzeren. DDoS-Angriffe<br />
in der Wolke dauern typischerweise<br />
zwischen mehreren Tagen und mehreren<br />
Wochen, und finden abwechselnd über<br />
mehrere Vektoren statt. Das IT-Fachpersonal<br />
kommt nicht mehr umhin, eine<br />
DDoS-Attacke aktiv zu kontern.<br />
DDoS aus der Wolke in die<br />
Wolke<br />
Das Hosting eines CDNs in der Wolke gewinnt<br />
zunehmend an Popularität. Doch<br />
anders als vermutet bietet diese skalierbare<br />
Cloud-Architektur nicht nur keinen<br />
Schutz vor DDoS-Attacken, sondern ganz<br />
im Gegenteil, der Angreifer kann die eigene<br />
Infrastruktur des Opfers ausnutzen,<br />
um IP-basierte Abwehrmechanismen auf<br />
dem Zielserver aufzuheben. Ein CDN<br />
DDos auf Applikationsebene<br />
DDoS-Netzwerkattacken<br />
< 10 MBit/s 10-100 MBit/s 100 MBit/s - 1 GBit/s 1-5 GBit/s 5-10 GBit/s > 10 GBit/s<br />
Geschwindigkeit<br />
Abbildung 3: Datenvolumen typischer DDoS-Attacken auf Netzwerkressourcen<br />
(rot) und auf Server-Applikationen (blau).<br />
kann Attacken mit einem hohen<br />
Datenvolumen aufnehmen<br />
und das Ausschöpfen<br />
der verfügbaren Ressourcen<br />
wesentlich erschweren. Leider<br />
bietet dies den IT-Fachkräften<br />
ein falsches Gefühl<br />
der Sicherheit. Anfragen nach<br />
dynamisch erzeugten Daten<br />
leitet das CDN an den Origin-Server.<br />
Indem die Angreifer<br />
jede Anfrage nach nicht<br />
vorhandenen Daten leicht<br />
modifizieren, können sie das CDN dazu<br />
veranlassen, eine DDoS-Attacke auf das<br />
eigene Data Center loszutreten. Die Täter<br />
können das CDN außerdem mit Cache-<br />
Direktiven im HTTP-Header umgehen,<br />
zum Beispiel mit:<br />
cache‐control: no‐cache<br />
oder<br />
Pragma: no‐cache<br />
Werden bösartige Anfragen durch das<br />
CDN an den Origin-Server weitergeleitet,<br />
unterlaufen sie außerdem bestehende Sicherheitssysteme,<br />
weil sie sich nun mit<br />
einer vertrauenswürdigen IP-Adresse des<br />
eigenen CDNs ausweisen. Das Resultat<br />
ist eine DoS-Attacke des eigenen CDNs<br />
auf das eigene Data Center des Opfers.<br />
Nicht-legitime Anfragen lassen sich in<br />
diesem Fall weder anhand der IP-Adresse<br />
blocken noch anhand des Datenvolumens<br />
identifizieren. Die Lastverteilung<br />
eingehender Angriffe auf verschiedene<br />
Knoten des CDNs sorgt dafür, dass sie<br />
unerkannt mit legitimen Datenströmen<br />
im Multiplex-Verfahren gemischt werden<br />
und erst dann hochkonzentriert die Zielsysteme<br />
bombardieren.<br />
Die einzige Methode, um legitime von<br />
nicht legitimen Anfragen in einer Attacke<br />
aus dem eigenen CDN zu unterscheiden,<br />
besteht im Inspizieren des HTTP-Headers.<br />
Denn erst der X-Forwarded-For-Header<br />
(XFF) gibt hier endgültigen Aufschluss<br />
über den tatsächlichen Ursprung der Anfrage<br />
und ermöglicht dann das gezielte<br />
Abblocken der Attacke anhand der IP-<br />
Adresse. (jcb)<br />
n<br />
Infos<br />
[1] Spamhaus: [http:// www. spamhaus. org]<br />
[2] CloudFlare: [https:// www. cloudflare. com]<br />
[3] Finanzwelt: [http:// finanzwelt. de]<br />
20 Ausgabe 05-2013 Admin www.admin-magazin.de
<strong>Freie</strong> <strong>Clouds</strong><br />
OpenStack<br />
© Vladimir Nenov, 123RF<br />
OpenStack: Der Shooting Star unter den <strong>Clouds</strong><br />
Bausteinprinzip<br />
OpenStack bindet im Augenblick sehr viel von der Publicity, die zum Thema Cloud in einschlägigen Medien anfällt.<br />
Ist die Lösung tatsächlich als Cloud-Primus qualifiziert und was steckt technisch dahinter? Martin Loschwitz<br />
Wer im Augenblick IT-Nachrichten liest,<br />
fühlt sich gelegentlich an eine Szene aus<br />
John Malkovichs „Being John Malkovich“<br />
erinnert, in der eben jener eine Reise<br />
in sich selbst unternimmt und bemerkt,<br />
dass jeder gesprochene Satz durch „John<br />
Malkovich“ ersetzt wird. Denn genau<br />
so ist es in der IT gerade auch: Cloud,<br />
Cloud, Cloud.<br />
Und immer häufiger in direktem Zusammenhang<br />
mit der Cloud OpenStack. Tatsächlich<br />
profiliert sich die offene Cloud-<br />
Umgebung des OpenStack-Projektes gerade<br />
als der Liebling der Community. Ist<br />
der Hype gerechtfertigt? Dieser Artikel<br />
gibt einen Überblick über eines der interessantesten<br />
Projekte der FOSS-Welt.<br />
Was ist Cloud Computing?<br />
Cloud Computing zielt in aller Regel darauf<br />
ab, skalierbare Lösungen zu schaffen.<br />
Konkret geht es darum, den großen<br />
IT-Trend der letzten Jahre, die Virtualisierung,<br />
mit Automatisierung zu verbinden:<br />
Die Idealvorstellung beim Bau einer<br />
Cloud ist es, Kunden die Möglichkeit einzuräumen,<br />
sich mit IT-Dienstleistungen<br />
selbst zu versorgen.<br />
Bei virtualisierten Umgebungen genießen<br />
Unternehmen zunächst ja nur den Vorteil,<br />
dass sie nicht mehr riesige Rechnerparks<br />
in ihren Rechenzentren stehen haben, in<br />
denen einzelne Server nicht ausgelastet<br />
sind. Zur Erinnerung: Ein heute gekaufter<br />
Server lässt sich beispielsweise mit einem<br />
Webserver kaum sinnvoll auslasten. Virtualisierung<br />
umgeht das Problem, indem<br />
sie mehrere virtuelle Appliances auf ein<br />
Blech legt und so für dessen optimale<br />
Auslastung sorgt. Mit Automatisierung<br />
hat das aber noch nicht viel zu tun, denn<br />
auch virtuelle Maschinen müssen häufig<br />
mühsam durch einen Admin installiert<br />
werden.<br />
Cloud Computing erweitert Virtualisierung<br />
um den Do-It-Yourself-Faktor:<br />
Kunden klicken sich über ein intuitives<br />
Web-Interface die Dienste, die sie<br />
im Augenblick benötigen, einfach selbst<br />
zusammen. Das Setup erfolgt automatisch,<br />
die Verrechnung auch. Zu zahlen<br />
ist allerdings nur, was der Kunde auch<br />
tatsächlich in Anspruch nimmt. Braucht<br />
er einen Dienst nicht mehr, stellt er ihn<br />
über das gleiche Web-Interface ab und<br />
muss ihn auch nicht mehr bezahlen.<br />
Reality-Check: OpenStack<br />
Wie passt OpenStack zu dieser Anforderung?<br />
Wichtig ist zunächst, dass es sich<br />
bei OpenStack nicht um ein monolithisches<br />
Programm handelt. Vielmehr beschreibt<br />
der Name OpenStack eine mittlerweile<br />
sehr umfangreiche Sammlung<br />
verschiedener Komponenten, die sich zusammen<br />
um Automatisierung kümmern.<br />
Die verschiedenen OpenStack-Komponenten<br />
befassen sich dabei jeweils nur<br />
mit ihrer spezifischen Aufgabe. Innerhalb<br />
der OpenStack-Welt sind folgende Aufgaben<br />
im Rahmen der Automatisierung<br />
definiert:<br />
n Benutzerverwaltung<br />
n Image-Verwaltung<br />
n Netzwerkverwaltung<br />
n VM-Verwaltung<br />
n Verwaltung von Blockspeicher für<br />
VMs<br />
n Cloud Storage<br />
n das Frontend zum Benutzer<br />
Für jede dieser Aufgaben existiert eine<br />
einzelne OpenStack-Komponente; der Artikel<br />
stellt diese Komponenten im weiteren<br />
Verlauf vor. Übrigens: Komponenten<br />
in OpenStack haben stets zwei Namen,<br />
einerseits den offiziellen Projektnamen<br />
und andererseits einen Codenamen. Der<br />
Artikel nutzt die weitaus geläufigeren<br />
Codenamen, um die einzelnen Teile von<br />
OpenStack zu benennen.<br />
Benutzerverwaltung:<br />
Keystone<br />
Da wäre zunächst die Benutzerverwaltung,<br />
die der Cloud zugrunde liegt. Der<br />
Punkt klingt banal, ist es aber nicht.<br />
22 Ausgabe 05-2013 Admin www.admin-magazin.de
OpenStack<br />
<strong>Freie</strong> <strong>Clouds</strong><br />
Denn: Damit Kunden sich innerhalb einer<br />
Cloud-Computing-Umgebung ihre<br />
Dienste zurechtlegen können, muss jene<br />
zwingend über ein System zur Benutzerverwaltung<br />
verfügen. In OpenStack<br />
sorgt Keystone [1] dafür, dass Benutzer<br />
sich mit ihren Account-Daten einloggen<br />
können.<br />
Keystone implementiert aber nicht nur<br />
ein simples System auf der Grundlage<br />
von Benutzern und Passwörtern, sondern<br />
es bietet ein feingranulares Schema<br />
zum Zuteilen von Berechtigungen: An<br />
oberster Stelle stehen die Tenants, die in<br />
der Cloud-Umgebung typischerweise die<br />
Ebene der Unternehmen darstellen, die<br />
Kunden des Cloud-Anbieters sind. Dann<br />
gibt es die Benutzer, die jeweils Mitglied<br />
eines Tenants sind und dort durchaus<br />
unterschiedliche Rechte haben können.<br />
Der Chef eines Unternehmens wird beispielsweise<br />
die Permissions haben, um<br />
VMs zu starten oder zu stoppen oder<br />
neue Admins zu ernennen, während der<br />
einfache Sysadmin nur virtuelle Systeme<br />
starten oder stoppen darf. Über Key stone<br />
lässt sich solch ein Benutzerschema<br />
nachbilden und zwar für beliebig viele<br />
Tenants.<br />
Auch für die interne Kommunikation<br />
mit den anderen OpenStack-Diensten<br />
ist Keystone verantwortlich; damit ein<br />
OpenStack-Dienst mit einem anderen reden<br />
darf, muss er sich vorher ebenfalls<br />
über Keystone authentifizieren. Dafür<br />
gibt es die Keystone-Middleware, eine Art<br />
Python-Plugin, das jede interne oder externe<br />
Komponente nutzen kann, um die<br />
Keystone-Authentifizierung sicher abzuwickeln.<br />
Apropos Python: Keystone ist –<br />
wie alle anderen OpenStack-Dienste auch<br />
– zu 100 Prozent in Python verfasst.<br />
Und dann wären da noch die Endpunkte:<br />
Damit die Cloud tut, was sie soll, findet<br />
zwischen den einzelnen Komponenten<br />
von OpenStack jede Menge Kommunikation<br />
statt. Weil <strong>Clouds</strong> aber skalieren sollen,<br />
wäre es sehr unpraktisch, für diese<br />
Kommunikation statische IPs zu nutzen.<br />
Keystone pflegt deshalb eine Art Telefonbuch<br />
innerhalb der OpenStack-Cloud:<br />
Das Endpunkte-Verzeichnis listet auf,<br />
welcher OpenStack-Dienst gerade wo zu<br />
erreichen ist. Will ein Dienst mit einem<br />
anderen reden, befragt er also ganz einfach<br />
nur Keystone und erhält im Handumdrehen<br />
die gewünschte Information.<br />
Ändert sich die Adresse eines Dienstes<br />
später, ändert der Admin einfach nur die<br />
Adresse in Keystone, nicht aber in allen<br />
Konfigurationsdateien für jeden Dienst<br />
auf jedem Host.<br />
Image-Verwaltung: Glance<br />
Cloud-Angebote, die Kunden per Web-<br />
Interface nutzen sollen, müssen eine zentrale<br />
Anforderung erfüllen: Sie müssen<br />
niederschwellig sein. Der Kunde muss per<br />
Mausklick eine neue VM starten können,<br />
sonst bringt ihm die ganze Umgebung<br />
nichts. Daraus ergibt sich zwangsläufig,<br />
dass es dem Kunden kaum zuzumuten<br />
ist, sich um die Installation eines Betriebssystems<br />
innerhalb der VM händisch<br />
zu kümmern – oft genug wird er gar nicht<br />
das notwendige Wissen mitbringen, das<br />
er braucht, um die VM zu installieren.<br />
Der Admin hat naturgemäß kein Interesse<br />
daran, dem Kunden die Aufgabe der<br />
manuellen VM-Installation abzunehmen,<br />
denn dann wäre der Automatisierungseffekt<br />
ja dahin.<br />
Glance [2] schafft eine Lösung für das<br />
Problem: In Glance legt der Administrator<br />
einer Cloud-Umgebung fertige Images<br />
an, die der Benutzer dann bei Bedarf<br />
einfach für seine neue VM auswählt. Für<br />
den Admin fällt daher nur einmal Arbeit<br />
an, nämlich beim Einrichten des Images,<br />
und der Kunde hat mit dem Thema<br />
Betriebssystem überhaupt keine Scherereien<br />
mehr.<br />
Unter der Haube besteht Glance aus zwei<br />
Diensten, einer API und einem Tool, das<br />
sich um die Verwaltung der Images kümmert.<br />
Diese Einteilung findet sich in ab-<br />
gewandelter Form in OpenStack häufig.<br />
Auch Keystone ist ja im Grunde nichts<br />
anderes als eine HTTP-basierte API, die<br />
per ReSTful-Prinzip anzusprechen ist.<br />
Glance gehört zu den eher unauffälligen<br />
OpenStack-Komponenten, und Admins<br />
werden nach der ersten Installation mit<br />
dem Dienst nur noch selten etwas zu tun<br />
haben. Er unterstützt diverse Image-Formate,<br />
darunter natürlich das KVM-eigene<br />
Format Qcow2, VMware-VMDK-Images,<br />
aber auch Microsofts VDI-Format aus<br />
Hyper-V. Außerdem lassen sich vorhandene<br />
Systeme relativ leicht in Glancekompatible<br />
Images (Raw Images) verwandeln.<br />
Seinen großen Auftritt hat Glance stets<br />
dann, wenn es gilt, eine neue VM zu starten:<br />
Dann kopiert der Dienst nämlich das<br />
Image für diese VM auf den Hypervisor-<br />
Host, auf dem die VM lokal laufen soll.<br />
Für Admins ergibt sich daraus freilich,<br />
dass in Glance abgelegte Images nicht<br />
zu groß sein sollten, sonst dauert es eine<br />
gefühlte Ewigkeit, bis das Image auf dem<br />
Hypervisor ankommt. Übrigens: Viele<br />
Distributionen bieten fertige Glance-Images<br />
an: Ubuntu kommt beispielsweise mit<br />
seinen UEC-Images [3] daher.<br />
Netzwerkverwaltung:<br />
Neutron<br />
Wer sich mit OpenStack auseinandersetzt,<br />
landet früher oder später auch bei<br />
Neutron. Die Komponente genießt nicht<br />
den besten Ruf und steht im Verdacht,<br />
übermäßig kompliziert zu sein – das liegt<br />
allerdings viel weniger an Neutron selbst<br />
als an seinen umfassenden Aufgaben:<br />
Abbildung 1: Über das Dashboard erhalten Nutzer Zugriff auf die Images, die in Glance gespeichert sind – per<br />
Mausklick wählen sie eines aus.<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
23
<strong>Freie</strong> <strong>Clouds</strong><br />
OpenStack<br />
Abbildung 2: Beim Starten einer VM kann der Kunde sich – Neutron sei Dank –<br />
aussuchen, zu welchem virtuellen Netz die VM eine Verbindung haben soll.<br />
Es kümmert sich darum, dass in einer<br />
OpenStack-Umgebung das Netzwerk so<br />
funktioniert, wie es soll.<br />
Das Thema Netzwerk-Virtualisierung<br />
wird gern unterschätzt. Typische Netzwerk-Topologien<br />
sind eher statisch: Es<br />
herrscht eine meist sternförmige Struktur.<br />
Bestimmten Kunden sind bestimmte<br />
Ports zugewiesen und untereinander<br />
sind Kunden voneinander über VLANs<br />
getrennt. In Cloud-Umgebungen funktioniert<br />
dieses System nicht mehr: Einerseits<br />
ist nicht vorhersagbar, auf welchem<br />
Computing-Knoten die VM eines Kunden<br />
gestartet wird, andererseits skaliert eine<br />
solche Lösung auch nicht. Die Antwort<br />
auf dieses Problem ist Software Defined<br />
Networking, kurz SDN, das im Grunde<br />
ein einfaches Ziel hat: Switches sind bloß<br />
noch Blech, VLANs & Co. sind nicht länger<br />
in Gebrauch und alles, was mit dem<br />
Netzwerk zu tun hat, wird über Software<br />
innerhalb der Umgebung kontrolliert. Die<br />
bekannteste SDN-Lösung ist OpenFlow<br />
[4] mit dem dazugehörigen Frontend<br />
Open vSwitch [5]. Und Neutron bildet<br />
das OpenStack-Gegenstück, nämlich den<br />
Teil, der aus OpenStack heraus auf die<br />
Konfiguration von Open vSwitch (oder<br />
die eines anderen SDN-Stacks) direkten<br />
Einfluss nimmt. De facto lässt sich mit<br />
Neutron ein komplettes Netz virtualisieren,<br />
ohne die Konfiguration einzelner<br />
Switches anzufassen – über verschiedene<br />
Plugins ist es aber auch möglich, Switch-<br />
Konfigurationen direkt aus OpenStack<br />
heraus zu bearbeiten.<br />
Wie OpenStack ist nämlich auch Neutron<br />
[6] modular aufgebaut; die API<br />
wird durch ein Plugin für eine spezifische<br />
SDN-Technik (beispielsweise das bereits<br />
erwähnte Open vSwitch) aufgebohrt, zu<br />
jedem Plugin gehört<br />
auf der Seite<br />
der Computing-<br />
Knoten ein entsprechender<br />
Agent, der die SDN-Befehle<br />
des Plugins umsetzt.<br />
Die generischen Agents für DHCP und L3<br />
erfüllen beide spezielle Aufgaben: Ersterer<br />
sorgt dafür, dass VMs beim Starten von<br />
Tenants IPs per DHCP bekommen, letzterer<br />
schafft eine Verbindung zum Internet<br />
für die laufenden VMs. Auf die Spitze getrieben<br />
ist es mit Neutron möglich, dass<br />
sich jeder Kunde innerhalb seiner Cloud<br />
eine eigene Netzwerk-Topologie baut.<br />
Die Netzwerke von Kunden dürfen dabei<br />
durchaus auch überlappende IP-Bereiche<br />
nutzen, der Fantasie sind letztlich kaum<br />
Grenzen gesetzt. Der Nachteil dieser<br />
enormen Funktionsvielfalt ist freilich,<br />
dass es einiges Vorwissen zu Themen wie<br />
der Funktionsweise von Software Defined<br />
Networks braucht, um zu verstehen, was<br />
Neutron eigentlich tut – und um den Fehler<br />
zu finden, wenn etwas einmal nicht so<br />
funktioniert, wie es soll.<br />
Übrigens: Wer sich in der Vergangenheit<br />
bereits mit OpenStack beschäftigt hat,<br />
kennt diese Komponente vielleicht noch<br />
unter ihrem alten Namen, Quantum. So<br />
hieß Neutron bis einschließlich Open-<br />
Abbildung 3: Neutron baut im Hintergrund in der Standardkonfiguration sowohl<br />
auf OpenFlow als auch auf Open vSwitch auf.<br />
Stack 2013.1, bis ein Streit um Namensrechte<br />
in den USA zur Umbenennung in<br />
Neutron führte.<br />
VM-Verwaltung: Nova<br />
Die bisher vorgestellten Komponenten<br />
erledigen im Rahmen einer Cloud die<br />
wichtige Vorarbeit, um virtuelle Maschinen<br />
laufen zu lassen. Nova [7] kommt<br />
quasi als Exekutive innerhalb einer<br />
OpenStack-Cloud hinzu: Nova zeichnet<br />
für das Starten und Stoppen von virtuellen<br />
Maschinen sowie für die Verwaltung<br />
der zur Verfügung stehenden Hypervisor-<br />
Knoten verantwortlich. Weist der Nutzer<br />
die OpenStack-Cloud an, eine virtuelle<br />
Maschine zu starten, so erledigt Nova<br />
stets das Gros der Arbeit: Es schaut bei<br />
Keystone nach, ob der Benutzer überhaupt<br />
eine VM starten darf, weist Glance<br />
an, eine Kopie des Images auf dem Hypervisor<br />
anzulegen und zwingt Neutron,<br />
eine IP für die neue VM herauszurücken.<br />
Ist all das passiert, startet Nova selbst<br />
die VM auf dem Hypervisor-Knoten und<br />
Abbildung 4: Neben dem Dashboard bieten auch die einzelnen Client-Tools auf der Kommandozeile die<br />
Möglichkeit, die einzelnen Komponenten zu bedienen.<br />
24 Ausgabe 05-2013 Admin www.admin-magazin.de
OpenStack<br />
<strong>Freie</strong> <strong>Clouds</strong><br />
Weise gesichert ist und sich zum Beispiel<br />
auf verschiedenen Knoten starten lässt.<br />
Cloud Storage: Swift<br />
Abbildung 5: Nova besteht aus vielen einzelnen Komponenten, dazu gehören der Scheduler oder<br />
»nova‐compute«.<br />
erlaubt es anschließend auch, sie herunterzufahren,<br />
zu löschen oder auf einen<br />
anderen Host umzuziehen. Auch Nova<br />
besteht aus mehreren Teilen: neben einer<br />
API namens Nova-API ist es vor allem<br />
die Nova-Compute-Komponente, die<br />
auf den Hypervisor-Knoten die Arbeit<br />
erledigt. Andere Komponenten erfüllen<br />
spezifische Aufgaben: »nova‐scheduler«<br />
beispielsweise findet anhand der Konfiguration<br />
und seiner Informationen über<br />
vorhandene Hypervisor-Knoten heraus,<br />
auf welchem Hypervisor die neue VM<br />
überhaupt zu starten ist.<br />
Dabei hat Nova übrigens keineswegs das<br />
Rad neu erfunden: Kommt es zusammen<br />
mit Libvirt und KVM auf Linux-Servern<br />
zum Einsatz, setzt es auf die Funktionen<br />
von Libvirt und baut so auf eine erprobte<br />
Technologie, anstatt eigene Methoden<br />
zum Starten und Stoppen von VMs zu<br />
implementieren. Ähnliches gilt für andere<br />
Hypervisor-Implementierungen, von<br />
denen Nova mittlerweile einen ganzen<br />
Reigen unterstützt: Neben KVM gehören<br />
beispielsweise Xen, Microsoft Hyper-V<br />
und auch VMware zu den Zielplattformen.<br />
Block-Speicher für VMs:<br />
Cinder<br />
Schließlich gibt es noch Cinder [8], dessen<br />
Funktion sich nicht auf den ersten<br />
Blick erschließt – man versteht sie aber,<br />
wenn man sich das Problem vergegenwärtigt:<br />
OpenStack geht grundsätzlich<br />
davon aus, dass virtuelle Maschinen<br />
Am Ende der Vorstellung von OpenStack<br />
steht das Frontend zum Nutzer: Die<br />
schönste Cloud-Umgebung wäre nichts<br />
wert, wenn sie für unerfahrene Anwender<br />
ohne Vorkenntnisse nicht zu bedienen<br />
wäre. Horizon macht OpenStack nutzbar:<br />
Das auf Django basierende Web-Interface<br />
ermöglicht Anwendern das Starten und<br />
Stoppen virtueller Maschinen wie auch<br />
die Konfiguration diverser Parameter, die<br />
mit der Nutzung der Cloud durch die<br />
Anwender in Verbindung stehen. Wenn<br />
eine neue VM zu starten ist, erledigen<br />
Anwender das genauso über Horizon wie<br />
das Zuweisen einer öffentlichen IP zu<br />
einer VM [10].<br />
Freilich darf an dieser Stelle ein kurzer<br />
Überblick über die verschiedenen Vernicht<br />
darauf ausgelegt sind, dauerhaft<br />
zu laufen. Der radikale Gedanke resultiert<br />
aus dem hauptsächlich in Amerika vertretenem<br />
Ansatz, eine Cloud-Umgebung<br />
müsse nur in der Lage sein, schnell viele<br />
VMs aus dem gleichen Image zu starten<br />
– es ist in diesem Prinzip quasi gar nicht<br />
vorgesehen, dass Daten innerhalb einer<br />
VM anfallen, die dauerhaft zu speichern<br />
sind. Deshalb existieren VMs zunächst<br />
nur als lokale Kopie in den Dateisystemen<br />
ihres jeweiligen Hypervisor-Knotens. Und<br />
wenn der abstürzt oder der Kunde die<br />
VM löscht, sind die Daten weg. Das Prinzip<br />
trägt den Namen Ephemeral Storage.<br />
Dass die Realität komplizierter ist, ist<br />
kein Geheimnis.<br />
OpenStack bietet durchaus die Möglichkeit,<br />
Daten in VMs zu sammeln und sie<br />
über den Neustart der VMs hinweg zu<br />
sichern. Genau hier kommt Cinder ins<br />
Spiel: Cinder stattet virtuelle Maschinen<br />
auf Kundenwunsch mit persistentem<br />
Blockspeicher aus. Dabei unterstützt es<br />
eine Vielzahl verschiedener Storage-Backends,<br />
darunter LVM, Ceph, aber auch<br />
Hardware-SANs wie IBMs StoreWiz und<br />
3PAR-Storages von HP. Je nach gewählter<br />
Implementierung unterscheiden sich<br />
die technischen Details im Hintergrund.<br />
Wichtig für den Benutzer ist aber zunächst<br />
nur, dass er sich einen Speicher<br />
anlegt und diesen seiner VM zuweist –<br />
danach greift er in der VM auf den Speicher<br />
wie auf eine gewöhnliche Festplatte<br />
zu. Auf Kundenwunsch hin lassen sich<br />
VMs auch von Block-Devices booten,<br />
sodass die gesamte VM auf dauerhafte<br />
Abbildung 6: Die einzelnen VMs auf den Computing-Knoten liegen einfach auf einem Dateisystem lokal – sollen<br />
sie dauerhaft erhalten bleiben, ist Cinder notwendig.<br />
Nahezu sämtliche bis hierhin vorgestellten<br />
Komponenten beschäftigen sich mit<br />
dem Thema Virtualisierung. Allerdings<br />
ist es gängige Lehrmeinung, dass eine<br />
Cloud zusätzlich auch On-Demand-Storage<br />
bieten muss, also Speicher, welchen<br />
Anwender bei Bedarf über ein simples<br />
Interface nutzen können. Dienste wie<br />
Dropbox oder Google Drive sind der Beweis<br />
dafür, dass solche Dienste sich einer<br />
großen Fangemeinde erfreuen. In Open-<br />
Stack kümmert sich Swift [9] darum,<br />
dass Benutzer Cloud-Speicher haben. Der<br />
vom amerikanischen Anbieter Rackspace<br />
entwickelte Dienst bietet Nutzern über<br />
ein ReSTful-Protokoll die Möglichkeit,<br />
Dateien in den Speicher hoch- oder aus<br />
ihm herunterzuladen. Für Unternehmen<br />
ist Swift interessant, weil es sich um einen<br />
Object Store handelt, der Daten in<br />
Form binärer Objekte ablegt und damit<br />
nahtlos in die Breite skaliert. Wird der<br />
Platz knapp, stellen Unternehmen also<br />
einfach ein paar Storage-Knoten mit frischem<br />
Plattenplatz dazu, ohne dass der<br />
Speicher vollläuft. Es ist übrigens auch<br />
möglich, Swift ohne die anderen Open-<br />
Stack-Komponenten zu betreiben – damit<br />
nimmt der Dienst in OpenStack eine Sonderstellung<br />
ein, denn die anderen Dienste<br />
bedingen einander zwingend.<br />
Das Frontend: Horizon<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
25
<strong>Freie</strong> <strong>Clouds</strong><br />
OpenStack<br />
sionen von OpenStack nicht fehlen – das<br />
Thema stiftet unter Neulingen im Open-<br />
Stack-Umfeld gelegentlich Verwirrung:<br />
Grundsätzlich folgt OpenStack einem<br />
Release-Plan, der jedes halbe Jahr eine<br />
neue Version vorsieht.<br />
OpenStack-Versionen<br />
Die Versionen werden durchnummeriert,<br />
wobei die Jahreszahl stets Teil der Version<br />
ist. Die erste OpenStack-Version im Jahre<br />
2012 hatte folglich die Version 2012.1,<br />
die erste Version im Jahre 2013 hatte die<br />
Version 2013.1. Hinzu kommen die von<br />
der OpenStack-Community ausgewählten<br />
Codenamen, die weitaus geläufiger sind:<br />
OpenStack 2012.1 hieß Essex, 2012.2 hieß<br />
Folsom und OpenStack 2013.1 trägt den<br />
Namen Grizzly. Die nächste Version, die<br />
im Oktober 2013 erscheinen wird, hört<br />
auf den Codenamen Havana. Gewisse<br />
Ähnlichkeiten zum Versionsschema von<br />
Ubuntu sind durchaus gegeben.<br />
Die Community<br />
OpenStack legt großen Wert darauf, ein<br />
Community-Projekt zu sein. Das ist auch<br />
einer der Faktoren, die das Projekt von<br />
anderen Cloud-Stacks abhebt: Anders als<br />
bei Eucalyptus oder OpenNebula steht<br />
bei OpenStack kein Unternehmen im<br />
Hintergrund, das die Entwicklung der<br />
Plattform bewusst steuert. OpenStack<br />
war seit Anbeginn seiner Existenz darauf<br />
ausgelegt, ein Community-Projekt zu<br />
sein. Es ging aus einer Kooperation der<br />
NASA und des amerikanischen Hostinganbieters<br />
Rackspace hervor, der hierzulande<br />
als Hoster von GitHub bekannt sein<br />
dürfte. Die NASA steuerte den Teil bei,<br />
der sich mit Virtualisierung beschäftigte,<br />
Rackspace warf Swift als Speicherlösung<br />
in die Waagschale.<br />
Seither hat sich viel getan: Die NASA ist<br />
nicht mehr an der OpenStack-Entwicklung<br />
beteiligt, aber dafür haben sich Hunderte<br />
andere Firmen der OpenStack-Bewegung<br />
angeschlossen, darunter Größen wie Red<br />
Hat, Intel und HP. Die Projektstruktur<br />
legt weiterhin großen Wert auf die Community,<br />
so gibt es beispielsweise eine<br />
OpenStack-Foundation, deren Board-Mitglieder<br />
zum Teil direkt von Projektmitgliedern<br />
gewählt werden. Jede der zuvor<br />
beschriebenen Komponenten hat einen<br />
technischen Projektleiter (Project Technical<br />
Lead, PTL), der ebenfalls demokratisch<br />
gewählt wird. Und: OpenStack legt<br />
viel Wert darauf, jedem Interessierten die<br />
Mitarbeit zu ermöglichen, wer also will,<br />
findet in OpenStack definitiv etwas, zu<br />
dem er Sinnvolles beisteuern kann.<br />
Auf den zweimal jährlich stattfindenden<br />
Design Summits zelebriert das Projekt<br />
seine Wurzeln in der Community und<br />
lädt Entwickler dazu ein, im Rahmen einer<br />
Konferenz über mehrere Tage hinweg<br />
Vorträgen zu lauschen oder über Designkonzepte<br />
zu brüten, die im weiteren Verlauf<br />
die Entwicklung bestimmen. Keine<br />
Rede also von einer One-Man-Show.<br />
Mehr Informationen<br />
Es würde an dieser Stelle den Rahmen<br />
des Artikels bei Weitem sprengen, die<br />
Funktionen der OpenStack-Komponenten<br />
genauer zu erläutern oder auf weitere<br />
Hintergründe des Projektes einzugehen.<br />
Wer mehr wissen möchte, findet<br />
auf den einzelnen Seiten der OpenStack-<br />
Komponenten mehr Informationen. Die<br />
Dokumentation des Projekts kann sich<br />
mittlerweile sehen lassen [11], und auch<br />
im Wiki des OpenStack-Projektes finden<br />
sich viele detaillierte Informationen.<br />
Für die Aufzeichnungen über Fehlerberichte<br />
nutzt OpenStack übrigens Launchpad,<br />
und auch die »Questions«-Funktion<br />
von Launchpad bietet die Möglichkeit,<br />
bei hartnäckigen Problemen eine Frage<br />
in die Runde zu werfen, derer sich nicht<br />
selten einer der Projektentwickler direkt<br />
annimmt.<br />
Der offizielle IRC-Kanal des OpenStack-<br />
Projektes ist »#openstack« auf Freenode.<br />
Auch hier finden sich etliche erfahrene<br />
OpenStack-Anwender, die bei konkreten<br />
Problemen vielleicht weiterhelfen können.<br />
Wer OpenStack ausprobieren möchte,<br />
findet im Netz einige vollständige Installationsanleitungen<br />
und kann quasi sofort<br />
loslegen – zum Testen reichen drei virtuelle<br />
Maschinen völlig aus, eigene Hardware<br />
ist nicht notwendig. Schließlich sei<br />
auch auf die verschiedenen OpenStack-<br />
Artikel des Autors dieses Artikels verwiesen,<br />
die in den letzten <strong>ADMIN</strong>-Ausgaben<br />
erschienen sind. (jcb)<br />
n<br />
Infos<br />
[1] Keystone: [http:// keystone. openstack.<br />
org/]<br />
[2] Glance: [http:// glance. openstack. org/]<br />
[3] Ubuntu-UEC-Images: [http:// cloud‐images.<br />
ubuntu. com/]<br />
[4] OpenFlow: [http:// www. openflow. org/]<br />
[5] Open vSwitch: [http:// www. openvswitch.<br />
org/]<br />
[6] Neutron: [http:// quantum. openstack. org/]<br />
[7] Nova: [http:// nova. openstack. org/]<br />
[8] Cinder: [http:// cinder. openstack. org/]<br />
[9] Swift: [http:// swift. openstack. org/]<br />
[10] Horizon: [http:// horizon. openstack. org/]<br />
[11] OpenStack-Wiki: [http:// wiki. openstack.<br />
org/]<br />
Abbildung 7: Über das Dashboard steuern Nutzer die Dienste, die sie innerhalb der Cloud nutzen, wie etwa<br />
virtuelle Maschinen.<br />
Der Autor<br />
Martin Gerhard Loschwitz arbeitet als Principal<br />
Consultant bei hastexo. Er beschäftigt sich dort<br />
intensiv mit Distributed-Storage-Lösungen sowie<br />
OpenStack. Außerdem ist er Entwickler beim<br />
Debian-Projekt.<br />
26 Ausgabe 05-2013 Admin www.admin-magazin.de
<strong>Freie</strong> <strong>Clouds</strong><br />
OpenNebula<br />
© pitris, 123RF<br />
OpenNebula – Open-Source-Datacenter-Virtualisierung<br />
Griff zu den Sternen<br />
OpenNebula ist eine Enterprise-Cloud-Management-Plattform, die 2005 aus einem EU-Forschungsprojekt hervorgegangen<br />
ist. Damit ist sie bereits länger am Markt als viele vergleichbare Produkte. Mit der aktuellen Version<br />
4.2 (Codename Flame) präsentiert sie sich seit Juli 2013 in neuem Gewand. Bernd Erk<br />
OpenNebula [1] selbst trennt die vorhandenen<br />
Cloud-Lösungen in die beiden<br />
Einsatzbereiche Infrastructure Provisioning<br />
und Datacenter Virtualizsation [2]<br />
und sieht sich selbst im letztgenannten<br />
Bereich. Diese Einteilung erlaubt auch<br />
eine klare Positionierung im Vergleich zu<br />
anderen Lösungen, worauf der Artikel<br />
noch eingehen wird.<br />
Was ist OpenNebula?<br />
OpenNebula greift zur Bereitstellung von<br />
Ressourcen auf verschiedene etablierte<br />
Subsysteme in den Bereichen Virtualisierung,<br />
Networking und Storage zurück.<br />
Dies ist bereits ein signifikanter Unterschied<br />
zu Alternativlösungen wie Open-<br />
Stack und Eucalyptus. Diese favorisieren<br />
nämlich eigene Konzepte – am Beispiel<br />
von Storage und OpenStack via Swift.<br />
Alle diese Subsysteme [Abbildung 1]<br />
werden über einen zentralen Daemon<br />
(»oned«) miteinander verbunden. Zusammen<br />
mit einem Benutzer- und Rollenkonzept<br />
werden diese Komponenten<br />
über Command Line Interfaces und das<br />
Web-Interface bereitgestellt. Die Bedienung<br />
der Hosts und VMs ist dadurch<br />
unabhängig vom eingesetzten Subsystem<br />
und erlaubt eine transparente Steuerung<br />
von Xen, KVM und VMware. Auch ein<br />
gemischter Betrieb dieser Hypervisor ist<br />
möglich – OpenNebula abstrahiert dabei<br />
von den jeweils verfügbaren Komponenten<br />
mithilfe eines einheitlichen Interfaces.<br />
Genau in dieser transparenten Verbindung<br />
unterschiedlichster Komponenten<br />
steckt die Stärke von OpenNebula: seine<br />
hohe Integrationsfähigkeit.<br />
Aufbau<br />
Ein wichtiges Merkmal von OpenNebula<br />
ist der Schwerpunkt auf Rechenzentrumsvirtualisierung<br />
mit bestehender<br />
Infrastruktur. Wichtige Voraussetzung<br />
dafür ist die Unterstützung einer Vielzahl<br />
an Infrastrukturkomponenten und deren<br />
dynamische Verwendung.<br />
Besonders gut erkennt man das an den<br />
sogenannten Datastores. Deren Grundidee<br />
ist simpel: Während beispielsweise<br />
ein Testsystem jederzeit wieder aus dem<br />
zentralen Image Repository auf einen Hypervisor<br />
kopiert werden kann, ist bei einem<br />
DB-Server die Wiederherstellung der<br />
letzten Laufzeitumgebung notwendig. Die<br />
innerhalb einer OpenNebula-Installation<br />
mehrfach konfigurierbare Definition von<br />
Datastores bietet die Möglichkeit, sich<br />
diesen unterschiedlichen Lebenszyklen<br />
anzupassen. So kann ein persistentes<br />
Image auf einem NFS-Volume beheimatet<br />
sein und ein volatiles Image wird zum<br />
Startzeitpunkt auf den eingesetzten Hypervisor<br />
kopiert.<br />
Der Konfigurations- und der Monitoringstack<br />
sind innerhalb von OpenNebula<br />
28 Ausgabe 05-2013 Admin www.admin-magazin.de
OpenNebula<br />
<strong>Freie</strong> <strong>Clouds</strong><br />
vollständig getrennt. Ein klarer Workflow<br />
stellt Compute-Ressourcen bereit und<br />
überwacht in der Folge die Verfügbarkeit.<br />
Ein Ausfall des OpenNebula-Cores<br />
hat dabei keinerlei Auswirkung auf den<br />
Runtime-Status der jeweiligen Instanzen,<br />
da Kommandos nur im Bedarfsfall abgesetzt<br />
werden.<br />
Zur Überwachung selbst dienen abhängig<br />
vom Hypervisor lokale Kommandos. So<br />
pollt der Core regelmässig alle aktiven<br />
Hypervisor und prüft, ob die konfigurierten<br />
Systeme noch aktiv sind. Sollte<br />
das nicht der Fall sein, werden sie neu<br />
gestartet.<br />
Durch die Überwachung von Hypervisor-<br />
Ressourcen wie Memory und CPU wird<br />
eine Vielzahl von Systemen im Fehlerfall<br />
schnell umverteilt und neu gestartet. Typischerweise<br />
werden bei Ausfall eines<br />
Hypervisors die betroffenen Systeme so<br />
schnell verteilt, dass ein Nagios- oder<br />
Icinga-System im Standardintervall keinen<br />
Alarm schlägt. Lediglich der Ausfall<br />
des Hypervisors soll natürlich für Aufmerksamkeit<br />
sorgen.<br />
Selfmanagement und Überwachung der<br />
Ressourcen sind ein wichtiger Bestandteil<br />
von OpenNebula und im Vergleich<br />
zu anderen Produkten bereits sehr detailliert<br />
und variabel verwendbar. Über<br />
ein Hook-System können darüber hinaus<br />
noch an allen erdenklichen Stellen Custom-Skripte<br />
ausgeführt werden. Mit der<br />
Auto-Scaling-Implementierung OneFlow<br />
können ab Version 4.2 auch Abhängigkei-<br />
ten über Systemgrenzen hinweg definiert<br />
und überwacht werden. Aber dazu später<br />
mehr.<br />
Die Installation<br />
Die Installation von OpenNebula ist im<br />
Detail stark von den eingesetzten Komponenten<br />
wie Virtualisierungs-, Storageund<br />
Netzwerk-Providern abhängig. Für<br />
alle gängigen Provider bietet der Design-<br />
Guide [3] jedoch ausführliche Beschreibungen<br />
und Hinweise zur Vermeidung<br />
der klassischen Fehlkonfigurationen. In<br />
der Basis setzt sich eine Installation aus<br />
vier Komponenten zusammen:<br />
n Core und Interfaces<br />
n Hosts<br />
n Image Repository und Storage<br />
n Networking<br />
Der Management-Core (»oned«) bildet<br />
gemeinsam mit den entsprechenden APIs<br />
und dem Web-Interface (Sunstone) die<br />
eigentliche Steuereinheit der Cloud-Installation.<br />
Auf den Virtualisierungs-Hosts<br />
muss mit der Ausnahme von Ruby keine<br />
spezifische Software laufen; jedoch muss<br />
der Zugriff per SSH auf alle beteiligten<br />
Hosts möglich sein, um später Statusdaten<br />
abzurufen oder gegebenfalls Images<br />
zu übertragen. Für den Aufbau des<br />
Image Repositories gibt es verschiedene<br />
Möglichkeiten unter Verwendung von<br />
Shared- oder Non-shared-Filesystemen.<br />
Die Entscheidung für die richtige Storage-<br />
Infrastruktur ist an dieser Stelle wohl<br />
Abbildung 1: OpenNebula setzt auf existierende Virtualisierungs-Netzwerk- und Storage-Lösungen, die ein<br />
zentraler Daemon integriert.<br />
die wichtigste, da eine Umstellung zum<br />
späteren Zeitpunkt mit großem Aufwand<br />
verbunden ist.<br />
Ein Szenario ohne Shared-Filesystem ist<br />
zwar denkbar, allerdings muss dann auf<br />
Features wie Live-Migration verzichtet<br />
werden. Fällt ein Host aus, wäre es dann<br />
nötig, das entsprechende Image erneut<br />
zu deployen, und die volatilen Datenänderung<br />
wären verloren.<br />
Die Installation der Komponenten kann<br />
über entsprechende Distributionspakete<br />
für alle gängigen Plattformen [4] oder<br />
aus den Sourcen [5] erfolgen und ist<br />
auf der Projektseite sehr ausführlich<br />
beschrieben. Nach Installation der notwendigen<br />
Pakete und Anlage des Open-<br />
Nebula-Users »oneadmin« ist noch der<br />
entsprechende SSH-Key zu generieren.<br />
Anschließend muss man diesen auf den<br />
eingesetzten Host-Systemen verteilen –<br />
fertig! Wenn alles richtig gemacht wurde,<br />
sollte ein Start von OpenNebula mit dem<br />
Befehl »one start« erfolgreich sein und<br />
der Zugriff auf den Daemon unter Verwendung<br />
des CLI ohne Probleme durchlaufen.<br />
Konfiguration und<br />
Management<br />
Als erster Schritt nach der Installation<br />
müssen dem System die entsprechenden<br />
Hypervisor hinzugefügt werden, um virtuelle<br />
Systeme zur Verfügung zu stellen.<br />
Es werden aktuell Xen, KVM und VMware<br />
unterstützt. Abhängig vom gewählten<br />
Hypervisor muss die Konfiguration<br />
noch im zentralen Konfigurationsfile<br />
»/etc/one/oned.conf« erweitert werden,<br />
um die korrekte Ansteuerung des Host-<br />
Systems sicherzustellen. Im Falle von<br />
KVM erfolgt die Kommunikation mittels<br />
»libvirt«, welches als Interface sowohl<br />
die Verwaltungs- als auch Monitoring-<br />
Funktionen übernimmt.<br />
Auch wenn OpenNebula 4.2 mit einer<br />
sehr schönen neuen Webkonsole (Abbildung<br />
2) und einem Self-Service-Portal<br />
daherkommt, ist die Steuerung aller<br />
Komponenten mittels CLI möglich. Die<br />
meisten Kommandos arbeiten mit Hostund<br />
VM-IDs, um diese Komponenten sicher<br />
zu identifizieren und zu steuern.<br />
Eine Anbindung von OpenNebula an<br />
eine CMDB ist ein Kinderspiel – so lassen<br />
sich automatisch VMs generieren,<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
29
<strong>Freie</strong> <strong>Clouds</strong><br />
OpenNebula<br />
nachdem sie in der Verwaltungsoberfläche<br />
angelegt wurden. Auch Puppet, Chef<br />
und Cfengine lassen sich zur Steuerung<br />
der Cloud-Umgebung heranziehen.<br />
Funktional wird man mit dem zur Verfügung<br />
stehenden Feature-Set nichts vermissen.<br />
Eine gewisse Einarbeitung in das<br />
Vorgehen und die Funktionen der einzelnen<br />
Subsysteme bedarf allerdings etwas<br />
Zeit. Auch ein hybrider Betrieb verschiedener<br />
Wirtssysteme oder auch die Verlagerung<br />
von Ressourcen in andere private<br />
Zonen oder zu Public-Cloud-Anbietern<br />
ist mit OpenNebula möglich und kann<br />
unter einer einheitlichen administrativen<br />
Konsole bewerkstelligt werden.<br />
Cloud Shaping<br />
Mit zunehmender Größe einer Cloud-<br />
Umgebung sind auch Abhängigkeiten zu<br />
Nutzern, Standorten und Fähigkeiten der<br />
eingesetzten Systeme zu berücksichtigen.<br />
OpenNebula verfügt hier mit Gruppen,<br />
virtuellen Datacenters (kurz VDC) und<br />
Zones über drei Basiskonzepte.<br />
Gruppen erlauben es, Systeme mit<br />
gleichartigen Fähigkeiten zu logischen<br />
Einheiten zusammenzuschließen. Damit<br />
können Voraussetzungen für den Betrieb<br />
bestimmter Systeme definiert und solche<br />
mit Zugriff auf die gleiche Teilinfrastruktur<br />
wie Datastore, VLANs und Hypervisor<br />
zusammengefasst werden. So lässt sich<br />
zum Beispiel ein KVM-System auf einem<br />
GlusterFS-Storage natürlich nur auf Servern<br />
mit KVM-Hypervisor und GlusterFS-<br />
Zugriff betreiben. Gruppen stellen sicher,<br />
Abbildung 2: Das neue Web-Interface von OpenNebula 4.2.<br />
dass genau diese Voraussetzungen auch<br />
erfüllt sind.<br />
Wenn eine Sammlung von Ressourcen<br />
einer Anzahl Benutzer oder auch einem<br />
Kunden zur Verfügung gestellt werden<br />
soll, ohne dass Gruppen zum Einsatz<br />
kommen, dann ist die Verwendung von<br />
VDC die Lösung. Beliebige Ressourcen<br />
können zu virtuellen Rechenzentren zusammengefasst<br />
und über ACLs berechtigt<br />
werden. Diese zonenübergreifenden Zusammenschlüsse<br />
bieten neben der Isolation<br />
von Noisy Neighbors und der Teilzuordnung<br />
von Ressourcen auch eine sehr<br />
gute Basis für Individualabrechnung von<br />
Ressourcen. Auch die Unterteilung aller<br />
Ressourcen in individuelle Private <strong>Clouds</strong><br />
lässt sich einfach mit VDCs lösen.<br />
Als drittes Teilkonzept für den Zusammenschluss<br />
großer Installationen bietet<br />
OpenNebula Zones. Zones (oZones) ermöglichen<br />
die zentrale Überwachung<br />
und Konfiguration individueller Open-<br />
Nebula-Einzelinstallationen. Dies erlaubt<br />
die vollständige Isolation einzelner Bereiche<br />
über die Versionsgrenzen hinweg<br />
und die gleichzeitige zentrale Steuerung<br />
der Umgebung.<br />
Diese Trennung kann das Applikationsprofil,<br />
aber auch den Standort oder Kunden<br />
berücksichtigen. Auch wenn man<br />
eine Vielzahl von OpenNebula-Installationen<br />
zusammenfasst, ist eine unabhängige<br />
Steuerung der Einzelsysteme<br />
möglich. Somit ist die maximale Freiheit<br />
in der jeweiligen Einzelumgebung bei<br />
Listing 1: Ressourcen ändern<br />
01 {<br />
02 "name": "ONE‐SCALE",<br />
03 "deployment": "none",<br />
04 "roles": [<br />
05 {<br />
06 "name": "appserver",<br />
07 "cardinality": 2,<br />
08 "vm_template": 0,<br />
09 <br />
10 "min_vms" : 5,<br />
11 "max_vms" : 10,<br />
12 <br />
13 "elasticity_policies" : [<br />
14 {<br />
15 // +2 VMs when the exp. is true for 3 times in a row,<br />
16 // separated by 10 seconds<br />
17 "expression" : "CONNECTION > 2000",<br />
18 <br />
19 "type" : "CHANGE",<br />
20 "adjust" : 2,<br />
21 <br />
22 "period_number" : 3,<br />
23 "period" : 10<br />
24 },<br />
25 {<br />
26 // ‐10 percent VMs when the exp. is true.<br />
27 // If 10 percent is less than 2, ‐2 VMs.<br />
28 "expression" : "CONNECTION < 2000",<br />
29 <br />
30 "type" : "PERCENTAGE_CHANGE",<br />
31 "adjust" : ‐10,<br />
32 "min_adjust_step" : 2<br />
33 }<br />
34 ]<br />
35 }<br />
36 ]<br />
37 }<br />
32 Ausgabe 05-2013 Admin www.admin-magazin.de
OpenNebula<br />
<strong>Freie</strong> <strong>Clouds</strong><br />
gleichzeitiger zentraler Zusammenfassung<br />
und Überwachung gewährleistet.<br />
Neues in Version 4.2<br />
Bereits mit der Version 4.0 haben viele<br />
neue Features in OpenNebula Einzug<br />
gehalten. Gerade im Bereich der Virtualisierungsschicht<br />
bietet OpenNebula mit<br />
Features wie Realtime Snapshots und<br />
Capacity Resizing nun alles, um auch<br />
mit kommerziellen Lösungen auf Augenhöhe<br />
zu agieren. Die bereits angesprochene<br />
Neuerung der Weboberfläche ist<br />
sicherlich die auffälligste Veränderung<br />
und verbindet nun die früher getrennten<br />
Sichten für Admin und Self Service in<br />
einer Oberfläche.<br />
Besonders erwähnenswert sind die beiden<br />
neuen Komponenten OpenNebula Gate<br />
und OpenNebula Flow. Gate ermöglicht es<br />
dem Anwender, mithilfe eines Sicherheits-<br />
Tokens Informationen zwischen VMs und<br />
OpenNebula auszutauschen. Eine bei<br />
Template-Erzeugung erstellte URL kann<br />
so Applikationsmetriken an OpenNebula<br />
übergeben und mit Hilfe von Sunstone visualisieren.<br />
Ein Beispiel wäre, die aktiven<br />
Connections eines virtualisierten Loadbalancers<br />
in regelmässigen Abständen an<br />
OpenNebula zu übergeben.<br />
Sinnvoll ist die anschließende Verarbeitung<br />
dieser Informationen mit der neuen<br />
Komponente Flow. Die früher als App-<br />
Flow verfügbare Erweiterung ist seit 4.2<br />
fester Bestandteil und wurde im Rahmen<br />
der Übernahme stark erweitert. Mit Hilfe<br />
von Flow lassen sich statische, aber auch<br />
dynamische Regeln auf Basis von Open-<br />
Nebula-Gate-Werten ausführen.<br />
Hier trennt OpenNebula in sogenannte<br />
Scheduled Policies und Elasticity Policies<br />
(Abbildung 3). Scheduled Policies<br />
erlauben, wie der Name bereits vermuten<br />
lässt, die zeitgesteuerte Veränderung von<br />
Ressourcen-Pools. So können Applikationsserver<br />
in der Nacht oder am Wochenende<br />
nach statischen Regeln heruntergefahren<br />
werden, wenn deren Leistung<br />
nicht benötigt wird.<br />
Elasticity Policies können nach Regeln<br />
und unter Berücksichtigung von Gate-<br />
Werten Änderungen an Pools vornehmen.<br />
Nach Definition von Minimal- und<br />
Maximalgröße eines Pools werden regelgesteuert<br />
virtuelle Maschinen gestartet<br />
oder heruntergefahren. Unter Verwendung<br />
von Expressions und Period-Regeln<br />
lassen sich dann in variablen Intervallen<br />
die verfügbaren Ressourcen ändern.<br />
Listing 1 zeigt die Verwendung einer dynamischen<br />
Regel auf Basis der Connections.<br />
Die per OpenNebula Gate übermittelte<br />
Anzahl aktiver Connections wird<br />
geprüft und führt in der ersten Teilregel<br />
nach dreifacher Überschreitung zum Start<br />
zweier neuer Systeme. Die zweite Teilregel<br />
erlaubt die Reduzierung des Pools,<br />
wenn sich die Connections um einen bestimmten<br />
Prozentsatz verringern.<br />
Durch Verbindung von dynamischen<br />
Applikatonsinformationen mit den Möglichkeiten<br />
des OpenNebula-Kerns sind<br />
dem Management komplexerer Applikationsszenarien<br />
keinerlei Grenzen gesetzt.<br />
Die Syntax ist selbsterklärend und Regeln<br />
sind in kurzer Zeit für vielfältige Szenarien<br />
verwendbar. Damit erfüllt OpenNebula<br />
eine wichtige Anforderungen von<br />
Applikationsbetreibern und erlaubt die<br />
bedarfsgerechte Ressourcenzuweisung.<br />
Da OpenNebula auch über eine Schnittstelle<br />
zu AWS verfügt, können auch Systeme<br />
in Richtung AWS als Hybrid-Cloud-<br />
Modell ausgelagert werden.<br />
Warum OpenNebula?<br />
OpenNebula ist eine mächtige Verwaltungs-<br />
und Provisioning-Plattform für<br />
das virtualisierte Rechenzentrum. Nach<br />
Einarbeitung in den Stack und die verwendeten<br />
Subsysteme wird der Themenkomplex<br />
Cloud greifbar und die eine oder<br />
andere Komponente, die seit Jahren im<br />
Einsatz ist, bekommt unter der Verwaltung<br />
von OpenNebula einen ganz neuen<br />
Anstrich.<br />
Klar wird aber auch, dass Cloud-Computing<br />
nicht zwangsläufig die Auslagerung<br />
aller Dienste in fremde Wolken bedeuten<br />
muss, sondern dass es auch für den eigenen<br />
Betrieb enorme Chancen bietet.<br />
OpenNebula erfreut sich gerade dabei als<br />
Open-Source-Alternative zu VMware immer<br />
größerer Beliebtheit [6]. Gerade die<br />
Verwendung heterogener Komponenten<br />
und die hohe Integrationsfähigkeit zeichnen<br />
OpenNebula dabei aus, weil es damit<br />
auch für gewachsene IT-Infrastrukturen<br />
einen umfassenden Architekturansatz<br />
bietet. (jcb)<br />
n<br />
Abbildung 3: OpenNebula kennt sogenannte Schedulded und Elasticity Policies für die automatische<br />
Anpassung der Ressourcen.<br />
Infos<br />
[1] OpenNebula: [http:// opennebula. org]<br />
[2] Zwei Cloud-Modelle: [http:// blog.<br />
opennebula. org/ ? p=4042]<br />
[3] Design-Guide: [http:// opennebula. org/<br />
documentation:rel4. 2# designing_and_installing_your_cloud_infrastructure]<br />
[4] Distributionspakete: [http:// opennebula.<br />
org/ documentation:rel4. 2:ignc]<br />
[5] Source Code: [http:// opennebula. org/<br />
documentation:rel4. 2:compile]<br />
[6] OpenNebula-Konferenz: [http://<br />
opennebulaconf. com]<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
33
<strong>Freie</strong> <strong>Clouds</strong><br />
CloudStack<br />
© Shen En-Min, 123RF<br />
Praxiserprobte, freie Cloud<br />
Gut vernetzt<br />
Apache CloudStack ist eine Open-Source-Plattform, die Rechenressourcen<br />
zusammenführt, um daraus Public-, Private- und Hybrid-IaaS-<strong>Clouds</strong> zu<br />
bilden (Infrastructure as a Service). Apache CloudStack managet dabei<br />
Netzwerk-, Storage- und Compute-Knoten, die zusammen die Infrastruktur<br />
einer Cloud ausmachen. Geoff Higginbottom<br />
CloudStack begann sein Leben unter<br />
dem Namen VMOps in einer 2008 gegründeten<br />
Firma, die von Sheng Liang<br />
angeführt wurde, der zuvor bei Sun die<br />
virtuelle Maschine von Java entwickelt<br />
hatte. Die allerersten Versionen waren<br />
noch eng an Xen gebunden, aber schon<br />
bald erkannte das Team die Vorteile der<br />
Unterstützung verschiedener Hypervisor.<br />
Früh im Jahr 2010 gelang der Firma ein<br />
großer Schritt nach vorn, indem sie die<br />
Domain cloud.com erwerben konnte und<br />
die erste Version von CloudStack veröffentlichte,<br />
die bereits zu 98 Prozent<br />
freie Software war. Im Juli 2011 wurde<br />
CloudStack dann von Citrix Systems<br />
übernommen und auch der verbleibende<br />
Code unter die GPLv3 gestellt.<br />
Die nächsten großen Neuigkeiten standen<br />
im April 2012 an, als Citrix CloudStack<br />
an die Apache Foundation abgab, wo<br />
es zunächst als Incubator-Projekt angenommen<br />
wurde. Im Gegenzug zog sich<br />
Citrix aus der CloudStack-Initiative zurück.<br />
Heute ist CloudStack ein Top-Level-<br />
Projekt der Apache Software Foundation,<br />
was auch von der Reife des Codes und<br />
der Qualität der Community zeugt.<br />
CloudStack bedient verschiedene Unternehmensstrategien<br />
und unterstützt<br />
gleichzeitig verschiedene Cloud-Ansätze<br />
aus der Provider-Perspektive.<br />
Von Private bis Public<br />
Gehen Firmen den ersten Schritt über<br />
die klassische Server-Virtualisierung hinaus,<br />
erscheinen vielen von ihnen Private<br />
<strong>Clouds</strong> als Mittel der Wahl, um sowohl<br />
die Flexibilität zu erhöhen als auch die<br />
Kontrolle über die benutzten Services zu<br />
behalten. Diese Private <strong>Clouds</strong> können<br />
sowohl von der eigenen IT-Abteilung<br />
gehostet als auch von einem externen<br />
Provider bezogen werden: In jedem Fall<br />
bleibt das Ziel – umfassende Kontrolle<br />
und Sicherheit ohne Verletzung von SLAs<br />
– gewahrt.<br />
Am anderen Ende des Spektrums finden<br />
sich die Public-Cloud-Anbieter mit elastischer<br />
Skalierung der Ressourcen und<br />
Abrechnung nach Verbrauch (Abbildung<br />
1). Während Public <strong>Clouds</strong> oft von Details<br />
wie der Netzwerktopologie abstrahieren,<br />
bieten schließlich Hybrid <strong>Clouds</strong> als weitere<br />
Variante die Möglichkeit, die Schlüsselaspekte<br />
unter Kontrolle zu behalten<br />
und gleichzeitig vom Angebot an freier,<br />
nach Bedarf skalierender Kapazität zu<br />
profitieren.<br />
Die wichtigsten<br />
CloudStack-Features<br />
Unterstützung mehrerer Hypervisor:<br />
CloudStack arbeitet mit diversen Hypervisor<br />
zusammen und eine einzelne<br />
Cloud-Installation kann mehrere Hypervisor<br />
enthalten. Das gegenwärtige<br />
CloudStack-Release unterstützt Citrix<br />
XenServer und VMware vSphere sowie<br />
KVM und Xen unter Ubuntu und Cent OS.<br />
Die Unterstützung für Hyper-V wird momentan<br />
entwickelt und in ein kommendes<br />
Release einfließen.<br />
Massiv skalierbare Infrastruktur:<br />
CloudStack kann mit Zehntausenden<br />
34 Ausgabe 05-2013 Admin www.admin-magazin.de
CloudStack<br />
<strong>Freie</strong> <strong>Clouds</strong><br />
Servern in geografisch verteilten Rechenzentren<br />
umgehen. Das zentralisierte<br />
Management skaliert linear und braucht<br />
daher keine extra Zwischenschicht auf<br />
Cluster-Ebene. Der Ausfall einer Komponente<br />
führt niemals zu einem Clusterweiten<br />
Stillstand. Periodische Wartungsarbeiten<br />
können durchgeführt werden,<br />
ohne die laufenden virtuellen Maschinen<br />
zu beeinträchtigen.<br />
Automatisches Konfigurationsmanagement:<br />
CloudStack konfiguriert die Netzwerk-<br />
und Storage-Settings seiner Clients<br />
automatisch. Es verwaltet einen internen<br />
Pool virtueller Appliances, die den Cluster<br />
als solchen unterstützen. Diese Appliances<br />
offerieren Dienste wie Firewalling,<br />
Routing, DHCP, VPN, Konsolenzugänge,<br />
Speicherplatz und Storage-Replikation.<br />
Die ausgedehnte Verwendung virtueller<br />
Appliances vereinfacht dabei Installation,<br />
Konfiguration und Verwaltung.<br />
Grafisches Benutzer-Interface: Cloud-<br />
Stack bietet sowohl dem Administrator<br />
wie auch dem Enduser ein grafisches<br />
Benutzer-Interface an. Damit lässt sich<br />
die Cloud als Ganzes verwalten und es<br />
können auch einzelne virtuelle Maschinen<br />
gestartet und angehalten werden.<br />
Das GUI kann dem Look&Feel des Providers<br />
oder des Kundenunternehmens<br />
angepasst werden.<br />
API und Erweiterbarkeit: Alle Funktionen<br />
des Benutzer-Interfaces sind auch<br />
über ein API erreichbar. Auf dessen Basis<br />
lassen sich Command Line Tools oder<br />
grafische Werkzeuge für spezielle Bedürfnisse<br />
programmieren. Für die Zuteilung<br />
von Storage oder Hosts kann man neue<br />
Module entwerfen, die sich in die vorhandene<br />
Architektur einklinken können.<br />
CloudStack kann Amazon Web Services<br />
(AWS) EC2- und S3-API-Calls in native<br />
CloudStack-API-Aufrufe übersetzen. Daher<br />
können Benutzer auf Wunsch weiter<br />
mit ihren gewohnten AWS-Tools arbeiten.<br />
CloudMonkey ist dagegen ein spezielles,<br />
in Python geschriebenes Command Line<br />
Interface (CLI) für CloudStack. Mit seiner<br />
Hilfe lassen sich leicht Skripte programmieren,<br />
die komplexe Abläufe bei der<br />
CloudStack-Administration automatisieren.<br />
Mehr Informationen dazu finden<br />
sich bei [1].<br />
Der Zugriff auf die API – direkt oder via<br />
CloudMonkey – wird durch eine Reihe<br />
von geheimen Schlüsseln und einem Signature<br />
Hash geschützt.<br />
Hochverfügbarkeit: CloudStack enthält<br />
eine Reihe von Features zur Verbesserung<br />
der Verfügbarkeit. Der Management-Server<br />
selbst lässt sich in einem Multinode-<br />
Cluster hinter einem Load Balancer installieren.<br />
Der Ausfall eines Rechners des<br />
Clusters würde dann der Load Balancer<br />
auffangen. Der MySQL-Server kann im<br />
Interesse einer höheren Verfügbarkeit repliziert<br />
werden. Gegen den Ausfall des<br />
Ethernet-Interfaces schützt NIC-Bonding<br />
(auch bekannt als Trunking oder Teaming)<br />
oder iSCSI-Multipathing im Storage-Bereich.<br />
Die Hierarchie der<br />
Schlüsselkomponenten<br />
CloudStack besteht aus sechs Schlüsselbausteinen.<br />
Da wären auf der obersten<br />
Ebene die Regionen, die ungefähr den<br />
AWS-Regionen entsprechen. Sie sind<br />
das erste und größte Bauelement von<br />
CloudStack.<br />
Jede Region besteht aus einer oder mehreren<br />
Verfügbarkeitszonen, dem zweitgröß-<br />
ten Element. Typischerweise entspricht<br />
eine solche Zone einem Rechenzentrum.<br />
Jede Zone enthält Pods, Cluster, Hosts<br />
und Storage.<br />
Pods, die drittgrößte Einheit, entsprechen<br />
oft einem Rack mit Netzwerk-, Rechenund<br />
Speicherkomponenten. Pods haben<br />
logische wie physische Eigenschaften,<br />
beispielsweise eine IP-Adresse. Die Verteilung<br />
der VMs wird durch Pods beeinflusst.<br />
Die viertgrößte Einheit sind die Cluster.<br />
Sie fassen homogene Rechner und Primary<br />
Storage zu Gruppen zusammen.<br />
Pro Cluster läuft nur ein bestimmter Hypervisor<br />
– aber in einer Zone können<br />
alle unterstützten Hypervisor versammelt<br />
sein.<br />
Hosts finden sich auf der fünften Ebene,<br />
sie bilden den eigentlichen Rechen-Layer,<br />
auf dem die virtuellen Maschinen laufen.<br />
Der letzte Baustein ist schließlich der<br />
Storage. Er kommt in zwei Ausprägungen<br />
vor, als Primary und Secondary Storage.<br />
Den Primary Storage verwenden<br />
die virtuellen Maschinen. Dabei kann<br />
es sich um lokalen oder Shared Storage<br />
handeln (NFS, iSCSI, Fibre Channel und<br />
so weiter).<br />
Der Secondary Storage nimmt die Virtual<br />
Machine Templates, ISO-Images<br />
und Snapshots auf und wird derzeit immer<br />
mit NFS realisiert. Swift kann verwendet<br />
werden, um Secondary Storage<br />
zwischen Zonen zu replizieren, sodass<br />
User auch bei Ausfall einer Zone immer<br />
noch Zugriff auf die Snapshots haben. Im<br />
Moment wird an ziemlich vielen neuen<br />
Storage-Features entwickelt, die dann in<br />
eines der nächsten Releases Einzug halten<br />
werden.<br />
Private <strong>Clouds</strong><br />
Public <strong>Clouds</strong><br />
On-Premise<br />
Enterprise Cloud<br />
Hosted<br />
Enterprise Cloud<br />
Multi-Tenant<br />
Public Cloud<br />
Dedicated Resources<br />
Security and Total Control<br />
Internal Network<br />
Managed by Enterprise or 3rd Party<br />
Dedicated Resources<br />
Security<br />
SLA Bound<br />
3rd Party Owned and Operated<br />
Mix of Shared and Dedicated Resources<br />
Elastic Scaling<br />
Pay As You Go<br />
Public Internet VPN Access<br />
Abbildung 1: Die verschiedenen Ausprägungen privater und öffentlicher <strong>Clouds</strong> in der Übersicht.<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
35
<strong>Freie</strong> <strong>Clouds</strong><br />
CloudStack<br />
Das Verbindungsglied zwischen all den<br />
Bauelementen ist der Netzwerk-Layer.<br />
CloudStack kennt zwei Netzwerkmodelle:<br />
Basic und Advanced.<br />
Networking<br />
Basic Networking entspricht dem Modell,<br />
das AWS benutzt, und kann auf<br />
drei Arten eingesetzt werden, wobei jede<br />
ein paar weitere Features zum Vorgänger<br />
hinzufügt:<br />
n Als einfaches, flaches Netzwerk, in<br />
dem sich alle VMs einen Adressbereich<br />
teilen. Isolation gibt es hier nicht.<br />
n Als Netzwerk mit Security Groups, die<br />
über Layer-3-Adressfilter ddie VMs<br />
voneinander isolieren.<br />
n Als Modell mit Elastic-IP und Elastic<br />
Load Balancing. Dabei bietet ein<br />
von CloudStack orchestrierter Citrix<br />
Net Scaler öffentliche IP-Adressen und<br />
Load Balancer an.<br />
Alle drei Ausprägungen des Basic-Netzwerkmodells<br />
erlauben eine massive<br />
Skalierung, solange der von den VMs<br />
genutzte IP-Adressbereich sich innerhalb<br />
eines Pods befindet. Zonen skalieren horizontal<br />
durch Hinzufügen weiterer Pods,<br />
die ihrerseits aus Clustern und Hosts bestehen<br />
samt den dazugehörigen Netzwerk-<br />
und Primary-Storage-Ressourcen.<br />
Fortgeschrittenes<br />
Netzwerken<br />
Das Advanced-Netzwerk-Modell bringt<br />
dem Anwender zusätzlich jede Menge<br />
mächtiger Features. So sind dort VLANs<br />
die Standardmethode der Isolation, noch<br />
darüber hinaus gehen aber die Angebote<br />
für Software Defined Networks (SDN)<br />
von Nicira, BigSwitch und bald auch von<br />
Midokura, die die Beschränkungen von<br />
VLANs hinter sich lassen.<br />
CloudStack macht ausgiebigen Gebrauch<br />
von systemeigenen VMs zur Kontrolle<br />
und Automation von Storage und Netzwerk.<br />
Eine solche System-VM ist der<br />
CloudStack Virtual Router. Die VM mit<br />
dem unschuldig klingenden Namen stellt<br />
in Wirklichkeit folgende Dienste bereit:<br />
DNS und DHCP, Firewall, Client IPsec<br />
VPN, Load Balancing, Source/Static NAT<br />
und Port Forwarding. Alle diese Dienste<br />
sind vom Enduser über die CloudStack-<br />
GUI oder die CloudStack-API frei konfigurierbar.<br />
Sobald ein Anwender ein neues Gastnetzwerk<br />
aufbaut und Gast-VMs in diesem<br />
Netzwerk erzeugt, werden diese<br />
VMs automatisch einer eigenen Layer-2-<br />
Broadcast-Domain zugeordnet, die von<br />
anderen Domains durch ein VLAN isoliert<br />
ist. Es besteht volle Kontrolle über<br />
den eingehenden und ausgehenden Traffic<br />
inklusive einer direkten Anbindung<br />
an das öffentliche Internet.<br />
Firewall- und Port-Forwarding-Regeln<br />
erlauben es, IP-Adressen auf jede gewünschte<br />
Anzahl von VMs zu mappen.<br />
Das Load Balancing ist mit Round-Robin-,<br />
Least-Connections- und auch mit<br />
Source-Based-Algorithmen verfügbar.<br />
App-Cookie- oder LB-Cookie-Stickiness-<br />
Policies sind von Anfang an verfügbar.<br />
Abbildung 2: Rechnen, speichern, vernetzen – der schematische Aufbau von CloudStack.<br />
Ein anderes leistungsstarkes Feature des<br />
Advanced-Network-Modells ist die Virtual<br />
Private Cloud (VPC). Damit ist es<br />
den Benutzern möglich, mehrschichtige<br />
Netzwerkkonfigurationen innerhalb der<br />
VLANs für ihre VMs anzulegen. Den Datenfluss<br />
zwischen den Netzwerkschichten<br />
und ins Internet kann der Anwender<br />
über ACLs steuern. Eine typische Konfiguration<br />
könnte beispielsweise die drei<br />
Schichten Web, App und DB enthalten,<br />
wobei nur der Web-Tier Internetzugang<br />
hätte.<br />
VPCs bringen darüberhinaus weitere<br />
Features mit, etwa Site-2-Site-VPNs, mit<br />
denen sich persistente Verbindungen in<br />
andere Rechenzentren oder sogar andere<br />
<strong>Clouds</strong> aufbauen lassen. Weiter gibt es<br />
ein VPC-Private-Gateway, das ein zweites<br />
Gateway neben dem Virtual Router bereitstellt<br />
und die Verbindung zu anderer<br />
Infrastruktur, etwa einem MPLS-Network<br />
anstelle des Internet, ermöglicht.<br />
Traffic aufteilen<br />
CloudStack optimiert die Verwendung<br />
der Netzwerkarchitektur eines Rechenzentrums<br />
durch die Aufspaltung des Traffics<br />
auf verschiedene Gruppen einzelner<br />
oder gebondeter NICs eines Compute-<br />
Knotens. Insgesamt können vier Typen<br />
physischer Netzwerke konfiguriert werden,<br />
die jeweils ein Interface oder einen<br />
Interface-Verbund (Bond) nutzen. Die<br />
vier Typen sind:<br />
Management: Zur Verwendung mit den<br />
CloudStack-Management-Servern und<br />
anderen Komponenten. Wird manchmal<br />
das Orchestration Network genannt.<br />
Guest: Für alle Gast-VMs zur Kommunikation<br />
mit anderen Gästen oder Gateways<br />
wie den Virtual Routers, Juniper<br />
SX Firewalls, F5 Load Balancers und so<br />
weiter. Im Advanced-Modus lassen sich<br />
mehrere Gastnetzwerke einrichten, die<br />
dann einzelnen Gästen oder Funktionen<br />
zugeordnet werden können.<br />
Public: Verbindet im Advanced-Modus<br />
die Virtual Router mit dem öffentlichen<br />
Internet. Im Basic Network Mode existiert<br />
es nur, wenn ein Citrix NetScaler<br />
verwendet wird. In diesem Fall stellt es<br />
die Elastic-IP- und Elastic-LB-Services<br />
bereit.<br />
Storage: Wird verwendet, um die Verbindung<br />
zum Secondary Storage herzustel-<br />
36 Ausgabe 05-2013 Admin www.admin-magazin.de
len. So optimiert es den Traffic,<br />
der beim Erstellen neuer VMs<br />
aus Templates oder beim Anlegen<br />
von Snapshots entsteht.<br />
Diese netzwerkintensiven Operationen<br />
beeinträchtigen so anderen<br />
Verkehr nicht.<br />
Auch der Netzwerkverkehr<br />
zur Anbindung des Primary<br />
Storage lässt sich aus Gründen<br />
der Verfügbarkeit oder Performance<br />
auf bestimmte NICs<br />
auslagern.<br />
Network Service<br />
Provider<br />
Neben den Virtual Routern und<br />
den VPC-Virtual-Routern kann<br />
CloudStack außerdem echte<br />
Hardware nutzen. Derzeit werden<br />
Citrix NetScaler, F5 Big IP<br />
und Juniper SRX unterstützt,<br />
an der Integration weiterer Modelle<br />
wird gearbeitet.<br />
Sobald ein solches Device integriert<br />
wurde, kann es der<br />
Anwender über die Standard-<br />
GUI oder -API administrieren.<br />
Der Anwender konstruiert<br />
die Firewall-Regeln dann der<br />
CloudStack-GUI. CloudStack<br />
seinerseits greift dabei auf eine<br />
API des Herstellers zurück, um<br />
die Konfiguration an das physische<br />
Gerät zu übermitteln.<br />
Wird ein Citrix NetScaler eingesetzt,<br />
dann ermöglicht er neben<br />
Load Balancing, NAT und<br />
Port Forwarding auch AutoScaling.<br />
Dahinter verbirgt sich<br />
eine Methode, die Performance<br />
laufender Gast-VMs zu überwachen<br />
und bei Bedarf neue<br />
VMs zu erzeugen. Sinkt die<br />
Auslastung später wieder unter<br />
einen Schwellwert, werden<br />
die zusätzlich erzeugten VMs<br />
wieder entfernt, um die Kosten<br />
wieder auf das Ausgangsniveau<br />
zu senken. Genau ein solches<br />
Maß an Automatisierung und<br />
Flexibilität ist die treibende<br />
Kraft des Cloud Computing.<br />
Tatsächlich ist CloudStack<br />
dank seiner GUI, API und den<br />
CLI-Tools wie CloudMonkey<br />
leicht aufzusetzen und zu administrieren.<br />
Ein Wizard begleitet<br />
den Anwender durch<br />
die Konfiguration seiner ersten<br />
Zone-, Networking-, Pod-,<br />
Cluster-, Host- and Storage-<br />
Komponente. Das kann bereits<br />
binnen einiger Stunden erledigt<br />
sein.<br />
Management<br />
Ein einfaches Rollen-basiertes<br />
Rechtesystem (Role Based Access<br />
Control, RBAC) definiert<br />
schon verschiedene Berechtigungs-Level,<br />
die bei Bedarf<br />
verfeinert werden können. Die<br />
Authentifikation kann außerdem<br />
in ein LDAP-System ausgelagert<br />
werden (Open LDAP<br />
oder MS Active Directory).<br />
Neue Accounts, die Admins anlegen<br />
können, gehören stets zu<br />
einer Domain. Auf diese Weise<br />
entsteht eine hierarchische<br />
Struktur, die es erlaubt, einen<br />
bestimmten Ausschnitt der Infrastruktur<br />
einer bestimmten<br />
Gruppe von Nutzern zugänglich<br />
zu machen. Darüberhinaus<br />
können die Admins über<br />
Parameter einstellen, wieviel<br />
vCPUs, RAM und Bandbreite<br />
bestimmten Anwendern zur<br />
Verfügung stehen, welches Betriebssystem,<br />
welche Hardware<br />
oder welchen Storage sie nutzen<br />
können.<br />
Admins haben die volle Kontrolle<br />
über die Infrastruktur und<br />
können die Live-Migration jeder<br />
VM innerhalb eines Clusters<br />
anstoßen. Angehaltene<br />
VMs können auch zwischen<br />
Clustern migriert werden,<br />
wenn man die ihnen zugeordneten<br />
Volumes auf den neuen<br />
Storage verschiebt.<br />
Benutzererfahrung<br />
Ein großer Pluspunkt von<br />
CloudStack ist das gut durchdachte,<br />
grafische Benutzer-Interface.<br />
Die Mehrzahl aller Features<br />
ist über diese GUI verfüg-<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
37
<strong>Freie</strong> <strong>Clouds</strong><br />
CloudStack<br />
GUI<br />
API<br />
Abbildung 3: Ein Load Balancer verteilt die Management-Aufgaben auf eine Gruppe von Servern und sorgt so<br />
gleichzeitig für Ausfallsicherheit.<br />
bar, nur einige wenige fortgeschrittenere<br />
erreicht man nur via API. Wegen dieser<br />
leicht erlernbaren Benutzeroberfläche<br />
können neue Anwender ihre ersten VMs<br />
innerhalb weniger Minuten nach ihrem<br />
ersten Login zum Laufen bringen.<br />
In sechs Schritten zur<br />
ersten Cloud<br />
Das Anlegen einer neuen virtuellen Maschine<br />
in der GUI vollzieht sich in sechs<br />
einfachen Schritten:<br />
n Wahl der Availability Zone,<br />
n Wahl eines vorgefertigten Templates<br />
oder ISOs,<br />
n Auswahl des sogenannten Compute<br />
Offerings, das über die Anzahl CPUs,<br />
RAM, Netzwerkbandbreite und Storage<br />
Tier bestimmt,<br />
n Konfiguration eines zusätzlichen Daten-Volumes,<br />
n Anschluss an ein Netzwerk oder einen<br />
VPC; falls das nicht existiert, wird es<br />
automatisch erzeugt,<br />
Load Balancing<br />
View all<br />
Internet<br />
Firewall<br />
Load Balancer<br />
View all<br />
Port Forwarding<br />
Multi-Node Deployment<br />
View all<br />
Abbildung 4: Eine Konfigurationsseite für die<br />
Virtual-Router-VM in CloudStack.<br />
Management<br />
Server<br />
Management<br />
Server<br />
Management<br />
Server<br />
MySQL<br />
DB<br />
Zones<br />
n Vergabe eines Namens, der auch als<br />
Hostname der VM fungiert. Start der<br />
VM.<br />
Sobald die ersten VMs laufen, kann der<br />
Anwender andere Features erkunden, die<br />
für sie zur Verfügung stehen. So bieten<br />
beispielsweise Snapshots eine effektive<br />
Möglichkeit, jede VM abzusichern. Ein<br />
Snapshot jedes Volumes lässt sich entweder<br />
ad hoc oder zeitgesteuert anlegen<br />
(stündlich, täglich, wöchentlich). Werden<br />
von einer VM mehrere Exemplare benötigt,<br />
kann man die schnell aus benutzerdefinierten<br />
Templates generieren, die<br />
man aus einer VM oder ihrem Snapshot<br />
gewinnt.<br />
Volumes, Snapshots und Templates lassen<br />
sich exportieren, um dieselbe Benutzerumgebung<br />
in einer anderen Cloud<br />
wieder anzulegen.<br />
Warum CloudStack?<br />
MySQL<br />
DB<br />
CloudStack hat eine jederzeit vorzeigbare<br />
Erfolgsbilanz sowohl im Unternehmensumfeld<br />
wie bei Service Providern – die<br />
weltweit größten <strong>Clouds</strong> basieren auf seiner<br />
Technologie. Der Autor selbst war bei<br />
drei großen Implementierungen auf drei<br />
verschiedenen Kontinenten beteiligt, und<br />
obwohl es bei jedem großen IT-Projekt<br />
ein paar Schwierigkeiten gibt, wurden<br />
alle drei in der geplanten Zeit fertig.<br />
Im Unterschied zu anderen Open-Source-<br />
Cloud-Projekten ist CloudStack ein in<br />
sich abgeschlossenes Projekt mit einheitlichen<br />
Grundsätzen und Zielen, getragen<br />
von einer sehr aktiven Community.<br />
Die Liste der Features, an denen derzeit<br />
entwickelt wird, ist wahrhaft atemberaubend.<br />
Nur einige Beispiele für kommende<br />
Features sind:<br />
n Ein neues Storage Framework, das<br />
größere Kontrolle erlaubt und bei dem<br />
Primary Storage an beliebiger Stelle<br />
im gesamten Rechenzentrum lokalisiert<br />
sein kann.<br />
n XenMotion, das XenServern die Live-<br />
Migration ihrer VMs ermöglicht.<br />
n Dedizierte Ressourcen, die sich für<br />
einen bestimmten Nutzer reservieren<br />
lassen.<br />
n Support für das Cisco Virtual Network<br />
Management Center (VNMC).<br />
n Mehrere IPs pro Virtual-NIC – das eignet<br />
sich ideal für Webserver-VMs mit<br />
mehreren SSL-Zertifikaten.<br />
n S3 Backed Secondary Storage.<br />
n Dynamic Scaling für CPU und RAM –<br />
das ermöglicht das vollautomatische<br />
Vergrößern und Verkleinern dieser<br />
Ressourcen einer VM.<br />
n Support für Midokura Software Defined<br />
Networking.<br />
n Zusätzliche Isolation innerhalb eines<br />
VLANs – unter Verwendung der<br />
PVLANs (VMware) oder von Security<br />
Groups (Xen und KVM).<br />
Zu den Stärken von CloudStack zählt<br />
seine erprobte, massive Skalierbarkeit: es<br />
existieren in der Praxis <strong>Clouds</strong> mit mehr<br />
als 50 000 Hosts im Produktivbetrieb.<br />
Die Inbetriebnahme einer Cloud ist bei<br />
CloudStack in aller Regel nur eine Frage<br />
von Tagen, nicht von Monaten.<br />
Die Dokumentation ist exzellent. Es existiert<br />
ein sicherer Upgrade-Pfad von allen<br />
Vorgängerversionen auf das aktuelle Release.<br />
Das grafische User Interface als<br />
Herzstück einer CloudStack-Implementation<br />
ist ausgereift und intuitiv bedienbar.<br />
CloudStack ist das beste Einzelprojekt<br />
zum Aufbau einer IaaS-Plattform.<br />
CloudStack unterstützt verschiedene<br />
SDNs gleichzeitig. Es ist AWS-kompatibel.<br />
(jcb)<br />
n<br />
Infos<br />
[1] CloudMonkey: [https:// cwiki. apache.<br />
org/ confluence/ display/ CLOUDSTACK/<br />
CloudStack+cloudmonkey+CLI]<br />
Der Autor<br />
Geoff Higginbottom arbeitet als CTO und Cloud<br />
Architect bei der Londoner Beratungsfirma Shape<br />
Blue und war für mehrere große, internationale<br />
Cloud-Projekte auf der Basis von CloudStack verantwortlich.<br />
38 Ausgabe 05-2013 Admin www.admin-magazin.de
<strong>Freie</strong> <strong>Clouds</strong><br />
Eucalyptus<br />
© petervick167, 123RF<br />
Die eigene AWS-kompatible Cloud mit Eucalyptus<br />
Koalas Liebling<br />
Wer den Cloud-Diensten von Amazon nicht traut oder aus Datenschutzgründen dort keine Kundendaten ablegen<br />
kann, der schafft sich mit Eucalyptus kurzerhand seine eigene Cloud. Die ist sogar zu den Amazon-Werkzeugen<br />
kompatibel und dank eines vorbereiteten Installationsmediums ruck, zuck aufgesetzt. Tim Schürmann<br />
Eucalyptus entstammt ursprünglich einem<br />
Forschungsprojekt an der University<br />
of California [1]. Im Jahr 2009 übernahm<br />
dann das ausgegründete Unternehmen<br />
Eucalyptus Inc. die Weiterentwicklung<br />
und Vermarktung. Die Software gibt es<br />
seitdem in zwei Geschmacksrichtungen:<br />
kostenlos als Open-Source-Variante, die<br />
komplett unter der GPLv3-Lizenz steht,<br />
und die kommerzielle Eucalyptus Enterprise<br />
Edition, die unter anderem die Einbindung<br />
von SANs und einer VMware-<br />
Infrastruktur ermöglicht.<br />
Amazon zu Hause<br />
Eucalyptus baut aus mehreren Rechnern<br />
eine Cloud zusammen, in der man virtuelle<br />
Maschinen starten und Speicherplatz<br />
abrufen kann – ganz so, wie es Amazon<br />
mit seinen AWS-Diensten anbietet. Bei<br />
Eucalyptus ist man jedoch selbst der Betreiber<br />
der Cloud. Administratoren haben<br />
nicht nur die vollständige Kontrolle, die<br />
Server und somit die Daten verbleiben<br />
auch im eigenen Unternehmen. Eine Eucalyptus-Cloud<br />
lässt sich sogar schnell<br />
auf nur einem Computer einrichten<br />
(siehe Kasten »Alle auf Einen«).<br />
Um mit Eucalyptus eine Cloud aufzubauen,<br />
benötigt man echte Rechner,<br />
deren Prozessoren über die Virtualisierungsfunktion<br />
Intel VT beziehungsweise<br />
AMD-V verfügen. Eine Testinstallation<br />
unter Virtualbox oder VMware ist somit<br />
nicht möglich, mit einem Trick klappt<br />
es jedoch unter KVM [2]. Zudem sollte<br />
in den Stationen jeweils mindestens 4<br />
GByte Hauptspeicher sowie eine 250<br />
GByte große Festplatte stecken – je mehr<br />
Speicher, desto mehr virtuelle Maschinen<br />
lassen sich später in der Cloud starten.<br />
Abschließend braucht man einen zusätzlichen<br />
Satz freier IP-Adressen, die Eucalyptus<br />
später den in der Cloud laufenden<br />
Systemen zuweisen kann.<br />
Kickstart<br />
Auch was das Betriebssystem anbelangt,<br />
ist Eucalyptus äußerst wählerisch: Offiziell<br />
unterstützen die Entwickler ausschließlich<br />
die 64-Bit-Versionen der Linux-Distributionen<br />
CentOS 6 und Red<br />
Hat Enterprise Linux 6. Für eine kurze<br />
Zeit war Eucalyptus auch offizieller Bestandteil<br />
von Ubuntu. Mit Ubuntu 11.10<br />
40 Ausgabe 05-2013 Admin www.admin-magazin.de
Eucalyptus<br />
<strong>Freie</strong> <strong>Clouds</strong><br />
Eucalyptus-Cloud<br />
Node Controller<br />
(192.168.100.11)<br />
Walrus<br />
Cloud Controller<br />
(CLC)<br />
Client<br />
(192.168.100.13)<br />
Frontend<br />
(192.168.100.10)<br />
Node Controller<br />
(192.168.100.12)<br />
Storage Controller<br />
(SC)<br />
Cluster Controller<br />
(CC)<br />
G Abbildung 1: Für eine erste kleine Cloud genügen drei physische Rechner und<br />
ein Client für den Zugriff. Die Node Controller übernehmen die eigentliche Arbeit,<br />
das Frontend koordiniert sie.<br />
E Abbildung 2: Eucalyptus besteht aus mehreren Einzelteilen, die aufeinander<br />
aufbauen.<br />
Node Controller<br />
(NC)<br />
Node Controller<br />
(NC)<br />
Node Controller<br />
(NC)<br />
(Oneiric) hat es Canonical jedoch gegen<br />
den Konkurrenten OpenStack ersetzt. Seit<br />
Eucalyptus 3.2 stellen die Eucalyptus-<br />
Entwickler zudem keine fertigen Ubuntu-<br />
Pakete mehr bereit. Eine Eucalyptus-<br />
Cloud unter RHEL oder CentOS aus den<br />
bereitgestellten Paketen zu installieren,<br />
ist obendrein recht zeitaufwendig, da<br />
die zugrunde liegenden Linux-Systeme<br />
zahlreiche Bedingungen erfüllen müssen<br />
– nicht umsonst umfasst die Installationsanleitung<br />
satte 96 Seiten.<br />
Glücklicherweise stellen die Eucalyptus-<br />
Entwickler ein spezielles Installationsmedium<br />
bereit, mit dem Administratoren in<br />
wenigen Mausklicks eine kleine Eucalyptus-Cloud<br />
aufsetzen. Diese FastStart<br />
genannte Installationsmethode kann aber<br />
auch als Ausgangspunkt für eine größere<br />
Cloud dienen: Da Eucalyptus gerne die<br />
Rechner der Cloud ganz für sich alleine<br />
haben möchte, können Administratoren<br />
sich die mühsame Einrichtung sparen,<br />
einfach die Festplatte der beteiligten<br />
Rechner löschen und dem FastStart-<br />
Alle auf Einen<br />
Die Eucalyptus-Komponenten darf man auch<br />
allesamt auf einem einzigen physischen Computer<br />
installieren. Die Eucalyptus-Entwickler<br />
unterstützen diese Betriebsart sogar ganz offiziell.<br />
Eine solche Cloud-In-A-Box eignet sich<br />
insbesondere für kleine Arbeitsgruppen sowie<br />
Administratoren, die mit den Einstellungen<br />
experimentieren möchten.<br />
Besonders schnell zu einer Cloud-In-A-Box<br />
kommt man ebenfalls mit dem FastStart-Medium:<br />
Im Bootmenü entscheidet man sich für<br />
den Punkt »Install CentOS 6 with Eucalyptus<br />
Cloud‐in‐a‐box«. Die dann vom Assistenten<br />
gestellten Fragen entsprechen der üblichen<br />
Installation.<br />
Image das Einrichten eines frischen<br />
Eukalyptus-Systems überlassen. Damit<br />
hat man ganz nebenbei auch schon eine<br />
funktionierende Basiskonfiguration und<br />
kann direkt loslegen.<br />
Der Zugriff und die Verwaltung der laufenden<br />
Cloud erfolgt von Client-Rechnern<br />
mit beliebigem Betriebssystem – entweder<br />
komfortabel mit der Maus in einer<br />
Weboberfläche oder aber über die offiziellen<br />
Kommandozeilenwerkzeuge, die<br />
sogenannten Euca2ools. Letztgenannte<br />
findet man auch in den Repositories der<br />
meisten großen Distributionen.<br />
Eucalyptus selbst besteht aus mehreren<br />
Komponenten, die jeweils eine ganz<br />
bestimmte Aufgabe erfüllen. Zunächst<br />
benötigt man einen oder mehrere Rechner,<br />
auf denen später die virtuellen Maschinen<br />
laufen und die zu speichernden<br />
Daten landen. Auf diesen Knoten (Nodes)<br />
läuft jeweils ein sogenannter Node<br />
Fünf ist Trumpf<br />
Eucalyptus besteht aus fünf Komponenten. Jeder<br />
von ihnen läuft als Webdienst und greift<br />
auf die Funktionen der anderen Dienste zurück<br />
(Abbildung 2).<br />
Node Controller (NC): Auf den Knoten arbeitet<br />
der sogenannte Node Controller (kurz NC). Er<br />
startet, stoppt und verwaltet die auf seinem<br />
Rechner laufenden virtuellen Maschinen.<br />
Cluster Controller (CC): Mehrere Knoten fasst<br />
der Cluster Controller (kurz CC) zu einem Cluster<br />
zusammen. Der Cluster Controller entscheidet<br />
darüber, welche virtuelle Maschine auf welchem<br />
Knoten startet und verwaltet das Netzwerk, in<br />
dem die virtuellen Maschinen hängen.<br />
Cloud Controller (CLC): Die Befehlsgewalt über<br />
die einzelnen Cluster hat der Cloud Controller<br />
(kurz CLC). Er bastelt aus den Clustern die<br />
eigentliche Cloud, trifft alle übergeordneten<br />
Controller (kurz NC). Im Wesentlichen<br />
startet, stoppt und verwaltet er die auf<br />
seinem Rechner laufenden virtuellen Maschinen.<br />
Dienstevielfalt<br />
Auf welchen der Knoten welche Maschinen<br />
laufen, entscheidet das Frontend. Es<br />
stellt zudem die Weboberfläche bereit<br />
und nimmt die Befehle des Administrators<br />
entgegen. Tatsächlich besteht auch<br />
das Frontend aus mehreren weiteren, einzelnen<br />
Diensten, die der Kasten »Fünf<br />
ist Trumpf« vorstellt. Dem Frontend<br />
sollte man ebenfalls einen eigenen Rechner<br />
spendieren. Eine erste kleine Cloud<br />
besteht somit aus zwei oder mehr Node-<br />
Controllern, die die eigentliche Arbeit<br />
verrichten und einem weiteren Rechner<br />
mit dem Frontend (wie in Abbildung 1).<br />
Dank der Trennung in die Komponenten<br />
Entscheidungen und nimmt die Anfragen der<br />
Benutzer entgegen. Er stellt auch die Weboberflächen<br />
bereit.<br />
Storage Controller (SC): Der Storage Controller<br />
fasst Speicherplatz zu sogenannten Volumes<br />
zusammen, die dann wiederum eine virtuelle<br />
Maschine einbinden oder als Block Device ansprechen<br />
kann. Der Funktionsumfang entspricht<br />
dabei Amazons Elastic Block Store (EBC).<br />
Walrus: Schließlich stellt die Komponente namens<br />
Walrus noch einen zu Amazon Simple Storage<br />
Service (S3) kompatiblen Speicherdienst<br />
bereit. Wie das Vorbild legt er Daten in sogenannten<br />
Buckets in der Cloud ab. Walrus kann<br />
man zum einen über die erwähnten Kommandozeilenwerkzeuge<br />
nutzen oder aber auch aus<br />
den virtuellen Maschinen heraus in Anspruch<br />
nehmen.<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
41
<strong>Freie</strong> <strong>Clouds</strong><br />
Eucalyptus<br />
kann man später die Cloud sukzessive<br />
vergrößern, indem man zum Beispiel<br />
weitere Node Controller hinzufügt.<br />
Gordische Knoten<br />
Das FastStart-Installationsmedium in<br />
Form eines kleinen ISO-Images erhalten<br />
Administratoren unter [3]. Das ISO-<br />
Image dient nur als Boot-Medium und<br />
holt sowohl ein komplettes CentOS 6 als<br />
auch die Eucalyptus-Pakete aus dem Internet<br />
nach. Die Rechner, die später die<br />
Cloud bilden sollen, müssen folglich an<br />
das Internet angebunden sein.<br />
Zunächst startet man das FastStart-Image<br />
auf den Rechnern, die später als Node<br />
Controller arbeiten sollen. In Abbildung<br />
1 würde man das Image auf den Rechnern<br />
mit der IP-Adresse 192.168.100.11 und<br />
192.168.100.12 starten. Im Bootmenü<br />
fällt die Entscheidung für den Punkt<br />
»Install CentOS 6 with Eucalyptus Node<br />
Controller«. Das Angebot, das Installationsmedium<br />
zu prüfen, lässt sich mit<br />
»Skip« überspringen. Anschließend geht<br />
es mit »Next« zur Wahl der Sprache, gefolgt<br />
von der Tastaturbelegung.<br />
Anschließend richtet man die Netzwerkkarte<br />
ein (Abbildung 3). Wer den<br />
Rechnern der Cloud ihre IP-Adressen per<br />
DHCP zuweist, muss sicherstellen, dass<br />
sie immer dieselbe Adresse erhalten, die<br />
dynamische Zuweisung unterstützt Eucalyptus<br />
nicht. »Weiter« geht es zu den<br />
Zeiteinstellungen, anschließend folgt das<br />
Passwort für den Benutzer »root« und die<br />
Festplattenaufteilung. Da die Node Controller<br />
viel Speicher benötigen, sollte man<br />
dem Assistenten den »Gesamten Platz«<br />
überlassen – was gleichzeitig die Festplatte<br />
komplett löscht. Nach dem Abnicken<br />
der Sicherheitsfrage teilt Eucalyptus<br />
die Festplatte dann nach eigenen Vorstellungen<br />
auf, holt das System aus dem<br />
Internet und richtet es ein. Dies kann<br />
je nach Rechnergeschwindigkeit einige<br />
Zeit benötigen. Abschließend muss man<br />
das System ohne das FastStart-Medium<br />
neu starten und sich als Benutzer »root«<br />
einloggen.<br />
Das jetzt startende Konfigurationsskript<br />
möchte als Erstes wissen, über welche<br />
Netzwerkschnittstelle der Rechner später<br />
mit dem Frontend erreichbar ist (Abbildung<br />
4). Die Eingabetaste übernimmt<br />
den Vorschlag. Bei der anschließenden<br />
Abbildung 3: Bei der Einrichtung der Netzwerkkarten kann man über »Advanced Network Configuration« auch<br />
den unter Linux allseits bekannten Network Manager zu Hilfe rufen.<br />
Einrichtung richtet das Skript eine Netzwerk-Bridge<br />
ein (in der Regel heißt sie<br />
»br0«), an die alle virtuellen Maschinen<br />
andocken und nach draußen kommunizieren.<br />
Per »ifconfig« kann man anschließend<br />
prüfen, ob die Netzwerkschnittstellen<br />
korrekt erkannt und zugeordnet<br />
wurden. Sollte man versehentlich die<br />
falsche Netzwerkschnittstelle erwischen,<br />
lässt sich das Einrichtungsskript per<br />
»/usr/local/sbin/eucalyptus‐nc‐config.sh«<br />
jederzeit erneut anwerfen. Die Rechner<br />
mit den Node Controllern können weiterlaufen.<br />
Stirnseite<br />
Hat man auf diese Weise alle Node Controller<br />
eingerichtet (in Abbildung 1 die Rechner<br />
192.168.100.11 und 192.168.100.12),<br />
folgt der Rechner, der alle übrigen Komponenten<br />
ausführt. Auch ihn startet man<br />
Abbildung 4: Die Einrichtung eines Node Controllers ist hier erfolgreich beendet.<br />
vom FastStart-Medium, wählt aber im<br />
Boot-Menü »Install CentOS 6 with Eucalyptus<br />
Frontend«. Die Installation des<br />
Systems erfolgt jetzt ganz analog zu den<br />
Node Controllern: Den Medientest übergeht<br />
man mit »Skip«, wählt Sprache und<br />
Tastaturbelegung, konfiguriert die Netzwerkkarten,<br />
stellt die Zeitzone ein und<br />
vergibt ein Root-Passwort.<br />
Als Nächstes muss man Eucalyptus einen<br />
freien IP-Adressbereich nennen. Aus ihm<br />
weist es später den virtuellen Maschinen<br />
ihre IP-Adressen zu. Die angegebenen<br />
Adressen müssen zudem zwingend aus<br />
dem gleichen Subnetz stammen, in dem<br />
der Rechner für das Frontend hängt. Im<br />
Beispiel aus Abbildung 1 könnte man<br />
die IP-Adressen 192.168.100.100 bis<br />
192.168.100.200 wählen. Ihre Eingabe<br />
erfolgt unter »Public IP range/list« mit<br />
einem Trennstrich, im Beispiel also »192.<br />
168.100.100‐192.168.100.200« (Abbil-<br />
42 Ausgabe 05-2013 Admin www.admin-magazin.de
<strong>Freie</strong> <strong>Clouds</strong><br />
Eucalyptus<br />
ein. Den nächsten Schritt kann man daher<br />
einfach bestätigen beziehungsweise<br />
bei Bedarf noch weitere NTP-Zeitserver<br />
»Hinzufügen«.<br />
Die Daten des Abschlussbildschirms<br />
sollte man sich gut notieren. Sie verschaffen<br />
Zugriff auf gleich zwei von Eucalyptus<br />
angebotene Weboberflächen: Über<br />
die User Console können Anwender unter<br />
anderem neue virtuelle Maschinen<br />
starten. Mit der Admin Console hingegen<br />
verwalten Administratoren die Cloud und<br />
richten insbesondere neue Benutzerkonten<br />
für die User Console ein.<br />
Klickibunti<br />
Abbildung 5: Bei der Installation des Frontends muss man einen Satz freie IP-Adressen spendieren.<br />
dung 5). Bei allen anderen Einstellungen<br />
kann man die Vorgaben akzeptieren, womit<br />
es »Weiter« zur Aufteilung der Festplatte<br />
geht. Dort sollte man wieder den<br />
»Ganzen Platz verwenden« und somit die<br />
Festplatte löschen lassen. Während der<br />
nun folgenden Installation erstellt der Assistent<br />
auch ein kleines Image mit einem<br />
kleinen CentOS-6-System, das man gleich<br />
direkt in der Cloud starten lassen kann.<br />
Der erste Neustart des Frontends dauert<br />
eine Weile und es kann so erscheinen,<br />
als würde das System hängen. Hier sollte<br />
man einfach auf die Festplattenaktivität<br />
achten. Irgendwann erscheint ein grafischer<br />
Assistent, der dazu auffordert,<br />
die Lizenz zu bestätigen. Im nächsten<br />
Schritt tippt man in das Feld die IP-Adressen<br />
aller Node Controller ein, jeweils<br />
durch ein Leerzeichen getrennt. Im Beispiel<br />
wäre das folglich »192.168.100.11<br />
192.168.100.12« (Abbildung 6). Wenn<br />
die IP-Adresse nicht bekannt ist, listet der<br />
Befehl »ifconfig« auf dem Node Controller<br />
sie auf. Nach einem Klick auf »Vor« fragt<br />
der Assistent noch die Root-Passwörter<br />
der Node Controller ab.<br />
Abschließend gilt es noch, einen normalen<br />
Benutzer für den Rechner mit dem<br />
Frontend anzulegen. Im Gegensatz zu<br />
den Node Controllern installiert das Fast-<br />
Start-Medium auf dem Frontend-Rechner<br />
eine vollständige grafische Benutzeroberfläche.<br />
Eucalyptus setzt voraus, dass die<br />
Uhren auf allen Rechnern absolut synchron<br />
laufen. Um dies sicherzustellen,<br />
richtet das über das FastStart-Medium<br />
installierte Eucalyptus einen NTP-Server<br />
Um in der neu aufgebauten Cloud eine<br />
erste virtuelle Maschine zu starten, steuert<br />
man folglich die neben »User Console«<br />
notierte Internetadresse im Browser<br />
an. Da die beiden Weboberflächen<br />
ausschließlich gesicherte Verbindungen<br />
zulassen, muss man bei der Eingabe<br />
der Internetadresse darauf achten, das<br />
HTTPS-Protokoll zu verwenden. Die<br />
komplette Adresse folgt dem Schema:<br />
»https://Frontend‐Rechner:8888«. Aufrufen<br />
lässt sie sich von einem beliebigen<br />
Client-Rechner, in Notfällen kann man<br />
sich aber auch direkt auf dem Rechner<br />
mit dem Frontend anmelden und dort<br />
den beigelegten Firefox verwenden.<br />
Der Browser beschwert sich jetzt als Erstes<br />
über ein nicht vertrauenswürdiges<br />
Zertifikat, das man einfach akzeptiert<br />
beziehungsweise als Ausnahme hinzufügt<br />
und damit am Anmeldebildschirm<br />
landet. Direkt nach der Installation erhält<br />
man Zugang mit dem Account-Namen<br />
»demo«, dem User Name »admin« und<br />
Abbildung 6: Beim ersten Start des Frontends muss man die IP-Adressen der<br />
Node Controller hinterlegen.<br />
Abbildung 7: Die User Console bietet Zugriff auf alle wichtigen Funktionen der<br />
neu eingerichteten Cloud.<br />
44 Ausgabe 05-2013 Admin www.admin-magazin.de
Eucalyptus<br />
<strong>Freie</strong> <strong>Clouds</strong><br />
dem Passwort »demo«. Es erscheint das<br />
Dashboard, das einen Überblick über die<br />
gerade laufenden virtuellen Maschinen<br />
(Abbildung 7) gibt. Eucalyptus bezeichnet<br />
sie als Instanzen – aus einem Betriebssystem-Image<br />
lassen sich mehrere<br />
unabhängige Instanzen starten.<br />
Ein Klick auf »Launch new Instance«<br />
startet eine neue virtuelle Maschine. Die<br />
Weboberfläche zeigt jetzt an, welche<br />
Betriebssystem-Images in der Cloud zum<br />
Starten bereitstehen. Für einen ersten<br />
Test bringt das FastStart-Medium bereits<br />
ein kleines CentOS-6-System mit. Um es<br />
anzuwerfen, klickt man es an und der<br />
Hintergrund wird grün eingefärbt. Weiter<br />
geht es über den Knopf »Select Type«.<br />
Dort wählt man in der Ausklappliste<br />
»Select instance type« die Hardware der<br />
virtuellen Maschine. Das kleine CentOS-<br />
6-System benötigt nur eine CPU und 256<br />
MByte Speicher, sodass die vorgeschlagene<br />
Maschine vom Typ »m1.small« ausreicht<br />
(Abbildung 8). Die übrigen Einstellungen<br />
können ebenfalls auf ihren<br />
Abbildung 8: Eucalyptus lässt die Wahl zwischen verschiedenen virtuellen Computermodellen mit<br />
unterschiedlicher Hardware.<br />
Kommandozeilenwerkzeuge<br />
Eine virtuelle Maschine starten und stoppen<br />
kann man auch auf der Kommandozeile mit der<br />
Werkzeugsammlung Euca2ools. Viele Linux-Distributionen<br />
bieten sie in ihren Repositories an,<br />
auch auf dem Frontend-Rechner sind sie bereits<br />
installiert. Um die Euca2ools einsetzen zu können,<br />
muss man sich zunächst als rechtmäßiger<br />
Benutzer der Cloud ausweisen. Dazu holt sich<br />
der Adminstrator zunächst sein Credentials-<br />
Paket vom Frontend ab:<br />
usr/sbin/euca_conf ‐‐get‐credentials U<br />
admin.zip<br />
unzip admin.zip<br />
source eucarc<br />
Abbildung 9: Die Arbeit mit den Euca2ools ist nicht so eingängig<br />
wie die Benutzeroberflächen.<br />
Den ersten Befehl muss man als Benutzer root<br />
ausführen, der letzte Befehl setzt ein paar Umgebungsvariablen<br />
für die Euca2ools. Anschließend<br />
erzeugt man noch ein Schlüsselpaar, im<br />
Folgenden unter dem Namen »eucatest«. Der<br />
private Schlüssel landet dabei in der Datei »eucatest.private«:<br />
euca‐add‐keypair eucatest > eucatest.private<br />
chmod 0600 eucatest.private<br />
Jetzt kann man sich zunächst alle verfügbaren<br />
Betriebssystem-Images anzeigen lassen, die<br />
man in einer virtuellen Maschine starten kann:<br />
euca‐describe‐images<br />
Aus dem dann ausgespuckten Textgewirr muss<br />
man sich das entsprechende Image heraussuchen.<br />
Jedes Betriebssystem-Image besteht aus<br />
drei Dateien: dem Kernel, einer<br />
Ramdisk und dem eigentlichen<br />
Image. Letzteres erkennt man am<br />
Kürzel ».img« im Dateinamen. Um<br />
eine virtuelle Maschine zu starten,<br />
benötigt man das Image. Dessen<br />
Zeile findet man am schnellsten<br />
anhand der Beschreibung in der<br />
zweiten Zeile. Wichtig ist dabei<br />
die interne Identifikationsnummer,<br />
die hinter »IMAGE« steht.<br />
In Abbildung 9 heißt das Image<br />
mit dem kleinen CentOS-6-System<br />
»emi‐AF4736C9«. Diesen Namen<br />
behält man jetzt im Hinterkopf.<br />
Alle möglichen virtuellen Computermodelle<br />
spuckt der folgende<br />
Befehl aus:<br />
euca‐describe‐availability‐zones verbose<br />
In der zweite Spalte stehen die Namen der<br />
virtuellen Computermodelle, ihre Hardware-<br />
Konfiguration folgt auf der rechten Seite. So<br />
hat der Computer mit dem Namen »m1.small«<br />
nur eine CPU und 256 MByte Hauptspeicher. Interessant<br />
ist dabei auch die Spalte »free / max«:<br />
Die Zahl unter »free« verrät, wieviele virtuelle<br />
Maschinen man selbst von diesem Modell noch<br />
anwerfen könnte, während »max« die maximal<br />
mögliche Anzahl der Maschinen nennt. Sobald<br />
man sich für ein Modell entschieden hat, kann<br />
man die virtuelle Maschine starten:<br />
euca‐run‐instances ‐k eucatest emi‐AF4736C9U<br />
‐t m1.small<br />
Eucalyptus zeigt jetzt die gleiche Statuszeile,<br />
wie man sie auch in der User Console zu Gesicht<br />
bekommt. Wenn noch keine IP-Adressen angegeben<br />
sind, kann man nach ein paar Sekunden den<br />
Zustand wieder erneut abrufen:<br />
euca‐describe‐instances<br />
Die interne Identifikationsnummer neben »IN-<br />
STANCE« sollte man sich unbedingt notieren (sie<br />
beginnt mit einem »i‐«), um sie mit bestimmten<br />
Befehlen zu benutzen:<br />
euca‐terminate‐instances i‐45C44614<br />
Damit kann man eine laufende Instanz später<br />
wieder abschalten.<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
45
<strong>Freie</strong> <strong>Clouds</strong><br />
Eucalyptus<br />
raus wieder anzuhalten, hakt man ihr<br />
kleines Kästchen in der ersten Spalte ab<br />
und wählt dann unter »More actions« die<br />
gewünschte Aktion – wie etwa »Terminate«<br />
(Beenden).<br />
Ausblick<br />
Abbildung 10: Hier läuft eine virtuelle Maschine (Instanz).<br />
Vorgaben verbleiben. Weiter geht es mit<br />
»Next: Select Security«.<br />
Schlüsseltausch<br />
Um später die laufende virtuelle Maschine<br />
warten zu können, muss man sich bei ihr<br />
per SSH anmelden. Die Authentifizierung<br />
erfolgt dabei mithilfe eines Schlüsselpaars<br />
– wer schon einmal mit SSH gearbeitet<br />
hat, sollte das Prinzip kennen. Um das<br />
Schlüsselpaar zu generieren, klickt man<br />
auf den grünen Link »Create new key<br />
pair« und vergibt einen Namen, wie etwa<br />
»test«. »Create and Download« erzeugt<br />
das Schlüsselpaar und bietet den privaten<br />
Schlüssel umgehend zum Download an,<br />
im Beispiel in der Datei »test.pem«. Den<br />
öffentlichen Schlüssel behält Eucalyptus.<br />
In der Ausklappliste »Key name« stellt<br />
man anschließend den zuvor vergebenen<br />
Schlüsselnamen ein (im Beispiel »test«).<br />
Mitunter dauert es etwas, bis der passende<br />
Eintrag auftaucht.<br />
Per »Launch instance(s)« kann man jetzt<br />
endlich die virtuelle Maschine starten.<br />
Es dauert allerdings einen Moment, bis<br />
die virtuelle Maschine läuft und in der<br />
Liste auftaucht (Abbildung 10). Mit einem<br />
Klick auf den (grünen) kryptischen<br />
Namen in der Spalte »Instance« klappt<br />
ein Register mit unzähligen weiteren Informationen<br />
auf. In der Spalte »Public IP«<br />
steht die IP-Adresse, unter der man die<br />
virtuelle Maschine etwa per SSH erreicht.<br />
Die »Private IP« dient zur Kommunikation<br />
der virtuellen Maschinen untereinander.<br />
Sollten in der Liste noch die IP-Adressen<br />
»0.0.0.0« stehen, heißt es wieder etwas<br />
zu warten. Bevor man sich per SSH auf<br />
der virtuellen Maschine einloggen kann,<br />
muss man die Zugriffsrechte auf die Datei<br />
mit dem privaten Schlüssel einschränken,<br />
etwa mit:<br />
chmod 0600 test.pem<br />
Abbildung 11: Die Anmeldung auf der virtuellen Maschine war erfolgreich.<br />
Anschließend kann man sich mit folgendem<br />
SSH-Kommando auf der virtuellen<br />
Maschine einloggen:<br />
ssh ‐i test.pem ec2‐user@192.168.100.100<br />
Dabei steht »test.pem« für die Datei<br />
mit dem privaten Schlüssel und<br />
»192.168.100.100« für die »Public IP« der<br />
virtuellen Maschine (Abbildung 11). Der<br />
Benutzer »ec2‐user« ist im Mini-CentOS-<br />
System bereits angelegt,<br />
sonst sollte<br />
der Benutzername<br />
»root« zum Ziel<br />
führen.<br />
Um die virtuelle<br />
Maschine aus der<br />
Weboberfläche he-<br />
Das vorgegebene Benutzerkonto ist nur<br />
für die ersten Schritte gedacht. Um es zu<br />
löschen und anderen Benutzern mit eigenen<br />
Konten das Starten von virtuellen<br />
Maschinen zu gestatten, ruft man die Admin<br />
Console auf. Sie erreicht man unter<br />
der URL »https://Frontend‐Rechner:8448«.<br />
Auch hier muss man das Zertifikat als<br />
Ausnahme hinzufügen. Die Anmeldung<br />
erfolgt mit dem Account »eucalyptus«,<br />
dem User »admin« und dem Passwort<br />
»admin«. Es meldet sich jetzt ein Assistent,<br />
der die Eingabe einer E-Mail-<br />
Adresse und aus Sicherheitsgründen eine<br />
Änderung des Passworts verlangt. Anschließend<br />
kann man unter »Accounts«<br />
die Benutzerkonten verwalten.<br />
Die weitere Bedienung der beiden Weboberflächen<br />
erläutert das Eucalyptus User<br />
Console Guide. Wer eigene Betriebssystem-Images<br />
in die Cloud stellen möchte,<br />
greift hingegen zum extrem umfangreichen<br />
Administration Guide. In den Dokumenten<br />
erfährt man auch, wie man die<br />
virtuellen Maschinen in Security Groups<br />
einsperrt, die von Amazon bekannten<br />
Availability Groups bildet und die Cloud<br />
Speicherplatz bereitstellen lässt. (ofr) n<br />
Infos<br />
[1] Eucalyptus: [http:// www. eucalyptus. com]<br />
[2] Tim Schürmann, Virtuelle Maschine in<br />
einer virtuellen Maschine betreiben,<br />
LinuxCommunity, 30.07.2013: [http://<br />
www. linux‐community. de/ Archiv/<br />
Tipp‐der‐Woche/ Virtuelle‐Maschine‐in‐eine<br />
r‐virtuellen‐Maschine‐betreiben]<br />
[3] Download des FastStart-Images: [http://<br />
www. eucalyptus. com/ eucalyptus‐cloud/<br />
get‐started/ try/ faststart/ download]<br />
Der Autor<br />
Tim Schürmann ist selbstständiger Diplom-<br />
Informatiker und derzeit hauptsächlich als freier<br />
Autor unterwegs. Zu seinen Büchern gesellen<br />
sich zahlreiche Artikel, die in Zeitschriften<br />
und auf Internetseiten in mehreren Ländern<br />
veröffentlicht wurden.<br />
46 Ausgabe 05-2013 Admin www.admin-magazin.de
Know-how<br />
PostgreSQL 9.3<br />
© Nuno Andre, 123RF<br />
Neues im kommenden PostgreSQL 9.3<br />
Datenbank-Tuning<br />
PostgreSQL in der Version 9.3 steht vor der Tür. Das kommende Release bringt einige Neuerungen hinsichtlich<br />
geschwindigkeit, Benutzbarkeit, aber auch SQL-Standardkonformität. Bernd Helmle<br />
Mit der Version 9.3 liefert die PostgreSQL-<br />
Community wieder etliche wichtige, neue<br />
Features in einer Hauptversion. Sie ist<br />
das Werk vieler Entwickler weltweit und<br />
durchlief einen strengen Review-Prozess<br />
(Commitfest), der die Qualität des Quelltextes<br />
sicherstellt. In der Regel finden<br />
sich bis zu 100 Patches in diesen Commitfests<br />
– wegen der Menge muss besonders<br />
vor dem Feature Freeze einer neuen<br />
Hauptversion die dafür veranschlagte<br />
Zeit regelmäßig verlängert werden. Die<br />
Liste an hinzugekommenen Funktionen<br />
ist entsprechend beeindruckend. Dieser<br />
Artikel stellt die Wichtigsten vor.<br />
Parallel Dump<br />
Ein lange von den Anwendern (aber auch<br />
von Entwicklern) gefordertes Feature ist<br />
die Möglichkeit, Dumps einer Datenbank<br />
mit mehreren Threads oder Prozessen<br />
gleichzeitig auszuführen. PostgreSQL<br />
verwendet eine Multiprozessarchitektur,<br />
das heißt, es benutzt keine Threads<br />
(auch nicht auf Plattformen wie Windows,<br />
die sie eigentlich favorisieren). Um<br />
mit »pg_dump« parallel mehrere Objekte<br />
zu sichern, muss das Programm deshalb<br />
mehrere Datenbankverbindungen öffnen.<br />
Da jedoch »pg_dump« die Konsistenz<br />
eines Dumps auch mit nebenläufigen<br />
Transaktionen garantiert, müssen diese<br />
zu »pg_dump« gehörenden Datenbankverbindungen<br />
nun synchronisiert werden.<br />
Aus diesem Grund gestaltete sich<br />
die Entwicklung dieses Features recht<br />
langwierig.<br />
Snapshot Cloning<br />
Die Infrastruktur, die hierfür implementiert<br />
wurde, nennt sich Snapshot Cloning.<br />
Dieses Verfahren gestattet es, mehrere<br />
Transaktionen derart untereinander zu<br />
synchronisieren, dass sie denselben Zustand<br />
sehen, obwohl es sich doch um<br />
separate Datenbankverbindungen handelt.<br />
Grundsätzlich muss zuerst eine<br />
Transaktion gestartet werden, die dann<br />
synchronisiert werden kann. Alle weiteren<br />
Transaktionen importieren dann den<br />
dabei erzeugten Snapshot. Dies synchronisiert<br />
dann die jeweilige Transaktion mit<br />
ihrer „Elterntransaktion“, beide haben<br />
dann dieselbe Sicht auf den Zustand der<br />
Datenbank.<br />
Abbildung 1 verdeutlicht den Ablauf. Zunächst<br />
wird eine Transaktion gestartet.<br />
Diese muss den Isolationsgrad »REPEA-<br />
TABLE READ« oder »SERIALIZABLE«<br />
haben. »READ COMMITTED« ist nicht<br />
möglich, da sich innerhalb dieses Isolationsgrades<br />
der Snapshot nach jedem<br />
Kommando ändert und nicht dauerhaft<br />
für die Transaktion ist.<br />
Mit der Funktion »pg_export_snapshot()«<br />
kann in jeder beliebigen Transaktion ein<br />
Snapshot exportiert werden. Die Rückgabe<br />
ist ein Datum vom Typ TEXT mit<br />
dem Bezeichner des Snapshots. Dieser<br />
Bezeichner kann in einer anderen<br />
Transaktion mit dem Kommnado »SET<br />
TRANSACTION SNAPSHOT« importiert<br />
werden.<br />
Zu beachten ist, dass dies das erste Kommando<br />
innerhalb der Transaktion oder<br />
vor jedem anderen »SELECT«, »INSERT«,<br />
»UPDATE« oder »DELETE« sein muss. Ferner<br />
kann eine importierende Transaktion<br />
mit »SERIALIZABLE«-Isolationsgrad kei-<br />
48 Ausgabe 05-2013 Admin www.admin-magazin.de
PostgreSQL 9.3<br />
Know-how<br />
nen Snapshot einer Transaktion importieren,<br />
deren Isolationsgrad kleiner ist.<br />
Neue Formate und<br />
Parameter<br />
»pg_dump« implementiert exakt diese Infrastruktur,<br />
um mehrere Dump-Prozesse<br />
zu synchronisieren. Parallel Dump funktioniert<br />
nur für das neue Ausgabeformat<br />
»directory«. Der Aufruf von »pg_dump«<br />
und mehreren synchronisierten Dump-<br />
Prozessen geschieht mit dem neuen Kommandozeilenparameter<br />
»‐j«:<br />
pg_dump ‐j4 ‐Fd ‐f /srv/backups/db/<br />
Wichtig ist das Ausgabeformat »directory«<br />
mit dem Kommandozeilenparameter<br />
»‐Fd«; »‐f« gibt das Ausgabeverzeichnis<br />
an, das nicht existieren darf.<br />
Das Kommando »pg_dump« einer neueren<br />
Hauptversion ließ sich schon immer<br />
auch in einer älteren Version verwenden,<br />
um Migrationen zu ermöglichen. Auch<br />
Parallel Dump ist abwärtskompatibel<br />
und lässt sich beispielsweise auch mit<br />
einer PostgreSQL-Instanz in der Version<br />
9.2 verwenden. Dann kann »pg_dump«<br />
aber keine synchronisierten Snapshots<br />
verwenden, weshalb für die Dauer des<br />
Dumps keinerlei Änderungen an den<br />
Datenbanken zugelassen werden sollten,<br />
um Inkonsistenzen zu vermeiden.<br />
Alternativ lassen sich synchronisierte<br />
Snapshots auch explizit mit einem Kommandozeilenparameter<br />
(»‐‐no‐synchronized‐snapshots«)<br />
abschalten, sodass<br />
sich Dumps mit mehreren »pg_dump«-<br />
Prozessen auch in älteren Versionen anfertigen<br />
lassen.<br />
Schreibbare Foreign Data<br />
Wrapper<br />
Data Wrapper (FDW) zur Laufzeit konvertiert<br />
und als Datenbankzeile in der<br />
Ergebnismenge gemäß der Tabellendefinition<br />
angezeigt. Zum jetzigen Zeitpunkt<br />
existieren bereits eine größere Anzahl<br />
von FDWs für den Zugriff auf andere<br />
Datenbanksysteme unter PostgreSQL,<br />
darunter<br />
n Oracle<br />
n MySQL<br />
n Informix<br />
n ODBC<br />
n JDBC<br />
sowie auch solche für die NoSQL-Datenbankquellen<br />
CouchDB, Redis und MongoDB.<br />
Der FDW für PostgreSQL selbst hat nun<br />
mit der Version 9.3 in den Contrib-Zweig<br />
des Datenbankservers Einzug gehalten.<br />
Damit lassen sich die Tabellen externer<br />
PostgreSQL-Datenbanken einbinden.<br />
Ferner unterstützt der PostgreSQL-FDW<br />
bereits schreibende DML-Abfragen mit<br />
»INSERT«, »DELETE« und »UPDATE«.<br />
Für die jeweiligen Distributionen werden<br />
diese zusätzlichen Module in der<br />
Regel in einem PostgreSQL-Contrib-Paket<br />
bereitgehalten. Ist alles ordnungsgemäß<br />
installiert, lässt sich der PostgreSQL-FDW<br />
einfach als Extension aktivieren. Abbildung<br />
2 zeigt beispielhaft diesen Vorgang.<br />
Das »\dx«-Kommando gibt in »psql« alle<br />
derzeit installierten Extensions einer Datenbank<br />
aus.<br />
Zugriff auf externe Server<br />
Um mittels des PostgreSQL-FDW auf<br />
einen entfernten Datenbankserver zuzugreifen,<br />
muss zunächst eine entsprechende<br />
Datenquelle konfiguriert sein.<br />
Das geschieht mit Hilfe des »CREATE<br />
SERVER«-Kommandos. Im folgenden<br />
Beispiel wird auf einen entfernten PostgreSQL-Server<br />
»archives.mynet.internal«<br />
zugegriffen. Zunächst muss der FDW jedoch<br />
per »CREATE EXTENSION« in die<br />
lokale Datenbank geladen werden.<br />
Es ist nicht notwendig, einen FDW auch<br />
auf dem entfernten Datenbankserver<br />
zu installieren, jedoch muss die lokale<br />
Datenbank per »pg_hba.conf« eine Zugriffsberechtigung<br />
auf die gewünschte<br />
Datenbank erhalten. Es können auch<br />
alle gängigen PostgreSQL-Schlüsselworte<br />
für die Datenbankverbindung angegeben<br />
werden (»host«, »dbname«, »port« und<br />
so weiter), verboten sind jedoch »user«,<br />
»password«, »failback_application_name«<br />
und »client_encoding«. Die beiden letzten<br />
werden automatisch vom FDW gesetzt:<br />
CREATE EXTENSION postgres_fdw;<br />
Anschließend kann die Datenquelle für<br />
den entfernten Datenbankserver definiert<br />
werden, wie das folgende Listing zeigt:<br />
CREATE SERVER pg_archive_server<br />
FOREIGN DATA WRAPPER postgres_fdw<br />
OPTIONS(dbname 'archive', host U<br />
'archives.mynet.internal', port '5432');<br />
Um eine Foreign Table erzeugen zu können,<br />
muss der Datenquelle noch mitgeteilt<br />
werden, welcher Benutzer sich mit welcher<br />
Kombination aus Rollennamen und<br />
Passwort an der entfernten PostgreSQL-<br />
Instanz anmelden kann. Dafür wird ein<br />
Mapping für den Benutzer benötigt. Das<br />
erledigt das Kommandos »CREATE USER<br />
MAPPING«. Die verwendeten Zugangsinformationen<br />
unterscheiden sich zwischen<br />
den einzelnen FDW, für PostgreSQL sind<br />
Bereits PostgreSQL 9.1 hatte eine Teilimplementierung<br />
des SQL/MED-Standards<br />
an Bord, der das Einbinden externer Datenquellen<br />
in Form einer Foreign Table<br />
ermöglichte. Dies war jedoch bisher<br />
nur lesend möglich. Mit PostgreSQL 9.3<br />
wurde die API auch für Schreiboperationen<br />
auf Foreign Tables erweitert.<br />
Externe Datenquellen werden dabei derart<br />
definiert, dass sie dem PostgreSQL-<br />
Anwender wie lokale Tabellen erscheinen.<br />
Die Datensätze werden bei einer<br />
Abfrage über einen sogenannten Foreign<br />
Abbildung 1: Die zweite Transaktion rechts bezieht sich auf einen zuvor angelegten Snapshot: So sieht sie<br />
dieselben Daten.<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
49
Know-how<br />
PostgreSQL 9.3<br />
auf jeden Fall Benutzername und gegebenenfalls<br />
Passwort erforderlich. Letzteres<br />
ist bei einem User Mapping für Benutzer<br />
ohne Superuserberechtigung zwingend<br />
notwendig. Das Schlüsselwort »CUR-<br />
RENT_USER« wird durch die aktuell in<br />
der lokalen Datenbanksitzung verwendete<br />
Rolle automatisch ersetzt:<br />
CREATE USER MAPPING FOR CURRENT_USER<br />
SERVER pg_archive_server<br />
OPTIONS(user 'bernd', password 'bernd');<br />
Mit dem Anlegen einer Datenquelle und<br />
einem Mapping für die Zugangsberechtigungen<br />
zur jeweiligen Datenquelle kann<br />
anschließend eine sogenannte Foreign<br />
Table angelegt werden. Die lokale Definition<br />
sollte dabei möglichst dem Schema<br />
der entfernten Datenquelle entsprechen.<br />
Die lokale Datenbank erhält in Listing 1<br />
eine Foreign Table, die E-Mails in einem<br />
Archiv speichert:<br />
Beispiel: E-Mail-Archiv<br />
Dies entspricht exakt der Definition auf<br />
dem Archivserver – dort natürlich ohne<br />
die Schlüsselwörter »SERVER« und »OP-<br />
TIONS«, die dort nicht nötigt sind.<br />
Nun kann die lokale Datenbank die Archivtabelle<br />
in lokalen Abfragen ohne<br />
Weiteres verwenden:<br />
SELECT COUNT(*) FROM mails WHEREU<br />
mail_from LIKE 'Tom Lane%';<br />
count<br />
‐‐‐‐‐‐‐<br />
6238<br />
(1 row)<br />
Der FDW ist dafür zuständig, beim erstmaligem<br />
Ausführen eine für das User<br />
Mapping und Zielserver entsprechende<br />
Datenbankverbindung aufzubauen.<br />
Diese Datenbankverbindung wird pro<br />
verwendetes User Mapping innerhalb<br />
der lokalen Datenbanksitzung zur Wiederverwendung<br />
gecached.<br />
Listing 1: Foreign Table<br />
01 CREATE FOREIGN TABLE mails(<br />
02 id bigint not null,<br />
03 label_id bigint,<br />
04 mail_from text not null,<br />
05 mail_to text not null,<br />
06 msg text not null,<br />
07 subject text not null,<br />
08 msg_id text not null,<br />
09 date timestamp)<br />
10 SERVER pg_archive_server<br />
Der PostgreSQL-FDW unterstützt nicht<br />
nur lesende, sondern auch schreibende<br />
Operationen (Data Modyfing Language,<br />
DML). Werden Transaktionen oder Sicherungspunkte<br />
(SAVEPOINT) auf der lokalen<br />
Datenbank verwendet, so koppelt<br />
der PostgreSQL-FDW diese ebenfalls an<br />
Transaktionen beziehungsweise Sicherungspunkte<br />
auf der entfernten Datenbank.<br />
Dies bedeutet, dass ein ROLLBACK<br />
von lokalen Datenbanken auch jede Änderung<br />
einer entfernten PostgreSQL-Datenquelle<br />
zurückrollt.<br />
Neue Features mit<br />
Streaming Replication<br />
Das mit Version 9.0 eingeführte, eingebaute<br />
Replikationsverfahren über Streaming<br />
Replication erfährt von Hauptversion<br />
zu Hauptversion stetige Verbesserungen.<br />
Auch PostgreSQL 9.3 bleibt<br />
dieser Tradition treu und verbessert die<br />
Handhabung von Streaming Replication<br />
im Falle eines Failovers oder Recovery des<br />
primären Servers.<br />
Wird der primäre Server durch eine Online-Sicherung<br />
wiederhergestellt, oder<br />
wird ein Failover auf einen anderen Streaming<br />
Replication Standby durchgeführt,<br />
so ändert die betroffene PostgreSQL-Instanz<br />
die sogenannte Timeline, eine Art<br />
Zeitschiene, auf die das Transaktionslog<br />
des Datenbankservers einschwenkt.<br />
Dies ermöglicht auch das mehrfache Recovern<br />
einer Online-Sicherung, falls man<br />
beispielsweise den falschen Zeitpunkt<br />
für das Ende der Rücksicherung (Point<br />
In Time Recovery, PITR) gewählt hat.<br />
Alle anderen Streaming Standby müssen<br />
dieser Timeline folgen. Bis PostgreSQL<br />
9.2 ist dies nur mit Hilfe des »restore_<br />
command«-Kommandos in der »recovery.<br />
conf« möglich, da ein Zugriff über ein<br />
Archiv mit allen archivierten Transaktionslogs<br />
notwendig ist. Dies enthält die<br />
sogenannten History-Dateien für den<br />
Wechsel der Timeline (alle Dateien enden<br />
mit ».history«), die der Streaming<br />
Replication Standby benötigt, um diesen<br />
Wechsel nachzuvollziehen. Mit Version<br />
9.3 fällt diese Notwendigkeit eines Archivzugriffes<br />
weg, Streaming Replication<br />
kann nun direkt einen Wechsel der Timeline<br />
nachvollziehen. Erforderlich ist nach<br />
wie vor das Setzen des Parameters »recovery_target_timeline='latest'«<br />
in der<br />
Konfigurationsdatei »recovery.conf«.<br />
Neben der Möglichkeit, einen Hot-<br />
Standby-PostgreSQL-Server mithilfe des<br />
Parameters »trigger_file« zu einer vollwertigen<br />
PostgreSQL-Instanz zu delegieren,<br />
bietet PostgreSQL zusätzlich noch<br />
die Möglichkeit, dies über den Befehl<br />
»pg_ctl promote« zu implementieren. Mit<br />
der Version 9.3 gibt es hier zusätzlich die<br />
Möglichkeit, den Standby ohne Warten<br />
auf einen Checkpoint zur vollwertigen,<br />
schreibbaren Instanz zu machen. Hierzu<br />
muss die Kommandozeilenoption »‐m<br />
fast« verwendet werden. Dies erspart unter<br />
Umständen eine längere Wartezeit,<br />
bevor die Instanz zum Schreiben zur Verfügung<br />
steht.<br />
Mehr Speicher<br />
Abbildung 2: PostgreSQL-FDW wird als Extension der Datenbank hinzugefügt.<br />
Bis einschließlich PostgreSQL 9.2 war<br />
es für Einstellungen von »maintenance_<br />
work_mem« beziehungswiese »work_<br />
mem« nicht möglich, effektiv mehr als 2<br />
GByte für Sortierungen im RAM zu nutzen.<br />
Dies lag an einer hartcodierten Beschränkung<br />
innerhalb der Datenbank. Besonders<br />
für DDL-Kommandos, die diesen<br />
Konfigurationsparameter nutzen, kommt<br />
dieser Beschränkung eine wichtige Bedeutung<br />
zu. So profitiert zum Beispiel<br />
nun das »CREATE INDEX«-Kommando<br />
effektiv von einer hohen Einstellung in<br />
»maintenance_work_mem«, wenn sehr<br />
große Indexe erzeugt werden müssen.<br />
Das Sortieren für den Aufbau des Index<br />
kann dann im Idealfall komplett per<br />
50 Ausgabe 05-2013 Admin www.admin-magazin.de
Know-how<br />
PostgreSQL 9.3<br />
Quicksort im Speicher des Datenbankservers<br />
erfolgen, ohne auf das Storage-<br />
System ausweichen zu müssen.<br />
Für Altsysteme, die diese Einstellung<br />
schon immer auf hohe Werte gesetzt hatten<br />
(auch wenn diese effektiv nie genutzt<br />
wurden), sollte der Wert jetzt jedoch geprüft<br />
werden. Ansonsten droht Gefahr,<br />
wenn die Einstellung plötzlich wirklich<br />
entsprechend hohe Speicherallozierungen<br />
auf dem System vornimmt.<br />
Bereits in älteren PostgreSQL-Versionen<br />
konnte man mittels sogenannter Expression<br />
Indexes reguläre Ausdrücke indizieren.<br />
Allerdings funktionierte das nur für<br />
statische reguläre Ausdrücke und falls<br />
mehrere Suchbegriffe indiziert werden<br />
mussten, wurde es aufgrund der Vielzahl<br />
der benötigten Indexe schnell ineffektiv.<br />
Indizierbare reguläre<br />
Ausdrücke<br />
Mit Version 9.3 verfügt PostgreSQL nun<br />
über die Möglichkeit, direkt dynamische<br />
reguläre Ausdrücke mit Hilfe eines speziellen<br />
Indexes zu beschleunigen.<br />
Das Contrib-Modul »pg_trgm« wurde in<br />
PostgreSQL 9.3 derart erweitert, dass es<br />
beliebige reguläre Ausdrücke über ei-<br />
nen Index beantworten kann. Da es sich<br />
ebenfalls im Contrib-Zweig der Datenbank<br />
befindet, muss es über »CREATE<br />
EXTENSION« nachinstalliert werden. Das<br />
Listing 2 zeigt am Beispiel der Tabelle<br />
»mails«, wie ein derartiger Index angelegt<br />
wird und einen Vergleich der Ausführungspläne<br />
mit und ohne Index.<br />
Die Unterschiede in den Kosten und<br />
Ausführungszeiten mit und ohne Index<br />
zeigen die deutlichen Vorteile in der Abfragegeschwindigkeit.<br />
Mit der Version 9.3 unterstützt PostgreSQL<br />
nun auch das im SQL-Standard<br />
definierte LATERAL-Schlüsselwort. Das<br />
Listing 2: Indizierte Regex<br />
01 CREATE EXTENSION pg_trgm;<br />
02 CREATE INDEX ON mails USING gin(msg gin_trgm_ops);<br />
03 <br />
04 EXPLAIN ANALYZE SELECT * FROM mails WHERE msg ~ '(updatable|views)';<br />
05 QUERY PLAN<br />
06 ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐<br />
07 Bitmap Heap Scan on mails (cost=128.03..143.74 rows=4 width=961)<br />
(actual<br />
08 time=35.454..175.184 rows=672 loops=1)<br />
09 Recheck Cond: (msg ~ '(updatable|views)'::text)<br />
10 Rows Removed by Index Recheck: 978<br />
11 ‐> Bitmap Index Scan on mails_msg_idx (cost=0.00..128.03 rows=4<br />
width=0)<br />
12 (actual time=34.925..34.925 rows=1650 loops=1)<br />
13 Index Cond: (msg ~ '(updatable|views)'::text)<br />
14 Total runtime: 175.403 ms<br />
15 (6 rows)<br />
16 <br />
17 EXPLAIN ANALYZE SELECT * FROM mails WHERE msg ~ '(updatable|views)';<br />
18 QUERY PLAN<br />
19 ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐<br />
20 Seq Scan on mails (cost=0.00..5628.25 rows=4 width=961) (actual<br />
21 time=2.401..1519.809 rows=672 loops=1)<br />
22 Filter: (msg ~ '(updatable|views)'::text)<br />
23 Rows Removed by Filter: 40148<br />
24 Total runtime: 1519.991 ms<br />
25 (4 rows)<br />
Listing 3: Set Returning Function<br />
01 CREATE OR REPLACE FUNCTION get_buch_by_autorid(IN integer)<br />
02 RETURNS SETOF text<br />
03 STRICT<br />
04 LANGUAGE SQL<br />
05 AS<br />
06 $$<br />
07 SELECT b.titel FROM buch b WHERE autor_id = $1;<br />
08 $$;<br />
09 <br />
10 buch =# SELECT * FROM autor a, get_buch_by_autorid(a.id);<br />
11 ERROR: function expression in FROM cannot refer to other relations of<br />
same<br />
12 query level<br />
13 LINE 1: SELECT * FROM autor a, get_buch_by_autorid(a.id);<br />
14 <br />
15 SELECT * FROM autor a, LATERAL get_buch_by_autorid(a.id);<br />
16 <br />
17 id | name | get_buch_by_autorid<br />
18 ‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐<br />
19 1 | Bernd Helmle | PostgreSQL Administration<br />
20 2 | Andreas Eschbach | One Trillion Dollar<br />
21 3 | Mario Puzo | Der Pate<br />
22 4 | Peter Eisentraut | PostgreSQL Administration<br />
23 4 | Peter Eisentraut | PostgreSQL ‐ Das offizielle Handbuch<br />
24 (5 rows)<br />
Listing 4: »LATERAL«<br />
01 SELECT<br />
02 a.id, a.name, t.titel<br />
03 FROM autor a,<br />
04 (SELECT autor_id, titel FROM buch b WHERE b.autor_id = a.id AND<br />
b.titel LIKE '%PostgreSQL%') AS t;<br />
05 ERROR: invalid reference to FROM‐clause entry for table "a"<br />
06 LINE 1: ...CT autor_id, titel FROM buch b WHERE b.autor_id = a.id) AS<br />
t...<br />
07 ^<br />
08 HINT: There is an entry for table "a", but it cannot be referenced from<br />
this part of the query.<br />
09 <br />
10 <br />
11 # Mit LATERAL wird aus dieser Verknüpfung jedoch eine korrekte<br />
Verknüpfung:<br />
12 <br />
13 <br />
14 SELECT<br />
15 a.id, a.name, t.titel<br />
16 FROM autor a,<br />
17 LATERAL (SELECT autor_id, titel FROM buch b WHERE b.autor_id = a.id<br />
AND b.titel LIKE '%PostgreSQL%') AS t;<br />
18 id | name | titel<br />
19 ‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐<br />
20 1 | Bernd Helmle | PostgreSQL Administration<br />
21 4 | Peter Eisentraut | PostgreSQL Administration<br />
22 4 | Peter Eisentraut | PostgreSQL ‐ Das offizielle Handbuch<br />
23 (3 rows)<br />
52 Ausgabe 05-2013 Admin www.admin-magazin.de
PostgreSQL 9.3<br />
Know-how<br />
erlaubt es dem Entwickler, innerhalb von<br />
Verknüpfungen (Joins) mit Subselects aus<br />
diesen heraus andere Spalten oder Werte<br />
der Join-Operation zu referenzieren.<br />
LATERAL-Statement<br />
Ein einfaches Beispiel soll dies verdeutlichen:<br />
In der Regel ist es bisher in<br />
PostgreSQL nicht möglich, das Ergebnis<br />
eines Join-Partners als Funktionsargument<br />
einer Funktion zu verwenden. Bis<br />
PostgreSQL 9.2 liefert Listing 3 ein stark<br />
vereinfachtes Beispiel einer sogenannten<br />
Set Returning Function (SRF).<br />
Interessant wird LATERAL insbesondere<br />
bei Verknüpfungspartnern wie Subselects.<br />
Für diese gilt diesselbe Regelung:<br />
Vorhergehende Verknüpfungspartner<br />
können mit LATERAL direkt in der Definition<br />
des Subselects referenziert werden.<br />
Hierbei ist das LATERAL-Schlüsselwort<br />
Pflicht, wie Listing 4 verdeutlicht.<br />
Für komplexe Subqueries innerhalb von<br />
Verknüpfungen ist dies eine deutliche Erleichterung,<br />
allerdings sollte dies nicht<br />
dazu verleiten, Verknüpfungen als solche<br />
immer als Subqueries zu formulieren.<br />
Das vorhergehende Beispiel lässt sich<br />
beispielsweise recht einfach in einen herkömmlichen<br />
JOIN umschreiben.<br />
COPY FREEZE<br />
Wenn große Datenmengen beispielsweise<br />
in eine Archivtabelle zu laden waren, so<br />
bot es sich vor PostgreSQL Version 9.3<br />
an, nachträglich ein VACUUM FREEZE<br />
auf die Relation auszuführen, wenn sich<br />
die Datensätze im Anschluss garantiert<br />
nicht mehr änderten. Dies hatte den Vorteil,<br />
dass man sich einen späteren VA-<br />
CUUM FREEZE sparen konnte. Auf jeden<br />
Fall entfällt außerdem ein teurer zusätzlicher<br />
Scan der kompletten Tabelle im<br />
Anschluss, was gerade bei sehr großen<br />
Datenbeständen eine beachtliche Zeitersparnis<br />
ist.<br />
In PostgreSQL 9.3 gibt es nun die Möglichkeit,<br />
das sofort beim Ladens der Daten<br />
erledigen. Das Kommando »COPY«<br />
wurde um den Parameter »FREEZE« erweitert.<br />
»COPY« mit »FREEZE« erfordert einige<br />
Rahmenbedingungen. So muss die Zieltabelle<br />
in derselben Transaktion erzeugt<br />
worden sein, die auch den COPY-Befehl<br />
absetzt. Auch dürfen keine »CURSOR«<br />
auf diese Tabelle geöffnet sein. Das folgende<br />
Beispiel zeigt die Verwendung von<br />
»COPY FREEZE« mit einer CSV-Datei:<br />
BEGIN;<br />
CREATE TABLE t3(LIKE t2);<br />
COPY archive_tbl FROM '/Users/berndU<br />
/tmp/archive.dat' FREEZE CSV;<br />
COMMIT;<br />
Häufiger regten Anwendern die Verfügbarkeit<br />
von Triggern beim Ausführen bestimmter<br />
DDL-Kommandos an. Solche<br />
Trigger können beispielsweise Änderungen<br />
an der Datenbank selbst verfolgen.<br />
Anzeige<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
53
Know-how<br />
PostgreSQL 9.3<br />
Ein Anwendungsbeispiel sind etwa Replikationssysteme<br />
wie Slony-I, die auf eine<br />
entsprechende Benachrichtigung über<br />
veränderte Objekte angewiesen sind.<br />
Event Trigger<br />
Einen Event Trigger erzeugt man über das<br />
Kommando »CREATE EVENT TRIGGER«.<br />
Die Syntax folgt der normalen »CREATE<br />
TRIGGER«-Syntax, das heißt, die Trigger-<br />
Funktion ist im Vorfeld zu definieren.<br />
Listing 5 zeigt ein Beispiel, das pauschal<br />
alle »ALTER TABLE«-Kommandos in einer<br />
Datenbank mit einem Fehler verhindert:<br />
Neben dem Event-Trigger-Ereignis<br />
»ddl_command_start« stehen noch die<br />
Ereignisse »ddl_command_end« und<br />
»sql_drop« zur Verfügung. »ddl_command_start«<br />
wird vor dem Ausführen des<br />
jeweiligen DDL-Kommandos ausgeführt,<br />
»ddl_command_end« entsprechend bevor<br />
das DDL-Kommando beendet wird. Event<br />
Trigger mit dem »sql_drop«-Ereignis<br />
werden noch vor »ddl_command_end«-<br />
Event-Triggern ausgeführt: Für alle Objekte,<br />
die innerhalb dieses Ereignisses<br />
entfernt werden.<br />
Event Trigger lassen sich im Moment in<br />
PL/pgSQL oder C implementieren. Ein<br />
CREATE-EVENT-TRIGGER-Kommando<br />
selbst kann nicht Auslöser eines Event<br />
Triggers sein.<br />
Prüfsummen<br />
Mit PostgreSQL 9.3 lassen sich Datenbankblöcke,<br />
die auf Festplatte geschrieben<br />
werden, mit Prüfsummen versehen.<br />
Listing 5: Event Trigger<br />
01 CREATE OR REPLACE FUNCTION public.deny_alter_table()<br />
02 RETURNS event_trigger<br />
03 LANGUAGE plpgsql<br />
04 AS $function$<br />
05 BEGIN<br />
06 <br />
07 RAISE EXCEPTION '% is disabled', TG_TAG;<br />
08 <br />
09 END;<br />
10 $function$<br />
11 <br />
12 CREATE EVENT TRIGGER etg_deny_alter_table<br />
13 ON ddl_command_start<br />
14 WHEN tag IN ('ALTER TABLE')<br />
15 EXECUTE PROCEDURE deny_alter_table();<br />
16 <br />
17 ALTER TABLE test ADD COLUMN another_col integer;<br />
18 FEHLER: ALTER TABLE is disabled<br />
Das kann die Diagnose von Festplattenproblemen<br />
erleichtern, indem etwaige<br />
Datenkorruption erkannt wird. Interessant<br />
ist das insbesondere für Systeme, die<br />
auf unsicherer Hardware laufen.<br />
Ob Prüfsummen verwendet werden sollen,<br />
muss der Administrator beim Initialisieren<br />
der PostgreSQL-Instanz mittels<br />
des Kommandos »initdb« und dessen<br />
neuen Kommandozeilenparameters<br />
»‐‐data‐checksums« festlegen. Nachträglich<br />
kann dieses Feature weder aktiviert<br />
noch deaktiviert werden. Ferner gilt es<br />
immer gleich für sämtliche Datenbanken<br />
und ‐objekte.<br />
Das Schreiben oder Checken der Prüfsummen<br />
findet auf Blockebene für alle<br />
Datenbankobjekte wie Tabellen oder Indexe<br />
statt. Für einzelne Objekte ist der<br />
Check der Prüfsummen nicht deaktivierbar.<br />
Auch muss beachtet werden, dass<br />
die Aktivierung der Prüfsummen Auswirkungen<br />
auf die Geschwindigkeit der<br />
Datenbank hat.<br />
Verbesserte Concurrency<br />
für Fremdschlüssel<br />
Bisher wurde insbesondere bei Änderungen<br />
an Daten, die mit Fremdschlüssel<br />
entsprechende Tabellen referenzieren,<br />
ein sogenannter »FOR SHARE«- beziehungsweise<br />
»FOR UPDATE«-Lock-Typ<br />
verwendet. Das Problem mit diesen Typen<br />
war, dass sie bei einer Vielzahl an<br />
nebenläufigen Änderungen zu massiven<br />
Sperrungen führten, was die Geschwindigkeit<br />
solcher Anwendungen erheblich<br />
sinken lassen konnte.<br />
Mit der Version PostgreSQL 9.3 werden<br />
zwei neue Lock-Typen eingeführt: »FOR<br />
KEY SHARE« und »FOR NO KEY UP-<br />
DATE«. Diese beiden Lock-Typen blockieren<br />
sich nicht mehr gegenseitig. Wird<br />
nun ein Tupel, das über einen Fremdschlüssel<br />
verfügt, aktualisiert, so wird<br />
für den Fall, dass der Schlüssel nicht<br />
Bestandteil der Aktualisierung ist, nun<br />
ein neuer »FOR NO KEY UPDATE«-Lock<br />
angefordert.<br />
Prüfungen der Fremdschlüsselintegrität<br />
selbst werden in PostgreSQL seit jeher<br />
über implizite Trigger realisiert. Diese<br />
verwenden anstelle von »FOR SHARE«<br />
nun »FOR KEY SHARE«. Das beschleunigt<br />
den Großteil der Anwendungen mit<br />
einem derartigen Anforderungsprofil. In<br />
der Regel werden sowieso Fremdschlüsselwerte<br />
als solche nur recht selten aktualisiert.<br />
Schon seit geraumer Zeit wurde in der<br />
PostgreSQL-Community über sogenannte<br />
Background-Prozesse nachgedacht.<br />
Background Worker API<br />
Das sind Prozesse, die neben den normalen<br />
Datenbankverbindungen – die<br />
ebenfalls separate Prozesse sind – gestartet<br />
werden und dedizierte Aufgaben<br />
erledigen können, wie beispielsweise das<br />
periodische Ausführen spezifischer Aufgaben<br />
oder Kommandos. PostgreSQL 9.3<br />
enthält die notwendige Infrastruktur und<br />
API, um solche Hintergrundprozesse implementieren<br />
zu können. Eine Referenzimplementierung<br />
findet sich im Contrib-<br />
Modul »worker_spi«. Interessierte Entwickler<br />
können hier die notwendigen<br />
Schritte studieren.<br />
Hintergrundprozesse starten bei Start der<br />
Datenbankinstanz und sind während der<br />
gesamten Laufzeit der Instanz aktiv. Beendet<br />
sich ein Hintergrundprozess, so<br />
wird er sofort vom PostgreSQL-Datenbankserver<br />
neu gestartet.<br />
Fazit<br />
Die beschriebenen neuen Funktionen<br />
und Ergänzungen stellen die wichtigsten<br />
und gravierendsten Neuerungen in<br />
PostgreSQL 9.3 dar. Darüber hinaus gibt<br />
es eine noch viel größere Anzahl kleinerer,<br />
aber teilweise dennoch bedeutender<br />
Änderungen. Das betrifft Geschwindigkeitsverbesserungen<br />
im Datenbankserver<br />
selbst oder in Verbindung mit Streaming<br />
Replication, die alleine schon einen Blick<br />
auf die neue Version rechtfertigen.<br />
Zusätzlich hat der JSON-Datentyp, eingeführt<br />
in PostgreSQL 9.2, nun eine umfangreiche<br />
Liste an Zusatzfunktionen für<br />
Zugriff und Datenmanipulation bekommen.<br />
Dies vereinfacht insbesondere die<br />
Interaktion interaktiver Webanwendungen<br />
mit der Datenbank, beispielweise<br />
über Skriptsprachen, die selbst über weitgehende<br />
JSON-Funktionalität verfügen.<br />
Jedoch insbesondere mit dem Einzug<br />
von DML-fähigen Foreign Data Wrapper<br />
wird PostgreSQL 9.3 zum Multifunktionswerkzeug<br />
in heterogenen, verteilten<br />
Datenbankumgebungen. (jcb) n<br />
54 Ausgabe 05-2013 Admin www.admin-magazin.de
Know-how<br />
Bareos<br />
© Maxim Kazmin, 123RF<br />
Neue Features im Bacula-Fork Bareos<br />
Besser sichern<br />
Die auf fast allen Plattformen verfügbare Open-Source-Backup-Software<br />
Bacula ist bei vielen Administratoren beliebt – nun schickt sich der Fork<br />
Bareos an, die Vorreiterrolle noch auszubauen. Jörg Steffens, Philipp Storz<br />
Bevor man sich mit Bacula oder Bareos<br />
näher befasst oder eine Testinstallation<br />
ins Auge fasst, ist ein Blick auf die Struktur<br />
der Anwendung nützlich (Abbildung<br />
1): Der grundsätzliche Aufbau besteht<br />
immer aus einer Steuerzentrale, dem<br />
Backup Director, ein oder mehreren Storage<br />
Daemons und den File Daemons auf<br />
den zu sichernden Clients.<br />
Die File Daemons sind der Teil der Software,<br />
der auf möglichst vielen Plattformen<br />
laufen muss. Er ist dafür zuständig,<br />
die Daten vom Client zu sichern beziehungsweise<br />
sie bei einer Rücksicherung<br />
auch wieder dorthin zu bringen. Dieser<br />
Daemon läuft auf den Clients permanent<br />
und führt die Anweisungen des Directors<br />
aus.<br />
Der Director ist die Steuereinheit: Er enthält<br />
die gesamte Logik und zu ihm gehören<br />
die meisten Einstellungen. Seine<br />
Konfigurationsdatei beschreibt<br />
n die Datenbank-Konfiguration,<br />
n alle Client-Systeme und wie diese anzusprechen<br />
sind,<br />
n welche Dateien gesichert werden sollen<br />
(File Sets),<br />
n die Plugin-Konfigurationen,<br />
n die Before- und After-Jobs: Programme,<br />
die vor oder nach einem<br />
Backup-Job gestartet werden sollen,<br />
um etwa Dienste zu stoppen und zu<br />
starten,<br />
n den Storage- und den Medien-Pool mit<br />
dessen Eigenschaften und Vorhaltezeiten,<br />
n die Zeitpläne für die Backups,<br />
n die Adressen für Meldungen,<br />
n Jobs und JobDefs.<br />
Selbst wenn bereits ein Storage, ein File<br />
Set und ein Client definiert sind, passiert<br />
erst einmal gar nichts. Zusammengeführt<br />
werden diese Komponenten erst<br />
über Jobs. Sie definieren, was wann und<br />
wohin zu sichern ist.<br />
Wichtig ist auch, wie lange gesicherte<br />
Daten aufzuheben sind. Das steuern File<br />
Retention, Job Retension und Volume Retention.<br />
Es ist sinnvoll, sich nur auf die<br />
Volume Retention zur Steuerung der Vorhaltezeiten<br />
zu beschränken, denn wenn<br />
sich mehrere Retention-Optionen überschneiden,<br />
kann es zu überraschenden<br />
Effekten kommen.<br />
Die Volume Retention wird pro Pool definiert.<br />
Durch die Definition mehrerer<br />
Pools kann man auch mit unterschiedlichen<br />
Vorhaltezeiten arbeiten, zum Beispiel<br />
für verschiedene Systeme oder für<br />
unterschiedliche Sicherungsarten wie<br />
Voll-, differenzielle oder inkrementelle<br />
Sicherung. Die angegebenen Zeiten sind<br />
Mindestaufbewahrungsfristen.<br />
Bessere Bedienbarkeit<br />
Ein Schwerpunkt der Bareos-Entwicklung<br />
ist es, die Hürden für Anfänger möglichst<br />
56 Ausgabe 05-2013 Admin www.admin-magazin.de
Bareos<br />
Know-how<br />
Abbildung 1: Struktur einer einfachen Bacula-/Bareos-Installation.<br />
niedrig zu halten. Weil Neulinge von den<br />
gebotenen Konfigurationsmöglichkeiten<br />
meist erschlagen werden, bietet das Bareos-Projekt<br />
unter [1] Paket-Repositories<br />
für die gängigen Linux-Distributionen<br />
und Windows an. Für Windows werden<br />
sogar zusätzliche Pakete für die Software-<br />
Management-Lösung OPSI [2] offeriert.<br />
Alle Versionen werden automatisiert<br />
durch eine projekteigene Instanz des<br />
Open Build Service gebaut. Im Vergleich<br />
dazu bietet Bacula.org nur den Quellcode<br />
an. Aktuelle Windows-Binaries<br />
stehen dort nur gegen Bezahlung zur<br />
Verfügung.<br />
Unter Linux reicht es zur Installation eines<br />
Bareos-Servers aus, das entsprechende<br />
Repository einzubinden und das Paket<br />
»bareos« zu installieren. Bareos unterstützt<br />
drei Datenbank-Backends: MySQL,<br />
PostgreSQL und SQLite. SQLite sollte<br />
aber nur für Testinstallationen verwendet<br />
Von Bacula zu Bareos<br />
Die Open-Source-Variante von Bacula wurde<br />
erstmals 2002 veröffentlicht und fand rasch Anklang<br />
in der Community. In den letzten Jahren<br />
hat sich beim freien Bacula aber immer weniger<br />
getan. Derzeit gibt es nur alle paar Monate<br />
neue Commits in das öffentliche Git-Projekt. Es<br />
scheint, als würden sich die Entwickler auf die<br />
kommerzielle Bacula Enterprise Edition konzentrieren,<br />
die nicht öffentlich entwickelt wird.<br />
Der langjährige Bacula-Entwickler Marco van<br />
Wieringen hatte deshalb schon 2010 begonnen,<br />
Erweiterungen und Code-Aufräumarbeiten,<br />
die entweder gar nicht angenommen wurden<br />
werden. Der meiste Optimierungsaufwand<br />
soll zukünftig<br />
in die PostgreSQL-Anbindung<br />
fließen. Um sicherzustellen,<br />
dass wirklich das gewünschte<br />
Backend installiert wird, sollte<br />
man die Pakete »bareos« und<br />
»bareos‐database‐postgresql«<br />
(oder eben »bareos‐database‐mysql«)<br />
auswählen. Die<br />
Datenbank selbst muss separat<br />
installiert werden, da Bareos<br />
nur Abhängigkeiten zu den<br />
Datenbank-Clients beinhaltet.<br />
Dies ist sinnvoll, weil die Datenbank<br />
nicht unbedingt auf<br />
dem Bareos-Director-Rechner<br />
selbst laufen muss.<br />
Im Gegensatz zu Bacula wird<br />
bei Bareos die zu verwendende<br />
Datenbank in der Konfigurationsdatei<br />
definiert. Bei Bacula war<br />
es noch notwendig, eine speziell gegen<br />
die jeweilige Datenbank kompilierte Version<br />
einzusetzen.<br />
Bei der Erstinstallation wird Bareos die<br />
Konfigurationsdateien im Verzeichnis<br />
»/etc/bareos« mit sinnvollen Werten belegen.<br />
Nach der Installation muss der<br />
Admin die Datenbank initialisieren und<br />
die Dienste starten (Listing 1).<br />
Bei der automatischen Konfiguration ist<br />
die Sicherung auf Festplatte (nach »/var/<br />
lib/bareos/storage«) voreingestellt. Bei<br />
der Sicherung auf Festplatte verhält sich<br />
Bareos genau so wie bei einer Sicherung<br />
auf eine Tape Library. Das bedeutet, dass<br />
unterhalb von »/var/lib/bareos/storage«<br />
Dateien angelegt werden, die jeweils einem<br />
Band entsprechen. Das hat den Vorteil,<br />
dass einheitliche Regeln gelten und<br />
zum Beispiel Vorhaltezeiten auf Bändern<br />
und auf Festplatten gleich gehandhabt<br />
oder für die es nur das Angebot gab, sie in<br />
die kommerzielle Version einfließen zu lassen,<br />
in einem eigenen Git-Repository weiterzupflegen.<br />
Daraus erwuchs die Entscheidung einiger<br />
ehemaliger Mitglieder der Bacula-Community,<br />
dies als eigenständigen Fork unter dem Namen<br />
Bareos weiterzuentwickeln.<br />
Das erste Stable-Release war Bareos 12.4 im<br />
April 2013, wobei die Versionsnummer für das<br />
Jahr und das Quartal des Feature Freeze steht.<br />
Die Version 13.2 ist derzeit im Beta-Stadium<br />
und soll spätestens im September 2013 veröffentlicht<br />
werden.<br />
werden. Die maximale Größe der Dateien<br />
und die maximale Anzahl wird im<br />
Director Daemon in der Pool Ressource<br />
definiert, das heißt in der Datei »/etc/<br />
bareos/bareos‐dir.conf«.<br />
Um ein solches virtuelles Band anzulegen,<br />
startet man das Programm »bconsole«,<br />
das einem mit dem Prompt »*«<br />
empfängt. Dort gibt man dann »label«,<br />
einen Namen (hier: »file1«) und danach<br />
»2« für den Pool »File« an (Listing 2).<br />
Mittels »status director« kann man sich<br />
die nächsten geplanten Jobs anzeigen<br />
lassen (Listing 3).<br />
Die Sicherungen sind in der Konfigurationsdatei<br />
auf 23:05 Uhr (BackupClient1:<br />
Dateisystem) beziehungsweise. 23:10 Uhr<br />
(BackupCatalog: Datenbank-Eigensicherung)<br />
voreingestellt.<br />
Möchte man eine Testsicherung durchführen,<br />
kann man sie mit dem Kommando<br />
»run« starten. Dann muss der Admin<br />
nur noch angeben, welchen Client er<br />
sichern möchte und schon beginnt die<br />
Sicherung. Das Ergebnis zeigt dann ein<br />
Aufruf des Kommandos »status director«<br />
an (Listing 4).<br />
E<br />
01 *label<br />
Listing 1: Dienste starten<br />
01 su postgres ‐c /usr/lib/bareos/scripts/create_bareos_<br />
database<br />
02 su postgres ‐c /usr/lib/bareos/scripts/make_bareos_<br />
tables<br />
03 su postgres ‐c /usr/lib/bareos/scripts/grant_bareos_<br />
privileges<br />
04 <br />
05 service bareos‐dir start<br />
06 service bareos‐sd start<br />
07 service bareos‐fd start<br />
Listing 2: Virtuelles Band labeln<br />
02 Automatically selected Storage: File<br />
03 Enter new Volume name: file1<br />
04 Defined Pools:<br />
05 1: Default<br />
06 2: File<br />
07 3: Scratch<br />
08 Select the Pool (1‐3): 2<br />
09 Connecting to Storage daemon File at bareos:9103 ...<br />
10 Sending label command for Volume "file1" Slot 0 ...<br />
11 3000 OK label. VolBytes=186 Volume="file1"<br />
Device="FileStorage" (/var/lib/bareos/storage)<br />
12 Catalog record for Volume "file1", Slot 0<br />
successfully created.<br />
13 Requesting to mount FileStorage ...<br />
14 3001 OK mount requested. Device="FileStorage" (/var/<br />
lib/bareos/storage)<br />
15 *<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
57
Know-how<br />
Bareos<br />
Mittels »status scheduler« kann man sich<br />
anzeigen lassen, wann Jobs geplant sind,<br />
mittels »status scheduler days=365« auch<br />
für ein ganzes Jahr im Voraus.<br />
Verbesserungen<br />
Außer bei der Installation gibt es eine<br />
Reihe weiterer Verbesserungen, die das<br />
Leben des Bareos-Administrators einfacher<br />
machen: Wer schon einmal mit<br />
Baculas Konfigurationsdateien gearbeitet<br />
hat, wird sich freuen, dass bei Bareos<br />
fast alles mit sinnvollen Default-Werten<br />
vorbelegt ist. Bareos kennt nämlich im<br />
Gegensatz zu Bacula auch Voreinstellungen<br />
für String-Werte. So muss man<br />
sich zum Beispiel keine Gedanken mehr<br />
um die Angabe von »Pid Directory« und<br />
»Working Directory« in der File-Daemon-<br />
Konfiguration auf dem Client machen.<br />
Bareos setzt sinnvolle Werte für die entsprechende<br />
Plattform, wenn es die Pakete<br />
erstellt.<br />
Bei Windows-Systemen ist es jetzt möglich,<br />
ohne großen Aufwand nicht nur ein<br />
einzelnes, sondern alle angebundenen<br />
Laufwerke zu sichern (Windows Drive<br />
Discovery). Bei Bacula ist dies nur in<br />
der kommerziellen Version möglich. Dafür<br />
wurde auch der Aufruf des Volume<br />
Shadow Copy Service (VSS) intelligenter<br />
gestaltet.<br />
Die Handhabung von Tape Libraries<br />
wurde vereinfacht. So können Bänder<br />
Listing 4: Status Director<br />
01 *status director<br />
02 ...<br />
03 Terminated Jobs:<br />
04 JobId Level Files Bytes Status Finished Name<br />
05 =====================================================<br />
06 1 Full 135 6.679 M OK 18‐Jul‐13 16:00 BackupClient1<br />
07 2 Incr 0 0 OK 18‐Jul‐13 16:01 BackupClient1<br />
08 <br />
09 ...<br />
Listing 3: Statusanzeige<br />
01 *status director<br />
02 Scheduled Jobs:<br />
03 Level Type Pri Scheduled Name Volume<br />
04 =====================================================<br />
05 Incremental Backup 10 18‐Jul‐13 23:05<br />
BackupClient1 file1<br />
06 Full Backup 11 18‐Jul‐13 23:10<br />
BackupCatalog file1<br />
07 ...<br />
jetzt innerhalb<br />
der Bconsole von<br />
Copy Job<br />
einem Slot zum<br />
anderen bewegt<br />
werden. Auch<br />
kann ein eventuell<br />
vorhandener Import-/Export-Slot<br />
bequem mit dem<br />
Kommando »import«<br />
Console<br />
Director<br />
beziehungs-<br />
Storage 1<br />
weise »export«<br />
angesprochen<br />
werden.<br />
Der Tray-Monitor<br />
(ein kleines Icon<br />
im Systembereich<br />
der Taskleiste) läuft<br />
auf Windows- und<br />
filedaemon<br />
auf Linux-Systemen.<br />
Abbildung 2: Bisher: Kopieren ist nur innerhalb eines Storage Daemons möglich.<br />
Das Blinken<br />
des Icons zeigt an, dass auf dem System<br />
gerade eine Sicherung stattfindet.<br />
Wenn ein Backup-Job doch mal fehlschlägt,<br />
ist es jetzt einfach möglich, einen<br />
Job mit genau den gleichen Parametern<br />
nochmals zu starten:<br />
festlegen. Zudem kann man sich mittels<br />
Soft-Quotas und Grace-Periode auch<br />
frühzeitig informieren lassen, wenn die<br />
Quotierung erschöpft ist.<br />
Außerdem sollte man im Blick behalten,<br />
dass bei einer Vollsicherung große Datenmengen<br />
durch das Netz zu transportieren<br />
*rerun jobid=id<br />
Der Backup-Administrator muss sicherstellen,<br />
dass alle relevanten Daten eine<br />
gewisse Zeit lang aufgehoben werden.<br />
Für steuerrelevante Daten ist eine Aufbewahrungsfrist<br />
von 10 Jahren vorgeschrieben,<br />
die man sorgfältig planen muss. Will<br />
sind. Da ist es von Vorteil, dass Bareos<br />
auch die maximal genutzte Netzwerkbandbreite<br />
pro Client einschränken kann.<br />
Hierfür dient die Direktive »Maximum<br />
Bandwidth Per Job«, die zu dem entsprechenden<br />
Client-Eintrag in »/etc/bareos/<br />
bareos‐dir.conf« hinzuzufügen ist:<br />
man die Daten nach verschiedenen Eigenschaften<br />
trennen, nutzt man in Bareos<br />
dafür Pools. Für sie lassen sich unter<br />
anderem Größen und Aufbewahrungszeiten<br />
definieren.<br />
Client {<br />
Name = client2‐fd<br />
Address = client2<br />
Password = "secret"<br />
Maximum Bandwidth Per Job = 512 k/s<br />
Komplexe Umgebungen<br />
Manchmal ist für den Administrator<br />
schwer kalkulierbar, wie groß ein<br />
Backup wird. Ein erster Ansatz, damit<br />
umzugehen, besteht darin, bestimmte<br />
Verzeichnisse und Datentypen in den die<br />
Sicherung beschreibenden Dateilisten<br />
auszuschließen. Alternativ lassen sich<br />
auch Dateien ab einer bestimmten Größe<br />
ausschließen.<br />
Dies garantiert aber nicht, dass auf einem<br />
Client nicht trotzdem große Datenmengen<br />
anfallen. Mit einer Client-Quota kann<br />
man bei Bareos daher die Gesamtmenge<br />
der zu sichernden Daten eines Clients<br />
}<br />
Als grundlegende Neuerung ist die direkte<br />
Unterstützung von NDMP (Network<br />
Data Management Protocol) hinzugekommen.<br />
NDMP ist das native Backup-<br />
Protokoll großer NAS-Geräte wie etwa<br />
von NetApp. Mit der Version 12.4 werden<br />
Vollsicherungen und Rücksicherungen<br />
unterstützt. Die Wiederherstellung von<br />
Einzeldateien ist bei Bareos noch in der<br />
Erprobungsphase.<br />
Zudem wurde ein neues Plugin zur Sicherung<br />
von Microsoft-SQL-Server-Datenbanken<br />
geschrieben. Es beherrscht<br />
neben Voll- auch inkrementelle und differenzielle<br />
Sicherungen und befindet sich<br />
ebenfalls in der Erprobungsphase.<br />
58 Ausgabe 05-2013 Admin www.admin-magazin.de
Bareos<br />
Know-how<br />
Das nächste Projekt geht die Sicherung<br />
virtueller Maschinen von VMware über<br />
die VStorage-API an. Hier wurden bereits<br />
die ersten Gehversuche unternommen.<br />
Copy-Jobs<br />
Backup-Bänder sind immer noch das<br />
Mittel der Wahl für das Sichern von Daten,<br />
aber auch Sicherungen auf Festplatte<br />
haben ihre Vorteile. Deshalb werden<br />
häufig beide Ansätze verknüpft: Üblich<br />
sind Disk-To-Disk-To-Tape-Sicherungen<br />
(D2D2T). Dabei wird zuerst auf Festplatte<br />
gesichert, danach werden die Daten über<br />
einen Migrations- oder Copy-Job auf ein<br />
Band übertragen.<br />
Vor Bareos 13.2 konnten Migrations- und<br />
Copy-Jobs nur innerhalb eines Storage<br />
Daemons durchgeführt werden (Abbildung<br />
2). Diese Einschränkung ist mit<br />
Bareos 13.2 aufgehoben – Daten lassen<br />
sich nun zwischen Storage Daemons<br />
transportieren (Abbildung 3).<br />
Damit ist es möglich, Daten beispielsweise<br />
in unterschiedlichen Brandschutzabschnitten,<br />
zu sichern. Ein entsprechender<br />
Copy-Job kann Daten periodisch<br />
auch zu einem anderen Storage Daemon<br />
kopieren. Dabei lassen sich die Eigenschaften<br />
der Daten anpassen, sodass zum<br />
Beispiel die Daten auf dem ersten Storage<br />
Daemon unkomprimiert abgelegt sind,<br />
für den zweiten aber komprimiert werden.<br />
Auch Szenarien wie Backup-to-Diskto-Cloud<br />
sind so abbildbar.<br />
Passive Clients<br />
Ein häufiges Problem bei der Einrichtung<br />
der Backup-Umgebung sind Firewalls. Bei<br />
Console<br />
Director<br />
filedaemon<br />
einem normalen Verbindungsaufbau in<br />
einer Bareos-/Bacula-Umgebung würde<br />
der Backup Director eine Verbindung<br />
zum Client aufbauen und ihm mitteilen,<br />
was und wohin er sichern soll. Außerdem<br />
verbindet er sich mit dem Backup Storage<br />
Daemon und teilt diesem mit, dass er die<br />
Daten vom Client in Empfang nehmen<br />
und speichern soll. Schließlich baut der<br />
Client die eigentliche Datenverbindung<br />
zum Storage Daemon auf und überträgt<br />
seine Daten dorthin.<br />
Wenn der Client sich hinter einer Firewall<br />
befindet, dann erschweren Paketfilter<br />
und Network Address Translation (NAT)<br />
in der Firewall eine Verbindung vom Client<br />
zum Storage Daemon oder machen<br />
diese gar unmöglich. Die problematische<br />
Verbindung ist also die eigentliche Datenverbindung<br />
zwischen Client und Storage<br />
Daemon (Abbildung 4).<br />
Ab Bareos 13.2 ist dieses Verhalten nun<br />
konfigurierbar. Mithilfe der Option »Passive<br />
Client« lassen sich alle Verbindungen<br />
von den Server-Komponenten her aufbauen.<br />
Der Client nimmt dann nur noch<br />
Verbindungen entgegen. Der Aufbau der<br />
Verbindungen zwischen Director und Client<br />
und zwischen Director und Storage<br />
Daemon bleiben wie gehabt, aber die<br />
eigentliche Datenverbindung wird nun<br />
nicht vom Client, sondern vom Storage<br />
Daemon initiiert. Nachdem die Verbindung<br />
aufgebaut wurde, werden die Daten<br />
natürlich doch vom Client zum Storage<br />
Daemon übertragen (Abbildung 5).<br />
Neben der Firewall-Freundlichkeit hat<br />
dieser Ablauf noch einen weiteren Vorteil:<br />
Da der Passive Client keinerlei Datenverbindung<br />
aufbaut, benötigt er auch<br />
keine funktionierende Namensauflösung.<br />
Copy Job<br />
Storage 1 Storage 2<br />
Abbildung 3: Neu: Kopieren ist zwischen verschiedenen Storage Daemons über das Netzwerk möglich.<br />
In der Praxis hat sich gerade die Namensauflösung<br />
beim herkömmlichen Verfahren<br />
häufig als Problem herausgestellt.<br />
Sicherheit<br />
Bareos bietet im Hinblick auf Sicherheit<br />
weiterhin die bereits aus Bacula bekannten<br />
Sicherheits-Features wie:<br />
n Prüfsummenberechnung auf jeder gesicherten<br />
Datei und Überprüfung bei<br />
der Rücksicherung,<br />
n die Möglichkeit, die Verbindungen<br />
zwischen den Daemons über TLS zu<br />
verschlüsseln.<br />
Zusätzlich wurden zu Bareos aber weitere,<br />
interessante Sicherheitsfunktionen<br />
hinzugefügt:<br />
So kann man nun bei Software-Verschlüsselung<br />
das Verschlüsselungsverfahrens<br />
wählen. Bisher konnte dabei immer nur<br />
AES128 verwendet werden. Nun kommen<br />
zusätzlich die folgenden Verfahren<br />
in Frage: AES128, AES192, AES256, CA-<br />
MELIA128, CAMELIA192, CAMELIA256,<br />
AES128HNACSHA1, AES256HNACSHA1<br />
und Blowfish.<br />
Neben den Verschlüsselungsoptionen der<br />
Software gibt es jetzt die Möglichkeit,<br />
direkt die Hardware-Verschlüsselung<br />
der LTO-Bandlaufwerke zu nutzen. Seit<br />
LTO4 ist die Verschlüsselung Teil des LTO-<br />
Standards, sodass alle Laufwerke diese<br />
Option anbieten. Die Verschlüsselung im<br />
Bandlaufwerk hat dank Hardware-Unterstützung<br />
praktisch keine Auswirkung auf<br />
die Sicherungsgeschwindigkeit.<br />
Ob man das nutzen möchte, hängt natürlich<br />
von den Anforderungen ab. Die<br />
LTO-Hardware-Verschlüsselung ist vor<br />
allem für diejenigen eine effiziente Option,<br />
die ihre Bänder auslagern und dabei<br />
vermeiden möchten, dass Unbefugte sie<br />
lesen können.<br />
Die bereits erwähnte Option Passive Client<br />
stellt ebenfalls einen Sicherheitsgewinn<br />
dar: Weil keine Verbindung zum Storage<br />
Daemon mehr notwendig ist, können die<br />
Firewalls sämtliche Verbindungen zum<br />
Sicherungsnetzwerk verhindern.<br />
Bisher war es möglich, dem Client vom<br />
Director aus beliebige Kommandos zu<br />
senden. Das waren »backup« (Ausführen<br />
einer Sicherung), »restore« (Ausführen einer<br />
Rücksicherung), »verify« (Ausführen<br />
eines Prüfjobs zum Abgleich zwischen<br />
Systemdaten und gesicherten Daten),<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
59
Know-how<br />
Bareos<br />
Kommunikation bisher:<br />
Director<br />
Kommunikation mit "Passive Client:<br />
Director<br />
Console<br />
Storage<br />
Console<br />
Storage<br />
• Zugriff ins interne Netz<br />
muss erlaubt werden<br />
• bei NAT: Portforwarding<br />
Firewall/NAT<br />
• Firewall kann alles nach<br />
Innen blocken<br />
• NAT ist auch in mehreren<br />
Stufen kein Problem<br />
Firewall/NAT<br />
• gesicherter Server muss<br />
Verbindung aufbauen dürfen<br />
• Tricks mit Namensauflösung<br />
nötig<br />
filedaemon<br />
• gesicherter Server baut keine<br />
Verbindungen auf<br />
• Namensauflösung nicht nötig<br />
filedaemon<br />
Abbildung 4: Bisher: Die Datenverbindung wird vom Client zum Storage Daemon<br />
initiiert.<br />
Abbildung 5: Passive Client: Die Datenverbindung wird vom Storage Daemon zum<br />
Client initiiert.<br />
»estimate« (Abschätzen der zu erwartenden<br />
Sicherungsdatenmenge) und<br />
»runscript« (Ausführen eines Skritpts auf<br />
dem Client-System).<br />
Nun ist es möglich, mithilfe der Direktive<br />
»Allowed JobCommand« diese Befehle<br />
auf dem Client zu filtern. Nicht erlaubte<br />
Befehle werden dann vom Client nicht<br />
akzeptiert und nicht ausgeführt.<br />
Das Ausführen von Skripten auf dem zu<br />
sichernden System stellt eine besondere<br />
Sicherheitsgefährdung dar. Falls es sich<br />
nicht über »Allowed JobCommand« komplett<br />
verbieten lässt, kann über die Option<br />
»Allowed ScriptDir« das Verzeichnis<br />
gesetzt werden, in dem sich Skripte und<br />
Befehle befinden müssen. Befehle, die<br />
sich nicht innerhalb dieses Verzeichnisses<br />
befinden, werden nicht ausgeführt.<br />
Integration<br />
Ein Backup-Client sollte sich möglichst<br />
effizient auf Client-Systeme verteilen lassen<br />
und dort pflegeleicht laufen. Dies gilt<br />
insbesondere, wenn viele verschiedene<br />
Plattformen angeschlossen sind. Deshalb<br />
arbeitet Bareos auch mit alten Client-<br />
Versionen zusammen und unterstützt<br />
Bacula-File-Daemons ab Version 2.0 (aus<br />
dem Jahr 2007).<br />
Für Univention-Corporate-Umgebungen<br />
gibt es eine Bareos-Version für das Univention<br />
App Center. Dort kann man über<br />
die UCS-Oberfläche für jeden Rechner<br />
angeben, ob er gesichert werden soll. Die<br />
Bareos-Server-Konfiguration wird daraus<br />
automatisch erstellt, die Client-Konfiguration<br />
vorbereitet.<br />
Bareos stellt auch direkt Pakete für<br />
die Open-Source-Windows-Software-<br />
Manage mentlösung OPSI zur Verfügung.<br />
Sie können auf dem OPSI-Server installiert,<br />
mit den passenden Voreinstellungen<br />
belegt und dann auf alle angeschlossenen<br />
Windows-Systeme verteilt werden. Ein<br />
Skript erstellt dann mit Hilfe der OPSI-<br />
JSON-RPC-Schnittstelle die passende<br />
Bareos-Director-Konfiguration.<br />
Für Windows bietet Bareos einen nativen<br />
Installer, der die Grundkonfiguration der<br />
Software durchführt, Passwörter setzt<br />
und sogar die Windows-Firewall öffnet.<br />
File Daemon und Tray-Monitor werden<br />
so konfiguriert, dass sie sofort zusammenarbeiten.<br />
Ein sehr gut funktionierendes System<br />
für das Desaster Recovery von Linux-<br />
Maschinen stellt das Projekt Relax And<br />
Recover (REAR) [3] bereit. Der Ansatz<br />
dieses Projektes ist zweigeteilt. Installiert<br />
auf dem zu sichernden System, erzeugt<br />
der Aufruf<br />
sudo /usr/sbin/rear ‐v mkrescue<br />
eine Rettungssystem-ISO-Datei von etwa<br />
60 MByte Größe, inklusive des laufenden<br />
Kernels, der benötigten Treibermodule,<br />
der Informationen zur Festplattenanbindung<br />
und der Netzwerkkonfiguration.<br />
In einem zweiten Schritt kann das Komplettsystem<br />
mittels<br />
sudo /usr/sbin/rear ‐v mkbackup<br />
gesichert werden, etwa auf ein freigegebenes<br />
NFS-Verzeichnis.<br />
Auf diesen zweiten Schritt kann man bei<br />
einer Sicherung mit Bareos verzichten.<br />
Stattdessen wird in das Rescue-System<br />
ein Bareos-Recovery-Modul integriert,<br />
sodass man nach dem Booten des Recovery-Systems<br />
die Option präsentiert bekommt,<br />
das System komplett zu löschen<br />
und durch das Backup zu ersetzen. Das<br />
entsprechende Bareos-Modul befindet<br />
sich gerade in der Testphase.<br />
Qualitätssicherung<br />
Die gesamte Entwicklung von Bareos findet<br />
offen auf Github [4] statt. Die Kommunikation<br />
erfolgt über Mailing-Listen.<br />
Feature Requests und Bugs können im<br />
Bug-Tracking-System [5] eingetragen<br />
werden. Details gibt es hierzu unter [6].<br />
Für die automatisierte Qualitätssicherung<br />
werden drei unterschiedliche Systeme<br />
eingesetzt:<br />
n Build-Tests auf Basis von Travis [7],<br />
n Regression-Tests auf Basis von<br />
CDASH,<br />
n Test der verschiedenen Plattformen<br />
auf Basis von Jenkins und virtuellen<br />
Maschinen.<br />
Jeder in Github durchgeführte Commit<br />
stößt automatisch einen Build-Prozess auf<br />
[https:// travis‐ci. org/ bareos/ bareos]<br />
an. Dort wird der Quellcode kompiliert,<br />
die Daemons gestartet, eine Sicherung<br />
und Rücksicherung durchgeführt. Damit<br />
wird für jeden Commit geprüft, ob Bareos<br />
danach noch grundsätzlich funktionstüchtig<br />
ist.<br />
Weitergehende Tests werden auf einem<br />
auf CDASH basierenden Regression-Testsystem<br />
unter [8] durchgeführt. Gegenwärtig<br />
existieren etwa 130 unterschied-<br />
60 Ausgabe 05-2013 Admin www.admin-magazin.de
liche Tests, die jeweils bestimmte Funktionen<br />
in Bareos überprüfen.<br />
Der Entwicklungs-Workflow bei Bareos<br />
sieht vor, dass ein Ticket erst geschlossen<br />
werden soll, wenn für eine neue Eigenschaft<br />
auch ein Regression-Test erstellt<br />
wurde. Das wird dann im Ticket vermerkt.<br />
Ein neues Release wird erst erstellt,<br />
wenn die für Bareos mittels eines Open-<br />
Build-Servers gebauten Pakete zusätzlich<br />
einen auf Jenkins basierenden Test erfolgreich<br />
durchlaufen haben. Bei diesem<br />
Test werden die Pakete für die verschiedenen<br />
Plattformen auf entsprechenden<br />
virtuellen Maschinen getestet. Auf jeder<br />
Plattform werden automatisiert die Paketinstallation<br />
sowie Datensicherung und<br />
Rücksicherung überprüft.<br />
Auch die Windows-Pakete werden mithilfe<br />
des OBS und Cross-Kompilierung<br />
erstellt. Als Ergebnis entstehen dann<br />
auch die Windows-Installer und die<br />
OPSI-Pakete.<br />
Zukunft<br />
Der bis jetzt beschrittene Weg hat dem<br />
Bareos-Projekt viel Zuspruch eingebracht.<br />
Die Entscheidung, sich zum Projektstart<br />
erst einmal die Infrastruktur für eine<br />
weitgehende Automatisierung der Paket-<br />
Erzeugung und die Tests aufzubauen, hat<br />
sich bewährt.<br />
Weitere Plattformen können nun mit wenig<br />
Aufwand hinzugefügt werden, mit<br />
der Gewissheit, dass Probleme dank der<br />
kontinuierlichen Tests sehr schnell erkannt<br />
werden.<br />
Ebenfalls positiv aufgenommen wurde<br />
die Tatsache, das Bareos vollständig<br />
offen entwickelt wird. Auch wenn es<br />
kommerzielle Angebote für Subscription<br />
und Support von der Bareos GmbH & Co<br />
KG gibt, werden alle Ergänzungen und<br />
neuen Features in dem einen, offenen<br />
Github-Projekt entwickelt.<br />
Bei den weiteren Entwicklungen soll der<br />
bisherige Kurs fortgesetzt werden:<br />
n einfacher Einstieg, bessere Bedienbarkeit<br />
für Administratoren,<br />
n Integration in weitere Projekte/Distributionen,<br />
n Funktionserweiterungen.<br />
Der Einstieg soll demnächst durch eine<br />
weiter verbesserte Default-Konfiguration<br />
erleichtert werden. Zusätzlich werden<br />
OSBConf<br />
Am 25.9.2013 findet die Open Source Backup<br />
Conference (vormals Bacula Conference) [9]<br />
wie jeden Herbst in Köln statt. Das Bareos-<br />
Projekt nutzt diese Gelegenheit, um sich einem<br />
interessierten Fachpublikum vorzustellen<br />
und mit den Teilnehmern zu diskutieren.<br />
Whitepaper bestimmte Themen besser<br />
beleuchten.<br />
Ein Teilprojekt beschäftig sich mit der<br />
Entwicklung einer Konfigurations-API.<br />
Damit soll erreicht werden, dass sich bestimmte<br />
Konfigurationsänderungen problemfrei<br />
zur Laufzeit durchführen lassen,<br />
zum Beispiel das Hinzufügen eines Clients.<br />
Das können dann auch Frontends<br />
wie Webacula nutzen, um ihren Funktionsumfang<br />
mit einfachen Mitteln zu<br />
erweitern. (jcb)<br />
n<br />
Infos<br />
[1] Bareos: [http:// download. bareos. org]<br />
[2] OPSI: [http:// www. opsi. org]<br />
[3] Relax and Recover: [http://<br />
relax‐and‐recover. org]<br />
[4] Bareos auf Github: [https:// github. com/<br />
bareos]<br />
[5] Bug-Tracking-System: [https:// bugs. bareos.<br />
org]<br />
[6] Mitmachen: [http:// www. bareos. org/<br />
howto‐contribute. html]<br />
[7] Build-Tests: [https:// travis‐ci. org]<br />
[8] Regression-Tests: [http:// regress. bareos.<br />
org/ index. php? project=bareos]<br />
[9] OSBConf: [http:// osbconf. org]<br />
Die Autoren<br />
Jörg Steffens beschäftigt sich seit 1995 mit Linux,<br />
unter anderem als Berater bei der SUSE Linux<br />
AG und seit 2004 als Geschäftsführer des Open-<br />
Source-Beratungsunternehmen »dass IT GmbH«<br />
aus Köln. 2012 hat er mit anderen langjährigen<br />
Bacula-Nutzern das Bareos-Projekt initiiert und<br />
die Bareos GmbH & Co KG gegründet.<br />
Philipp Storz beschäftigt sich sein 1998 mit Linux<br />
und seit 2007 mit Bacula. Seit 2001 beschäftigt<br />
er sich professionell mit Linux und arbeitet als<br />
Consultant zunächst bei der SUSE Linux AG und<br />
seit 2004 als Mitgründer bei der dass IT GmbH<br />
in Köln. Sein Buch zu Bacula ist 2012 bei Open<br />
Source Press erschienen. Seit der Gründung des<br />
Bareos-Projekts und der gleichnamigen Firma<br />
treibt er gemeinsam mit Marco van Wieringen<br />
die technische Entwicklung von Bareos voran.<br />
www.admin-magazin.de<br />
Ausgabe 05-2013<br />
61
Know-How<br />
Exchange-Rechte<br />
© Marek Uliasz, 123RF<br />
Exchange-Rechteverwaltung in der Praxis<br />
Alles, was recht ist<br />
Exchange Server 2013 bietet eine umfangreiche Rechteverwaltung nach einem Rollenmodell. Verwalten lassen<br />
sich Rechte und Rollen in der Exchange-Konsole, der Powershell oder mit Zusatztools. Dieser Artikel führt alle<br />
drei Möglichkeiten vor. Thomas Joos<br />
Mit Exchange 2013 hat Microsoft seinen<br />
Messaging-Server auf ein rollenbasiertes<br />
Rechtemodell (RBAC) umgestellt. Unter<br />
anderem vereinfacht das für den Windows-Administrator<br />
die Verwaltung der<br />
Benutzerrechte.<br />
Es gibt zwei Typen von Rollen, die Sie zuweisen<br />
können: Administratorrollen und<br />
Endbenutzerrollen. Administratorrollen<br />
umfassen Berechtigungen, die Administratoren<br />
zur Verwaltung eines bestimmten<br />
Bereichs der Exchange-Organisation<br />
zugewiesen werden können. Wenn ein<br />
Benutzer Mitglied mehrerer Rollengruppen<br />
ist, erteilt Exchange ihm die Berechtigungen<br />
dieser Gruppen.<br />
Endbenutzerrollen beginnen mit dem<br />
Präfix »My«. Beispielsweise dürfen Mitglieder<br />
der Benutzerrolle »MyDistributionGroups«<br />
eigene Verteilergruppen<br />
anlegen und eigene Gruppen löschen.<br />
Das ist in Unternehmen nicht immer<br />
gewünscht. Mit der Steuerung der Berechtigungen<br />
können Sie diese Rechte<br />
normalen Anwendern entziehen. Der einfachste<br />
Weg dazu ist, wenn Sie auf Basis<br />
der vorhandenen Benutzerrolle »MyDistributionGroup«<br />
eine neue Rolle erstellen,<br />
ihr die entsprechenden Rechte entziehen<br />
und sie den Anwendern zuweisen.<br />
Sie können eine vorhandene Rollengruppe<br />
kopieren und ändern, unabhängig<br />
davon, ob es sich um eine Administratorrolle<br />
oder eine Endbenutzerrolle handelt,<br />
ohne dass sich das auf die ursprüngliche<br />
Rollengruppe auswirkt. Wenn Sie die<br />
Rollengruppe kopieren, legen Sie einen<br />
neuen Namen fest, fügen optional Rollen<br />
zur neuen Rollengruppe hinzu oder<br />
entfernen sie. Vorhandene Rollengruppen<br />
können ebenfalls geändert werden.<br />
Sie können Rollen vorhandenen Rollengruppen<br />
hinzufügen oder sie aus diesen<br />
Gruppen entfernen und gleichzeitig Mitglieder<br />
hinzufügen oder entfernen. Für<br />
die Standardgruppen bietet es sich aber<br />
an, Kopien zu erstellen, bevor Sie die<br />
Gruppen ändern.<br />
In Exchange Server 2013 finden Sie die<br />
Verwaltungsrollengruppen im Bereich<br />
»Berechtigungen«. Mit dem Commandlet<br />
»Get‐RoleGroup« lassen sich die verschiedenen<br />
Gruppen auch in der Verwaltungsshell<br />
anzeigen. »Get‐RoleGroupMember«<br />
zeigt die Mitglieder einer Gruppe an,<br />
zum Beispiel »Get‐RoleGroupMember<br />
"Organization Management"«. Um einen<br />
Benutzer in eine Gruppe aufzunehmen,<br />
verwenden Sie die Exchange-Verwaltungskonsole<br />
(Abbildung 1) oder die<br />
Exchange-Verwaltungsshell:<br />
Add‐RoleGroupMember VerwaltungsrollengruppeU<br />
‐Member Benutzerpostfach<br />
Um Mitglieder aus einer Verwaltungsrollengruppe<br />
zu entfernen, greifen Sie auch<br />
auf die Exchange-Verwaltungskonsole<br />
zurück oder geben in der Exchange-Verwaltungsshell<br />
den Befehl »Remove‐Role-<br />
GroupMember Verwaltungsrollengruppe<br />
‐Member Benutzerpostfach« ein.<br />
Klicken Sie in der Exchange-Verwaltungskonsole<br />
auf eine Gruppe, sehen Sie<br />
im rechten Bereich, welche Rechte die<br />
Gruppe hat und welche Mitglieder ihr<br />
zugeordnet sind. Um einen Benutzer in<br />
eine Gruppe aufzunehmen, klicken Sie<br />
doppelt auf die Gruppe. Anschließend<br />
können Sie bei »Mitglieder« neue Benutzer<br />
hinzufügen oder entfernen.<br />
Verwaltungsrollen fassen Commandlets<br />
zusammen, die zum Verwalten von<br />
Exchange-Komponenten dienen (Abbildung<br />
2). Benutzer, die Mitglieder einer<br />
Verwaltungsrollengruppe sind, erhalten<br />
das Recht, die Commandlets zu nutzen,<br />
die in den Verwaltungsrollen hinterlegt<br />
sind, welche wiederum Bestandteil der<br />
Verwaltungsrollengruppen sind.<br />
Pflege von Verwaltungsrollengruppen<br />
delegieren<br />
Stellvertreter von Verwaltungsrollengruppen<br />
können Mitglieder zu Verwaltungsrollengruppen<br />
hinzufügen oder daraus<br />
entfernen und Eigenschaften einer Rollengruppe<br />
anpassen, haben aber selbst<br />
keine Rechte, die Funktionen der Verwal-<br />
62 Ausgabe 05-2013 Admin www.admin-magazin.de
Exchange-Rechte<br />
Know-How<br />
den Sie den Befehl »Get‐RoleGroup |fl<br />
Managedby«.<br />
Neben den Standardgruppen können Sie<br />
auch selbst Verwaltungsrollengruppen<br />
erstellen und ihnen Benutzer zuordnen.<br />
Neue Verwaltungsrollengruppen erstellen<br />
Sie mit dem Commandlet »New‐Role-<br />
Group«. Ein Beispiel zeigt Listing 1.<br />
Bestehende Rollengruppen können Sie<br />
kopieren, wenn Sie selbst Rollengruppen<br />
erstellen wollen, die zum Beispiel eingeschränkte<br />
Rechte nutzen. Dazu verwenden<br />
Sie am besten auch die Exchange-<br />
Verwaltungsshell zum Kopieren. Im ersten<br />
Schritt speichern Sie die Rollengruppe<br />
in einer Variablen:<br />
Abbildung 1: Die verschiedenen Verwaltungsgruppen steuern Sie in der Exchange-Verwaltungskonsole von<br />
Exchange Server 2013 im Bereich »Berechtigungen«.<br />
rollengruppe« die Einstellungen der<br />
Rollengruppe in einer Variablen.<br />
n Sie fügen den Stellvertreter zu der<br />
Rollengruppe hinzu, die Sie als Variable<br />
gespeichert haben: »$RoleGroup.<br />
ManagedBy += (Get‐User Postfach,<br />
das Sie hinzufügen wollen).Identity«.<br />
Wollen Sie eine universelle Gruppe<br />
hinzufügen, verwenden Sie das Commandlet<br />
»Get‐Group«.<br />
n Wiederholen Sie den obigen Befehl<br />
für jeden Stellvertreter, den Sie hinzufügen<br />
wollen.<br />
n Die Liste in der Variablen müssen Sie<br />
noch in die echte Verwaltungsrollengruppe<br />
hinzufügen: »Set‐RoleGroup<br />
Verwaltungsrollengruppe ‐ManagedBy<br />
$RoleGroup.ManagedBy«.<br />
Um die Anwender anzuzeigen, welche<br />
die Gruppe verwalten dürfen, verwentungsrollengruppe<br />
zu nutzen. Die Konfiguration<br />
des Stellvertreters erfolgt durch<br />
die Option »ManagedBy« für die Commandlets<br />
»Set‐RoleGroup« oder »New‐RoleGroup«.<br />
Sollen die Benutzer auch die<br />
Rechte der Gruppe erhalten, müssen Sie<br />
diese als Mitglieder der Rollengruppe aufnehmen.<br />
Die Option »ManagedBy« für<br />
das Commandlet »Set‐RoleGroup« überschreibt<br />
immer die gesamte Stellvertreterliste<br />
für eine Rollengruppe.<br />
Wollen Sie einzelne Stellvertreter zu einer<br />
Rollengruppe hinzufügen, ohne die gesamte<br />
Stellvertreterliste zu löschen, müssen<br />
Sie vorhandene Mitglieder speichern,<br />
das neue Mitglied hinzufügen und dann<br />
die Liste wieder speichern. Gehen Sie<br />
folgendermaßen vor (Abbildung 3):<br />
n Sie speichern mit dem Befehl: »$Role-<br />
Group = Get‐RoleGroup Verwaltungs-<br />
$RoleGroup = Get‐RoleGroup U<br />
Gruppe, die Sie kopieren wollen<br />
Verwenden Sie die folgende Syntax, um<br />
eine neue Rollengruppe zu erstellen, der<br />
Rollengruppe Mitglieder hinzuzufügen<br />
und anzugeben, wer die neue Rollengruppe<br />
an andere Benutzer delegieren<br />
kann:<br />
New‐RoleGroup Name ‐Roles U<br />
$RoleGroup.Roles‐Members Mitglied1,...U<br />
‐ManagedBy User1,User2,...<br />
Wollen Sie zum Beispiel die Rollengruppe<br />
»Organization Management« kopieren,<br />
um eine neue Gruppe zu erstellen, die<br />
weniger Rechte hat, verwenden Sie folgende<br />
Befehle:<br />
$RoleGroup = Get‐RoleGroup "Management"<br />
New‐RoleGroup "Limited Management" ‐Roles U<br />
$RoleGroup.Roles ‐Members Thomas, Michael, U<br />
Hans ‐ManagedBy Jean, Fritz<br />
RBAC-Manager<br />
Abbildung 2: Verwaltungsrollengruppen verwalten Sie mit einfachen Commandlets auch in der Exchange-<br />
Verwaltungsshell.<br />
Wer es bei der Verwaltung etwas komfortabler<br />
haben möchte, verwendet den<br />
RBAC-Manager [1]. Er benötigt keine Installation,<br />
sondern besteht nur aus einer<br />
Exe-Datei und einer XML-Steuerungsdatei.<br />
Sind die Exchange-Verwaltungstools<br />
auf einer Arbeitsstation installiert, können<br />
Sie den RBAC-Manager auch von<br />
einer Arbeitsstation aus nutzen (Abbildung<br />
4). Das Tool ermöglicht die Steuerung<br />
der Verwaltungsrollen, der Zuweisungsrichtlinien<br />
und der Verwaltungsrollengruppen.<br />
Sobald das Programm gestartet ist, geben<br />
Sie den Namen des Servers ein, mit dem<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
63
Know-How<br />
Exchange-Rechte<br />
Abbildung 3: Mit Hilfe der Powershell lässt sich die Rollenmitgliedschaft zuweisen und die Zuordnung zu einer<br />
Verwaltungsrollengruppe ändern.<br />
Sie sich verbinden wollen, sowie die Anmeldeinformationen.<br />
Anschließend verbindet<br />
sich der RBAC-Manager mit der<br />
Exchange-Organisation und verwendet<br />
die Rechte des angemeldeten Benutzers.<br />
Sie müssen dazu auf dem Server aber das<br />
.NET-Framework 3.5 installieren. In Windows<br />
Server 2012 verwenden Sie dazu<br />
den Server-Manager. Im oberen Bereich<br />
schalten Sie zwischen der Verwaltung<br />
von Verwaltungsrollen (Management Roles),<br />
Zuweisungsrichtlinien (Assignment<br />
Policies), Verwaltungsrollengruppen<br />
(Role Groups) und Verwaltungsbereichen<br />
(Management Scopes) um.<br />
Über »Role Groups« steuern Sie die Mitglieder<br />
und die Verwaltungsrollen sowie<br />
die Rollenzuweisungen. Hier lassen sich<br />
eigene Rollengruppen erstellen oder vorhandene<br />
anpassen. Änderungen speichert<br />
der RBAC-Manager in einer Protokolldatei,<br />
die sich über den Bereich »Tools«<br />
öffnen lässt. In der Protokolldatei ist das<br />
Powershell-Commandlet zu sehen, mit<br />
dem der RBAC-Manager die Konfigurationsaufgabe<br />
abgearbeitet hat.<br />
Überwachen der Verwaltung<br />
von Rollengruppen<br />
Sie können sich in der Exchange-Verwaltungskonsole<br />
auch anzeigen lassen,<br />
wer Änderungen an den Berechtigungen<br />
vornimmt, also anderen Benutzern Administratorrechte<br />
zuteilt:<br />
n Klicken Sie auf »Verwaltung der Richtlinientreue<br />
| Überwachung | Administrator<br />
Rollengruppenbericht ausführen«.<br />
n Wählen Sie die Rollengruppe aus, die<br />
Sie überwachen wollen.<br />
n Klicken Sie auf »Suchen«. Im Fenster<br />
sehen Sie jetzt alle durchgeführten<br />
Änderungen.<br />
In der Exchange-Verwaltungsshell können<br />
Sie die Administratoren und deren<br />
Berechtigungen anzeigen. Mit der Option<br />
»GetEffectiveUsers« des Commandlets<br />
»Get‐ManagementRoleAssignment« zeigen<br />
Sie die Rechte an:<br />
Get‐ManagementRoleAssignment ‐Role U<br />
Verwaltungsrolle ‐GetEffectiveUsers<br />
Wollen Sie nur einen bestimmten Benutzer<br />
anzeigen, verwenden Sie den folgenden<br />
Aufruf:<br />
Get‐ManagementRoleAssignment ‐Role U<br />
Verwaltungsrolle ‐GetEffectiveUsers U<br />
| Where { $_.EffectiveUserName ‐Eq U<br />
"Benutzername" }<br />
Wollen Sie alle Verwaltungsrollen eines<br />
Benutzers anzeigen, verwenden Sie:<br />
Get‐ManagementRoleAssignment U<br />
‐GetEffectiveUsers | Where { $_.U<br />
EffectiveUserName ‐Eq "Benutzername" }<br />
Endbenutzerrollen<br />
Neben den Administratorrollen zur Verwaltung<br />
der Exchange-Server können<br />
Sie in Exchange auch die Rechte von<br />
Benutzern für ihr eigenes Postfach und<br />
Verteilergruppen steuern. Mit Rollenzuweisungsrichtlinien<br />
können Sie steuern,<br />
welche Konfigurationseinstellungen Benutzer<br />
für Postfächer und Verteilergruppen<br />
ändern können.<br />
Wollen Sie alle Postfächer anzeigen, denen<br />
eine bestimmte Zuweisungsrichtlinie<br />
zugeordnet<br />
ist, verwenden Sie<br />
das Commandlet<br />
»Get‐Mailbox« und<br />
geben das Ergebnis<br />
an das Commandlet<br />
»Where«<br />
weiter:<br />
Get‐Mailbox | Where U<br />
{ $_.RoleAssignmentU<br />
Policy ‐Eq "ZuweiU<br />
sungsrichtlinie"}<br />
Sie können die Zulassungsrichtlinie,<br />
die einem Benutzerkonto zugewiesen ist,<br />
auch in den Eigenschaften des Benutzerkontos<br />
in der Exchange-Verwaltungskonsole<br />
anzeigen und die Zuweisung ändern.<br />
Rufen Sie dazu das Menü »Postfachfunktionen«<br />
auf. Mit dem folgenden Befehl<br />
ändern sie die Standard-Zuweisungsrichtlinie,<br />
die Exchange neuen Postfächern<br />
automatisch zuordnet:<br />
Set‐RoleAssignmentPolicy U<br />
Zuweisungsrichtlinie ‐IsDefault<br />
Neuen Postfächern weist Exchange immer<br />
die standardmäßige Zuweisungsrichtlinie<br />
zu, auch dann, wenn sie keine<br />
Verwaltungsrollen enthält. Ein Postfach<br />
kann nur eine Rollenzuweisungsrichtlinie<br />
verwenden. Wollen Sie bestimmten<br />
Benutzern andere Rechte zuweisen, müssen<br />
Sie für diese Postfächer eine eigene<br />
Rollenzuweisungsrichtlinie erstellen und<br />
diese vergeben. Nachdem Sie im Bereich<br />
»Berechtigungen | Benutzerrollen« eine<br />
neue Rollenzuweisungsrichtlinie erstellt<br />
haben, ordnen Sie ihr die gewünschten<br />
Verwaltungsrollen zu. Anschließend weisen<br />
Sie die Rollenzuweisungsrichtlinie<br />
den gewünschten Postfächern zu. Wollen<br />
Sie die Richtlinie für alle Postfächer ändern,<br />
denen eine bestimmte Zuweisungsrichtlinie<br />
zugewiesen ist, verwenden Sie<br />
folgenden Befehl:<br />
Get‐Mailbox | Where { $_.RoleAssignmentU<br />
Policy ‐Eq "Alte Zuweisungsrichtlinie" } |U<br />
Set‐Mailbox ‐RoleAssignmentPolicy Neue<br />
Richtlinie<br />
Verwenden Sie am Ende des Befehls die<br />
Option »WhatIf«, können Sie sich anzeigen<br />
lassen, was der Befehl machen<br />
würde, ohne die Änderungen tatsächlich<br />
auszuführen.<br />
Abbildung 4: Mit dem RBAC-Manager verwalten Sie die Rollengruppen in Exchange.<br />
64 Ausgabe 05-2013 Admin www.admin-magazin.de
Exchange-Rechte<br />
Know-How<br />
Die Verwaltungsrollengruppe »MyDistributionGroup«<br />
darf in Exchange Server<br />
2010/2013 nicht nur Mitglieder bestimmter<br />
Verteilergruppen hinzufügen oder entfernen,<br />
sondern auch Verteilergruppen<br />
selbst entfernen und erstellen. Solche<br />
Vorgänge wollen Administratoren aber<br />
möglichst verhindern. Es reicht oft aus,<br />
wenn bestimmte Anwender die Mitgliedschaften<br />
steuern dürfen. Welche Rechte<br />
die Benutzerrollengruppe »MyDistributionGroups«<br />
hat, sehen Sie auch in der<br />
Exchange-Verwaltungsshell, wenn Sie<br />
den Befehl »Get‐ManagementRoleEntry<br />
‐Identity MyDistributionGroups\*« eingeben.<br />
Einfacher geht das, wenn Sie den<br />
RBAC-Manager nutzen.<br />
Verwaltungsrollengruppen<br />
Die Einstellungen vorhandener Verwaltungsrollengruppen<br />
sollten Sie nicht anpassen.<br />
Besser ist es, wenn Sie eine neue<br />
Verwaltungsrollengruppe erstellen und<br />
ihr die entsprechenden Mitglieder und<br />
Rechte zuweisen. In der Exchange-Verwaltungsshell<br />
verwenden Sie als Beispiel<br />
für die Verwaltung von Verteilergruppen<br />
zum Beispiel den Befehl:<br />
New‐ManagementRole ‐Parent "MyDistributionU<br />
Groups" ‐Name Contoso‐MyDistributionGroups<br />
Sie erstellen so eine neue Gruppe und<br />
weisen ihr die Rechte der übergeordneten<br />
Gruppe hinzu. Im RBAC-Manager klicken<br />
Sie die entsprechende Gruppe mit der<br />
rechten Maustaste an und wählen »New<br />
Role from Here«. Anschließend geben<br />
Sie einen Namen ein. Sie können für<br />
die neue Gruppe jetzt Rechte anpassen,<br />
indem Sie die Haken bei den Rechten<br />
der übergeordneten Rollengruppe aus der<br />
untergeordneten Gruppe entfernen.<br />
Listing 1: Neue Verwaltungsrollengruppe<br />
Sie können die Rechte dafür auch in der<br />
Exchange-Verwaltungsshell steuern. Wollen<br />
Sie zum Beispiel verhindern, dass<br />
die Anwender zukünftig Verteilergruppen<br />
anlegen und löschen dürfen, verwenden<br />
Sie die beiden Befehle:<br />
Get‐ManagementRoleEntry ‐Identity "Contoso‐U<br />
MyDistributionGroups\New‐DistributionGroup" | U<br />
Remove‐ManagementRoleEntry<br />
und<br />
Get‐ManagementRoleEntry ‐Identity "Contoso‐U<br />
MyDistributionGroups\Remove‐DistributionGroup"| U<br />
Remove‐ManagementRoleEntry<br />
Haben Sie die Rechte konfiguriert, können<br />
Sie sie in der Exchange-Systemsteuerung<br />
über die Zuweisungsrollenrichtlinie<br />
den Anwendern zuweisen. In Exchange<br />
01 New‐RoleGroup ‐Name "Contoso Recipient Management" ‐Roles "Mail Recipients", "Distribution Groups",<br />
"Move Mailboxes", "UM Mailboxes", "Reset Password" ‐CustomRecipientWriteScope "Contoso Users",<br />
‐ManagedBy "Thomas", "Tami", "Fynn" ‐Members "Stefan", "Marc", "Marco", "Hans", "Michael"<br />
Anzeige<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
65
Know-How<br />
Exchange-Rechte<br />
Abbildung 5: Erstellen einer neuen Gruppenbenennungsrichtlinie.<br />
Abbildung 6: Konfigurieren der Gruppenmitgliedschaften einer Verteilerliste.<br />
Server 2013 verwenden Sie dazu die Exchange-Verwaltungskonsole<br />
und den Bereich<br />
»Berechtigungen | Benutzerrollen«.<br />
In den Eigenschaften der »Default Role<br />
Assignment Policy« weisen Sie die neu<br />
erstellte Verwaltungsrollengruppe hinzu<br />
und bestätigen die Änderung. Haben Sie<br />
eine Rollengruppe kopiert, entfernen Sie<br />
den Haken für die bereits zugewiesene<br />
und setzen den Haken bei der von Ihnen<br />
erstellten Richtlinie, sodass die Anwender<br />
nur die neuen Rechte erhalten.<br />
Anschließend wird darüber allen Anwendern<br />
mit dieser Richtlinie die Verwaltungsrollengruppe<br />
zugewiesen. Sie<br />
können für den Vorgang aber auch den<br />
RBAC-Manager verwenden. Dazu klicken<br />
Sie auf die Schaltfläche »Show Assignment<br />
Policies«, wählen die »Default Role<br />
Assignment Policy« aus und weisen die<br />
von Ihnen erstellte Verwaltungsrollengruppe<br />
zu.<br />
Durch die Zuordnung zur Richtlinie werden<br />
den entsprechenden Benutzern die<br />
Rechte erteilt, die Sie der Verwaltungsrollengruppe<br />
zugewiesen haben. Welche<br />
Richtlinie einem Benutzer zugewiesen<br />
ist, sehen Sie wiederum in den Einstellungen<br />
des entsprechenden Postfachs.<br />
In Exchange Server 2013 finden Sie die<br />
Einstellung über Empfänger und dann<br />
über das Menü »Postfachfunktionen«.<br />
Nehmen Sie größere Änderungen vor, ist<br />
es sinnvoll, den Exchange-Server neu zu<br />
starten.<br />
Eine Benennungsrichtlinie für Gruppen<br />
ermöglicht das Standardisieren von Verteilergruppen,<br />
die von Benutzern und<br />
anderen Administratoren in der Organisation<br />
erstellt werden. Sie können<br />
festlegen, dass dem Namen von neuen<br />
Verteilergruppen bei der Erstellung ein<br />
bestimmtes Präfix und Suffix hinzugefügt<br />
werden muss. Außerdem können<br />
Sie die Verwendung bestimmter Wörter<br />
verbieten.<br />
Ignorierte Richtlinien<br />
Gruppenbenennungsrichtlinien werden<br />
nur auf Gruppen angewendet, die von<br />
Benutzern erstellt werden. Wenn Sie oder<br />
andere Administratoren mit der Exchange-<br />
Verwaltungskonsole Verteilergruppen erstellen,<br />
wird die Gruppenbenennungsrichtlinie<br />
ignoriert. Sie erstellen Gruppenbenennungsrichtlinien<br />
am besten in der<br />
Exchange-Verwaltungskonsole:<br />
n Wählen Sie in der Exchange-Verwaltungskonsole<br />
»Gruppen | Mehr ... |<br />
Gruppenbenennungsrichtlinie konfigurieren«.<br />
n Konfigurieren Sie unter »Gruppenbenennungsrichtlinie«<br />
das Präfix, indem<br />
Sie im Pulldown-Menü entweder »Attribut«<br />
oder »Text« auswählen (Abbildung<br />
5). Geben Sie die gewünschte<br />
Textzeichenfolge ein und klicken Sie<br />
anschließend auf »OK«. Die eingegebene<br />
Textzeichenfolge oder das ausgewählte<br />
Attribut wird als Link dargestellt.<br />
Klicken Sie auf den Link, um<br />
die Textzeichenfolge oder das Attribut<br />
zu ändern.<br />
n Klicken Sie auf »Hinzufügen«, um weitere<br />
Präfixe hinzuzufügen.<br />
Sie können die erstellten Richtlinien auch<br />
in der Exchange-Verwaltungsshell anzeigen.<br />
Verwenden Sie dazu den Befehl<br />
»Get‐OrganizationConfig | fl Distribution-<br />
GroupNamingPolicy«. Führen Sie folgenden<br />
Befehl aus, um eine Gruppenbenennungsrichtlinie<br />
außer Kraft zu setzen:<br />
New‐DistributionGroup ‐Name GruppeU<br />
‐IgnoreNamingPolicy<br />
Gruppenmitgliedschaften<br />
Über die Seite »Mitgliedschaftsgenehmigung«<br />
in den Eigenschaften von Verteilergruppen<br />
steuern Sie, ob für den Beitritt<br />
zur Gruppe eine Genehmigung des Besitzers<br />
erforderlich ist. Hier stehen Ihnen<br />
verschiedene Möglichkeiten zur Konfiguration<br />
zur Verfügung (Abbildung 6).<br />
Empfänger können aber Verteilerlisten<br />
nicht nur beitreten, sondern selbst auch<br />
aus Gruppen austreten. Auch hierzu verwenden<br />
Sie die »Outlook Web App« und<br />
dann »Optionen | Gruppen«.<br />
Wie man sieht, gibt es in Exchange viele<br />
Möglichkeiten, Rechte zu delegieren und<br />
Bereiche wie die Verteilergruppen so zu<br />
konfigurieren, dass sich diese nach der<br />
Einrichtung selbst pflegen. Mit etwas<br />
Mühe und der Anpassung der Berechtigungen<br />
können Administratoren im laufenden<br />
Betrieb viel Zeit sparen. (ofr) n<br />
Infos<br />
[1] RBAC-Manager: [http:// rbac. codeplex. com]<br />
Der Autor<br />
Thomas Joos ist freiberuflicher IT-Consultant und<br />
seit über 20 Jahren in der IT tätig. Neben seinen<br />
Projekten schreibt er praxisnahe Fachbücher<br />
und Fachartikel rund um Windows und andere<br />
Microsoft-Themen. Online trifft man ihn unter<br />
[http:// thomasjoos. spaces. live. com].<br />
66 Ausgabe 05-2013 Admin www.admin-magazin.de
Netzwerk<br />
Floodlight<br />
© aurielaki, 123RF<br />
Open-Source-Netzwerkzukunft: Der Floodlight-OpenFlow-Controller<br />
Leitstandstechnik<br />
Die Schlagworte Netzwerkvirtualisierung und Software Defined Networking (SDN) markieren einen Paradigmenwechsel<br />
im Bereich der Kommunikationsnetze. Der Weg führt zu einem ganzheitlichen Netzwerkkonzept, für das<br />
mit Floodlight eine vielversprechende Open-Source-Software zur Verfügung steht. Dr. Michael Bredel<br />
Heutige Kommunikationsnetze basieren<br />
in weiten Teilen auf den einfachen,<br />
ursprünglichen Mechanismen von Ethernet<br />
und TCP/IP. Durch dessen Erfolg und<br />
das dadurch bedingte enorme Wachstum<br />
der Netze wurden jedoch immer<br />
komplexere Kontrollmöglichkeiten wie<br />
VLANs, ACLs, Firewalls und Deep Packet<br />
Inspection notwendig. Dabei implementiert<br />
eine Vielzahl von heterogenen<br />
Netzwerk-Appliances (Firewalls, Load<br />
Balancer, IDS, Optimierer und so weiter<br />
– kurz sogenannte Middleboxes) jeweils<br />
ihren eigenen proprietären Kontroll-Stack<br />
sowie ein zumeist herstellerabhängiges<br />
Management-Interface in Form eines<br />
CLI, einer Weboberfläche oder eines<br />
Management-Protokolls. Die Kommunikation<br />
untereinander erfolgt dezentral<br />
über immer komplexere Protokolle wie<br />
Spanning Tree, Shortest Path Bridging,<br />
Border Gateway oder ähnliches.<br />
Jede zusätzliche Komponente erhöht somit<br />
die Komplexität und erschwert ein<br />
integriertes Netzwerkmanagement. Die<br />
Folgen sind häufig eine geringe Netzauslastung,<br />
schlechte Verwaltbarkeit,<br />
mangelnde Kontrollmöglichkeiten in<br />
netzübergreifenden Konfigurationen und<br />
ein Vendor-Lock-in.<br />
Ausweg OpenFlow<br />
Einen Ausweg aus diesem Dilemma versprechen<br />
Software Defined Networks<br />
(SDNs) und OpenFlow. OpenFlow ist ein<br />
von der Open Networking Foundation<br />
(ONF) standardisiertes Protokoll, das die<br />
komplexen Details einer schnellen und<br />
effizienten Switching-Architektur abstrahiert<br />
und einem externen Controller<br />
direkt zur Verfügung stellt. Mit Open-<br />
Flow steht heute für Netzwerkkomponenten<br />
eine offene Kontrollschnittstelle<br />
zur Verfügung, die mittlerweile von allen<br />
namhaften Herstellern hardwareseitig implementiert<br />
wird. Darüber hinaus gibt es<br />
einige Implementierungen in Form von<br />
Software-Switches, die den Einsatz in<br />
virtualisierten Rechenzentren erlauben.<br />
OpenFlow ermöglicht auch die im Konzept<br />
von Software Defined Networking<br />
geforderte Trennung von Daten- und<br />
Kontrollpfad. Das macht eine Netzwerkarchitektur<br />
möglich, in der eine zentrale<br />
Kontrollinstanz – der SDN-Controller<br />
– eine Vielzahl von OpenFlow-fähigen<br />
Netzwerkkomponenten steuert und eine<br />
netzwerkweite Sichtweise etwa auf Datenflüsse,<br />
Kontroll- und Sicherheitsinformationen<br />
wie VLANs oder ACLs besitzt.<br />
Der SDN-Controller selbst kann aus<br />
Gründen der Ausfallsicherheit oder zum<br />
Load Balancing verteilt sein.<br />
Das OpenFlow-Protokoll erlaubt eine einheitliche,<br />
direkte Kontrolle der Infrastruktur.<br />
Die Notwendigkeit eines komplexen<br />
und komplizierten Netzwerkmanagements<br />
entfällt in weiten Teilen. Dies erhöht<br />
die Flexibilität und überwindet ganz<br />
nebenbei die Notwendigkeit, sich auf einen<br />
einzigen Hardwarehersteller festlegen<br />
zu müssen. Darüber hinaus besteht<br />
mit OpenFlow die Möglichkeit zur Entwicklung<br />
eigener Netzwerkanwendun-<br />
68 Ausgabe 05-2013 Admin www.admin-magazin.de
Floodlight<br />
Netzwerk<br />
gen und damit einer besseren Integration<br />
des Netzwerks in ein Gesamtsystem mit<br />
Servern und Storage. Gleichzeitig erhofft<br />
man sich eine deutliche Senkung der Kosten.<br />
Abbildung 1 zeigt die Unterschiede<br />
zwischen einem klassisch-konservativen<br />
Netzwerk und einem SDN-Netzwerk.<br />
Regeln steuern Pakete<br />
Die OpenFlow-API arbeitet mit einfachen<br />
Primitives zur Behandlung von Netzwerkpaketen<br />
sowie zur Abfrage und Auswertung<br />
von Statistiken. Auf der Grundlage<br />
von Matching-Regeln zum Erkennen<br />
identischer Header-Informationen<br />
erlaubt OpenFlow das Zusammenfassen<br />
von Paketen zu sogenannten Flows. Diesen<br />
Flows kann eine Priorität sowie eine<br />
Aktion zugewiesen werden. Eine einfache<br />
OpenFlow-Regel könnte wie folgt<br />
ausschauen:<br />
match="dl_type=ip, nw_type=tcp,U<br />
tp_dst_port=80", action="output=2",U<br />
priority="10"<br />
Diese Regel besagt, dass alle IP-Pakete<br />
mit TCP-Zielport 80 an Port 2 weitergeleitet<br />
werden sollen. Treffen mehrere Regeln<br />
auf ein Paket zu, bestimmt die Priorität,<br />
welche vorrangig angewendet wird.<br />
In den einfachen Primitives des Open-<br />
Flow-Protokolls zeigt sich seine große<br />
Flexibilität. Gleichzeitig stellen sie eine<br />
Herausforderung dar. So ermöglicht<br />
OpenFlow zwar die Programmierung eines<br />
SDN-Netzwerks, macht sie jedoch<br />
nicht unbedingt einfach.<br />
Ein Netzwerk nur über OpenFlow-Primitives<br />
zu managen, wäre so, als würde<br />
man Software ausschließlich in Maschinencode<br />
entwickeln.<br />
Deshalb kommt dem SDN-Controller eine<br />
wichtige Bedeutung zu. Er übernimmt<br />
die zentrale Aufgabe der Kommunikation<br />
mit den OpenFlow-Switches und der Abstraktion<br />
von der OpenFlow-API. Statt<br />
mit komplizierten OpenFlow-Primitives<br />
lassen sich SDN-Netze damit durch höhere<br />
Befehle der Art „Installiere einen<br />
Datenpfad von A nach B“ oder „Verwerfe<br />
alle Pakete an Host X“ steuern. Der Controller<br />
löst eventuell auftretende Konflikte,<br />
übersetzt die Befehle in OpenFlow-<br />
Primitives und installiert diese dann auf<br />
die entsprechenden Switche.<br />
Auf Basis dieser Abstraktionen lassen<br />
sich dann die eigentlichen Netzwerk-Applikationen<br />
wie MAC-Learning, Spanning<br />
Tree oder Routing-Protokolle realisieren.<br />
Auch völlig neue Ideen wie Multipath<br />
Switching, BYOD-Anwendungen oder<br />
eine zentrale ACL-Konfiguration sind relativ<br />
schnell implementiert. Ausgeführt<br />
werden die Applikationen auf dem Controller<br />
wie in heutigen Betriebssystemen.<br />
Im SDN-Jargon spricht man daher auch<br />
von einem Netzwerkbetriebssystem.<br />
Noch stehen sowohl die Entwicklung<br />
von SDN-Controllern wie auch die Suche<br />
nach den richtigen OpenFlow-Abstraktionen<br />
am Anfang und sind Teil intensiver<br />
Forschungsaktivitäten. Kann man jedoch<br />
mit einigen Einschränkungen leben, so<br />
steht mit dem Floodlight-OpenFlow-SDN-<br />
Controller bereits eine vielversprechende<br />
Open-Source-Software zur Verfügung.<br />
Floodlight-OpenFlow-<br />
Controller<br />
Floodlight ist ein in Java geschriebener,<br />
hoch performanter Open-Source-<br />
OpenFlow-Conroller. Er wurde auf der<br />
Basis von Beacon, einem experimentellen<br />
OpenFlow-Controller der Universität<br />
Standford, entwickelt und wird heute von<br />
einer großen Entwickler-Community unterstützt.<br />
Mit BigSwitch Networks steht<br />
hinter Floodlight auch eine Firma, die<br />
kommerzielle Lösungen vorrangig für<br />
Rechenzentren anbietet.<br />
Derzeit implementiert Floodlight die<br />
OpenFlow-Version 1.0 und arbeitet mit<br />
allen Switches, Routern, virtuellen Switches<br />
und Accesspoints zusammen, die<br />
diese Version ebenfalls unterstützen.<br />
Floodlight ist unter der Apache-Lizenz<br />
veröffentlicht und stellt neben dem Kontroll-Framework<br />
zum Steuern der Netzwerkkomponenten<br />
mittels OpenFlow<br />
auch eine Reihe von Netzwerkapplikationen<br />
zur Verfügung. Das Bereitstellen<br />
dieser Applikationen ist der eigentliche<br />
Fokus von Floodlight.<br />
Floodlight-Architektur<br />
Floodlight bietet eine Reihe von Funktionen<br />
und Abstraktionen zum Steuern<br />
eines OpenFlow-Netzwerks. Dem dient<br />
eine modulare Architektur der Controller-<br />
Features sowie eine Reihe von eng an<br />
den Controller gebundenen Basis-Applikationen.<br />
Zum optimalen Ausnutzen der<br />
Ressourcen aktueller Multiprozessorsysteme<br />
greift Floodlight dabei auf Multithreading<br />
zurück und ist so in der Lage,<br />
mehrere Millionen neuer Flows pro Sekunde<br />
zu verarbeiten.<br />
Die Westbound-Java-API erlaubt die Entwicklung<br />
eigener Module in Java und<br />
die schnelle Anbindung an den Core-<br />
Controller. Diese werden beim Start des<br />
Floodlight-Controllers über ein eigenes<br />
Modulsystem automatisch unter Berück-<br />
Feature<br />
Feature<br />
Network<br />
Application<br />
Network<br />
Application<br />
Network<br />
Application<br />
Operating System<br />
Feature<br />
Feature<br />
Spezialisierte<br />
Packet Forwarding<br />
Hardware<br />
Feature<br />
Feature<br />
Network Operating System<br />
Operating System<br />
Operating System<br />
Spezialisierte<br />
Packet Forwarding<br />
Hardware<br />
Feature<br />
Feature<br />
Spezialisierte<br />
Packet Forwarding<br />
Hardware<br />
Operating System<br />
Spezialisierte<br />
Packet Forwarding<br />
Hardware<br />
Abbildung 1: Der Unterschied zwischen einem klassisch-konservativen Netzwerk mit verteilten, heterogenen und vertikal integrierten Netzwerkkomponenten und<br />
einem SDN-Netzwerk mittels OpenFlow.<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
69
Netzwerk<br />
Floodlight<br />
sichtigung ihrer Abhängigkeiten geladen<br />
und stehen fortan zur Verfügung. So<br />
kann man den vollen Funktionsumfang<br />
des Controllers und der OpenFlow-API<br />
nutzen und zeitnah auf Ereignisse im<br />
Netz, wie beispielsweise das Auftauchen<br />
neuer Pakete oder eines neuen Flows,<br />
reagieren. Man spricht daher auch von<br />
reaktiven Applikationen.<br />
Die Northbound-REST-API erlaubt darüber<br />
hinaus das Anbinden externer Applikationen<br />
in einer beliebigen Sprache<br />
mittels JSON. Im Vergleich zur Java-API<br />
ist die REST-API jedoch relativ langsam.<br />
Ein Reagieren auf Events in Echtzeit ist<br />
damit nicht möglich. Stattdessen erlaubt<br />
sie neben dem Abfragen von Service- und<br />
Statusinformationen beispielsweise die<br />
A-priori-Installation von OpenFlow-Regeln<br />
durch externe Applikationen. Diese<br />
nennt man auch proaktive Applikationen.<br />
Eine der Standardanwendungen, die<br />
auf die REST-API setzt, ist das Floodlighteigene<br />
GUI. Darüber hinaus existieren ein<br />
in Python geschriebener Circuit Pusher,<br />
welcher automatisch dauerhafte Open-<br />
Flow-Regeln für die Verbindung zwischen<br />
zwei IP-Adressen installiert.<br />
Topologie eines OpenFlow-Netzwerks.<br />
Mittels eines Link-Discovery-Moduls erzeugt<br />
der Controller sowohl LLDP- als<br />
auch Broadcast-Pakete (sogenannte<br />
BDDPs) und sendet diese in regelmäßigen<br />
Abständen an alle benachbarten<br />
Switche. Unter der Annahme, dass alle<br />
Switche LLDP-Nachrichten konsumieren<br />
und Broadcast-Pakete weiterleiten,<br />
kann Floodlight aus empfangenen eigenen<br />
Nachrichten aktive Verbindungen<br />
erkennen und die Netzwerktopologie<br />
berechnen.<br />
Dabei unterscheidet Floodlight zwischen<br />
direkten Links und Broadcast-Links, wobei<br />
eine direkte Verbindung immer dann<br />
angenommen wird, wenn eigene LLDP-<br />
Pakete empfangen werden. In diesem Fall<br />
sind zwei OpenFlow-Switche unter der<br />
Kontrolle derselben Floodlight-Instanz<br />
direkt miteinander verbunden.<br />
Graphen zeigen Wege<br />
Basierend auf der Information des Link-<br />
Discovery-Mechanismus berechnet der<br />
Topology Service eine Topologie-Repräsentation<br />
in Form eines gerichteten Graphen.<br />
Der beinhaltet alle relevanten Information<br />
über die Konnektivität der Switche<br />
untereinander und kann von anderen<br />
Applikationen etwa für die Berechnung<br />
eines Spanning Trees genutzt werden.<br />
Darüber hinaus lassen sich jedoch durch<br />
einfache Anwendung der Graphentheorie<br />
auch weitere Funktionen realisieren. Die<br />
Berechnung multipler Pfade zwischen<br />
Start und Ziel oder die Optimierung nach<br />
multiplen Parametern stellen somit kein<br />
prinzipielles Problem mehr dar.<br />
Schleifenfreie Inseln<br />
Ein weiteres interessantes und wichtiges<br />
Konzept ist das Zusammenfassen<br />
von direkt miteinander verbundenen<br />
OpenFlow-Switches zu Gruppen – sogenannten<br />
OpenFlow-Inseln – die wiederum<br />
über Broadcast-Links mit anderen<br />
Inseln verbunden sein können. Unter gewissen<br />
Einschränkungen erlaubt Floodlight<br />
so die Kombination von OpenFlow-<br />
Weitere Floodlight Applikationen<br />
Die wichtigsten Floodlight-<br />
Module<br />
GUI<br />
(Javascript)<br />
Circuit<br />
Pusher<br />
(Python)<br />
OpenStack<br />
Quantum Plugin<br />
(Python)<br />
Network<br />
Application<br />
Network<br />
Application<br />
Network<br />
Application<br />
Link Discovery, Topology Service und<br />
OpenFlow Islands: In traditionellen<br />
Netzwerken übernehmen häufig Spanning-Tree-<br />
oder Routing-Protokolle die<br />
Aufgabe des Topologie-Managements,<br />
wie beispielsweise das Sicherstellen der<br />
Schleifenfreiheit. Durch die verteilten<br />
Algorithmen dieser Protokolle ergeben<br />
sich jedoch eine Reihe von Schwierigkeiten,<br />
wie eine komplexe Konfiguration,<br />
eine beschränkte Anzahl von Hops oder<br />
lange Konvergenzzeiten bei Änderungen<br />
der zugrunde liegenden Netzinfrastruktur.<br />
Das Ausnutzen mehrerer Pfade zwischen<br />
Start und Ziel eines Datenflusses<br />
ist sogar nur mit erheblichem Aufwand<br />
und der Verwendung weiterer Protokolle<br />
möglich.<br />
SDN-Controller dagegen verfügen über<br />
eine zentrale Sichtweise auf alle Netzwerkkomponenten<br />
und können das Topologie-Management<br />
dadurch erheblich<br />
vereinfachen. Floodlight implementiert<br />
hierzu einen ausgeklügelten Mechanismus<br />
zum automatischen Erkennen der<br />
Module Applications<br />
VNF<br />
R<br />
R<br />
Firewall<br />
Hub<br />
R<br />
Static<br />
Flow<br />
Entry<br />
Pusher<br />
R<br />
R<br />
Port<br />
Down<br />
Reconciliation<br />
Java API<br />
R<br />
Module<br />
Manager<br />
R<br />
Device<br />
Manager<br />
R<br />
Switches<br />
OpenFlow Switch<br />
OpenFlow Switch<br />
OpenFlow Switch<br />
Northbound REST API<br />
Thread<br />
Pool<br />
Packet<br />
Streamer<br />
OpenFlow Services<br />
R<br />
Controller<br />
Memory<br />
Floodlight Controller<br />
Topology<br />
Manager/<br />
Routing<br />
Southbound OpenFlow v.1.0 API<br />
R<br />
Python<br />
Server<br />
R<br />
Link<br />
Discovery<br />
R<br />
Performance<br />
Monitor<br />
Web<br />
UI<br />
Flow<br />
Cache<br />
R<br />
Trace<br />
R<br />
Unit<br />
Te s t<br />
R<br />
Storage<br />
Memory<br />
NoSQL<br />
R<br />
Counter<br />
Store<br />
Abbildung 2 zeigt die grundsätzliche Architektur und die Relationen zwischen einzelnen in Java<br />
geschriebenen Modulen des Floodlight-Controllers sowie die RESTfull-Northbound-API zum Anbinden externer<br />
Applikationen.<br />
70 Ausgabe 05-2013 Admin www.admin-magazin.de
Netzwerk<br />
Floodlight<br />
Equipment mit Standard-Netzwerkkomponenten.<br />
Wichtig ist, dass aufgrund der<br />
Broadcast-Pakete, Schleifen in den Verbindungen<br />
mit Nicht-OpenFlow-Switches<br />
vermieden werden müssen. Daher darf<br />
jede OpenFlow-Insel nur exakt eine Verbindung<br />
zu Nicht-OpenFlow-Equipment<br />
aufweisen. Weiterhin dürfen OpenFlowund<br />
Nicht-OpenFlow-Inseln an sich keine<br />
Schleife bilden. Abbildung 4 zeigt eine<br />
mögliche und erlaubte Topologie mit<br />
OpenFlow und Nicht-OpenFlow-Equipment.<br />
Lernende Switche<br />
Forwarding and Learning Switch: Derzeit<br />
bietet Floodlight zwei Module zur automatischen<br />
Paketweiterleitung zwischen<br />
Endhosts. Das standardmäßig aktivierte,<br />
jedoch relativ einfach implementierte<br />
Forwarding-Modul dient hauptsächlich<br />
der exemplarischen Einführung in<br />
Floodlight und bietet einen guten Einstiegspunkt<br />
in Funktionsweise von Floodlight<br />
sowie OpenFlow im Allgemeinen.<br />
Es behandelt jedes Paket einzeln und ist<br />
daher in seiner Leistungsfähigkeit stark<br />
eingeschränkt.<br />
Das komplexere Learning-Switch-Modul<br />
implementiert ein ähnliches Verhalten,<br />
wie man es von einem Standard-Switch<br />
bereits kennt: Es erkennt und lernt neue<br />
Geräte anhand ihrer MAC-Adresse.<br />
Aufgrund der globalen Sichtweise von<br />
Floodlight bietet es jedoch darüber hinausgehende<br />
Funktionen. Erkennt Floodlight<br />
einen neuen Flow, identifiziert das<br />
Learning-Switch-Modul anhand der vorliegenden<br />
Topologie-Information des Topology<br />
Services den Eingangs- und den<br />
Ausgangsswitch sowie alle weiteren Switche<br />
auf dem kürzesten Pfad zwischen<br />
Start und Ziel. Ist ein Pfad gefunden,<br />
installiert das Modul die entsprechenden<br />
OpenFlow-Regeln zur Behandlung des<br />
neues Flows auf alle beteiligten Switche.<br />
Anschließend können alle weiteren Pakete<br />
zu ihrem Ziel finden.<br />
Im Vergleich zum einfachen Forwarding-<br />
Modul ist die Leistungsfähigkeit um ein<br />
Vielfaches höher, da die Paketweiterlei-<br />
tung nach der Installation der OpenFlow-<br />
Regeln ausschließlich im Forwarding-<br />
Pfad der Switche bewerkstelligt wird und<br />
eine Interaktion mit dem Controller nicht<br />
für jede Nachricht zwingend notwendig<br />
ist.<br />
Koexistenz mit Standard-<br />
Equipment<br />
Eine Einschränkungen für beide Module<br />
ergibt sich, wenn im Netzwerk Open-<br />
Flow- und Standard-Equipment koexistiert.<br />
In diesem Fall identifiziert der Algorithmus<br />
alle OpenFlow-Inseln und leitet<br />
Pakete nur innerhalb der Insel direkt zum<br />
Ziel. Ist das Ziel unbekannt oder befindet<br />
es sich auf einer anderen Insel, werden<br />
die Pakete geflutet.<br />
Schon an diesen Modulen lassen sich<br />
die Vorteile von SDN, OpenFlow und<br />
Floodlight klar erkennen. Bereits relativ<br />
einfache Implementierungen bieten<br />
gegenüber konservativen Netzwerken<br />
erhebliche Vorteile. Innerhalb einer<br />
OpenFlow-Domäne wird selbst bei großen<br />
vermaschten Netzen ein kompliziert<br />
konfiguriertes Spanning-Tree-Protokoll<br />
überflüssig. Der SDN-Controller übernimmt<br />
diese Aufgaben. So lassen sich<br />
zentral Datenfluss-Optimierungen oder<br />
ein Traffic Engineering zur Lastverteilung<br />
durchführen. Ebenso können innerhalb<br />
einer OpenFlow-Insel ohne großen Aufwand<br />
Multipath-Verbindungen realisiert<br />
werden. Im Fall von Link-Ausfällen kann<br />
der Controller unmittelbar und intelligent<br />
auf Änderungen der Topologie reagieren<br />
und beispielsweise bestehende Datenflüsse<br />
umleiten. Im besten Fall erfolgt<br />
diese Änderung transparent und ohne<br />
große Verzögerung. Lange Konvergenzzeiten<br />
gehören der Vergangenheit an.<br />
Teile und herrsche<br />
Abbildung 3: Das Floodlight-GUI stellt alle wichtigen Informationen bezüglich des OpenFlow-Netzwerks dar.<br />
So erfährt man den Status der Switche sowie der verbundenen Endgeräte. Auch die automatisch erkannte<br />
Netzwerktopologie lässt sich graphisch darstellen.<br />
Load Balancer: Ein weiteres Beispiel für<br />
die Anwendung der fortgeschrittenen<br />
Paketweiterleitungs- und Manipulationsmöglichkeiten<br />
von OpenFlow ist eine netzinterne<br />
Lastverteilung auf verschiedene<br />
Server. Traditionelle Server-Load-Balancer<br />
sind typischerweise einzelne Systeme, die<br />
einer Serverlandschaft vorgeschaltet sind<br />
und die Last in Abhängigkeit des Dienstes<br />
auf die zur Verfügung stehenden Anwendungen<br />
verteilen. Neben der oftmals<br />
72 Ausgabe 05-2013 Admin www.admin-magazin.de
Netzwerk<br />
Floodlight<br />
komplexen Konfiguration inklusive einer<br />
Analyse der zu verteilenden Datenströme<br />
besteht ein wesentlicher Nachteil dieses<br />
Ansatzes darin, dass der klassische Load<br />
Balancer einen schwer zu vermeidenden<br />
Engpass im Netzwerk darstellt.<br />
In einem SDN lässt sich dieses Bottleneck<br />
dagegen leicht vermeiden. Durch<br />
die umfangreichen Kontrollmöglichkeiten<br />
von Datenflüssen kann in einem SDN<br />
das gesamte Netzwerk, also jeder einzeln<br />
Switch, Router und Netzwerkpfad,<br />
als Load Balancer fungieren und Datenströme<br />
auf verteilten Pfaden direkt an<br />
unterschiedliche Server weiterleiten. Eine<br />
Überlastung einer einzelnen Netzwerk-<br />
Appliance wird hierdurch vermieden.<br />
Stattdessen wird aus dem Server-Load-<br />
Balancing jetzt ein Dienst des Netzwerks.<br />
Load Balancing als Dienst<br />
Auch hierfür bietet Floodlight bereits<br />
eine rudimentäre Lösung. Die Floodlight-<br />
Load- Balancer-Applikation ist eine einfache<br />
Anwendung zur Verteilung von<br />
UDP-, TCP- oder ICMP-Flows auf verschiedene<br />
Server. Dabei übernimmt nicht<br />
eine eigenständige Netzwerkkomponente<br />
die Aufgabe der Lastverteilung, sondern<br />
das gesamte Netzwerk. De facto ist jeder<br />
Switch des Netzes daran beteiligt.<br />
Steuern lässt sich der Floodlight-Load-<br />
Balancer über eine REST-API, welche an<br />
die OpenStack-Quantum-Load-Balanceras-a-Service-API<br />
(LBaaS) angelehnt ist.<br />
So lassen sich virtuelle IP-Adressen für<br />
den Load Balancer erstellen und an diese<br />
Adressen gerichtete Flows automatisch<br />
an reale Server im Netz umleiten. Einmal<br />
konfiguriert, übernehmen die OpenFlow-<br />
Switche automatisch einen Großteil der<br />
Arbeit.<br />
Wie viele andere Floodlight-Applikationen<br />
befindet sich der Load Balancer<br />
derzeit noch in der Entwicklung und bietet<br />
bisher nur eine Basis-Funktionalität.<br />
So findet die Verteilung der Flows nach<br />
einem Round-Robin-Verfahren statt und<br />
berücksichtigt weder die Last des Servers<br />
noch etwa das tatsächliche Datenaufkommen.<br />
Dennoch lässt sich bereits<br />
mit den vorhandenen Komponenten ein<br />
einfacher, aber leistungsfähiger Server-<br />
Load-Balancer realisieren. Durch die<br />
Open-Source-Quellen lässt sich die bestehende<br />
Software auch einfach den eigenen<br />
Bedürfnissen anpassen.<br />
Mehr Sicherheit<br />
Stateless Firewall: Auch im Bereich Sicherheit<br />
lassen sich mit SDN und Open-<br />
Flow neue Wege beschreiten und traditionelle<br />
Verfahren vereinfachen. Die kongruente<br />
Installation von Access Control<br />
Lists (ACLs) auf einer Vielzahl Switche<br />
eines Netzes etwa erweist sich bis heute<br />
als aufwendiges Unterfangen. Selbst in<br />
professionellen Systemen ergeben sich<br />
immer wieder Diskrepanzen zwischen<br />
Anforderung, Dokumentation und der<br />
eigentlichen Konfiguration. Wünschenswert<br />
ist ein System, das ACLs automatisch<br />
auf allen Netzwerkkomponenten<br />
durchsetzt. Auch hier bietet Floodlight<br />
eine elegante und standardisierte Lösung<br />
für das Problem.<br />
Die Floodlight-Stateless-Firewall-Applikation<br />
ist ein reaktives Floodlight-Modul,<br />
das netzwerkweite ACL-Konfigurationen<br />
für alle OpenFlow-Switche zentral vorhält.<br />
Die Firewall-Regeln (ALLOW oder<br />
DENY) lassen sich für beliebige Open-<br />
Flow-Matches relativ komfortabel durch<br />
eine REST-API konfigurieren und nach<br />
Prioritäten sortieren.<br />
Jedes Packet-In-Ereignis, das durch das<br />
erste Paket eines neuen Flows erzeugt<br />
wird, wird anschließend mit der Menge<br />
der existierenden Firewall-Regeln verglichen,<br />
bis entweder die Menge leer<br />
ist oder eine passende Regel gefunden<br />
wurde. Im zweiten Fall bestimmt die<br />
höchstpriorisierte Regel, ob das Paket<br />
weitergeleitet oder der Flow blockiert<br />
wird. Wird keine Regel gefunden oder<br />
besagt die Regel, dass der Flow erlaubt<br />
ist, passiert das Packet-In-Ereignis die<br />
Firewall und wird von nachfolgenden<br />
Floodlight-Modulen, wie beispielsweise<br />
dem bereits erwähnten Learning-Switch-<br />
Modul, regulär verarbeitet und weitergeleitet.<br />
Findet sich dagegen eine Regel, die<br />
den Flow blockiert, installiert die Firewall<br />
eine OpenFlow-Regel auf dem OpenFlow-<br />
Eingangsswitch zum Verwerfen aller weiteren<br />
Pakete desselben Flows.<br />
Die Floodlight-Firewall erlaubt somit zentral<br />
konfigurierte, netzwerkweite ACL-Regeln,<br />
die automatisch auf alle (oder ausgewählte)<br />
Switche durchgesetzt werden.<br />
Das folgende, einfache Beispiel verdeutlicht<br />
die Konfigurationsmöglichkeiten.<br />
Die Regeln erlauben Verbindungen in das<br />
Subnetz 192.168.1.0/24 ausschließlich<br />
zu TCP-Port 80.<br />
Protokoll | Ziel-IP | Ziel-Port | Action |<br />
Priorität<br />
----------+---------+------------+-------+<br />
---------<br />
TCP | 192.168.1.0/24 | 80 | ALLOW | 1 TCP |<br />
192.168.1.0/24 | * | DENY | 2<br />
Tutorial: Erste Schritte<br />
Als Java-Anwendung läuft Floodlight in<br />
einer Java-VM und steht somit auf praktisch<br />
allen Betriebssystemen zur Verfügung.<br />
Für viele gängige Linux-Distributionen<br />
wie beispielsweise Ubuntu ist oftmals<br />
sogar ein Release in den Repositories<br />
vorhanden. Darüber hinaus steht auf der<br />
Projekt-Homepage ein vorkonfiguriertes<br />
Virtual Machine Image zum Download<br />
bereit. Durch die rapide Weiterentwicklung<br />
von Floodlight empfiehlt es sich<br />
jedoch, die neueste Version von GitHub<br />
oder Nightly Builds zu installieren. Diese<br />
erwiesen sich in der Vergangenheit als<br />
äußerst stabil und beheben bereits eine<br />
Reihe von Bugs der alten Releases.<br />
OpenFlow Island 1 Non-OpenFlow Island<br />
OpenFlow Island 2<br />
Abbildung 4: Beispiel einer in Floodlight erlaubten Topologie mit OpenFlow- und Standard-Equipment. Zu<br />
Nicht-OpenFlow-Inseln dürfen OpenFlow-Inseln jedoch nur exakt eine Verbindung aufweisen.<br />
74 Ausgabe 05-2013 Admin www.admin-magazin.de
Floodlight<br />
Netzwerk<br />
Am einfachsten lässt sich Floodlight unter<br />
Linux (etwa Ubuntu) installieren. Hierzu<br />
sollte neben einer Java-Umgebung ein<br />
Git-Client, Python und Apache Ant vorhanden<br />
sein. Um Floodlight unter Linux<br />
von GitHub zu laden und zu übersetzen,<br />
genügen die folgenden Befehle:<br />
$ git clone git://github.com/floodlightU<br />
/floodlight.git<br />
$ cd floodlight<br />
$ git checkout stable<br />
$ ant<br />
Konfigurieren lässt sich Floodlight über<br />
Java-Properties-Dateien. Unter »./src/<br />
main/resources/floodlightdefault.properties«<br />
finden sich die Standardeinstellungen<br />
wie Port-Einstellungen und die<br />
Applikationsmodule, welche automatisch<br />
geladen werden. Vor einem ersten Test<br />
empfiehlt es sich, das einfache »net.flood-<br />
lightcontroller.forwarding.Forwarding«-<br />
Modul durch das performantere »net.<br />
floodlightcontroller.learningswitch.<br />
LearningSwitch«-Modul zu ersetzen. Anschließend<br />
lässt sich Floodlight mit<br />
$ java ‐jar target/floodlight.jar<br />
starten und es erwartet fortan die Verbindung<br />
von OpenFlow-Switches.<br />
Steht gerade keine OpenFlow-fähige<br />
Hardware zur Verfügung, lässt sich mit<br />
der freien Software MiniNet ein Open-<br />
Flow-Netzwerk simulieren. Hier empfiehlt<br />
sich ebenfalls die Installation von<br />
GitHub:<br />
$ git clone git://github.com/mininet/mininet<br />
$ mininet/util/install.sh ‐a<br />
Die Prozedur dauert circa fünf Minuten<br />
und installiert alle MiniNet-Komponenten<br />
inklusive des OpenFlow-Software-<br />
Switches »Open vSwitch«, einem Wireshark-Dissector<br />
zum Analysieren von<br />
OpenFlow-Nachrichten mit Wireshark<br />
und POX, einem in Python geschriebenen<br />
weiteren OpenFlow-Controller.<br />
Zum Starten von MiniNet mit einer minimalen<br />
Topologie, die zwei Hosts über<br />
einen OpenFlow-Switch verknüpft und<br />
eine Verbindung zu einem externen<br />
Floodlight-Controller aufnimmt, genügt:<br />
$ sudo mn ‐‐topo=minimal ‐‐controller=U<br />
remote‐‐ip= ‐‐port=U<br />
<br />
Sogleich verbindet sich MiniNet mit<br />
Floodlight und schon hat man ein kleines<br />
Software Defined Network zum Ausprobieren<br />
und Testen.<br />
Für weitere Hilfe oder Informationen zu<br />
Floodlight empfiehlt sich ein Blick auf die<br />
(englischsprachige) Homepage des Projekts<br />
[1]. Darüber hinaus steht über die<br />
Mailingliste eine große Entwickler-Community<br />
jederzeit hilfsbereit zur Seite.<br />
Fazit<br />
Der Floodlight-OpenFlow-SDN-Controller<br />
bietet bereits eine beeindruckende Leistung<br />
und eine Menge an Applikationen.<br />
Darüber hinaus entstehen in der Open-<br />
Source-Community weitere interessante<br />
Lösungen beispielsweise für effizientes<br />
Handover in drahtlosen Netzen, Multipath-<br />
und In-Network-Load-Balancing,<br />
Application Aware Traffic Engineering<br />
oder BYOD. Dabei ermöglicht Software<br />
Defined Networking eine schnelle, hardwareübergreifende<br />
und vor allem kostengünstige<br />
Möglichkeit auch für eigene<br />
Implementierungen<br />
von Netzwerk-Management-Lösungen.<br />
Das Floodlight-Projekt<br />
zeigt eindrucksvoll,<br />
welches Potenzial<br />
Software Defined Networking<br />
hat.<br />
Zum Einsatz von<br />
Floodlight in einer produktiven<br />
Umgebung<br />
fehlen jedoch noch<br />
einige entscheidende<br />
Punkte. So bietet<br />
Floodlight bisher nur<br />
ein sehr eingeschränktes<br />
Konfigurationsmanagement.<br />
Praktisch<br />
alle Konfigurationsinformationen<br />
werden<br />
ausschließlich im Speicher<br />
vorgehalten und<br />
sind bei einem Neustart<br />
des Controllers<br />
verloren. Ebenso fehlt<br />
bisher ein Hochverfügbarkeitsmechanismus.<br />
Fällt der Controller aus,<br />
liegt vor allem bei der<br />
Verwendung reaktiver<br />
Applikationen schnell<br />
das gesamte Netzwerk<br />
lahm. Auch die bisher<br />
verfügbaren Applikationen stecken zum<br />
Teil noch in den Kinderschuhen und erlauben<br />
mitunter nur eine eingeschränkte<br />
Funktionalität.<br />
Dennoch eignet sich Floodlight hervorragend,<br />
um mit Software Defined Networking<br />
in Kontakt zu treten und kostengünstig<br />
erste Erfahrungen zu sammeln. In<br />
Kombination mit der ebenfalls kostenlos<br />
erhältlichen MiniNet-Software und Open<br />
vSwitch bedarf es nicht einmal realer<br />
Hardware, um erste Versuche zu unternehmen<br />
und eigenes Know-how aufzubauen.<br />
Noch stehen SDN und OpenFlow<br />
– und somit auch OpenFlow-Controller<br />
wie Floodlight – am Anfang. Dennoch<br />
lässt sich absehen, dass sie die Zukunft<br />
von Kommunikationsnetzen weitreichend<br />
verändern werden. (jcb)<br />
n<br />
Infos<br />
[1] OpenFlow-Projekt: [http:// www.<br />
projectfloodlight. org]<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
75
Virtualisierung<br />
VHDX-Disks<br />
Umgang mit VHDX-Dateien<br />
Moderne Bilder<br />
© Alina Pavlova, 123RF<br />
Gegenüber dem alten Format für virtuelle Festplatten bringen VHDX-<br />
Dateien einige Verbesserungen mit. Dieser Artikel gibt einen Überblick<br />
über die interessanten Features. Thomas Joos<br />
Neben dem Vorteil der größeren Kapazität<br />
sind VHDX-Dateien auch wesentlich<br />
unempfindlicher beim Ausfall eines Servers<br />
oder einem Hardreset. VHD-Dateien<br />
können bei Problemen des Host-Systems<br />
sehr schnell zerstört werden. Das passiert<br />
mit VHDX-Dateien so gut wie nicht mehr.<br />
Setzen Sie Windows Server 2012 als<br />
iSCSI-Target ein, erstellen Sie als iSCSI-<br />
Ziel VHD-Dateien. Windows Server 2012<br />
kennt zwar bereits VHDX-Dateien, kann<br />
diese aber nur mit Hyper-V einsetzen,<br />
nicht als iSCSI-Target.<br />
Jetzt auch für iSCSI<br />
Der neue Windows Server 2012 R2 dagegen<br />
kann VHDX-Festplatten auch als<br />
iSCSI-Target verwenden. Die erstellten<br />
VHDX-Festplatten lassen sich ab Windows<br />
Server 2012 R2 und System Center<br />
2012 R2 auch direkt in den System-Center-Produkten<br />
verwalten. Außerdem gibt<br />
es in Windows Server 2012 R2 die Möglichkeit,<br />
die Festplatten mehreren virtuellen<br />
Servern zuzuweisen. Die Shared-<br />
VHDX-Technologie bietet daher vor allem<br />
Vorteile beim Betrieb mit Hyper-V 2012<br />
R2. Ebenfalls neu in Windows Server<br />
2012 R2 ist die Option, die Größe virtueller<br />
Festplatten im laufenden Betrieb zu<br />
ändern. In Windows Server 2012 müssen<br />
Sie die angebundenen virtuellen Server<br />
dazu herunterfahren. Außerdem können<br />
Sie in Windows Server 2012 R2 virtuelle<br />
Server jetzt im laufenden Betrieb exportieren<br />
und kopieren.<br />
VHDX-Dateien nutzen<br />
Die Steuerung von virtuellen Festplatten<br />
außerhalb von Hyper-V finden Sie in der<br />
Festplattenverwaltung über das Menü<br />
»Aktion«. Klicken Sie auf den Menüpunkt<br />
»Virtuelle Festplatte erstellen«, um den<br />
Assistenten zu starten. Im Assistenten<br />
legen Sie fest, wo Sie die VHDX-Datei der<br />
Festplatte speichern wollen und wie groß<br />
die Festplatte sein soll. An dieser Stelle<br />
bestimmen Sie auch, ob die Festplatte<br />
anwachsen darf oder ob Sie eine feste<br />
Größe verwenden wollen.<br />
Wählen Sie den Befehl »Virtuelle Festplatte<br />
anfügen«, können Sie bereits bestehende<br />
Datenträger an den Computer<br />
anbinden (Abbildung 1). Das funktioniert<br />
auch, wenn Sie auf eine VHD(X)-Datei<br />
doppelklicken. Nachdem Sie die virtuelle<br />
Festplatte erstellt haben, zeigt Windows<br />
sie in der Datenträgerverwaltung<br />
an und Sie können sie wie jede andere<br />
verwalten.<br />
Haben Sie noch VHD-Dateien im Einsatz,<br />
können Sie diese in VHDX-Dateien umwandeln.<br />
Das geht zum Beispiel mit dem<br />
Hyper-V-Manager oder dem Commandlet<br />
»convert‐VHD«. Im Hyper-V-Manager rufen<br />
Sie mit dem Link »Datenträger bearbeiten«<br />
den entsprechenden Assistenten<br />
auf. Laden Sie die VHD-Datei und starten<br />
Sie im Assistenten die Konvertierung, indem<br />
Sie die Aktion »Konvertieren« auswählen.<br />
Konvertieren<br />
Im Rahmen der Umwandlung wählen Sie<br />
das Datenträgerformat aus und können<br />
auch zwischen dem Typ der Festplatten,<br />
also fester Größe oder dynamisch<br />
erweiterbar, wechseln. Das Commandlet<br />
»convert‐vhd« steht auch zur Verfügung,<br />
wenn Sie Hyper-V in Windows 8 installiert<br />
haben, also nicht nur in den Server-<br />
Betriebssystemen.<br />
Ein Vorteil des Commandlets ist die Fähigkeit,<br />
nicht nur VHD-Dateien in VHDX-<br />
Dateien umwandeln zu können, sondern<br />
auch den umgekehrten Weg zu gehen.<br />
Das heißt, Sie können von den Vorteilen<br />
des neuen Formats profitieren, aber im<br />
Notfall auch wieder zurückkonvertieren,<br />
wenn etwa eine virtuelle Festplatte später<br />
an ein anderes System gehängt werden<br />
muss. Die Syntax ist sehr einfach:<br />
Convert‐VHD ‐Path Pfad zur VHD(X)‐Datei U<br />
‐DestinationPath Pfad zur Zieldatei<br />
76 Ausgabe 05-2013 Admin www.admin-magazin.de
VHDX-Disks<br />
Virtualisierung<br />
Außerdem ist es möglich, den Typ der<br />
Festplatte zu ändern, zum Beispiel mit:<br />
Convert‐VHD ‐Path Pfad der VHD/VHDX‐DateiU<br />
‐DestinationPath Zielpfad und Datei ‐VHDTypeU<br />
Differencing ‐ParentPath Übergeordnete<br />
Festplatte<br />
Ein weiteres Beispiel ist: »Convert‐VHD<br />
‐Path hd1.vhd ‐DestinationPath hd1.vhdx<br />
‐VHDType Dynamic«. Alle Optionen des<br />
Commandlets finden Sie auf der Seite<br />
[2]. Neben der Möglichkeit das Format<br />
von Festplatten in der PowerShell<br />
umzuwandeln, können Sie auch<br />
die Größe von Festplatten in der<br />
PowerShell anpassen. Dabei hilft<br />
das Commandlet »Resize‐VHD«,<br />
zum Beispiel:<br />
Resize‐VHD ‐Path c:\vm\owa.vhdx U<br />
‐SizeBytes 1TB<br />
Neben diesen Spezialaufgaben<br />
können Sie auch einfach mit<br />
»New‐VHD« neue Festplatten erstellen<br />
und mit »Get‐VHD« Informationen<br />
zu den Festplatten anzeigen.<br />
Virtuelle Festplatten lassen sich in<br />
der PowerShell auch direkt mit virtuellen<br />
Servern verbinden:<br />
Add‐VMHardDiskDrive ‐VMName VM ‐PathU<br />
VHDX‐Datei<br />
Natürlich können Sie virtuelle Festplatten<br />
auch am Host-System anbinden,<br />
zum Beispiel um Daten da-<br />
rauf zu kopieren, und diese erst dann im<br />
virtuellen Server einbinden: »mount‐vhd<br />
VHD‐Datei«. Mit dem Commandlet<br />
»unmount‐vhd« trennen Sie die virtuelle<br />
Platte wieder vom System.<br />
Microsoft unterstützt Administratoren<br />
mit dem kostenlosen Microsoft Virtual<br />
Machine Converter [1], um virtuelle Server<br />
von VMware vSphere zu Hyper-V zu<br />
migrieren. Die aktuelle Version wurde<br />
von Microsoft bereits für Windows Server<br />
2012 und Hyper-V Server 2012 optimiert,<br />
Abbildung 1: Virtuelle VHDX-Festplatten können Sie auch ohne<br />
Hyper-V direkt im Betriebssystem als Datenspeicher einbinden.<br />
unterstützt aber noch nicht das neue<br />
Festplattenformat VHDX von Windows<br />
Server 2012. Sie können aber im Hyper-<br />
V-Manager oder mit »convert‐vhd« die erstellte<br />
VHD-Datei in eine VHDX-Festplatte<br />
umwandeln. SCVMM 2012 kann mit dem<br />
SP1 VHDX-Festplatten von Hyper-V 3.0<br />
und auch VHD-Dateien in das VHDX-<br />
Format konvertieren.<br />
Zu Servern hinzufügen<br />
Um einem Server eine neue virtuelle<br />
Festplatte auf Basis einer<br />
VHDX-Datei hinzuzufügen, gibt<br />
es verschiedene Möglichkeiten.<br />
Im laufenden Betrieb lassen sich<br />
virtuelle Festplatten nur an virtuelle<br />
SCSI-Controller anbinden. Um<br />
einen virtuellen SCSI-Controller<br />
einzubauen, müssen Sie aber den<br />
virtuellen Server herunterfahren.<br />
Neue Festplatten fügen Sie im<br />
Schnelldurchlauf so hinzu: Klicken<br />
Sie mit der rechten Maustaste auf<br />
den virtuellen Server und dann auf<br />
»Einstellungen«. Wählen Sie den<br />
Controller aus, mit dem die neue<br />
virtuelle Festplatte verbunden werden<br />
soll. Klicken Sie auf »Festplatte«<br />
und dann auf »Hinzufügen«. Aktivieren<br />
Sie die Option »Virtuelle<br />
Festplatte« und klicken Sie auf<br />
»Neu«, um den Assistenten für eine<br />
neue Festplatte zu starten. E<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
77
Virtualisierung<br />
VHDX-Disks<br />
Abbildung 2: Virtuelle Festplatten können Sie in Hyper-V optimieren.<br />
Bestätigen Sie die Startseite des Assistenten<br />
und wählen Sie das Format für<br />
die neue Festplatte aus, also VHD (bis<br />
2 TByte) oder VHDX (bis 64 TByte).<br />
Bestimmen Sie als Nächstes, ob die Festplatte<br />
eine feste Größe hat, dynamisch<br />
erweiterbar sein oder auf einer vorhandenen<br />
Festplatte aufbauen soll (»Differenzierung«).<br />
Im Anschluss legen Sie den Pfad und<br />
den Namen fest, unter dem Windows<br />
Server 2012 die VHDX-Datei speichern<br />
soll. Auf der nächsten Seite bestimmen<br />
Sie die Größe der virtuellen Festplatte<br />
und können auch den Inhalt einer physischen<br />
Festplatte in die virtuelle Festplatte<br />
kopieren lassen. Danach erhalten<br />
Sie noch eine Zusammenfassung und<br />
erstellen mit »Fertigstellen« schließlich<br />
die virtuelle Festplatte. Klicken Sie danach<br />
im Fenster auf »Anwenden«, damit<br />
die virtuelle Festplatte in den virtuellen<br />
Server integriert wird.<br />
Speicher-Migration<br />
In Windows Server 2012 haben Sie auch<br />
die Möglichkeit, virtuelle Festplatten auf<br />
Hyper-V-Hosts zu verschieben – sogar im<br />
laufenden Betrieb. Klicken Sie dazu mit<br />
der rechten Maustaste auf den virtuellen<br />
Server, dessen Festplatten Sie umlagern<br />
wollen, und wählen Sie den Punkt »Verschieben«<br />
aus.<br />
Im Assistenten wählen Sie anschließend<br />
»Speicher des virtuellen Computers<br />
verschieben« aus. Auf der folgenden<br />
Seite bestimmen Sie, ob Sie die Daten<br />
des virtuellen Servers oder nur die virtuellen<br />
Festplatten verschieben wollen.<br />
Dann wählen Sie den entsprechenden<br />
Ordner aus, in dem Hyper-V die Daten<br />
des Computers speichern soll. Während<br />
des Vorgangs läuft der virtuelle Server<br />
weiter. Sie sehen den Status im Hyper-V-<br />
Manager. Wollen Sie Daten in verschiedenen<br />
Ordnern speichern, können Sie die<br />
entsprechende Option auswählen und im<br />
nächsten Fenster getrennte Speicherorte<br />
für Konfigurationsdateien, virtuelle Festplatten<br />
und Snapshots festlegen.<br />
Sie können daneben auch Smart-Paging-<br />
Dateien getrennt speichern. Smart Paging<br />
soll verhindern, dass sich virtuelle Server<br />
nicht mehr starten lassen, weil der gesamte<br />
verfügbare Arbeitsspeicher bereits<br />
zugewiesen ist. Diese neue Funktion erlaubt<br />
es virtuellen Servern, beim Neustart<br />
Teile der Festplatte des Hosts als Arbeitsspeicher<br />
zu nutzen. Auch diesen Bereich<br />
können Sie daher getrennt verschieben.<br />
Nach dem erfolgreichen Start wird der<br />
Festplattenplatz wieder freigegeben und<br />
der virtuelle Server erhält durch Dynamic<br />
Memory wieder seinen Speicher.<br />
Optimieren<br />
Im »Aktionen«-Bereich des Hyper-V-Managers<br />
finden Sie rechts die beiden Menüpunkte<br />
»Datenträger bearbeiten« und<br />
»Datenträger überprüfen«. Mit Letzterem<br />
starten Sie das Scannen einer beliebigen<br />
virtuellen Festplatte. Anschließend öffnet<br />
sich ein neues Fenster mit den Daten der<br />
Festplatte. So erfahren Sie, ob es sich um<br />
eine dynamisch erweiterbare oder eine<br />
Festplatte mit fester Größe handelt.<br />
Auch die maximale Größe sowie die aktuelle<br />
Datenmenge zeigt das Fenster an.<br />
Über »Datenträger bearbeiten« stehen Ihnen<br />
verschiedene Möglichkeiten offen)<br />
(Abbildung 2):<br />
n »Komprimieren« steht nur bei dynamisch<br />
erweiterbaren Festplatten zur<br />
Verfügung. Der Vorgang löscht leere<br />
Bereiche in der VHD(X)-Datei, sodass<br />
diese deutlich kleiner wird. Allerdings<br />
ist das nur für den Fall sinnvoll, wenn<br />
zuvor viele Daten von der Festplatte<br />
gelöscht wurden.<br />
n Mit »Konvertieren« wandeln Sie dynamisch<br />
erweiterbare Festplatten in<br />
Festplatten mit fester Größe um und<br />
umgekehrt.<br />
n »Erweitern« hilft dabei, den maximal<br />
verfügbaren Festplattenplatz einer<br />
VHD(X)-Datei zu vergrößern.<br />
n »Zusammenführen« wird nur dann<br />
angezeigt, wenn Sie eine differenzierende<br />
Festplatte auswählen, zum<br />
Beispiel die AVHD(X)-Datei eines<br />
Snapshots. Da diese Datei nur die aktuellen<br />
Unterschiede zu der VHD(X)-<br />
Quelldatei enthält, lassen sich die Daten<br />
zu einer gemeinsamen VHD(X)-<br />
Datei zusammenführen, die alle Daten<br />
enthält. Die beiden Quellfestplatten<br />
bleiben bei diesem Vorgang erhalten,<br />
der Assistent erstellt eine neue virtuelle<br />
Festplatte.<br />
n »Verbindung wiederherstellen« – für<br />
eine differenzierende Festplatte ist es<br />
zunächst einmal notwendig, dass die<br />
Quelldatei der verifizierten VHD(X)-<br />
Datei gefunden wird. Eine differenzierende<br />
Festplatte kann aber auch in<br />
einer Kette auf eine andere differenzierende<br />
Datei verweisen, die dann<br />
wiederum auf die VHD(X)-Datei verweist.<br />
Das kommt zum Beispiel dann<br />
vor, wenn mehrere Snapshots aufeinander<br />
aufbauen. Ist die Kette zerstört,<br />
zum Beispiel weil sich der Pfad einer<br />
Festplatte geändert hat, lässt sich mit<br />
dieser Option die Verbindung wiederherstellen.<br />
(ofr)<br />
n<br />
Infos<br />
[1] Microsoft Converter:<br />
[http:// www. microsoft. com/ en‐us/<br />
download/ details. aspx? id=34591]<br />
[2] Commandlet-Optionen:<br />
[http:// technet. microsoft. com/ en‐us/<br />
library/ hh848454. asp]<br />
Der Autor<br />
Thomas Joos ist freiberuflicher IT-Consultant<br />
und seit über 20 Jahren in der IT tätig.<br />
Neben seinen Projekten schreibt er praxisnahe<br />
Fachbücher und Fachartikel rund um<br />
Windows und andere Microsoft-Themen. Online<br />
trifft man Thomas Joos häufig unter<br />
[http:// thomasjoos. spaces. live. com].<br />
78 Ausgabe 05-2013 Admin www.admin-magazin.de
Virtualisierung<br />
Udev<br />
© Luciano De Polo, 123RF<br />
Udev mit virtuellen Maschinen<br />
Technisches K.O.<br />
Für viele Cloud-Admins steht das Udev-System des Kernels und die zugehörigen Regeln für eine endlose Neunummerierung<br />
der Netzwerkschnittstellen und manuelle Anpassungen. Dass man auch ohne wildes Löschen von<br />
Systemdateien obenauf bleiben kann, zeigt dieser Artikel. Martin Braun<br />
Das folgende Problem ist sicherlich jedem<br />
Administrator schon begegnet, der<br />
einmal ein virtuelles Suse-System geklont<br />
hat: Die frisch geklonte VM hängt beim<br />
Booten und wartet auf die Standard-<br />
Devices (Abbildung 1). Am Ende des<br />
verlängerten Bootvorgangs ist aus dem<br />
konfigurierten Netzwerk-Interface (NIC)<br />
»eth0« des Originals ein NIC mit Namen<br />
»eth1« geworden und die Nummern weiterer<br />
NICs wurden ebenfalls um eins erhöht.<br />
Ähnliches passiert bei nahezu allen<br />
anderen Linux-Distributionen und ist unabhängig<br />
vom eingesetzten Hypervisor.<br />
Damit verliert der Klon seine Netzwerk-<br />
Konfiguration, und man muss manuell<br />
über die Konsole nacharbeiten.<br />
Den schwarzen Peter bekommt dabei<br />
schnell Udev zugeschoben. Der Udev-<br />
Geräteverwalter meint es dabei aber nur<br />
gut: Udev lädt während der Hardware-<br />
Erkennung des Kernels alle Module<br />
Listing 1: »80‐net‐name‐slot.rules«<br />
01 ACTION=="remove", GOTO="net_name_slot_end"<br />
02 SUBSYSTEM!="net", GOTO="net_name_slot_end"<br />
03 NAME!="", GOTO="net_name_slot_end"<br />
04 <br />
asynchron in unbestimmter Reihenfolge.<br />
Diese hängt von verschiedenen Bedingungen<br />
ab: der PCI-Bus-Topologie, den<br />
Gerätetreibern und der Art, wie diese<br />
nach ihrer Hardware suchen. Dabei kann<br />
es zu ständig wechselnden Gerätenamen<br />
kommen. Wenn nun zum Beispiel »eth0«<br />
und »eth1« vertauscht werden, kann das<br />
je nach System gravierende Auswirkungen<br />
haben: von Sicherheitsproblemen bis<br />
zum Ausfall zentraler Serverdienste.<br />
Dauerhaft eingerichtet<br />
Damit ergibt sich die Forderung nach persistenten<br />
Gerätenamen. Einmal eingerichtete<br />
Netzwerkkarten sollen ihre Konfiguration<br />
dauerhaft beibehalten, unabhängig<br />
davon, ob man weitere Karten hinzufügt<br />
oder wegnimmt. Viele Distributionen lösen<br />
diese Anforderung über Udev durch<br />
die sogenannten Persistent-Net-Regeln.<br />
05 NAME=="", ENV{ID_NET_NAME_ONBOARD}!="", PROGRAM="/usr/bin/name_dev.py $env{ID_NET_NAME_ONBOARD}",<br />
NAME="%c"<br />
06 NAME=="", ENV{ID_NET_NAME_SLOT}!="", PROGRAM="/usr/bin/name_dev.py $env{ID_NET_NAME_SLOT}", NAME="%c"<br />
07 NAME=="", ENV{ID_NET_NAME_PATH}!="", PROGRAM="/usr/bin/name_dev.py $env{ID_NET_NAME_PATH}", NAME="%c"<br />
08 <br />
09 LABEL="net_name_slot_end"<br />
Sie finden sich im Verzeichnis »/etc/<br />
udev/rules.d« und sorgen für eine gleichbleibende<br />
Benennung der Geräte durch<br />
eine Zuteilung der Namen aufgrund der<br />
MAC-Adresse eines Gerätes.<br />
Problem: Virtualisierung<br />
Diese Lösung bereitet in der Cloud Probleme,<br />
da eine einzelne Linux-VM in der<br />
Regel sehr oft geklont wird. Jeder neue<br />
Klon erhält neue virtuelle Hardware und<br />
VMware, Libvirt oder auch der Administrator<br />
generieren für die virtuellen<br />
Netzwerkkarten neue MAC-Adressen,<br />
um doppelte MAC-Adressen im Netzwerk<br />
zu vermeiden. Die neuen Schnittstellen<br />
erhalten neue Namen mit aufsteigender<br />
Nummerierung, da die ursprünglichen<br />
Namen schon für andere MAC-Adressen<br />
reserviert sind. Damit zeigt sich ein großer<br />
Nachteil dieses Konzeptes: ein installiertes<br />
und konfiguriertes Linux kann<br />
nicht mehr auf einer anderen (virtuellen)<br />
Hardware ausgeführt werden, denn es<br />
ändert sich dann auch dessen Konfiguration.<br />
Der Systemverwalter muss manuell<br />
das geklonte System einrichten.<br />
Die oft vorgeschlagene und einfache Lösung,<br />
die Datei »70‐persistent‐net.rules«<br />
vor dem Klonen einfach zu löschen, ist<br />
leider nicht sehr nachhaltig: Bei vielen<br />
Distributionen wird beim nächsten Klon<br />
80 Ausgabe 05-2013 Admin www.admin-magazin.de
Udev<br />
Virtualisierung<br />
Abbildung 1: Ein geklonter SLES wartet beim Booten auf die Devices.<br />
Seit der Version v197 von Systemd gibt<br />
es weitere radikale Änderungen, um mit<br />
sogenannten vorhersagbaren Netzwerk-<br />
Interface-Namen [3] der Probleme Herr<br />
zu werden. Ähnlich wie durch »biosdevdiese<br />
Regeldatei durch eine Persistent-<br />
Net-Generator-Regel neu erzeugt. Auch<br />
eigene Änderungen in diesen Regeln im<br />
Verzeichnis »/lib/udev« sind ungünstig<br />
– bei einem Update des Udev-Pakets werden<br />
sie überschrieben. Tabelle 1 zeigt die<br />
Namen und Speicherorte der Regeln bei<br />
unterschiedlichen Distributionen.<br />
Bei der Arbeit mit Udev-Regeln ist zu<br />
beachten, dass es zu einem Wettlauf<br />
zwischen Kernel und den Udev-Rules<br />
kommen kann, wenn beide Namen der<br />
Form »eth*« vergeben wollen: Wer benennt<br />
zuerst das Netzwerk-Interface, der<br />
Kernel oder der Userspace? Daher wird<br />
auch empfohlen, für eigene Udev-Regeln<br />
den NICs andere Namen als »eth*«<br />
zu vergeben, wie zum Beispiel »net0«<br />
oder »wan1«. Wie so oft in der Open-<br />
Source-Welt werden Alternativen zu den<br />
Persistent-Net-Rules von verschiedenen<br />
Parteien auf unterschiedliche Weise entwickelt,<br />
auf die der Artikel im Folgenden<br />
näher eingeht.<br />
Lösungsansatz von Dell<br />
Dell beschreibt in einem Whitepaper [1]<br />
ein eigens entwickeltes Software-Paket<br />
namens »biosdevname«. Dieses Hilfswerkzeug<br />
für Udev vergibt Gerätenamen<br />
Tabelle 1: Udev-Speicherorte<br />
Distribution<br />
Ubuntu 12.10, Debian 7.0, SLES 11 SP2<br />
Open Suse, Red Hat 6<br />
Chakra Linux 2013.01<br />
auf Basis des Ortes, an dem sich die Hardware<br />
befindet. Damit entstehen gleichzeitig<br />
konsistente und aussagekräftige Namen<br />
für die Netzwerkkarten: NICs auf<br />
dem Mainboard beginnen mit dem Präfix<br />
»em«, gefolgt von der Portnummer von<br />
eins an gezählt. PCI-Karten haben folgendes<br />
Namensschema: »pSlotnummerpPort<br />
nummer«. Beispiele hierfür sind »em1«<br />
für das erste interne Interface und »p4p1«<br />
für den ersten Port einer Netzwerkkarte<br />
im Steckplatz Nummer 4.<br />
Das Hilfsprogramm liest die nötigen Informationen<br />
mit Hilfe der System Management<br />
BIOS Specification (SMBIOS<br />
[2]) aus. Diese Spezifikation beschreibt,<br />
wo das BIOS die nötigen Informationen<br />
über Steckplätze und Netzwerkkarten<br />
speichert. Falls das BIOS nicht die entsprechenden<br />
Einträge unterstützt, greift<br />
»biosdevname« auf die IRQ-Routing-Tabelle<br />
zurück.<br />
Lösungsansatz von<br />
Systemd ab v197<br />
Pfad<br />
• /etc/udev/rules.d/70-persistent-net.rules<br />
• /lib/udev/rules.d/75-persistent-net-generator.rules<br />
• /etc/udev/rules.d/70-persistent-net.rules<br />
• keine Net-Generator-Regeln seit 12.3. Stattdessen wird<br />
das Package »biosdevname« verwendet, um die NICs<br />
zu benennen.<br />
• /usr/lib/udev/rules.d/80-net-name-slot.rules<br />
• keine Net-Generator-Regeln, da Systemd v197<br />
name« erhalten Netzwerkkarten ihren<br />
Namen gemäß ihres eindeutigen Orts in<br />
der (virtuellen) Hardware (siehe Abbildung<br />
2).<br />
Zu Beginn stehen zwei Zeichen für die<br />
Art der Schnittstelle: »en« für Ethernet,<br />
»wl« für WLAN, »ww« für WWAN. Dann<br />
folgt die Unterscheidung nach Typ: »oIndex«<br />
steht für ein Onboard-Interface mit<br />
Ordnungsnummer, »sSlot« für Steckplatzkarten<br />
mit Ordnungsnummer und<br />
»pBussSlot« gibt die Lage der PCI-Karte<br />
wieder. Beispiele für das Resultat wären<br />
etwa »enp2s0« oder »enp2s1«. Das ist nur<br />
ein kleiner Ausschnitt des Namensschemas,<br />
weitere Informationen finden sich<br />
unter [4] und [5].<br />
Nachwirkungen<br />
Allerdings fordert die Namensrevolution<br />
ihre Opfer: Vor allem Programme im<br />
Enterprise-Umfeld und viele (Installations-)Skripte<br />
erwarten ein traditionelles<br />
Schema von Netzwerknamen nach dem<br />
Muster »eth*« und funktionieren auf einmal<br />
nicht mehr. In [3] findet sich als Lösungsansatz,<br />
die Datei »80‐net‐name‐slot.<br />
rules« umzukopieren:<br />
cp /usr/lib/udev/rules.d/80‐net‐name‐slot.U<br />
rules /etc/udev/rules.d/80‐net‐name‐slot.rules<br />
und die Regeln wie in Listing 1 gezeigt<br />
so zu ändern, dass sie Gerätenamen nach<br />
traditionellem Schema vergeben.<br />
In Listing 1 wird über die »PROGRAM«-<br />
Direktive ein kleines Python-Skript aufgerufen,<br />
das ein Mapping auf die alten<br />
Namen durchführt (Listing 2).<br />
Das Skript lässt sich ganz einfach durch<br />
Änderung der Schlüsselwertpaare in<br />
Zeile 4 an die eigene Umgebung anpassen.<br />
Damit werden nun die folgenden<br />
Bedingungen erfüllt:<br />
n Die Netzwerkkonfiguration ist nicht<br />
mehr abhängig vom Zufall. E<br />
Listing 2: »name_dev.py«<br />
01 #!/usr/bin/env python<br />
02 import sys<br />
03 <br />
04 dict = {'enp2s0':'eth0', 'enp2s1':'eth1'}<br />
05 <br />
06 if sys.argv[1] in dict:<br />
07 print dict[sys.argv[1]]<br />
08 else:<br />
09 print(sys.argv[1])<br />
10 exit(0)<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
81
Virtualisierung<br />
Udev<br />
entsprechenden Ordnungszahl<br />
Schnittstelle<br />
des Kernels (»%n«).<br />
Durch das Setzen eines MAC-<br />
Adressmusters, das den automatisch<br />
generierten MAC-<br />
Ethernet (en)<br />
WLAN (wl)<br />
Adressen des Hypervisors<br />
+<br />
entspricht, wird die Regel genauer<br />
Typ<br />
spezifiziert. Fügt man<br />
Onboard (o) Bus (p)<br />
+<br />
Index Nr.<br />
Schacht (s)<br />
dieser Regel eine passende Zuweisung<br />
voran, so ist es auch<br />
möglich, für eine VM-Vorlage<br />
eine andere Netzwerkkonfiguration<br />
zu verwenden als für<br />
die Klone. Bestehende Persistent-Net-Regeln<br />
werden weder<br />
=<br />
beim Update noch durch den<br />
eno2<br />
...<br />
enp5s0 wlp3s0<br />
Net-Generator überschrieben.<br />
Bekanntlich gibt es für jede<br />
Regel auch eine Ausnahme,<br />
Abbildung 2: Benennung der Netzwerkschnittstellen durch<br />
»systemd«.<br />
so auch hier: Die Udev-Regeln<br />
gehen davon aus, dass der Hypervisor<br />
(oder die Hardware)<br />
n Das traditionelle Namensschema wird<br />
beibehalten.<br />
n Die Systeme können in der Cloud beliebig<br />
oft geklont werden.<br />
Diese Systemd-Version kann man bei<br />
Chakra Linux [6] ab 2013.01 ausprobieren;<br />
bei anderen Distributionen wird es<br />
noch etwas dauern. Fedora 19 soll diese<br />
Version ebenfalls verwenden.<br />
die Geräte immer in der konfigurierten<br />
Reihenfolge aktiviert und diese damit dem<br />
Kernel in derselben Reihenfolge bekannt<br />
werden. Für KVM und VMware geht das<br />
Konzept auf – bei Hyper-V scheint das<br />
nicht der Fall zu sein (siehe dazu [7]).<br />
Hier bleibt dann nur die Lösung über<br />
das Biosdevnames-Paket oder eben die<br />
manuelle Nacharbeit.<br />
Im Endeffekt umgeht man mit diesen<br />
Ein Workaround<br />
Regeln die Generatoren für die Persistent-<br />
Net-Regeln und ist damit befreit von den<br />
Den neuen Bemühungen zum Trotz hat<br />
man es im Alltag noch oft genug mit den<br />
Generator-Regeln zu tun (siehe Tabelle 1).<br />
Glücklicherweise ist das Udev-Regelwerk<br />
mächtig genug, um sich selbst aus der<br />
Schlinge zu ziehen. Der folgende Trick<br />
(Listing 3) nutzt den Umstand aus, dass<br />
nach erfolgter Zuweisung eines Namens<br />
für ein Gerät keine weiteren zutreffenden<br />
Regeln ausgeführt werden. Damit vergibt<br />
die Udev-Regel einfach den vom Kernel<br />
vorgeschlagenen Namen (»eth*«) mit der<br />
Nachteilen, die sie mit sich bringen. Ein<br />
weiterer Vorteil dieser Vorgehensweise<br />
ist, dass die traditionellen Gerätenamen<br />
(»eth*«) beibehalten werden und damit<br />
Anwendungen und Skripte, die sich exakt<br />
auf diese Namensgebung verlassen, weiterhin<br />
funktionieren. Es bleibt allerdings<br />
bei der Schwierigkeit, dass der Kernel<br />
den Geräten nach der Reihenfolge ihres<br />
Erscheinens während des Bootvorgangs<br />
entsprechende Gerätenummern vergibt.<br />
Die Regeln im Listing 3 lassen sich somit<br />
Listing 3: »70‐persistent‐net.rules«<br />
01 Regel für KVM:<br />
02 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:*", KERNEL=="eth*",<br />
NAME="eth%n"<br />
03 Regel für VMware:<br />
04 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:*", KERNEL=="eth*",<br />
NAME="eth%n"<br />
05 Regel für Xen:<br />
06 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:16:3E:*", KERNEL=="eth*",<br />
NAME="eth%n"<br />
nur in Umgebungen erfolgreich einsetzen,<br />
bei denen diese Reihenfolge immer<br />
gleich ist.<br />
Fazit<br />
Jeder der gezeigten Lösungsansätze hat<br />
seine Vor- und Nachteile. Mit dem Workaround<br />
für die Cloud habe ich auf SLES,<br />
Ubuntu, VMware, KVM und Hardware-<br />
Blades bisher gute Erfahrungen gemacht.<br />
Leider ist eine Rundum-sorglos-Lösung<br />
im Udev-Umfeld nicht in Sicht. Biosdevnames<br />
und Systemd brechen mit den<br />
alten Konventionen. Für Systemd gibt<br />
es hier eine Lösung durch Anpassung<br />
der Regel in Verbindung mit einem Hilfsskript.<br />
Systemd wird sich mit seinem<br />
Ansatz wohl in den nächsten Versionen<br />
bei den entsprechenden Distributionen<br />
durchsetzen. Spannend wird es auch<br />
bei Ubuntu, wo es bei den bestehenden<br />
Udev-Regeln zu bleiben scheint. Schön<br />
wäre allerdings ein Admin-freundlicher<br />
Ansatz, bei dem man nur durch Editieren<br />
einer Konfigurationsdatei passende und<br />
gleichbleibende Namen für seine Netzwerkkarten<br />
vergeben kann. (ofr) n<br />
Infos<br />
[1] Consistent Network Device Naming<br />
in Linux: [http:// linux. dell. com/ files/<br />
whitepapers/ consistent_network_device_<br />
naming_in_linux. pdf]<br />
[2] System Management BIOS:<br />
[http:// en. wikipedia. org/ wiki/ System_Management_BIOS]<br />
[3] Predictable Network Interface Names:<br />
[http:// www. freedesktop. org/ wiki/<br />
Software/ systemd/ PredictableNetworkInte<br />
rfaceNames]<br />
[4] RFC: Predictable Network: [http:// www.<br />
mail‐archive. com/ systemd‐devel@lists.<br />
freedesktop. org/ msg07875. html]<br />
[5] udev-builtin-net_id.c: [http:// cgit.<br />
freedesktop. org/ systemd/ systemd/ plain/<br />
src/ udev/ udev‐builtin‐net_id. c]<br />
[6] Chakra: [http:// www. chakra‐project. org/]<br />
[7] Red Hat 5.5 virtual machine NICs bind to<br />
different configurations: [http:// support.<br />
microsoft. com/ kb/ 2665504]<br />
Der Autor<br />
Martin Braun ist Senior Consultant und DevOps-<br />
Entwickler im Cloud-Umfeld und Linux-Fan seit<br />
Suse Linux 5.3.<br />
82 Ausgabe 05-2013 Admin www.admin-magazin.de
Test<br />
Oracle 12c<br />
© Jakub Jirsak, 123RF<br />
Oracle Database 12c: Cloud Computing mit Multitenant-Architektur<br />
Datenbank zum<br />
Einstöpseln<br />
Mehr als 500 neue Features sind in das aktuelle Release Oracle Database 12c eingeflossen. Sie sollen unter anderem<br />
die Sicherheit, die Hochverfügbarkeit und Analysemöglichkeiten verbessern, bieten aber auch eine neue<br />
Architektur, die mit ihren Pluggable Databases die Verwaltung einer Private und Public Database Cloud sowie die<br />
Konsolidierung von Datenbanken erleichtert. Andrea Held, Ronny Egner<br />
Rund fünf Jahre Entwicklungszeit waren<br />
für das neue Release erforderlich. Die eigentliche<br />
Veröffentlichung erfolgte dann<br />
eher still und leise, ohne Paukenschlag<br />
und großes Tamtam, wie sonst üblich.<br />
Die aktuelle Version kann seit Ende Juni<br />
aus dem Oracle Technology Network<br />
(OTN) heruntergeladen werden. Sie sollte<br />
eigentlich früher veröffentlicht werden,<br />
dann musste man aber doch etwas länger<br />
testen, um eine möglichst fehlerfreie Software<br />
auf den Markt zu bringen.<br />
Aktuell steht das neue Release für Linux<br />
und Solaris zur Verfügung. Versionen<br />
für Windows, IBM AIX und HPUX sollen<br />
in Kürze folgen. Auch ein Release<br />
für BS2000-Plattformen wird es wieder<br />
geben. Für die Aktualisierung will der<br />
Hersteller erneut spezielle Upgrade-<br />
Assistenten bereitstellen. Sogar der direkte<br />
Schritt von der älteren Releases 8i<br />
und 9i auf 12c soll möglich sein. Voraussetzung<br />
hierfür ist, dass die Datenbank<br />
den aktuellen Patch-Stand aufweist.<br />
Oracle will über die bekannten Lizenzmodelle<br />
hinaus auch einen eigenen Cloud-<br />
Dienst mit flexiblen Preisen anbieten. Ob<br />
und wie dies bei den Kunden ankommen<br />
wird, ist eine spannende Frage: Nicht erst<br />
nach den jüngsten Berichten über PRISM<br />
stehen viele Unternehmenskunden den<br />
Public-Cloud-Modellen eher skeptisch<br />
gegenüber. Doch neben der Public Cloud<br />
gibt es künftig einfache Möglichkeiten,<br />
auch im eigenen Unternehmen mit der<br />
neuen Multitenant-Architektur eine flexible<br />
und gut konsolidierbare Datenbank-<br />
Landschaft bereitzustellen. Die neue<br />
Multitenant-Architektur bildet so eine Voraussetzung<br />
für Database as a Service.<br />
Neues Paradigma<br />
Eine der wichtigsten Neuerungen ist die<br />
Mandantenfähigkeit der neuen Architektur.<br />
Sie soll Cloud Computing erleichtern,<br />
gleich ob in einer öffentlichen oder in<br />
der Private Cloud eines Unternehmens.<br />
Aber auch Hardware-Ressourcen und<br />
der Verwaltungsaufwand lassen sich so<br />
reduzieren.<br />
84 Ausgabe 05-2013 Admin www.admin-magazin.de
Oracle 12c<br />
Test<br />
Die neue Architektur wird vor allem jenen<br />
Kunden zugutekommen, die bisher<br />
zahlreiche einzelne Instanzen im Einsatz<br />
haben. Bis zu 253 Datenbanken können<br />
nun in eine Instanz gepackt werden. So<br />
sollen sich Hardware-Kapazitäten wie<br />
Arbeitsspeicher, CPU-Leistung und Storage<br />
gemeinsam und effizienter nutzen<br />
lassen. Auch das Einspielen von Patches,<br />
Upgrades der Datenbanksoftware sowie<br />
Backup- und Recovery-Funktionen werden<br />
einfacher (Abbildung 2).<br />
Bei dem Konzept der Pluggable Database<br />
handelt es sich um eine grundsätzliche<br />
Veränderung des bisherigen Oracle-Paradigma,<br />
demzufolge eine Instanz (oder<br />
mehrere Instanzen eines Clusters) immer<br />
nur genau eine Datenbank öffnen konnten.<br />
Mit der Einführung der Pluggable<br />
Database ändert sich das: Es ist möglich,<br />
mit einer Instanz mehrere Datenbanken<br />
zu öffnen und zu betreiben. Oracle zielt<br />
damit auf eine maximale Datenbank-<br />
Konsolidierung ab, ohne das dafür Virtualisierung<br />
nötig wäre. Nach Meinung der<br />
Autoren kann die neue Architektur die<br />
Virtualisierung auf Hostebene in großen<br />
Umgebungen überflüssig machen.<br />
Um dies zu erreichen, erweitert Oracle<br />
die Datenbank um eine weitere Ebene: Es<br />
gibt zukünftig die sogenannte Container<br />
Database (CDB), die bis zu 253 Pluggable<br />
Databases (kurz: PDBs) aufnimmt<br />
(Abbildung 1). Diese erscheinen für den<br />
Anwender wie normale Datenbanken –<br />
und sie verhalten sich auch so. Anpassungen<br />
am Programmcode einer Anwendung<br />
sind bis auf ganz wenige Fälle nicht<br />
notwendig, da der Namensraum jeder<br />
Datenbank individuell ist.<br />
Die CDB selbst ist eine Instanz mit zugehörigem<br />
Speicher und Prozessen (wie<br />
zum Beispiel dem Logwriter LGWR, dem<br />
DBWriter DBWn, Checkpointer CKPT,<br />
und so weiter). Die PDBs dagegen haben<br />
keine eigenen Hintergrundprozesse<br />
– die Verarbeitung wird von den Hintergrundprozessen<br />
der Container Database<br />
erledigt.<br />
Das Data Dictionary mit den Metadaten<br />
speichert – wie in den Releases zuvor –<br />
Informationen wie Benutzer und Berechtigungen,<br />
Informationen über Tabellen,<br />
Indizes, Views und alle weiteren Datenbankobjekte.<br />
Dieses Data Dictionary wird<br />
in der Multitenant-Architektur jedoch in<br />
der CDB gespeichert. Die einzelnen PDBs<br />
Die Verteilung der Ressourcen zwischen<br />
den einzelnen Datenbanken erfolgt mit<br />
dem per Default aktivierten Ressource<br />
Manager von Oracle. Jede Datenbank erhaben<br />
intern lediglich Pointer auf die entsprechenden<br />
Bereiche in der Container<br />
Database. In ihr sind die Objekte des<br />
Data Dictionary definiert. Die eigentlichen<br />
Daten des Data Dictionary wie zum<br />
Beispiel die Rows in der Tabelle »OBJ$«<br />
sind in den jeweiligen Pluggable Databases<br />
abgelegt, sodass diese Daten beim<br />
Kopieren der Datenbank mitgenommen<br />
werden können.<br />
Effizienter durch Container<br />
Dieses Konzept ermöglicht die Trennung<br />
von Metadaten – also der Beschreibung<br />
des Data Dictionary – von den eigentlichen<br />
Daten, dem Inhalt des Data Dictionary.<br />
Zum einen ist es dadurch möglich,<br />
die einzelnen PDBs beliebig zu transportieren.<br />
Sie können entweder innerhalb<br />
eines oder auch zwischen verschiedenen<br />
Containern verlegt werden. Zum anderen<br />
erlaubt dies ab der Version 12c schnellere<br />
Upgrades: Statt wie bisher das Data<br />
Dictionary mittels »catproc« upzugraden,<br />
genügt es künftig, die PDB in eine<br />
Container Database der Version 12c+1<br />
„einzupluggen“, um diese auf die Nachfolgeversion<br />
zu aktualisieren.<br />
Wie bereits beschrieben verfügen die<br />
einzelnen PDBs über keine eigenen<br />
Speicherbereiche oder Prozesse. Hierdurch<br />
wird eine bessere Auslastung der<br />
Ressourcen erreicht, da zum einen wesentlich<br />
weniger Prozesse um die ver-<br />
Abbildung 1: Eine Container Database nimmt mehrere Pluggable Databases auf.<br />
fügbaren CPU-Kerne konkurrieren und<br />
so weniger Context-Switches notwendig<br />
werden, und zum anderen wesentlich<br />
mehr Speicher für den Buffer Cache oder<br />
den Shared Pool bereitsteht, da die mindestens<br />
350 MByte SGA für den Betrieb<br />
einer Instanz für die CDB und nicht für<br />
die PDBs gelten. Dies kann man sich mit<br />
einem einfachen Rechenbeispiel vergegenwärtigen:<br />
Bei zehn Datenbanken in<br />
der Version 11g werden mindestens 10 x<br />
350 MByte, also rund 3,5 GByte Speicher<br />
benötigt, um jede Instanz für sich überhaupt<br />
starten zu können. Der Buffer Pool<br />
und der Shared Pool haben hier kaum<br />
Platz, um ihren Funktionen nachkommen<br />
zu können. Ebenso hat man als Resultat<br />
mindestens 10 x 6 Hintergrundprozesse,<br />
die um die CPU konkurrieren. Nutzt man<br />
nun das Konzept der Pluggable Databases<br />
und lässt die zehn Datenbanken als<br />
PDBs in einer CDB laufen, so bleiben davon<br />
lediglich 6 Prozesse und 350 MByte<br />
Speicher zum Betreiben der CDB übrig.<br />
Die restlichen 3,15 GByte im Vergleich<br />
zur alten Architektur kann man mit dem<br />
neuen Konzept bereits für den Buffer<br />
Cache oder den Shared Pool nutzen.<br />
Ressourcen-Management<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
85
Test<br />
Oracle 12c<br />
hält standardmäßig einen gleichmäßigen<br />
Anteil an den Ressourcen. Bei zwei Datenbanken<br />
bekommt jede die Hälfte, bei<br />
drei ein Drittel der Ressourcen, bei vier<br />
ein Viertel und so weiter. Die Verteilung<br />
kann aber bei Bedarf auch angepasst werden.<br />
Diese Anpassungen können auch<br />
innerhalb der PDBs erfolgen. So sind zum<br />
Beispiel garantierte Anteile an der CPUbeziehungsweise<br />
Begrenzungen der CPU-<br />
Last einstellbar. Eine Begrenzung der<br />
I/O-Last ist jedoch nur auf Oracles eigener<br />
Exadata-Hardware möglich.<br />
Die physikalischen Speicherstrukturen<br />
der Datenbanken im Storage sind dagegen<br />
kaum verändert. So befinden sich die<br />
Control Files, Redo Logs, die Flashback<br />
Logs und der UNDO-Tablespace nach<br />
wie vor auf der Ebene des Containers.<br />
Der SYSTEM- und SYSAUX-Tablespace<br />
in der Container Database bildet das<br />
globale Data Dictionary; die gleichnamigen<br />
Tablespaces in den einzelnen PDBs<br />
speichern hingegen nur die eigentlichen<br />
Nutzdaten des Data Dictionary. Der temporäre<br />
Tablespace – der vergleichbar dem<br />
Swapspace auf Betriebssystemebene ist<br />
– kann global für alle Datenbanken und/<br />
oder lokal angelegt werden. Für die Ablage<br />
von Daten kann man auf allen Ebenen<br />
User-Tablespaces anlegen. Da der<br />
Namensraum für jede Datenbank individuell<br />
ist, ist ein Zugriff über PDB-Grenzen<br />
hinaus außer über Datenbank-Links<br />
nicht möglich – auch wenn die Daten<br />
sich in derselben CDB befinden. Generell<br />
ist es beim Einsatz dieser Technologie<br />
nicht empfehlenswert, Benutzerobjekte<br />
in der Containerdatenbank abzulegen, da<br />
diese bei einer Migration manuell übertragen<br />
werden müssten. Perspektivisch<br />
plant Oracle, diese Möglichkeit ganz abzuschalten.<br />
Für das Management des Speicherplatzes<br />
gibt es die Möglichkeit, den pro Datenbank<br />
maximal belegbaren Speicherplatz<br />
zu beschränken, sodass innerhalb dieser<br />
Grenzen ein Management durch weniger<br />
erfahrene DBAs möglich wird.<br />
Rechte und Rollen<br />
Der Verwaltung von Benutzern und<br />
Rollen kommt in einer hochgradig konsolidierten<br />
Umgebung natürlich eine<br />
Schlüsselfunktion zu. Beim Einsatz der<br />
Pluggable Database ist zwischen sogenannten<br />
Common- und Local-Benutzern<br />
und -Rollen zu unterscheiden. Common<br />
– oder besser global – sind Benutzer und<br />
Rollen dann, wenn sie auf Ebene der<br />
CDB angelegt sind und sich damit in alle<br />
vorhandenen und zukünftigen PDBs vererben.<br />
Man erkennt solche Benutzer am<br />
Präfix »C##«. Diese globalen User können<br />
sich in jede PDB konnektieren, zu der sie<br />
über die entsprechenden Grants Zugang<br />
haben. Auf Ebene der PDB lassen sich<br />
die Rechte über die durch die Common-<br />
Rollen erteilten Berechtigungen hinaus<br />
noch erweitern. So ist es möglich, einem<br />
globalen Benutzer in einer Datenbank<br />
DBA-Rechte zu geben, während sich derselbe<br />
Benutzer zur selben Zeit mit einer<br />
anderen Datenbank erst gar nicht verbinden<br />
darf.<br />
Die Verbindung der Benutzer zu einer<br />
Datenbank erfolgt genau wie in älteren<br />
Releases über den Listener_Prozess beziehungsweise<br />
über den Scan-Listener.<br />
Pro Pluggable Database gibt es per Default<br />
genau einen gleichnamigen Service,<br />
der aber noch um zusätzliche Services<br />
ergänzt werden kann.<br />
Einschränkungen<br />
Bei all den Vorteilen gibt es auch Einschränkungen<br />
im Betrieb einer solchen<br />
Umgebung. Offensichtlich ist zunächst<br />
Listing 1: ErstellEN einer PDB<br />
01 select * from CDB_PDBS order by pdb_id;<br />
02 SQL> PDB_ID PDB_NAME D BID CON_UID GUID STATUS CREATION_SCN<br />
03 =====================================================================;<br />
04 2 PDB$SEED 4062623230 4062623230 E0C9D94CE3B6497BE04380B0A8C06105<br />
NORMAL 1720734 1<br />
05 SQL> select name from v$datafile order by 1;<br />
06 ====================================================================;<br />
07 DATA01/CDB1/DATAFILE/sysaux.256.820013801<br />
08 DATA01/CDB1/DATAFILE/sysaux.257.820013845<br />
09 DATA01/CDB1/DATAFILE/undotbsl.259.820013893<br />
10 DATA01/CDB1/DATAFILE/users.258.820013891<br />
11 DATA01/CDB1/DD7C48AA5A4404A2E04325AAE80A403C/DATAFILE/<br />
sysaux.265.820013923<br />
12 DATA01/CDB1/DD7C48AA5A4404A2E04325AAE80A403C/DATAFILE/<br />
system.266.820013923<br />
13 <br />
14 6 rows selected<br />
15 ;<br />
16 SQL> create pluggable database pdb001 admin user admin identified by;<br />
17 <br />
18 Pluggable database created.<br />
19 <br />
20 SQL> alter pluggable database pdb001 open;<br />
21 <br />
22 Pluggable database altered.<br />
23 <br />
24 SQL> select * from CDB_PDBS order by pdb_id;<br />
25 <br />
26 PDB_ID PDB_NAM DBID CON_UID GUID STATUS<br />
CREATION_SCN CON_ID<br />
27 ‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐<br />
28 2 PDB$SEED 4062623230 4062623230 E0C9D94CE3B6497BE04380B0A8C06105 NORMAL<br />
1720734 1<br />
29 3 PDB001 1700339437 1700339437 E0D0BE79135B75B0E04380B0A8C00F14 NORMAL<br />
1956354 1<br />
30 <br />
31 SQL> select name from v$datafile;<br />
32 <br />
33 NAME<br />
34 ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐<br />
35 +DATA01/CDB1/DATAFILE/sysaux.256.820013801<br />
36 +DATA01/CDB1/DATAFILE/system.257.820013845<br />
37 +DATA01/CDB1/DATAFILE/undotbs1.259.820013893<br />
38 +DATA01/CDB1/DATAFILE/users.258.820013891<br />
39 +DATA01/CDB1/DD7C48AA5A4404A2E04325AAE80A403C/DATAFILE/<br />
sysaux.265.820013923<br />
40 +DATA01/CDB1/DD7C48AA5A4404A2E04325AAE80A403C/DATAFILE/<br />
system.266.820013923<br />
41 +DATA01/CDB1/E0D0BE79135B75B0E04380B0A8C00F14/DATAFILE/<br />
sysaux.271.820043565<br />
42 +DATA01/CDB1/E0D0BE79135B75B0E04380B0A8C00F14/DATAFILE/<br />
system.275.820043565<br />
86 Ausgabe 05-2013 Admin www.admin-magazin.de
Test<br />
Oracle 12c<br />
einmal, dass alle PDBs einer CDB die gleiche<br />
Datenbankversion haben. Weiterhin<br />
müssen alle Datenbanken den gleichen<br />
Zeichensatz verwenden – verschiedene<br />
Zeichensätze sind nicht möglich. Hier<br />
bietet sich Unicode an. Um Migrationen<br />
nach Unicode einfacher zu gestalten,<br />
wurde als neues Feature in der 12c die<br />
maximal mögliche Spaltenbreite von<br />
VARCHAR2-Spalten von 4 KByte auf 32<br />
KByte erweitert. Fehler, die durch das<br />
Erreichen der maximal möglichen Spaltenbreite<br />
bei der Konvertierung nach<br />
Unicode hervorgerufen wurden, gehören<br />
damit der Vergangenheit an.<br />
Parallel dazu gibt es ebenfalls Einschränkungen<br />
bezüglich der pro Pluggable<br />
Database individuell beeinflussbaren<br />
Datenbankparameter. Eine Übersicht der<br />
modifizierbaren Parameter kann man mit<br />
folgender Abfrage erhalten:<br />
select name from v$parameter where U<br />
ISPDB_MODIFIABLE ='TRUE' order by 1<br />
Hauptsächlich die Tuning-Parameter wie<br />
»OPTIMIZER_***« und »PARALLEL_***«<br />
sowie die NLS-Parameter sind individuell<br />
pro PDB modifizierbar.<br />
Unterstützung der Cloud-<br />
Architektur<br />
Dafür, dass die Multitenant-Architektur<br />
mit Container- und Pluggable-Datenban-<br />
ken in der ersten Version vorliegen, ist<br />
die Unterstützung durch die Oracle-Werkzeuge<br />
bereits weit fortgeschritten. So ist<br />
die Pluggable Database vollständig RACfähig,<br />
der RMAN ist in der Lage, Backups<br />
und Wiederherstellungen auf Ebene der<br />
PDB vorzunehmen – dies bei Wiederherstellungen<br />
sogar bis hinunter zu Tabellen<br />
– und die Integration in Standby-Datenbanken<br />
mit Data Guard wird ebenfalls<br />
unterstützt. Einzige Einschränkung bei<br />
Data Guard ist, dass ein Schwenk nur<br />
auf Ebene des Containers möglich ist<br />
und eine automatische Integration einer<br />
neuen PDB auf der Standby-Seite nur<br />
in Verbindung mit der zusätzlich kostenpflichtigen<br />
Active-Data-Guard-Option<br />
möglich ist.<br />
Datenbanken<br />
implementieren<br />
Das Anlegen einer PDB erfordert zunächst<br />
einmal, dass die 12c-Datenbank als Container<br />
Database angelegt wurde. Hat der<br />
DBA dies bei der Erstellung nicht explizit<br />
ausgewählt beziehungsweise mit dem<br />
Schlüsselwort »ENABLE PLUGGABLE<br />
DATABASE« aktiviert, handelt es sich um<br />
eine normale Datenbank ohne Möglichkeit<br />
der Aufnahme weiterer Datenbanken.<br />
In diesem Fall muss die Datenbank<br />
neu angelegt werden. Die Erstellung einer<br />
PDB erfolgt immer als Kopie einer bereits<br />
vorhandenen PDB. Dies ist entweder die<br />
sogenannte Seed Database »PDB$SEED«,<br />
die beim Erstellen des Containers implizit<br />
mitangelegt wird und nicht verändert<br />
werden kann, oder eine beliebige<br />
andere PDB. Sie muss sich allerdings für<br />
den Zeitraum der Erstellung im »OPEN<br />
READ‐ONLY«-Status befinden. Zusätzlich<br />
muss ein PDB-Administrator angegeben<br />
werden, der die Rolle »PDB_DBA« innehat.<br />
Diese Rolle ist aber per Default<br />
mit keinerlei Berechtigungen ausgestattet.<br />
Sofern gewünscht können aber bei<br />
Erstellung der PDB dieser Rolle weitere<br />
Rechte und Rollen zugewiesen werden.<br />
Bevor die PDB erstellt werden kann,<br />
muss noch für die Eindeutigkeit der resultierenden<br />
Dateinamen gesorgt werden.<br />
Dies geschieht entweder manuell über<br />
den Parameter »FILE_NAME_CONVERT«<br />
oder automatisch durch die Nutzung von<br />
OMF. Die Autoren raten hier der Einfachheit<br />
halber zur Nutzung von OMF und<br />
ASM (Listing 1).<br />
Wie in Listing 1 zu sehen ist, müssen<br />
PDBs vor der Nutzung und nach jedem<br />
Start der Instanz manuell geöffnet werden.<br />
Hierzu kann man einen Trigger<br />
schreiben oder aber die Grid-Infrastruktur<br />
benutzen. Über Oracle Restart lassen<br />
sich wie gehabt Ressourcen und ihre Abhängigkeiten<br />
registrieren, überwachen,<br />
gegebenenfalls automatisch neu starten<br />
beziehungsweise in der richtigen Reihenfolge<br />
starten und stoppen. Dies geht mit<br />
PDBs über Services. Sobald man einen<br />
Service anlegt und diesen mit einer PDB<br />
verknüpft, wird die verknüpfte Datenbank<br />
automatisch geöffnet, wenn der<br />
entsprechende Service startet.<br />
Die verfügbaren Informationen auf Ebene<br />
der CDB und der PDB folgen dem Prinzip<br />
der Sichtbarkeit. So enthält ein AWR-<br />
Report – ausgeführt in einer PDB – nur<br />
Informationen über die bestreffende PDB.<br />
Ein AWR-Report auf Ebene der CDB enthält<br />
hingegen Informationen über alle<br />
Datenbanken. Ähnlich verhält es sich mit<br />
den zusätzlichen Views mit dem Präfix<br />
»CDB_«. Sie enthalten Informationen<br />
über alle PDBs.<br />
Upgrade-Pfade<br />
Abbildung 2: Auch das notwendige Updaten und Patchen der Datenbank macht das neue Oracle-Release für den<br />
Administrator nun deutlich einfacher.<br />
Der Weg von einer Non-PDB zu einer<br />
PDB erfolgt auf drei Arten: Export/Import<br />
mittels DataPump (ab 10g Release 1;<br />
88 Ausgabe 05-2013 Admin www.admin-magazin.de
Oracle 12c<br />
Test<br />
ältere Versionen müssen gegebenenfalls<br />
einen Zwischenschritt machen), Golden-<br />
Gate oder Umwandlung einer Non-CDB<br />
in eine PDB. Hierbei muss die 10g- oder<br />
11g-Datenbank auf 12c aktualisiert werden<br />
(Abbildung 3). Bei der Umwandlung<br />
kann die Datenbank nach dem Upgrade<br />
auf 12c mit dem Package DBMS_PDB in<br />
eine PDB konvertiert und in eine CDB<br />
eingestöpselt werden. Direkte Upgrades<br />
sind bisher von 10.2.0.5, 11.1.0.7 und<br />
11.2.0.2 und höher möglich; das Resultat<br />
ist dann zunächst eine Non-CDB.<br />
Die Nutzung dieses neuen Konzepts<br />
setzt die Enterprise Edition voraus und<br />
benötigt darüber hinaus zusätzlich die<br />
Multitenancy-Lizenz. Sie kostet nach Listenpreis<br />
genauso viel wie die Enterprise<br />
Edition an sich. Die Standard Edition<br />
kann auch PDBs benutzen – allerdings<br />
ist da die Anzahl der möglichen Datenbanken<br />
auf eine begrenzt. Dies mag wie<br />
ein schlechter Scherz klingen, aber in<br />
der nächsten Version 12.2 wird es keine<br />
klassischen Non-CDB-Datenbanken mehr<br />
geben, sodass Non-PDB-Datenbanken<br />
konvertiert werden müssten – auch in<br />
der Standard Edition.<br />
Hierarchical Storage<br />
Management<br />
Ebenfalls neu in der Version 12c ist die<br />
Möglichkeit, Tabellen, Partitionen oder<br />
Blöcke basierend auf dem letzten Zugriff<br />
(schreibend wie lesend, Full-Table-Scan<br />
wie Einzelzugriff) automatisch Regeln zu<br />
unterwerfen, die beschreiben, was mit<br />
dem Objekt nach Ablauf der jeweiligen<br />
Frist passieren soll. Diese Regeln sehen<br />
beispielsweise vor, dass nach einer frei<br />
definierbaren Menge an Tagen seit dem<br />
letzten lesenden/schreibenden Full- Table-<br />
Scan beziehungsweise Single-Row-Access<br />
die betreffende Tabelle, Partition oder der<br />
Block entweder komprimiert und/oder<br />
in einen anderen Tablespace verschoben<br />
werden kann.<br />
So ist es zum Beispiel möglich, eine Partition<br />
nach 30 Tagen ohne Zugriff mittels<br />
Advanced Compression zu komprimieren,<br />
um Platz zu sparen. Nach 60 Tagen ohne<br />
Zugriff kann abermals die Kompression<br />
durch den Einsatz von (E)HCC erhöht<br />
werden und nach 90 Tagen ohne Zugriff<br />
kann die bereits komprimierte Partition<br />
in einen anderen Tablespace verschoben<br />
werden, der sich auf einem langsameren,<br />
aber billigeren Storage befindet. Auf<br />
diese Art und Weise kann die Datenbank<br />
häufig genutzte von selten verwendeten<br />
Daten trennen sowie letztere automatisch<br />
komprimieren und auf billigeren Storage<br />
verlagern.<br />
Flex Cluster / Flex ASM<br />
Ebenfalls neu in der Version 12c ist das<br />
Konzept des Flex ASM (Automatic Storage<br />
Management). Es ermöglicht die<br />
Nutzung einer ASM-Instanz, die nicht<br />
lokal auf dem Server läuft. Die Übertra-<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
89
Test<br />
Oracle 12c<br />
gung der Daten erfolgt über ein Netzwerk<br />
(Ethernet oder Infiniband). Im Extremfall<br />
ermöglicht dieses neue Feature eine<br />
Konsolidierung und Trennung des Storage<br />
von den Datenbanken, indem ein<br />
zentraler Storage-Cluster aufgebaut wird,<br />
auf den alle anderen Datenbanken im<br />
Unternehmen zugreifen. Flex ASM ist die<br />
Voraussetzung für ein weiteres, neues<br />
Feature, das die Anzahl der Knoten und<br />
damit die verfügbare Rechenleistung in<br />
einem RAC steigert, ohne dass jeder Knoten<br />
einen Zugriff auf den Shared Storage<br />
benötigt: Flex Cluster.<br />
Flex Cluster bestehen aus Hub- und Leaf-<br />
Nodes. Ein Hub Node ist ein Knoten, der<br />
direkten Zugriff (zum Beispiel per LAN)<br />
auf den Storage hat. Ein Leaf Node hingegen<br />
hat nur indirekt über Flex ASM Zugriff<br />
auf den Storage – ist aber dennoch<br />
ein vollwertiges Mitglied der Clusters.<br />
Application Continuity<br />
Vor einigen Jahren revolutionierte die<br />
Einführung von TAF (Transparent Application<br />
Failover) die bis dato gängigen<br />
Cluster-Konzepte, bei dem durch einen<br />
Knotenausfall abgebrochene SELECT-<br />
Statements (unter bestimmten Bedingungen)<br />
transparent für den Anwender<br />
auf einem verbleibenden Knoten erneut<br />
ausgeführt werden konnten. Mit der Version<br />
12c erweitert Oracle dieses Konzept<br />
auf alle Transaktionen und nennt dieses<br />
Feature Application Continuity. Im besten<br />
Fall bleibt ein Ausfall eines Knotens<br />
im RAC damit für den Anwender völlig<br />
unbemerkt – egal was für eine Art von<br />
Transaktion er gerade ausgeführt hatte.<br />
Allerdings bedingt dies Anpassungen am<br />
Client und ist an die Nutzung bestimmter<br />
Klassen und Bibliotheken gebunden.<br />
Derzeit wird JDBC Thin, UCP und Web-<br />
Logic unterstützt. Die Unterstützung für<br />
PeopleSoft, Siebel und Oracle Fusion ist<br />
in Arbeit.<br />
Kleine Perlen<br />
Neben all den großen Features gibt es<br />
auch kleinere nützliche Erweiterungen:<br />
n So ist es nun möglich, ein Datenfile<br />
online zu verschieben.<br />
n Neben den bekannten Rollen SYSDBA<br />
und SYSOPER gibt es nun weitere Rollen<br />
zur Abstufung der vorhandenen<br />
Berechtigungen: SYSBACKUPDBA für<br />
Backup und Recovery, SYSDGDBA für<br />
Data Guard und SYSKMDBA zur Verwaltung<br />
der Wallets.<br />
n Weiterhin erhielt Data Guard über die<br />
Far-Sync-Standby-Option die Möglichkeit,<br />
synchrone Replikationen<br />
über größere Entfernungen als 40<br />
bis 100 km zu ermöglichen, indem<br />
ein lokaler Hub die Daten synchron<br />
entgegennimmt und die Daten dann<br />
asynchron an die Remote-Standby-<br />
Seite transportiert. Der Switchover<br />
selbst erfolgt zwischen Primary- und<br />
Remote-Standby – der lokale Hub ist<br />
darin nicht involviert.<br />
n Abgebrochene Switchover können nun<br />
wieder aufgenommen werden.<br />
n DML auf temporären Tabellen in einer<br />
Standby-Datenbank erzeugt kein Redo<br />
und ermöglicht so die Speicherung<br />
von Daten in temporären Tabellen in<br />
einer Standby-Datenbank.<br />
n Sequenzen der Primary-DB können<br />
auch in der Standby genutzt werden.<br />
n Datenbankupgrades ohne Downtime<br />
sind nun (fast) automatisiert.<br />
n Die Größe der PGA ist jetzt mittels des<br />
Parameters PGA_AGGREGATE_SIZE_<br />
LIMIT begrenzbar.<br />
n Das Patch Inventory ist direkt aus der<br />
Datenbank abfragbar.<br />
n ACFS (Cluster-Filesystem) unterstützt<br />
nun die Ablage aller Datenfiles. ACFS-<br />
Snapshots können beschreibbar sein.<br />
Fazit<br />
Oracle hat nach einer doch recht langen<br />
Entwicklungszeit einen großen Wurf<br />
hingelegt. Neben den vielen kleinen<br />
Verbesserungen gibt die große Architekturänderung<br />
hin zur Pluggable und<br />
Cloud Database viele Möglichkeiten der<br />
Nutzung. Ob und wie weit diese von<br />
den Usern angenommen werden, wird<br />
sich in der nächsten Zeit zeigen. Nach<br />
anfänglicher Zurückhaltung wird sicher<br />
eine breite Umstellung folgen. (jcb) n<br />
Abbildung 3: Etliche Neuerungen betreffen auch die erleichterte Installation und Upgrades von früheren Oracle-<br />
Versionen auf das neue Release.<br />
Die Autoren<br />
Andrea Held ist Leiterin der Frankfurter Datenbanktage<br />
und Geschäftsführerin der Held Informatik<br />
GmbH. Sie ist Autorin des Buches "Oracle<br />
12c New Features" und Co-Autorin von "Der<br />
Oracle DBA – Administration der Oracle Database<br />
12c" sowie „Oracle 12c Advanced – Cloud Computing,<br />
Virtualisierung und Hochverfügbarkeit“, die<br />
im Hanser-Verlag erscheinen.<br />
Ronny Egner ist Sprecher der Frankfurter Datenbanktage.<br />
Er arbeitet als Freiberufler in Projekten<br />
und ist Dozent rund um das Thema Oracle-<br />
Datenbanken. Nebenher beschäftigt er sich mit<br />
SAP HANA, PostgreSQL und der neuen Oracle-<br />
Datenbank 12c. Seine Schwerpunkte liegen im<br />
Infrastrukturbereich. So kennt er sich auch mit<br />
Storage-, Betriebs- und Backupsystemen aus.<br />
90 Ausgabe 05-2013 Admin www.admin-magazin.de
Test<br />
LSI Nytro MegaRAID<br />
© Scott Betts, 123RF<br />
Im Test: Nytro MegaRAID 8110-4i von LSI<br />
Rennfieber<br />
Mit dem Versprechen, DAS-Speicher Beine zu machen, tritt der MegaRAID-<br />
8110-4i-Controller von LSI an. Welcher Performance-Gewinn dabei drin ist,<br />
zeigt dieser Test. Jens-Christoph Brendel<br />
Die hier getestete Beschleunigerkarte für<br />
direkt verbundenen Storage (DAS) von LSI<br />
ist eine Kombination aus RAID-Controller<br />
und intelligentem Cache auf Flash-Basis.<br />
Direct Attached Storage kann damit um<br />
ein Vielfaches an Tempo zulegen, indem<br />
ein Algorithmus die häufig verwendeten<br />
Daten in den schnellen SSD-Cache verschiebt,<br />
wogegen seltener benutzte auf<br />
den relativ langsamen Platten<br />
bleiben. Auch der Rebuild einer<br />
RAID-Gruppe geht dank<br />
des Caches übrigens zügiger<br />
vonstatten.<br />
An die Karte (Abbildung 1)<br />
lassen sich direkt mittels eines<br />
SAS-to-SATA-Adapterkabels<br />
bis zu vier SATA-Festplatten<br />
anschließen. Alternativ lässt<br />
sich ein SAS-Expander konnektieren,<br />
der dann seinerseits<br />
mehr und schnellere<br />
SAS-Platten in einer internen<br />
Drive Bay ansteuern kann. Für diesen<br />
Test wählten wir die erste Option und<br />
verbanden drei SATA-Desktop-Platten<br />
von Western Digital mit der Karte, auf<br />
der sich außerdem zwei Flash-Module<br />
finden, die zusammen ein 90 GByte großes<br />
Volume bilden (CacheCade). Zum<br />
Vergleich maßen wir eine dieser Platten<br />
(WD3200BEKT) als Einzellaufwerk.<br />
Abbildung 1: Die Nytro-MegaRAID-Controller-Karte 8110-4i.<br />
Unser Testrechner lief unter Windows<br />
Server 2008 R2, alternativ werden auch<br />
Windows Server 2003 SP2/XP SP2/Vista<br />
SP2 oder Windows 7 SP1 unterstützt,<br />
zusätzlich eine Reihe von Linux-Distributionen,<br />
darunter SLES und RHEL, außerdem<br />
VMware ESXi 4.x und 5 sowie<br />
Solaris 10 und 11.<br />
Hürdenlauf<br />
Die zu beschleunigenden Platten muss<br />
man im ersten Schritt zu einer RAID-<br />
Gruppe zusammenfassen. Das gelingt auf<br />
BIOS-Ebene entweder über eine einfache<br />
WebBIOS-GUI, die ohne Betriebssystemunterstützung<br />
auskommen soll, oder<br />
über ein Command Line Interface (CLI).<br />
Ersteres funktionierte auf unserem Rechner<br />
nicht. Das CLI, das wir notgedrungen<br />
wählen mussten, litt hingegen unter der<br />
Volkskrankheit der meisten<br />
Tools dieser Provenienz: benutzerunfreundliche<br />
Dokumentation<br />
samt kryptischer<br />
Syntax und nichtssagender<br />
Fehlermeldungen.<br />
Beispielsweise muss der Anwender<br />
die Platten immer mit<br />
einer Enclosure- und einer<br />
Slot-Nummer spezifizieren,<br />
auch wenn sie gehäuselos verkabelt<br />
sind. Dann ist für das<br />
nicht vorhandene Enclosure<br />
ein Default-Wert von exakt<br />
92 Ausgabe 05-2013 Admin www.admin-magazin.de
LSI Nytro MegaRAID<br />
Test<br />
Lohnt sich das?<br />
Ob sich ein SSD-beschleunigter RAID-Controller<br />
tatsächlich auszahlt, hängt entscheidend vom<br />
Workload ab, der ihm zugemutet wird. Nur wenn<br />
eine Menge von Daten, die das Volumen des<br />
Cache nicht sprengen, häufig gelesen werden,<br />
kann der Cache seine Stärken ausspielen. Wo<br />
überwiegend geschrieben wird oder sich Zugriffe<br />
kaum wiederholen, greift der Cache ins<br />
Leere und bewirkt keine Performance-Verbesserung.<br />
Herkömmliche synthetische Benchmarks<br />
eignen sich oft nur bedingt, um den Performance-Gewinn<br />
eines Cache zu messen, weil ihre<br />
Zugriffsmuster eben nicht denen entsprechen,<br />
die Applikationen in der Praxis erzeugen. Man<br />
kann sich hier unter Umständen helfen, denn<br />
zumindest die besseren Benchmarks lassen sich<br />
umfangreich parametrisieren, aber das bleibt<br />
eine Notlösung.<br />
Eine viel bessere Vorausschau ermöglicht dagegen<br />
die Nytro Predictor Software von LSI,<br />
von der man zumindest eine Trial-Version gegen<br />
Registrierung kostenlos herunterladen kann.<br />
Die reguläre Verwendung ist allerdings kostenpflichtig.<br />
Sie beobachtet das I/O-Geschehen<br />
über einige Stunden und ermittelt, wie gut die<br />
Caching-Algorithmen des Nytro-RAID-Controllers<br />
damit zurechtkommen würden. Im Ergebnis<br />
erhält man eine Prognose des wahrscheinlichen<br />
Geschwindigkeitsvorteils bei Einsatz der Beschleunigerkarte.<br />
252 anzugeben, was die Dokumentation<br />
aber mit keiner Silbe erwähnt. Erraten<br />
kann man es jedoch auch nicht. Wer es<br />
etwa mit Enclosure 0 oder 1 versucht,<br />
was noch einigermaßen nahe liegen<br />
würde, der erhält stets die vielsagende<br />
Fehlermeldung „Invalid input“, mit der<br />
ausnahmslos jede Art von Tipp-, Syntax-,<br />
oder Sachfehler schmallippig quittiert<br />
wird. Ohne Hilfe des Support ist man<br />
hier chancenlos.<br />
Als zusätzliche Verwaltungsalternative<br />
lässt sich unter Windows ein MegaRAID<br />
Storage Manager installieren, der viele<br />
Einstellmöglichkeiten bietet, den Status<br />
reportiert und einen Blick ins Log des<br />
Controllers erlaubt. Allerdings kann man<br />
mit ihm zwar das Volume für den SSD-<br />
Lesecache konfigurieren, wir haben aber<br />
kein Monitoring gefunden, das beispielsweise<br />
eine Cache Hit Ratio ausgewiesen<br />
hätte.<br />
Beim Storage Manager sollte man außerdem<br />
unbedingt auf eine aktuelle Version<br />
achten (derzeit 12.x), denn ältere<br />
Versionen können den Flash-Cache nicht<br />
managen. Legt man mit ihnen (oder mit<br />
dem CLI) eine neue RAID-Gruppe an, ist<br />
der Cache ausgeschaltet und die veraltete<br />
Software weist weder darauf hin noch<br />
bietet sie eine Option an, um ihn zu aktivieren,<br />
noch ein Monitoring, das den<br />
Fehler aufdecken würde. Die RAID-Konfiguration<br />
funktioniert, aber ohne Cache<br />
und mithin ohne entsprechenden Performance-Vorteil.<br />
Erst neuere Versionen der<br />
Management-Software erlauben es dem<br />
Admin, den Cache einzuschalten.<br />
Benchmarks<br />
Ist alles glücklich eingestellt, braucht<br />
das Betriebssystem noch einen passenden<br />
Treiber und dann kann es losgehen.<br />
Eine erste überschlägige Messung ergab<br />
im Vergleich der RAID-Gruppe (zunächst<br />
ohne Cache) zu einer Einzelplatte, die<br />
mit den im RAID verbauten identisch<br />
war, einen Geschwindigkeitszuwachs<br />
maximal um den Faktor drei, der allein<br />
auf die Verteilung der Lesezugriffe durch<br />
das RAID5 auf mehr Spindeln zurückzuführen<br />
ist.<br />
Mit zugeschaltetem Cache ergaben sich<br />
beim sequentiellen Lesen Geschwindigkeiten<br />
bis knapp 600 MByte/s, was noch<br />
einmal einer Verdreifachung gegenüber<br />
den Leseleistungen des unbeschleunigten<br />
RAID 5 entspricht. Ein ähnliches Ergebnis<br />
liefert die Reread-Funktion für wiederholtes<br />
Lesen (Abbildung 2): Bei großer Record<br />
Size klettern die Werte bei wahlfreien<br />
Zugriffen über 500 MByte/s und über<br />
50 000 IOPS.<br />
Vergleicht man ein paar der Benchmark-<br />
Resultate (Abbildung 3), zeigt sich, dass<br />
der Charakter des Workloads eine große<br />
Rolle spielt. Dominiert das wahlfreie<br />
Schreiben kleiner Records, kommt die<br />
Performance auch mit dem Cache kaum<br />
aus dem Keller. Beim sequentiellen Lesen<br />
oder beim zufälligen Lesen möglichst<br />
großer Rekords kann sich dagegen der<br />
Durchsatz gegenüber einer Einzelplatte<br />
verfünf- oder -sechsfachen. Gegenüber<br />
einer RAID-Gruppe ohne Cache verdreifacht<br />
sich immerhin die Leseleistung in<br />
der Spitze.<br />
Fazit<br />
Der Performance-Gewinn fällt zwar etwas<br />
geringer aus, als es von einem reinrassigen<br />
SSD-Laufwerk zu erwarten wäre,<br />
dafür beschleunigt hier eine relativ kleine<br />
und daher preiswerte SSD aber auch<br />
große Volumes, deren komplette Migration<br />
auf Flash-Speicher womöglich nicht<br />
wirtschaftlich wäre. Zusätzlich kommt<br />
mit der RAID-Konfiguration Redundanz<br />
ins Spiel, die für Ausfallsicherheit sorgt.<br />
Solange die am häufigsten genutzten<br />
Daten in den Cache passen und hauptsächlich<br />
gelesen werden, erweist sich der<br />
Nytro-MegaRAID-Controller als wahrer<br />
Nachbrenner für die Platten.<br />
n<br />
600.00<br />
Reread mit und ohne Cache<br />
(gemessen mit Iozone, File Size 4 GB)<br />
Lesen und Schreiben<br />
Einzelplatte vs. RAID mit und ohne Cache<br />
MByte/s<br />
500.00<br />
400.00<br />
300.00<br />
200.00<br />
100.00<br />
0.00<br />
Reread mit Cache<br />
Reread ohne Cache<br />
4 8 16 32 64 128 256 512 1024 2048 4096 8192<br />
Record Size<br />
MByte/s<br />
600.00<br />
500.00<br />
400.00<br />
300.00<br />
200.00<br />
100.00<br />
0.00<br />
sequentiell<br />
Lesen<br />
sequentiell<br />
Schreiben<br />
zufällig Lesen<br />
512K Records<br />
Einzelplatte<br />
RAID5 ohne<br />
Cache<br />
RAID5 mit<br />
Cache<br />
zufällig Schreiben<br />
512K Records<br />
Abbildung 2: Test des Cache mit wiederholtem Lesen.<br />
Abbildung 3: Besonders das Lesen kann der Cache drastisch beschleunigen.<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
93
Programmieren<br />
PostgreSQL-Notifikationen<br />
© Maxim Kazmin, 123RF<br />
PostgreSQL Notifications mit Perl<br />
Ans Licht gebracht<br />
Eine SQL-Datenbank wird oft als passive Datenablage betrachtet, die nur<br />
zuständig für die Integrität der Daten ist. PostgreSQL kann aber auch aktiv<br />
externe Ereignisse auslösen. Mit Perl lässt sich dies für eigene Zwecke<br />
ausnutzen. Torsten Förtsch<br />
Als ich vor circa 15 Jahren SQL lernte,<br />
wunderte ich mich über so ulkige SQL-<br />
Befehle wie »LISTEN« und »UNLISTEN«<br />
in der PostgreSQL-Dokumentation. Damals<br />
konnte ich damit nichts anfangen,<br />
und so vergaß ich sie wieder für eine<br />
ganze Weile. Vor ein paar Jahren fiel<br />
mir dann ein Programm auf, das ausgesprochen<br />
viel CPU-Zeit verbrauchte. Es<br />
war ein Daemon, der eine Aktion starten<br />
sollte, sobald sich in der Datenbank<br />
ein bestimmter Zustand einstellte. Dieser<br />
trat selten ein, sodass ich erwartete, dass<br />
das Programm fast keine CPU-Zeit verbraucht.<br />
In Wirklichkeit sah es aber anders aus:<br />
In einem regelmäßigen Zyklus wurde die<br />
Datenbank gefragt, ob der gewünschte<br />
Zustand erreicht ist. Wenn ja, wurde die<br />
Aktion gestartet, wenn nein, der nächste<br />
Schleifendurchlauf. So verbrauchte der<br />
Zyklus 100 Prozent der CPU-Kapazität.<br />
Im Rechenzentrum war es bestimmt<br />
recht warm.<br />
In diesem Artikel möchte ich anhand eines<br />
kleinen Beispiels ein in ähnlichen<br />
Situationen nützliches Feature vorstellen,<br />
das im Bewusstsein der Anwender oft ein<br />
Schattendasein fristet. Es geht um Notifikationen<br />
in PostgreSQL. Als Beispiel<br />
dient eine webbasierte Chat-Anwendung<br />
mit Apache und Mod-Perl. Ich werde dabei<br />
auf der in [1] vorgestellten »query«-<br />
Funktion aufbauen und als Seiteneffekt<br />
eine Methode aufzeigen, wie man in einer<br />
Mod-Perl-Anwendung zeitnah feststellen<br />
kann, wenn der Browser die Verbindung<br />
beendet.<br />
Die Beispiele in diesem Artikel wurden<br />
mit PostgreSQL 8.4, einem Apache aus<br />
der 2.2-Serie und Perl 5.12 erstellt – alles<br />
schon gut abgehangene Software. Sie<br />
brauchen also nicht die neueste Distribution.<br />
Mod-Perl sollte mindestens in<br />
Version 2.0.5 vorliegen. Als MPM des<br />
HTTPD kommt »prefork« zum Einsatz.<br />
Was sind Notifikationen?<br />
Notifikationen sind Meldungen, die von<br />
einem Client der Datenbank zum anderen<br />
geschickt werden können. Sie sind<br />
asynchron in dem Sinn, dass der Empfänger<br />
nicht genau weiß, zu welchem Zeitpunkt<br />
der Sender die Meldung schickte.<br />
Das einzige, was Empfänger und Sender<br />
wissen müssen, um über eine Notifikation<br />
zu kommunizieren, ist ihr Name.<br />
Empfänger müssen sich registrieren und<br />
dabei den Namen angeben, den Sender<br />
beim Abschicken verwenden.<br />
Ähnlich zu Signalen unter Unix/Linux<br />
muss die Datenbank nicht alle gesen-<br />
94 Ausgabe 05-2013 Admin www.admin-magazin.de
PostgreSQL-Notifikationen<br />
Programmieren<br />
deten Notifikationen einzeln zustellen.<br />
Angenommen, ein Empfänger hat sich<br />
für die Notifikation »A« registriert. Nun<br />
schickt ein Sender in schneller Folge<br />
mehrere Notifikationen »A«. Dann stellt<br />
die Datenbank mindestens einmal »A«<br />
zu, aber nicht unbedingt alle. Senden<br />
mehrere Datenbankprozesse »A«, wird<br />
von jedem Prozess mindestens ein »A«<br />
zugestellt. Seit PostgreSQL Version 9 können<br />
Notifikationen neben dem Namen<br />
zusätzlichen Inhalt übertragen. Hier stellt<br />
die Datenbank sicher, dass von jedem<br />
Senderprozess mindestens einmal die<br />
Kombination aus Name und Inhalt zugestellt<br />
wird.<br />
Notifikationen sind aber auch synchron<br />
in dem Sinn, dass sie, egal zu welchem<br />
Zeitpunkt in einer Transaktion versendet,<br />
erst beim Commit wirklich zugestellt<br />
werden. Empfänger erhalten Notifikationen<br />
nur außerhalb von Transaktionen.<br />
Dies demonstriert das in Listing 1 abgedruckte<br />
Skript.<br />
Nach dem Öffnen der Datenbankverbindung<br />
registriert es sich mit dem<br />
»LISTEN«-Kommando in Zeile 7 für die<br />
beiden Notifikationen »foo« und »bar«.<br />
In Zeile 10 wartet das Programm auf Input<br />
von der Datenbank. Eigentlich läuft<br />
gar keine Abfrage. Wie kann dann Input<br />
auftreten? Sobald jedoch ein anderer Datenbankprozess<br />
eine Notifikation schickt,<br />
wird sie vom Server gesendet. Daher<br />
kann also Input ankommen.<br />
Mit der »pg_notifies«-Funktion in Zeile 12<br />
werden dann alle bis dahin aufgelaufenen<br />
Notifikationen gelesen. Die Funktion<br />
liefert eine Notifikation pro Aufruf, deshalb<br />
die innere While-Schleife. Die Notifikation<br />
selbst ist ein Paar aus dem Namen<br />
und dem Absender-PID. Für Postgres ab<br />
Version 9 können hier noch Nutzdaten<br />
auftauchen.<br />
Das Skript wird auf der Kommandozeile<br />
gestartet und liefert zunächst keinen Output.<br />
Mit dem zu Postgres gehörenden<br />
Kommandozeilenprogramm »psql« versenden<br />
wir nun ein paar Notifikationen:<br />
chat=> notify foo; notify bar; U<br />
notify foo; notify foo; notify bax;<br />
NOTIFY<br />
NOTIFY<br />
NOTIFY<br />
NOTIFY<br />
NOTIFY<br />
chat=><br />
Es werden fünf Benachrichtigungen versandt:<br />
einmal »bar«, dreimal »foo« und<br />
einmal »bax«. Obwohl es keinen Empfänger<br />
für »bax« gibt, ist das Versenden kein<br />
Fehler. Die Notifikation geht in diesem<br />
Fall einfach verloren.<br />
Tue Apr 30 14:12:41 2013: notifications<br />
foo 12015<br />
Tue Apr 30 14:12:41 2013: notifications<br />
bar 12015<br />
Tue Apr 30 14:12:41 2013: notifications<br />
foo 12015<br />
Tue Apr 30 14:12:41 2013: notifications<br />
foo 12015<br />
Bemerkenswert hier ist, dass jede Notifikation<br />
einzeln zugestellt wird. Jeder<br />
»pg_notifies«-Aufruf liefert genau eine<br />
Nachricht. Dass das kein Widerspruch<br />
zu meiner obigen Aussage ist, zeigt das<br />
Experiment in Listing 2. Hier werden<br />
Listing 2: Test<br />
01 chat=> begin;<br />
02 BEGIN<br />
03 chat=> notify foo; notify bar;<br />
notify foo; notify foo; notify bax;<br />
04 NOTIFY<br />
05 NOTIFY<br />
06 NOTIFY<br />
07 NOTIFY<br />
08 NOTIFY<br />
09 chat=> select clock_timestamp();<br />
10 clock_timestamp<br />
11 ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐<br />
Listing 3: »recv1.pl«<br />
01 use common::sense;<br />
02 use DBI;<br />
03 use IO::Select;<br />
04 <br />
Listing 1: »recv0.pl«<br />
01 use common::sense;<br />
02 use DBI;<br />
03 use IO::Select;<br />
04 <br />
05 my $db=DBI‐>connect('dbi:Pg:dbname=chat',<br />
'ipp',<br />
06 undef, {RaiseError=>1});<br />
07 $db‐>do('LISTEN '.$_) for (qw/foo bar/);<br />
05 my $db=DBI‐>connect('dbi:Pg:dbname=chat',<br />
'ipp',<br />
06 undef, {RaiseError=>1});<br />
07 $db‐>do('LISTEN '.$_) for (qw/foo bar/);<br />
08 <br />
09 my $sel=IO::Select‐>new($db‐>{pg_socket});<br />
10 <br />
11 $db‐>do('BEGIN');<br />
12 warn localtime().": start transaction\n";<br />
die Notifikationen in einer Transaktion<br />
versandt. Zu Beginn wird zusätzlich die<br />
aktuelle Zeit ausgegeben und nach dem<br />
Versand fünf Sekunden gewartet.<br />
Sammelzustellung<br />
Der Empfänger gibt jetzt nur noch folgende<br />
Zeilen aus:<br />
Tue Apr 30 14:24:33 2013: notifications<br />
bar 12015<br />
foo 12015<br />
Die drei Foo-Notifikationen sind zu einer<br />
zusammengefasst. Außerdem beträgt die<br />
Zeitdifferenz zwischen dem Absenden<br />
und dem Empfang deutlich mehr als<br />
fünf Sekunden. Das heißt, die Notifikationen<br />
werden erst beim »COMMIT« der<br />
Transaktion wirklich verschickt. Wird die<br />
08 <br />
09 my $sel=IO::Select‐>new($db‐>{pg_socket});<br />
10 while ($sel‐>can_read) {<br />
11 warn localtime().": notifications\n";<br />
12 while (my $note=$db‐>pg_notifies) {<br />
13 warn " @$note\n";<br />
14 }<br />
15 }<br />
12 2013‐04‐30 14:24:16.067244+02<br />
13 (1 row)<br />
14 <br />
15 chat=> select pg_sleep(5);<br />
16 pg_sleep<br />
17 ‐‐‐‐‐‐‐‐‐‐<br />
18 <br />
19 (1 row)<br />
20 <br />
21 chat=> end;<br />
22 COMMIT<br />
23 chat=><br />
13 while (1) {<br />
14 if( $sel‐>can_read(10) ) {<br />
15 warn localtime().": notifications\n";<br />
16 while (my $note=$db‐>pg_notifies) {<br />
17 warn " @$note\n";<br />
18 }<br />
19 $db‐>disconnect;<br />
20 exit 0;<br />
21 } else {<br />
22 warn localtime().": finish transaction\n";<br />
23 $db‐>do('COMMIT');<br />
24 }<br />
25 }<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
95
Programmieren<br />
PostgreSQL-Notifikationen<br />
Transaktion abgebrochen (»ROLLBACK«),<br />
kommen keine Notifikationen an.<br />
Listing 3 demonstriert dies. Zeile 12 startet<br />
eine Transaktion und gibt anschließend<br />
einen Zeitstempel aus. Nun wartet<br />
das Programm maximal zehn Sekunden<br />
auf Input von der Datenbank. Im Fall<br />
eines Timeouts wird die Transaktion beendet<br />
(Zeile 23) und wieder in Zeile 14<br />
gewartet. Kommt Input an, werden die<br />
Notifikationen ausgelesen und das Programm<br />
beendet.<br />
Kurz nach dem Start des Programms<br />
sende ich mit »psql« eine Notifikation<br />
und gebe die aktuelle Zeit aus:<br />
chat=> notify foo; select clock_<br />
timestamp();<br />
NOTIFY<br />
clock_timestamp<br />
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐<br />
2013‐04‐30 14:46:18.638144+02<br />
Das Skript gibt folgendes aus:<br />
Tue Apr 30 14:46:16 2013: start transaction<br />
Tue Apr 30 14:46:26 2013: finish transaction<br />
Tue Apr 30 14:46:26 2013: notifications<br />
foo 12015<br />
Listing 4: SQL-Schema<br />
01 create table chat_rooms (<br />
02 id serial primary key,<br />
03 name text not null<br />
04 );<br />
05 <br />
06 create table chat_msgs (<br />
07 id serial primary key,<br />
08 room int references chat_rooms(id)<br />
09 on update restrict<br />
10 on delete cascade,<br />
11 tm timestamp default now() not null,<br />
12 author text not null,<br />
13 msg text not null<br />
14 );<br />
Listing 5: Trigger<br />
01 create or replace function chat_tg_fn() returns<br />
trigger as $CODE$<br />
02 declare<br />
03 room text;<br />
04 begin<br />
05 select into room name from chat_rooms where id=NEW.<br />
room;<br />
06 execute 'notify "r_' || room || '"';<br />
07 return null;<br />
08 end;<br />
09 $CODE$ language plpgsql;<br />
10 <br />
11 create trigger chat_tg after insert on chat_msgs for<br />
each row<br />
12 execute procedure chat_tg_fn();<br />
Der zeitliche Ablauf ist somit folgender:<br />
n 14:46:16 Transaktion startet,<br />
n 14:46:18 Notifikation wird gesendet,<br />
n 14:46:26 Transaktion endet und Notifikation<br />
wird empfangen.<br />
Transaktionen können lange dauern. In<br />
realen Anwendungen ist also die Frage zu<br />
stellen, ob eine Datenbankverbindung für<br />
normale SQL-Kommandos und Notifikationen<br />
gemeinsam benutzt werden kann,<br />
oder ob es nicht besser wäre, mit zwei<br />
Verbindungen zu arbeiten.<br />
Ein paar Tabellen<br />
Mit dem Wissen über Notifikationen<br />
können wir nun den Chat-Server planen.<br />
Wegen der Länge der Listings sind sie<br />
hier nur auszugsweise wiedergegeben.<br />
Das vollständige Paket kann unter [3]<br />
heruntergeladen werden.<br />
Um das Beispiel einfach zu halten, verzichtet<br />
es auf jegliche Benutzerverwaltung.<br />
Jeder Teilnehmer kann jeden Chat-<br />
Raum betreten und unter einer beliebigen<br />
Identität teilnehmen. Auch können mehrere<br />
Benutzer gleichzeitig unter demselben<br />
Namen auftreten. Chat-Räume entstehen<br />
nach Bedarf.<br />
In der Datenbank sind zwei Tabellen vorgesehen,<br />
eine für die Chat-Räume und<br />
eine für die Nachrichten (Listing 4).<br />
Der für das Thema interessante Teil ist jedoch<br />
der in Listing 5 dargestellte Trigger.<br />
In den Zeilen 11 und 12 wird der Trigger<br />
erzeugt. Er feuert bei jedem »INSERT« in<br />
die »chat_msgs«-Tabelle und führt dabei<br />
die Funktion »chat_tg_fn« aus. Diese ermittelt<br />
den Namen des Chat-Raums und<br />
bildet daraus die Notifikation<br />
r_RAUMNAME<br />
Zum Test lässt sich das Programm in<br />
Listing 1 so modifizieren, dass es auf »r_<br />
foo« und »r_bar« reagiert. Dann erzeugt<br />
man mit »psql« einen Chat-Raum »foo«<br />
und fügt als Nächstes eine Mitteilung<br />
ein. Das Skript meldet dann eine »r_foo«-<br />
Notifikation.<br />
Gerüstbau<br />
Datenbankseitig war es das schon. Listing<br />
6 enthält das Gerüst des Perl-Moduls<br />
für den Chat-Server. Der Einstieg<br />
ist die Handler-Funktion am Ende. Um<br />
es einfach zu halten, kommuniziert die<br />
HTML-Seite mit dem Modul nur über<br />
AJAX und benutzt dabei die HTTP-<br />
Methode »POST«. Parameter werden in<br />
JSON kodiert übertragen. Die Antwort<br />
wird auch in JSON erwartet.<br />
Daher liest Zeile 75 den Request-Body<br />
ein, den Zeile 76 dekodiert. Das Resultat<br />
landet in der globalen Variable »$data«.<br />
War das erfolgreich, wird die Verbindung<br />
zur Datenbank aufgebaut und auch in<br />
einer globalen Variable gespeichert. Alle<br />
drei globalen Variablen, die Anfrage »$r«,<br />
»$data« und die Datenbankverbindung<br />
»$db«, werden lokalisiert. Das heißt,<br />
sie werden automatisch zu »undef« zurückgesetzt,<br />
sobald das Programm die<br />
Handler-Funktion verlässt, auch wenn<br />
das mittels »die« in einer Unterfunktion<br />
passiert.<br />
Jede Anfrage muss den Parameter »action«<br />
enthalten. Er gibt an, was eigentlich<br />
gemacht werden soll. Der Hash »%actions«<br />
in Zeile 56 verzweigt dann entsprechend<br />
des Parameters. Im Moment kennt<br />
das Modul nur die Aktion »test«.<br />
Diese Architektur widerspricht dem REST-<br />
Paradigma. In der Praxis gibt es sicher<br />
einige Aktionen, die idempotent sind und<br />
daher mittels GET und über eine separate<br />
URL ansprechbar sein sollten. Aber das<br />
Ganze ist nur ein Beispiel.<br />
Der für das Thema interessante Teil spielt<br />
sich in der Query-Funktion ab. Hier wird<br />
wie in [1] »AnyEvent« benutzt. Der<br />
Event-Loop ist also der »recv«-Aufruf auf<br />
der Condition-Variable in Zeile 50. Hier<br />
wird gewartet, bis eine der folgenden<br />
Bedingungen erfüllt ist:<br />
n die Anfrage ist beendet (Zeile 35),<br />
n die Anfrage hat ihr Zeitlimit überschritten<br />
(Zeile 34),<br />
n ein SIGINT oder SIGTERM ist eingetroffen<br />
(Zeile 45).<br />
Nun unterscheidet sich das Umfeld für<br />
einen Mod-Perl-Handler etwas von einem<br />
Mod-CGI-Skript. Das SIGTERM hat hier<br />
eine komplett andere Bedeutung. Es tritt<br />
nicht auf, wenn der Webserver meint, die<br />
Anfrage dauere zu lange, sondern nur,<br />
wenn er sich beenden will. Daher bricht<br />
der Signal-Handler »$cancel_and_terminate«<br />
nicht nur die SQL-Anfrage ab, sondern<br />
setzt mit »child_terminate« auch ein<br />
Flag, das anzeigt, dass der Prozess enden<br />
soll, sobald die Anfrage abgearbeitet ist.<br />
Auch treten in Mod-Perl-Handlern keine<br />
Timeouts auf. Wie in [1] ausgeführt, be-<br />
96 Ausgabe 05-2013 Admin www.admin-magazin.de
PostgreSQL-Notifikationen<br />
Programmieren<br />
zieht sich der Timeout des Webservers<br />
auf die Überwachung von I/O-Strömen.<br />
Während des Query-Aufrufs gibt es aber<br />
keinen Datenaustausch mit dem Browser<br />
– das ist der einzige Kanal, den der<br />
HTTPD kennt. Von der Datenbankverbindung<br />
hat er keine Ahnung.<br />
Eigener Timeout<br />
Das heißt, man tun gut daran, selbst einen<br />
Timeout zu implementieren. Das ist<br />
zum Glück sehr einfach. Es gilt nur zu<br />
beachten, dass man »AE::now_update«<br />
vor dem Erzeugen der Condition-Variable<br />
aufruft. Den Watcher für den Timeout<br />
erzeugt Zeile 34.<br />
Wie in [1] erläutert, müssen die Signale<br />
TERM und INT von der Aktivierung der<br />
Signal-Handler in den Zeilen 44 bis 46 bis<br />
zum Ende der »execute«-Anweisung blockiert<br />
werden, um eine Race-Condition<br />
zu vermeiden. Nun kann es aber pas-<br />
Abbildung 1: Ein erster Test auf der Kommandozeile zeigt, dass der Webserver JSON zurückgibt.<br />
sieren, dass »execute« mit einer Exception<br />
abgebrochen wird, um die man sich<br />
normalerweise nicht weiter kümmern<br />
müsste, weil Mod-Perl daraus automatisch<br />
eine Antwort mit dem HTTP-Code<br />
500 (SERVER ERROR) macht. Die Signalmaske<br />
des Prozesses ist jedoch eine<br />
globale Eigenschaft, die zurückgesetzt<br />
werden muss. Sonst stockt der Webserver<br />
beim Herunterfahren.<br />
Für solche Fälle ist das Guard-Modul<br />
hilfreich. In Zeile 40 speichert die Variable<br />
»$guard« ein Objekt, bei dessen<br />
Zerstörung der übergebene Code-Block<br />
ausgeführt und damit die Signalmaske<br />
zurückgesetzt wird. In Zeile 48 passiert<br />
das explizit als Teil des Programms. Wenn<br />
jedoch der Execute-Aufruf abbricht, wird<br />
dieser Code nicht ausgeführt. Die »$guard‐«Variable<br />
wird von Perl aber automatisch<br />
zerstört. Als Nebeneffekt wird die<br />
Signalmaske wiederhergestellt.<br />
Und: Action!<br />
Jetzt, nachdem das Gerüst steht, können<br />
Aktionen eingefügt werden. Im Moment<br />
kennt die Anwendung nur »test«. Zudem<br />
ist sie eigentlich nur ein Platzhalter und<br />
hat mit der Anwendung nichts zu tun.<br />
Zum Testen des Gerüsts eignet sie sich<br />
aber gut.<br />
E<br />
Listing 6: Das Gerüst des Perl-Moduls<br />
01 package Chat;<br />
02 <br />
03 use common::sense;<br />
04 use Apache2::RequestRec ();<br />
05 use Apache2::RequestUtil ();<br />
06 use Apache2::RequestIO ();<br />
07 use Apache2::Const ‐compile=>qw/OK NOT_FOUND<br />
08 SERVER_ERROR/;<br />
09 use JSON::XS ();<br />
10 use DBI;<br />
11 use DBD::Pg qw/:async/;<br />
12 use AnyEvent;<br />
13 use Guard;<br />
14 use POSIX qw/SIGTERM SIGINT SIG_BLOCK SIG_<br />
UNBLOCK/;<br />
15 <br />
16 our ($r, $db, $data);<br />
17 our $query_timeout//=3;<br />
18 <br />
19 sub query {<br />
20 my $sql=pop;<br />
21 my $stmt=$db‐>prepare($sql, {pg_async=>PG_<br />
ASYNC});<br />
22 <br />
23 AE::now_update;<br />
24 my $done=AE::cv;<br />
25 my $cancel=sub {<br />
26 $db‐>pg_cancel if $db‐>{pg_async_<br />
status}==1;<br />
27 $done‐>send;<br />
28 };<br />
29 my $cancel_and_terminate=sub {<br />
30 $cancel‐>();<br />
31 $r‐>child_terminate;<br />
32 };<br />
33 <br />
34 my $tm_w=AE::timer $query_timeout, 0,<br />
$cancel;<br />
35 my $pg_w=AE::io $db‐>{pg_socket}, 0, sub {<br />
36 $db‐>pg_ready and $done‐>send;<br />
37 };<br />
38 <br />
39 my $sigblock=POSIX::SigSet‐>new(SIGTERM,<br />
SIGINT);<br />
40 my $guard=guard {<br />
41 POSIX::sigprocmask SIG_UNBLOCK, $sigblock;<br />
42 };<br />
43 POSIX::sigprocmask SIG_BLOCK, $sigblock;<br />
44 my @sig_w=map {<br />
45 AE::signal $_, $cancel_and_terminate;<br />
46 } qw/TERM INT/;<br />
47 $stmt‐>execute(@_);<br />
48 undef $guard;<br />
49 <br />
50 $done‐>recv;<br />
51 <br />
52 return $db‐>{pg_async_status}==1<br />
53 ? ($db‐>pg_result, $stmt) : ();<br />
54 }<br />
55 <br />
56 my %actions=<br />
57 (<br />
58 test=>sub {<br />
59 my ($rc, $stmt)=query @{$data‐>{param}},<br />
$data‐>{q};<br />
60 return Apache2::Const::SERVER_ERROR<br />
unless $rc;<br />
61 <br />
62 my @l;<br />
63 push @l, $_ while $_=$stmt‐>fetchrow_<br />
hashref;<br />
64 $r‐>content_type('text/json');<br />
65 $r‐>print(JSON::XS::encode_<br />
json(+{result=>\@l}));<br />
66 <br />
67 return Apache2::Const::OK;<br />
68 },<br />
69 );<br />
70 <br />
71 sub handler {<br />
72 local $r=$_[0];<br />
73 <br />
74 my $buf='';<br />
75 1 while( 0read($buf, 16000, length<br />
$buf) );<br />
76 local $data=eval{ JSON::XS::decode_json<br />
$buf };<br />
77 return Apache2::Const::NOT_FOUND<br />
78 unless('HASH' eq ref $data and<br />
79 my $act=$actions{$data‐>{action}<br />
});<br />
80 <br />
81 local $db=DBI‐>connect('dbi:Pg:dbname=chat,<br />
'ipp', undef,<br />
82 {RaiseError=>1, pg_<br />
enable_utf8=>1});<br />
83 return $act‐>();<br />
84 }<br />
85 <br />
86 1;<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
97
Programmieren<br />
PostgreSQL-Notifikationen<br />
Doch als erstes muss das Modul noch in<br />
der »httpd.conf« eingebunden werden.<br />
Neben der »LoadModule«-Anweisung,<br />
um Mod-Perl zu laden, ist dazu Folgendes<br />
nötig:<br />
PerlModule Chat<br />
<br />
SetHandler modperl<br />
PerlResponseHandler Chat<br />
<br />
Außerdem muss das Chat-Modul im Perl-<br />
Suchpfad gefunden werden (siehe auch<br />
Kasten „Mod-Perl – eine Einführung“).<br />
Die Test-Aktion erwartet zwei Parameter:<br />
eine SQL-Anweisung »q« und eine<br />
Liste mit Bind-Parametern »param«.<br />
Abbildung 1 zeigt einen solchen Aufruf<br />
mit »curl«. Die Option »‐d« erzeugt eine<br />
POST-Anfrage und übergibt gleichzeitig<br />
den Request-Body. Normale CGI-Skripte<br />
erwarten ihre Parameter oft URL-kodiert.<br />
Dieses erwartet jedoch JSON. Der Javascript-Teil<br />
im Browser wird dadurch<br />
einfacher.<br />
Sonderfälle simulieren<br />
Der Aufruf in Abbildung 1 zeigt ein erfolgreich<br />
beendetes SQL-Kommando. Viel<br />
wichtiger ist es aber, verschiedene vom<br />
Normalzustand abweichende Zustände<br />
zu provozieren. Mit dem Kommando<br />
»select pg_sleep(10)« könnte man beispielsweise<br />
einen Timeout in der Query-<br />
Funktion erzeugen. Zeile 17 stellt den<br />
Timeout auf drei Sekunden ein. Wenn<br />
ein SQL-Kommando nun länger als drei<br />
Sekunden dauert, wird es mit »$cancel«<br />
abgebrochen, und die Query-Funktion<br />
gibt die leere Liste zurück. In Zeile 60<br />
wird daraus eine HTTP-Antwort mit dem<br />
Code 500 (SERVER ERROR) gemacht.<br />
/chat.html<br />
enterroom<br />
enterroom<br />
listen<br />
listen<br />
Browser 1 Server<br />
Browser 2<br />
listen<br />
listen<br />
Abbildung 2: Die Grundstruktur der realisierten Chat-Anwendung.<br />
Der Curl-Aufruf mit dem Parameter<br />
»{"action":"test","q":"select pg_<br />
sleep(10)"}« müsste also nach drei Sekunden<br />
beendet sein und einen Server-<br />
Error liefern.<br />
Weiterhin sollte man testen, was passiert,<br />
wenn eine ungültige SQL-Anweisung<br />
übergeben wird. Dann bricht der<br />
Execute-Aufruf in Zeile 47 ab und Curl<br />
müsste sofort einen Fehler 500 liefern.<br />
Dann könnte man über »/proc/$PID/<br />
status« prüfen, ob die Signalmaske des<br />
Apache-Prozesses wieder ordentlich zurückgesetzt<br />
wurde. Einfacher ist es aber,<br />
den Server zu stoppen. Er muss sich wie<br />
gewohnt beenden lassen. Wenn die Signalmaske<br />
nicht zurückgesetzt ist, würde<br />
er eine ganze Weile brauchen und berichten,<br />
dass er einigen Prozessen mehrmals<br />
ein SIGTERM und schließlich ein SIG-<br />
KILL geschickt hat.<br />
Wenn ein zeitaufwendiges SQL-Kommando<br />
läuft und der Webserver gestoppt<br />
wird, sollte das Kommando abgebrochen<br />
werden. Das kann man prüfen, indem der<br />
Timeout zunächst auf einen großen Wert,<br />
zum Beispiel 300 Sekunden, gesetzt wird.<br />
/chat.html<br />
sendmsg<br />
listen<br />
listen<br />
Dann startet man das SQL-Kommando<br />
»select pg_sleep(50)« und stoppt den<br />
Webserver. Auf dem Datenbank-Server<br />
muss der zum SELECT zugehörige Prozess<br />
verschwinden. Bei geeigneten Logging-Einstellungen<br />
taucht im Log der<br />
Datenbank folgendes auf:<br />
ERROR: canceling statement due to user U<br />
request<br />
STATEMENT: select pg_sleep(50)<br />
Nach dem Test des Gerüsts lassen sich<br />
weitere Aktionen hinzufügen. Die Chat-<br />
Anwendung kommt mit drei Aktionen<br />
aus, die ich »enterroom«, »listen« und<br />
»sendmsg« getauft habe.<br />
Chat-Ablauf<br />
Zeit<br />
Abbildung 2 zeigt den zeitlichen Ablauf<br />
während eines Chats. Als erstes<br />
wird ganz normal die HTML-Seite geladen.<br />
Alle weiteren Anfragen werden per<br />
XMLHttpRequest in Javascript erzeugt.<br />
Daher kann der Request-Body auch sehr<br />
einfach in JSON kodiert werden. Betritt<br />
der Benutzer einen Chat-Raum, wird »en-<br />
Listing 7: Die Listen-Aktion<br />
01 sub wait_for_notification {<br />
02 my ($n, $cv, $pg_w, $cl_w, $cl_fd)=(0);<br />
03 <br />
04 $pg_w=AE::io $db‐>{pg_socket}, 0, sub {<br />
05 $cv‐>send;<br />
06 };<br />
07 $cl_fd=$r‐>connection<br />
08 ‐>client_socket<br />
09 ‐>fileno;<br />
10 $cl_w=AE::io $cl_fd, 0, sub {<br />
11 $n=‐1;<br />
12 $cv‐>send;<br />
13 };<br />
14 <br />
15 $n=1 while $db‐>pg_notifies;<br />
16 return 1 if $n;<br />
17 <br />
18 while( $n==0 ) {<br />
19 $cv=AE::cv; $cv‐>recv;<br />
20 return if $n==‐1;<br />
21 $n=1 while $db‐>pg_notifies;<br />
22 }<br />
23 return 1;<br />
24 }<br />
25 <br />
26 my %actions=<br />
27 (<br />
28 ...<br />
29 listen=>sub {<br />
30 $_=check_room and return $_;<br />
31 <br />
32 (undef, my $stmt)=<br />
33 query 'LISTEN "r_'.$data‐>{room}.'"';<br />
34 $stmt and $stmt‐>finish;<br />
35 <br />
36 while( reply_messages()
PostgreSQL-Notifikationen<br />
Programmieren<br />
terroom« aufgerufen. Als Antwort liefert<br />
der Server die Liste der Mitteilungen in<br />
dem gewählten Raum. Der Browser zeigt<br />
diese an und sendet sofort eine »listen«-<br />
Anfrage für den Raum. Dieser Aufruf<br />
kehrt erst zurück, wenn neue Mitteilungen<br />
eingetroffen sind. Will ein Browser<br />
eine Nachricht senden, benutzt er die<br />
Aktion »sendmsg«. Von der Chat-Anwendung<br />
wird daraus ein INSERT-Kommando<br />
gemacht. Der Datenbank-Trigger löst aus<br />
und schickt eine Notifikation. Die Empfänger<br />
lesen die neue Nachricht aus der<br />
Datenbank, senden sie an den Browser<br />
und beenden damit ihre »listen«-Anfrage.<br />
Der Browser zeigt sie an und sendet eine<br />
neue »listen«-Anfrage.<br />
Fortlaufende Zähler<br />
Jede Nachricht besitzt eine ID, die in<br />
aufsteigender Reihenfolge von der Datenbank<br />
beim »INSERT« erzeugt (Datentyp<br />
»SERIAL«) wird. Die Anwendung geht<br />
und schickt sie dem Browser. Die Anzahl<br />
wird zurückgegeben. Liefert die Funktion<br />
0, also keine neuen Nachrichten, wird<br />
»wait_for_notification« aufgerufen. Diese<br />
Funktion ist ähnlich zu »query« aufgedavon<br />
aus, dass dieser Zähler<br />
nicht überlaufen kann. Beim<br />
Betreten eines Chat-Raumes<br />
werden die Nachrichten und<br />
deren IDs übertragen. Der<br />
Browser merkt sich die höchsten<br />
IDs. Diese wird der Listen-<br />
Aktion als Parameter mitgegeben.<br />
Diese Aktion kann also<br />
interpretiert werden als: „Gib<br />
mir alle Nachrichten im Raum<br />
mit einer ID größer als N oder<br />
warte auf neue Nachrichten,<br />
falls es keine solchen gibt!“<br />
Listing 7 zeigt die relevanten<br />
Teile der Listen-Aktion. Nach<br />
Prüfung der Parameter wird in<br />
Zeile 33 die SQL-Operation<br />
LISTEN r_RAUMNAME<br />
ausgeführt. Damit hat das Programm sich<br />
als Empfänger für Notifikationen in dem<br />
Raum registriert. »reply_messages« in<br />
Zeile 36 sucht nach neuen Nachrichten<br />
Abbildung 3: Das Resultat: zwei Chat-Fenster im Browser mit<br />
PostgreSQL als Backend.<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
99
Programmieren<br />
PostgreSQL-Notifikationen<br />
baut. Sie kehrt in zwei Fällen zurück:<br />
wenn Notifikationen eingetroffen sind<br />
und wenn der Watcher in Zeile 10 aktiviert<br />
wurde. Der Event-Loop ist wieder<br />
mit einer Condition-Variable in Zeile 19<br />
implementiert.<br />
Der verschwundene<br />
Browser<br />
Neu an der Funktion sind eigentlich nur<br />
die Zeilen 7 bis 13. Hier wird die TCP-<br />
Verbindung zum Browser überwacht.<br />
Das ist nötig, denn im Prinzip kann die<br />
Aktion unendlich lange auf eine Notifikation<br />
warten. Wenn der Benutzer nun<br />
das Fenster schließt oder den Rechner<br />
ausschaltet, muss das Skript das merken,<br />
sonst werden die verwendeten Ressourcen<br />
nicht freigegeben.<br />
In Zeile 7 wird dazu zunächst der Dateideskriptor<br />
der Verbindung zum Browser<br />
ermittelt. Der Watcher wartet dann, dass<br />
der Socket lesbar wird. Das kann zwei<br />
Dinge bedeuten: Entweder ist die nächste<br />
Mod-Perl – eine Einführung<br />
Mod-Perl ist ein in den Apache-HTTPD eingebetteter<br />
Perl-Interpreter. Im Gegensatz zu mit<br />
Mod-CGI eingebundenen Skripten wird der Interpreter<br />
also nicht für jede Anfrage neu gestartet.<br />
Im Unterschied zu Techniken wie FastCGI oder<br />
Tomcat gibt es bei Mod-Perl kein Backend, dem<br />
die Anfrage vom Webserver übermittelt wird.<br />
Der Perl-Interpreter läuft im selben Prozess.<br />
Das Perl-Programm hat daher direkten Zugriff<br />
auf alle Ressourcen des Webservers, also auch<br />
auf die TCP-Verbindung zum Browser. Es gibt<br />
mehrere Wege, einer Anfrage eigenen Perl-Code<br />
zuzuordnen. Die direkteste ist der sogenannte<br />
»PerlResponseHandler«. Dazu schreibt man ein<br />
gewöhnliches Perl-Modul und implementiert darin<br />
eine Funktion mit dem Namen »handler«.<br />
Diese Funktion wird dann vom Webserver mit<br />
einem Parameter aufgerufen, der die Anfrage<br />
repräsentiert.<br />
Ein einfaches Hello-World sieht wie folgt aus:<br />
package Hello::World;<br />
use Apache2::RequestRec ();<br />
use Apache2::RequestIO ();<br />
use Apache2::Const ‐compile=>qw/OK/;<br />
sub handler {<br />
my ($r)=@_;<br />
$r‐>content_type('text/plain');<br />
$r‐>print("hello world\n");<br />
Anfrage schon in der Pipeline oder es<br />
kann ein End-of-File gelesen werden.<br />
HTTP/1.1 erlaubt zwar, Folge-Anfragen<br />
in einen Socket zu schreiben, ohne auf<br />
das Resultat der aktuellen Anfrage zu<br />
warten, die Chat-Anwendung macht das<br />
aber nicht.<br />
Wenn der Socket lesbar wird, kann das<br />
also nur eines bedeuten: Der Browser<br />
hat die Verbindung geschlossen.<br />
»wait_for_notification« gibt daraufhin in<br />
Zeile 20 die leere Liste zurück. Das führt<br />
in Zeile 37 zum Beenden der Anfrage<br />
mit dem HTTP-Code 500. Hier könnte<br />
man einen beliebigen Code benutzen,<br />
der nur in der Logdatei erscheint. Der<br />
Browser ist zu diesem Zeitpunkt schon<br />
verschwunden.<br />
Die Query-Funktion macht recht viel<br />
Wind um Signale und Timeouts. Müsste<br />
»wait_for_notification« nicht auch darauf<br />
achten? Ein Timeout wäre möglicherweise<br />
sinnvoll, wenn man sich nicht darauf verlassen<br />
kann, dass das Schließen der TCP-<br />
Verbindung seitens des Browsers auch<br />
return Apache2::Const::OK;<br />
}<br />
1;<br />
Das Modul installiert man im Suchpfad von Perl<br />
und bindet es in die »httpd.conf« ein:<br />
LoadModule perl_module libexec/mod_perl.so<br />
PerlModule Hello::World<br />
<br />
SetHandler modperl<br />
PerlResponseHandler Hello::World<br />
<br />
Der Pfad in der LoadModule-Zeile muss eventuell<br />
angepasst werden.<br />
Wollen Sie das Modul in einem separaten Suchpfad<br />
installieren, so kann dieser dem Perl-Interpreter<br />
entweder beim Start des Webservers<br />
über die Umgebungsvariable »PERL5LIB« oder<br />
mittels der Anweisung »PerlSwitches« in der<br />
»httpd.conf« übergeben werden.<br />
Beispiel:<br />
PerlSwitches ‐I/home/ich/mein/modperl<br />
Nach einem Restart des Webservers kann das<br />
Modul zum Beispiel mittels »curl« ausprobiert<br />
werden:<br />
$ curl http://localhost/hello‐world<br />
hello world<br />
Mehr Informationen zu Mod-Perl sind unter [2]<br />
zu finden.<br />
wirklich bemerkt wird. Signale werden<br />
von »query« nur abgefangen, um beim<br />
Stoppen des Webservers länger dauernde<br />
Datenbankabfragen zu beenden. Während<br />
das Programm auf Notifikationen<br />
wartet, läuft aber keine Abfrage. Hier Arbeit<br />
zu investieren, hat also keinen Sinn.<br />
Es wäre jedoch wahrscheinlich sinnvoll,<br />
die Prüfung auf den verschwundenen<br />
Browser auch in die Query-Funktion zu<br />
übernehmen.<br />
Schlussbemerkungen<br />
Die vorgestellte Anwendung ist ein Beispiel,<br />
wie mit Notifikationen die permanente<br />
Abfrage eines Zustands von der<br />
Datenbank vermieden werden kann. Für<br />
eine Chat-Anwendung wird hier jedoch<br />
mit Kanonen auf Spatzen geschossen,<br />
denn jeder Client belegt auf dem Webserver<br />
einen Worker-Prozess und zusätzlich<br />
einen Prozess auf dem Datenbankserver.<br />
Das lässt sich mit Techniken wie in [4]<br />
vorgestellt deutlich verbessern.<br />
Und wie sieht es mit anderen Datenbanken<br />
aus? Oracle und Microsoft SQL Server<br />
haben meines Wissens Funktionen,<br />
mit denen „tue etwas, sobald sich ein<br />
bestimmter Zustand einstellt“ abgebildet<br />
werden kann. Aber MySQL kann es meines<br />
Wissens nicht. (ofr)<br />
n<br />
Infos<br />
[1] Torsten Förtsch, Ausgefeilt, PostgreSQL<br />
asynchron, <strong>ADMIN</strong>-<strong>Magazin</strong> 04/2013, S. 110:<br />
[http:// www. admin‐magazin. de/ Das‐Heft/<br />
2013/ 04/ PostgreSQL‐asynchron]<br />
[2] Mod-Perl: [http:// perl. apache. org/]<br />
[3] Download der Chat-Anwendung:<br />
[ftp://ftp.admin-magazin.de/downloads/<br />
listings/2013/05]<br />
[4] HTTP-Verbindung an einen anderen Prozess<br />
weiterreichen: [http:// foertsch. name/<br />
ModPerl‐Tricks/ req‐hand‐over. shtml]<br />
Der Autor<br />
Dipl.-Inf. Torsten Förtsch [http:// foertsch. name/]<br />
bearbeitet Projekte für seine Kunden im In- und<br />
Ausland. Als Freiberufler<br />
programmiert und betreut<br />
er Webserver. Mit Perl beschäftigt<br />
er sich seit 1998. In<br />
seiner Freizeit arbeitet er an<br />
Mod-Perl und behebt Bugs,<br />
wo immer er welche findet.<br />
100 Ausgabe 05-2013 Admin www.admin-magazin.de
Sonderteil<br />
Auf der folgenden Seite startet der regelmäßige<br />
FreeX-Sonderteil des <strong>ADMIN</strong>-<strong>Magazin</strong>s. Hier finden<br />
Sie Know-how-Artikel und Workshops von erfahrenen<br />
Autoren aus der langen Tradition der FreeX.<br />
Capsicum.......................... 102<br />
Sicheres Sandboxing und fein granulare<br />
Rechtevergabe unter FreeBSD 9.<br />
Netberry .......................... 108<br />
Mal was anderes: NetBSD statt Linux auf dem<br />
Rasp berry Pi. Allerdings braucht das Projekt<br />
einiges an Vorbereitung.<br />
© yewkeo, 123RF<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
101
Capsicum<br />
© Krzysztof Slusarczyk, 123RF<br />
Capsicum – Mehr Sicherheit für FreeBSD<br />
Scharf gewürzt<br />
Applikationen wie Webbrowser öffnen durch teilweise nachlässige Programmierung Sicherheitslücken und<br />
gefährden dann das ganze System. Capsicum bietet als Abhilfe neben einer geschützten Sandbox auch die Möglichkeit<br />
der fein granulierten Rechtevergabe. Jürgen Dankoweit<br />
Administratoren treibt es in schöner Regelmäßigkeit<br />
den Schweiß auf die Stirn,<br />
wenn in Security Bulletins wieder einmal<br />
erläutert wird, dass Schadcode für die<br />
verwendeten Programme kursiert. Betroffen<br />
sind Webbrowser, E-Mail-Programme,<br />
Archivierungstools und sogar Office-Pakete.<br />
Es ist nicht (nur) die Nachlässigkeit<br />
bei der Verwendung von Bibliotheken,<br />
die es Eindringlingen erleichtert, Schadcode<br />
auszuführen, sondern auch der gezielte<br />
Angriff auf fehlerhafte Anwendungen.<br />
Mit den unter FreeBSD bekannten<br />
Mechanismen wie Chroot oder Jails ist<br />
dem nur schwer beizukommen.<br />
Abhilfe schafft das Einsperren von Anwendungen<br />
in eine Sandbox, eine Umgebung,<br />
die nur extrem limitierte Resourcen<br />
bereitstellt. Da FreeBSD bis zur<br />
Version 8 einen solchen Mechanismus<br />
nicht vorsieht, wurde mit FreeBSD 9<br />
die Umgebung Capsicum (lateinisch für<br />
Chili) geschaffen. Sie bietet neben einer<br />
geschützten Umgebung (Sandbox), aus<br />
der eine Anwendungen nicht ausbrechen<br />
kann, auch die Möglichkeit der fein granulierten<br />
Rechtevergabe.<br />
Klassische Rechte<br />
Traditionell besitzt FreeBSD wie Linux<br />
und andere Unix-Systeme ein sehr simples<br />
Rechtesystem. Der Grund dafür ist<br />
in der Geschichte der Unix-Systeme zu<br />
suchen, die ursprünglich nicht für einen<br />
im weltweiten Internet vernetzten Desktop<br />
konzipiert waren. Daraus entstanden<br />
hauptsächlich zwei Mechanismen<br />
der Zugriffskontrolle. Zum einen gibt es<br />
die Discretionary Access Control (DAC,<br />
diskrete Zugriffskontrolle), die von der<br />
Benutzerkennung abhängt. Hierbei wird<br />
die Entscheidung, ob auf eine Ressource<br />
zugegriffen werden darf, allein auf der<br />
Basis der Kennung des Users getroffen.<br />
Das bedeutet, die Zugriffsrechte für Daten<br />
werden für jeden Benutzer von einem<br />
Administrator oder vom Benutzer selbst<br />
festgelegt. Bestes Beispiel hierfür ist ein<br />
Home Directory, auf das nur der Benutzer<br />
Zugriff hat, der es auch besitzt.<br />
Der Nachteil der Methode zeigt sich am<br />
Kommando »passwd« zum Ändern des<br />
Benutzerpassworts. Damit jeder User<br />
selbst sein Passwort in die Benutzerdatenbank<br />
eintragen und ändern kann, muss<br />
das »passwd«-Kommando in die Datei<br />
102 Ausgabe 05-2013 Admin www.admin-magazin.de
Capsicum<br />
»/etc/passwd« schreiben dürfen.<br />
Es hat aber nur der User<br />
Root die Berechtigung, sie zu<br />
verändern. Vereinfacht dargestellt<br />
bedient man sich eines<br />
Tricks und setzt für den Befehl<br />
»passwd« das SUID-Flag<br />
und das Kommando wird<br />
mit Root-Rechten ausgeführt<br />
und die Änderung an »/etc/<br />
passwd« wird durchgeführt.<br />
Unter Umständen ist dieser<br />
Mechanismus das Einfallstor<br />
für Schad-Software.<br />
MAC-Security<br />
Der andere Mechanismus zur<br />
Zugriffskontrolle ist die Mandatory<br />
Access Control (MAC,<br />
zwingend erforderliche Zugangskontrolle).<br />
Hierbei wird im Gegensatz<br />
zur DAC die Zugriffsberechtigung<br />
auf Basis eines Regelwerks erteilt. Der<br />
Nachteil dieser Methode ist aber, dass ein<br />
solches Regelwerk innerhalb der Anwendung<br />
definiert werden muss, was einen<br />
erhöhten Programmieraufwand zur Folge<br />
hat. Außerdem trägt der Programmierer<br />
die volle Verantwortung für die Vergabe<br />
der Berechtigungen.<br />
Die beiden Arten der Zugriffskontrolle<br />
wurden in erster Linie dafür entwickelt,<br />
unerlaubten Zugriff auf Dateien zu reglementieren.<br />
Der Zugriff auf Speicherbereiche<br />
oder gar Kontrollstrukturen eines<br />
Namespace<br />
Prozesskennung<br />
(PID)<br />
Dateipfade<br />
NFS-File-Handles<br />
Filessystem-<br />
Kennungen<br />
Protokoll-<br />
Adressen<br />
Sysctl-MIBs<br />
SystemV-IPC<br />
Posix-IPC<br />
Systemuhren<br />
Jails<br />
CPU-Sets<br />
Tabelle 1: Globaler Namespace des FreeBSD-Kernel<br />
etc<br />
httpd<br />
Hauptprozess:<br />
HTTP-Daemon<br />
HTTP-Daemon Apache<br />
Abbildung 1: Sandboxing mit Apache.<br />
/<br />
www-site1<br />
Subprozess 1:<br />
HTTP-Daemon<br />
in Sandbox<br />
Kernels werden damit nicht unterbunden.<br />
Auch wurden die Mechanismen nie<br />
dafür entwickelt, moderne Desktop-Anwendungen<br />
wie Webbrowser oder Office-<br />
Pakete abzusichern.<br />
Das ist eine kritische Angelegenheit,<br />
wenn man bedenkt, dass sie aus dubiosen<br />
Quellen stammende Information<br />
verarbeiten und darstellen. Mit DAC<br />
oder MAC lässt sich die Ausführung von<br />
Schadcode eines Javascripts oder Makro-<br />
Viruses nur schwer verhindern.<br />
Der FreeBSD-Kenner wird an dieser Stelle<br />
einwerfen, dass es Jails gibt, mit denen<br />
man ebenfalls die Möglichkeit hat, eine<br />
Sandbox aufzubauen. Das<br />
ist korrekt, aber der Administrationsaufwand<br />
und Ressourcen-Verbrauch<br />
sind doch<br />
enorm, wenn man für jede<br />
Anwendung eine Jail erstellt.<br />
Außerdem löst es nicht das<br />
Problem, dass Schadcode ein<br />
System infiltriert.<br />
Zerkleinert<br />
Eine andere Möglichkeit besteht<br />
darin, dass man eine Applikation<br />
in kleinere Prozesse<br />
zerlegt, die vom Hauptprozess<br />
gestartet werden, und diese<br />
mit besonderen Zugriffsrechten<br />
ausstattet.<br />
Abbildung 1 zeigt am Beispiel<br />
des HTTP-Daemons Apache,<br />
wie man sich eine sichere Umgebung für<br />
einen Webserver vorzustellen hat. Wenn<br />
Apache gestartet wird, hat der Hauptprozess<br />
zunächst alle Rechte, um auf die<br />
Konfigurationsdateien und die komplette<br />
Verzeichnisstruktur zuzugreifen. Außerdem<br />
werden noch die Sockets erstellt,<br />
über die Webbrowser die Möglichkeit haben,<br />
die Webseiten abzurufen. Nachdem<br />
diese Grundkonfiguration abgeschlossen<br />
ist, werden Subprozesse gestartet, welche<br />
die eigentliche Aufgabe des HTTP-<br />
Daemons übernehmen. Jeder Subprozess<br />
erhält die Berechtigung, auf das ihm zugeordnete<br />
Verzeichnis und Ressourcen<br />
Erklärung<br />
Unix-Prozesse werden durch eine eindeutige Kennung repräsentiert. PIDs werden beim Starten eines Prozesses zurückgegeben<br />
und lassen sich zum Debugging, zum Senden von Signalen, Monitoring und zum Ermitteln des aktuellen Status heranziehen.<br />
Unix-Files liegen in einem globalen, hierarchisch aufgebauten Namespace, der durch DAC und MAC geschützt ist.<br />
Sowohl NFS-Server als auch der NFS-Client benutzen File-Handles, um Dateien und Verzeichnisse zu identifizieren. Davon macht<br />
die NFS-Zugriffsverwaltung Gebrauch.<br />
Damit wird die Zuordnung von Mountpoints zu Pfaden bestimmt. Sie werden benutzt, um einen Zwangs-Unmount vorzunehmen,<br />
wenn kein Pfad mehr existiert.<br />
Die Protokoll-Familien benutzen Socket-Adressen, um lokale beziehungsweise entfernte Netzwerkendpunkte zu bezeichnen. Sie<br />
existieren genauso wie IPv4-Adressen und Ports oder die Sockets im globalen Namensraum.<br />
Das Sysctl-Verwaltungssystem verwendet sowohl numerische als auch alphanumerische Einträge, um Systemparameter auszulesen<br />
und zu verändern.<br />
Message-Queues, Semaphoren und Shared Memory dienen der Kommunikation zwischen Prozessen und werden nach dem<br />
SystemV-Standard abgewickelt.<br />
Message-Queues, Semaphoren und Shared Memory dienen der Kommunikation zwischen Prozessen und werden nach dem Posix-<br />
Standard abgewickelt.<br />
FreeBSD-Systeme stellen mehrere Schnittstellen zur Verwaltung der Systemuhr bereit.<br />
Jails als auf FreeBSD basierende Virtualisierung nutzt einen eigenen Namespace als Untermenge des globalen Namespace.<br />
Zuordnung von CPU-Ressourcen zu Prozessen und Threads.<br />
data<br />
www<br />
www-site2<br />
Subprozess 2:<br />
HTTP-Daemon<br />
in Sandbox<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
103
Capsicum<br />
zuzugreifen. Das bedeutet, der Prozess<br />
läuft in einer Sandbox.<br />
Um einen in dieser Art und Weise abgesicherten<br />
HTTP-Daemon zu programmieren,<br />
muss man einen erheblichen Aufwand<br />
betreiben. Der Grund liegt darin,<br />
dass für jedes UNIX-System oder BSD-<br />
Betriebssystem die Zugriffsmechanismen<br />
eigens implementiert werden müssen.<br />
Hot Chili Pepper<br />
Filedeskriptor<br />
...<br />
23<br />
67<br />
struct<br />
file<br />
Ohne Capsicum<br />
struct capability<br />
mask = CAP_READ<br />
struct<br />
file<br />
Unter FreeBSD gibt es mit Capsicum eine<br />
Lösung für das geschilderte Problem.<br />
FreeBSD dient hier als Referenzplattform<br />
nicht nur für die anderen BSD-Systeme,<br />
sondern auch für andere Unix-Plattformen.<br />
Im Rahmen des Google Summer of<br />
Code wurde Capsicum in FreeBSD implementiert.<br />
Ein besonderes Lob gilt hier<br />
Pawel Jakub Dawidek (pjd) und seinen<br />
Kollegen im FreeBSD-Entwicklerteam für<br />
die Betreuung und Durchführung des<br />
Projekts.<br />
Bei der Entwicklung des Capsicum-<br />
Frameworks hat man sich der oben genannten<br />
Probleme angenommen und<br />
neue Sicherheitsmerkmale eingeführt,<br />
um die Abschottung von Anwendungen<br />
zu unterstützen. Um die Vorteile von<br />
Capsicum voll auszuschöpfen, müssen<br />
entweder – im schlechtesten Fall – Anwendungen<br />
neu entwickelt oder der Code<br />
neu strukturiert werden. Letzteres muss<br />
nicht von Nachteil sein.<br />
Für die Entwicklung von Capsicum stand<br />
im Vordergrund, dass bestehende Mechanismen<br />
der Zugriffskontrolle unverändert<br />
funktionsfähig bleiben. Ebenso sollten die<br />
Programmierschnittstellen (APIs) nicht<br />
verändert werden, damit bestehende<br />
Software weiterhin ohne Einschränkungen<br />
funktioniert. Daher erweitert das<br />
Capsicum-System die Unix-Programmierschnittstellen,<br />
indem es innerhalb des<br />
Betriebssystemkerns eigene Funktionen<br />
implementiert. Um Capsicum in eigenen<br />
Anwendungen und Betriebssystemwerkzeugen<br />
zu nutzen, werden die C-Header-<br />
Files »sys/capability.h«, »libcapsicum.h«<br />
und die Bibliothek »libcapsicum« bereitgestellt,<br />
die mit den Kernelerweiterungen<br />
kommuniziert.<br />
Um Capsicum zu verstehen, sind einige<br />
nicht triviale Grundlagen zu erläutern.<br />
Capsicum kennt den sogenannten Capability-Mode.<br />
Dabei handelt es sich um<br />
112<br />
...<br />
struct<br />
file<br />
ein Flag, das von der Funktion »cap_enter()«<br />
gesetzt wird. Es zeigt an, dass alle<br />
Datei- und Speicheroperationen von jetzt<br />
an stark reglementiert sind. Dieses Flag<br />
wird an alle Kindprozesse vererbt und<br />
lässt sich nicht löschen. Prozesse, die<br />
sich im Capability-Mode befinden, haben<br />
nur extrem eingeschränkten Zugriff<br />
auf den Namespace des Kernels (siehe<br />
Tabelle 1). Zusätzlich werden einige Systemschnittstellen<br />
geschützt. Dazu gehören<br />
alle Gerätetreiber, die Zugriff auf den<br />
physischen Speicher oder PCI-Bus gestatten.<br />
Auch Kommandos wie »reboot« oder<br />
»kldload« werden geblockt.<br />
Systemcalls begrenzt<br />
struct capability<br />
mask =<br />
CAP_READ|CAP_WRITE<br />
Capsicum-Umgebung<br />
Der Aufruf von Systemfunktionen ist im<br />
Capability-Mode ebenfalls reguliert: Einige<br />
Funktionen, die Zugriff auf den globalen<br />
Namespace haben, sind nicht mehr<br />
verfügbar, während andere eingeschränkten<br />
Zugriff haben. Ein kleines Beispiel<br />
dafür ist das Kommando »sysctl« beziehungsweise<br />
dessen Pendant »systctl()«<br />
in der Programmierbibliothek »libc«: Mit<br />
dessen Hilfe lässt sich die Art und Weise<br />
der Speicherbelegung abfragen, es lassen<br />
sich Netzwerkverbindungen belauschen<br />
oder Kernelparameter modifizieren. Das<br />
bietet für potenzielle Angreifer unter Umständen<br />
eine Angriffs- beziehungsweise<br />
Abhörmöglichkeit. Um die Sicherheit zu<br />
erhöhen, wurde der Zugriff nur auf circa<br />
dreißig Parameter erlaubt – gegenüber<br />
den dreitausend Parametern, die »systctl()«<br />
bietet. Allein durch Aktivieren des<br />
Capability-Mode erhält man eine Sandbox,<br />
aus der es für Applikationen keine<br />
Möglichkeit gibt, auszubrechen.<br />
Feiner gesteuert<br />
Neben dem Capability-Mode werden mit<br />
Capsicum auch fein granulierte Berechtigungen<br />
eingeführt, ohne das bisherige<br />
System der Berechtigungen aufzugeben.<br />
Dieser Kniff wurde möglich, weil die Entwickler<br />
die Struktur des Filedeskriptors<br />
erweitert haben. Ein Filedeskriptor ist<br />
eine systemweit eindeutige Seriennummer,<br />
die auf eine Datenstruktur verweist.<br />
In dieser Datenstruktur – auch Metadaten<br />
genannt – sind neben dem Dateinamen<br />
auch die Berechtigungen enthalten.<br />
Die bekanntesten Filedeskriptoren<br />
sind STDIN (Standardeingabe), STDOUT<br />
(Standardausgabe) und STDERR (Standardausgabe<br />
für Fehlermeldungen).<br />
Die bisher benutzten Filedeskriptoren<br />
enthalten bereits die von FreeBSD bekannten<br />
Berechtigungen. Es handelt sich<br />
dabei um unveränderliche Merkmale, die<br />
sich an Kindprozesse weiter vererben<br />
lassen. Allerdings haben sie – was die<br />
Sicherheit anbelangt – den Nachteil, dass<br />
sie Manipulationen an den Metadaten zulassen<br />
– auch dann, wenn eine Datei oder<br />
ein Gerät für einen ausschließlichen Leseoder<br />
Schreibvorgang geöffnet wurde!<br />
Hier greift Capsicum mit einer Erweiterung<br />
der zum Filedeskriptor gehörenden<br />
Datenstruktur ein. Sobald in einer Ap-<br />
File-<br />
System<br />
Abbildung 2: Fein granulierte Berechtigungen als Erweiterung zum bestehenden Rechtesystem von FreeBSD.<br />
104 Ausgabe 05-2013 Admin www.admin-magazin.de
Capsicum<br />
plikation »cap_enter()« aufgerufen wird,<br />
erhalten alle Filedeskriptoren eine erweiterte<br />
Datenstruktur. Sobald ein so ausgestatteter<br />
Filedeskriptor benutzt wird,<br />
prüft der Kernel, ob beim Zugriff auf die<br />
abgesicherte Einheit alles korrekt ist.<br />
Für den Entwickler von Applikationen,<br />
die sich des Capsicum-Systems bedienen,<br />
ist das von Bedeutung, weil er<br />
entscheiden muss, welche der bereits<br />
durch »cap_enter()« gesperrten Zugriffsmöglichkeiten<br />
entweder gelockert,<br />
weiter verschärft oder weitere Regeln<br />
hinzugefügt werden sollen. Dazu dient<br />
der Aufruf von »cap_new()«, der einen<br />
bereits bestehenden Filedeskriptor und<br />
die gewünschten Berechtigungen als Parameter<br />
erwartet. Dabei spielt es keine<br />
Rolle, ob der Filedeskriptor für Dateien,<br />
Unix- oder Netzwerk-Sockets, Directories<br />
oder Geräte angelegt wurde. Die Manpage<br />
zu »cap_new()« listet alle verfügbaren<br />
Berechtigungen auf, die mit dem<br />
Oder-Operator verknüpft an Capsicum<br />
übermittelt werden. Die Manpage listet<br />
auch die zahlreichen Systemfunktionen<br />
der C-Bibliothek »libc« auf, die von Capsicum<br />
beeinflusst werden.<br />
Vorher planen<br />
Capsicum setzt daher voraus, dass man<br />
Applikationen sehr genau plant. Diese<br />
Aufgabe ist mit Sicherheit nicht trivial,<br />
da sie eine sehr genaue Analyse der Ressourcen<br />
verlangt. Dazu gehört der Einsatz<br />
von geschütztem Shared Memory<br />
anstelle eines gemeinsamen, öffentlich<br />
zugänglichen Speicherbereichs zum Datenaustausch.<br />
Capsicum gibt dem Programmierer<br />
die Wahlfreiheit, ob er das<br />
FreeBSD-eigene Berechtigungssystem<br />
verwendet oder die Bibliothek »libcapsicum«<br />
einsetzt.<br />
Applikationen mit zweifelhaften Privilegien<br />
lassen sich so umbauen, dass sie<br />
»cap_enter()« direkt verwenden. So ent-<br />
steht eine Applikation, deren einzelne<br />
Prozesse im Capability-Mode laufen<br />
und spezielle Berechtigungen über ihre<br />
Filedeskriptoren vererben. Diese Vorgehensweise<br />
eignet sich gut für einfach gestrickte<br />
Applikationen, die nach folgendem<br />
Schema ablaufen: Alle Ressourcen<br />
öffnen und in einer Schleife alle ein- und<br />
ausgehenden Daten verarbeiten – ähnlich<br />
einer UNIX-Pipeline oder bei einer<br />
Interaktion mit einem Netzwerk. Der Geschwindigkeitsverlust<br />
durch Capsicum<br />
ist sehr gering, wenn man die Berechtigungen<br />
beim Zugriff auf die Ressourcen<br />
einschränkt.<br />
Anhand des FreeBSD-Tools zur Netzwerkanalyse<br />
»tcpdump« wird dieses Ziel<br />
im Folgenden näher beschrieben. Tcpdump<br />
ist nach dem genannten Schema<br />
aufgebaut und daher einfach auf Capsicum<br />
umzustellen: Das Programm nutzt<br />
den Berkeley Packet Filter »bpf«, um die<br />
über ein Netzwerk transportierten Daten<br />
zu analysieren. Dazu teilt Tcpdump<br />
dem Paketfilter ein Suchmuster mit. Im<br />
nächsten Schritt wird der Filter als Eingabequelle<br />
definiert, um die Informationen<br />
zur weiteren Verarbeitung an »tcpdump«<br />
zu senden. Schließlich werden die eingehenden<br />
Daten in einer Schleife interpretiert,<br />
aufbereitet und auf der Console dargestellt.<br />
Somit lässt sich die Anwendung<br />
mit zwei zusätzlichen Zeilen Programmcode<br />
in den Capsicum-Capability-Mode<br />
übertragen:<br />
if (cap_enter() < 0)<br />
error("cap_enter: %s",<br />
pcap_strerror(errno));<br />
Diese beiden Zeilen werden vor der<br />
Schleife eingefügt, welche die Analyse<br />
des Datenverkehrs durchführt:<br />
status = pcap_loop(pd, cnt,<br />
callback, pcap_userdata);<br />
Damit erhöht sich die Sicherheit beträchtlich.<br />
Parsen und Analysieren von<br />
Datenpaketen stellt meistens eine Sicherheitslücke<br />
dar, weil viele Speicherzugriffe<br />
durch C-Pointer und Kopieraktionen<br />
durchgeführt werden. Wie zuvor erläutert,<br />
unterbindet Capsicum den Zugriff<br />
auf privilegierte Speicherbereiche, was<br />
durch den Aufruf von »cap_enter()« realisiert<br />
wird. Um auch die Kommunikation<br />
auf STDIN (Standardeingabe), STDOUT<br />
(Standardausgabe) und STDERR (Standardfehlerausgabe)<br />
zu beschränken,<br />
sollte man Listing 1 vor dem ersten Aufruf<br />
von »cap_enter()« einfügen.<br />
Mit der hier verwendeten Funktion »cap_<br />
rights_limit()« wird der Lesezugriff auf<br />
das STDIN-Gerät unterbunden, während<br />
Schreiboperationen auf die Ausgabegeräte<br />
STDOUT und STDERR sinnvollerweise<br />
erlaubt werden.<br />
Reingeschaut<br />
Eine Analyse mit dem um den Parameter<br />
»‐C« erweiterten FreeBSD-Kommando<br />
»procstat« bestätigt diesen Sachverhalt<br />
und ist als Screenshot in Abbildung 3 zu<br />
sehen. In der ersten und zweiten Spalte<br />
sind die Prozess-ID und der Prozessname<br />
zu sehen; die dritte Spalte zeigt den Filedeskriptor.<br />
In diesem Beispiel sind das<br />
Standardeingabe (FD = 0), Standardausgabe<br />
(FD = 1), Standardfehlerausgabe<br />
(FD = 2) und der Treiber »bpf« für den<br />
Berkeley-Paketfilter (FD = 3); Spalte<br />
vier beschreibt die Art des Filedeskriptors,<br />
in Spalte »FLAGS« wird dargestellt,<br />
welche FreeBSD-Berechtigungen gesetzt<br />
sind. Desweiteren weist der Buchstabe<br />
»c« darauf hin, dass Capsicum für diesen<br />
Filedeskriptor aktiv ist.<br />
Die Spalte »CAPABILITIES« zeigt an,<br />
welche der Capsicum-Berechtigungen<br />
gesetzt sind. Die Angabe »FS« (CAP_<br />
FSTAT) bedeutet, dass der Status des Filedeskriptors<br />
abgefragt werden darf, »wr«<br />
(CAP_WRITE) steht für Schreibberechtigung<br />
und »se« (CAP_SEEK) bedeutet,<br />
Abbildung 3: Die Ausgabe von procstat eines durch Capsicum abgesicherten »tcpdump«.<br />
Listing 1: Standardkanäle limitieren<br />
if (cap_rights_limit(STDIN_FILENO,<br />
CAP_FSTAT) < 0)<br />
error("cap_new: unable to limit STDIN_FILENO");<br />
if (cap_rights_limit(STDOUT_FILENO,<br />
CAP_FSTAT | CAP_SEEK | CAP_WRITE) < 0)<br />
error("cap_new: unable to limit STDOUT_FILENO");<br />
if (cap_rights_limit(STDERR_FILENO,<br />
CAP_FSTAT | CAP_SEEK | CAP_WRITE) < 0)<br />
error("cap_new: unable to limit STDERR_FILENO");<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
105
Capsicum<br />
dass der Dateizeiger gesetzt werden darf.<br />
Eine Übersicht aller Capsicum-Berechtigungen<br />
findet sich unter [2]. Die letzten<br />
beiden Spalten zeigen das Protokoll und<br />
den Gerätetreiber an, der für den jeweiligen<br />
Filedeskriptor verwendet wird.<br />
Bei der Verwendung von Capsicum tritt<br />
aber auch ein unschöner Nebeneffekt auf,<br />
der sich speziell bei »tcpdump« deutlich<br />
zeigt: Es wird auch der Zugriff auf den<br />
Name-Service-Switch unterbunden. Im<br />
Fall von »tcpdump« betrifft das die Umwandlung<br />
von IP-Adressen in voll qualifizierte<br />
Hostnamen. Dies lässt sich aber<br />
umgehen, indem man Anfragen an einen<br />
lokalen Domain-Name-Server sendet.<br />
Aufgeteilt<br />
Ein schönes Beispiel für die Abschottung<br />
(engl. Compartmentalisation) stellt das<br />
Programm »rwhod« dar. Dieser System-<br />
Daemon ist dafür zuständig, Systeminformationen<br />
zu ermitteln. Die Informationen<br />
umfassen, welcher Benutzer aktuell<br />
angemeldet ist sowie Zeitraum und<br />
Zeitpunkt des Logons. Um den Daemon<br />
auf Capsicum umzustellen, wurde zuerst<br />
Listing 2: Dateioperationen<br />
if (cap_rights_limit(dirfd,<br />
CAP_CREATE | CAP_WRITE | CAP_FTRUNCATE |<br />
CAP_SEEK | CAP_LOOKUP | CAP_FSTAT) < 0 &&<br />
errno != ENOSYS) {<br />
syslog(LOG_WARNING, "cap_rights_limit: %m");<br />
exit(1);<br />
}<br />
if (cap_enter() < 0 && errno != ENOSYS) {<br />
syslog(LOG_ERR, "cap_enter: %m");<br />
exit(1);<br />
}<br />
Listing 3: Casper<br />
[...]<br />
#ifdef HAVE_LIBCAPSICUM<br />
if (nflag) {<br />
capcas = NULL;<br />
capdns = NULL;<br />
} else {<br />
capcas = cap_init();<br />
if (capcas == NULL)<br />
error("unable to contact Casper");<br />
capdns = cap_service_open(capcas,<br />
"system.dns");<br />
if (capdns == NULL)<br />
error("unable to open \\<br />
system.dns service");<br />
/*Limit system.dns to rev. DNS lookups.*/<br />
limits = nvlist_create(0);<br />
der Code bereinigt und die zu schützenden<br />
Bereiche in Funktionen unterteilt:<br />
Die zwei wesentlichen Funktionen sind<br />
»void receiver_process(void)« zum Empfang<br />
und »void sender_process(void)«<br />
zum Versenden der angeforderten Informationen<br />
an einen Client.<br />
Rechtefrage<br />
Nachdem die Abschottung in diesem<br />
Beispiel soweit abgeschlossen ist, muss<br />
sich der Autor des Programms Gedanken<br />
darüber machen, welche Zugriffsrechte<br />
das Tool für die einwandfreie Funktion<br />
benötigt. Hier gilt es, ein besonderes<br />
Augenmerk auf die Funktion »void receiver_process(void)«<br />
zu legen, weil sie<br />
Daten in die Datei »whod.«<br />
im Verzeichnis »/var/rwho« schreibt.<br />
Eingangs wurde erläutert, dass ein Filedeskriptor,<br />
der zum Schreiben in eine<br />
Datei angelegt wird, die Möglichkeit bietet,<br />
eine Datei auszulesen. Für Schadcode<br />
ist dieser Sachverhalt willkommen, weil<br />
so Informationen unerwünscht weiterverbreitet<br />
werden können. Mit der Capsicum-Funktion<br />
»cap_rights_limit()« lässt<br />
sich genau dies verhindern, wenn man<br />
die Flags »CAP_WRITE | CAP_FTRUN-<br />
CATE | CAP_FSTAT« setzt. Siehe hierzu<br />
den vollständigen Quellcode [4] ab Zeile<br />
404:<br />
if (cap_rights_limit(whod,<br />
CAP_WRITE | CAP_FTRUNCATE | CAP_FSTAT) < 0<br />
&& errno != ENOSYS) {<br />
syslog(LOG_WARNING, "cap_rights_limit:<br />
%m");<br />
exit(1);<br />
}<br />
nvlist_add_string(limits,<br />
"type", "ADDR");<br />
nvlist_add_number(limits,<br />
"family", (uint64_t)AF_INET);<br />
nvlist_add_number(limits,<br />
"family", (uint64_t)AF_INET6);<br />
if (cap_limit_set(capdns, limits) < 0)<br />
error(<br />
"unable to limit access to \\<br />
system.dns service");<br />
nvlist_destroy(limits);<br />
/*Casper capability no longer needed.*/<br />
cap_close(capcas);<br />
}<br />
#endif /* HAVE_LIBCAPSICUM */<br />
[...]<br />
Die Flags besagen, dass der Filedeskriptor<br />
»whod« nur zum Schreiben in die<br />
Datei (»CAP_WRITE«), zum Ändern der<br />
Dateigröße (»CAP_FTRUNCATE«) und<br />
zum Abrufen der Statusinformationen<br />
(»CAP_FSTAT«) genutzt werden darf.<br />
Jede andere Operation wird unterbunden.<br />
Auch für den Fall, dass der Schadcode<br />
versuchen sollte, die Flags zu manipulieren,<br />
gibt es keine Chance. Flags, die<br />
einmal gesetzt wurden, lassen sich nicht<br />
mehr verändern.<br />
Weiterhin muss klar definiert sein, welche<br />
Dateioperationen im Verzeichnis<br />
»/var/whod« ausgeführt werden dürfen.<br />
Dazu dient der Code ab Zeile 353<br />
(Listing 2).<br />
Diese wenigen Zeile C-Code sind dafür<br />
verantwortlich, dass im bereits geöffneten<br />
Verzeichnis mit dem Filehandle<br />
»dirfd« Dateien angelegt oder ergänzt<br />
werden dürfen. Ein Auslesen der angelegten<br />
Dateien ist vom Programm aus<br />
aber nicht möglich.<br />
Fenster zur Welt<br />
Viele Dienstprogramme und Werkzeuge<br />
müssen Zugriff auf bestimmte Ressourcen<br />
Zugriff erhalten. Ein Beispiel wurde<br />
im Zusammenhang mit Tcpdump bereits<br />
angesprochen. Dieses Tool benötigt Zugriff<br />
auf den Domain Nameserver, um IP-<br />
Adressen in Hostnamen umzuwandeln.<br />
Innerhalb des Programms wird dazu der<br />
Name-Service-Switch (NSS) aufgerufen.<br />
Da Capsicum solche Zugriffe allerdings<br />
unterbindet, musste eine andere Lösung<br />
gefunden werden. Es entstand das Tool<br />
Casper (Capsicum Service), das die Möglichkeit<br />
bietet, als Daemon-Prozess kontrolliert<br />
Ausnahmeregeln zuzulassen.<br />
Die Funktionsweise von Casper ist anhand<br />
Abbildung 4 schnell erklärt. Casper<br />
startet ein Programm wie das in diesem<br />
Beispiel genannte »tcpdump«, das in einer<br />
Sandbox eingeschlossen ist. Bevor<br />
alle Überwachungsmechanismen scharf<br />
geschaltet werden, meldet das Programm<br />
die Ausnahmeregeln beim Casper-<br />
Daemon an und aktiviert anschließend<br />
die Schutzmechanismen.<br />
Eine solche Aktion muss vorher erledigt<br />
werden, da nach der Aktivierung von<br />
Capsicum keinerlei Kommunikation mit<br />
Systemdiensten und auch nicht mit Casper<br />
möglich ist. Im Beispiel wurde dies<br />
106 Ausgabe 05-2013 Admin www.admin-magazin.de
Capsicum<br />
tcpdump<br />
IP-Adresse<br />
Hostname<br />
Direktzugriff<br />
auf<br />
NIC<br />
Capsicum-Sandbox<br />
Casper mit Freigabe für DNS<br />
wie in Listing 3 realisiert. Der vollständige<br />
Code findet sich unter [7].<br />
Zunächst wird mit »cap_init()« der Casper-<br />
Daemon kontaktiert und das Programm<br />
registriert. Im nächsten Schritt meldet<br />
die Funktion »cap_service_open(...)« die<br />
gewünschte Ausnahme beim Daemon an.<br />
In diesem Beispiel sind es DNS-Anfragen,<br />
was durch die Option »system.dns« gekennzeichnet<br />
ist. Der Daemon erwartet<br />
eine durch »limits = nvlist_create(...)«<br />
bezeichnete Liste mit der genauen Funktionalität.<br />
Das erste Element beschreibt,<br />
dass es sich um eine Umwandlung von<br />
IP-Adressen in Hostnamen handelt, was<br />
durch »type« und »ADDR« angezeigt<br />
wird. Die beiden nächsten Einträge beschreiben<br />
die IP-Adressfamilie. In diesem<br />
Beispiel sind es IPv4- und IPv6-Adressen<br />
(AF_INET und AF_INET6).<br />
Diese Liste übergibt man mit »cap_limit_set(...)«<br />
an den Daemon Casper<br />
und löscht sie anschließend, da sie vom<br />
Programm Tcpdump nicht mehr benötigt<br />
wird. Ab diesem Zeitpunkt hat Casper<br />
alle Informationen, um dem Tool einen<br />
Zugriff auf den Domain Name Service<br />
zu gestatten.<br />
Gezielt geöffnet<br />
STOP<br />
Abbildung 4: Kommunikationsweg von Tcpdump und Casper bei einer DNS-Anfrage.<br />
DNS-Server<br />
über<br />
Name Service Switch NSS<br />
Man kann sich die Frage stellen, ob damit<br />
nicht das Sandbox-Konzept ausgehebelt<br />
wird. Casper erteilt nicht uneingeschränkt<br />
Zugriff auf die Ressource, sondern nutzt<br />
auch hier die unter Capsicum bereitgestellte<br />
feine Granulierung der Rechtever-<br />
Netzwerk-<br />
Hardware<br />
gabe. Außerdem legt der Autor des Programms<br />
fest, wie die Kommunikation mit<br />
der Außenwelt stattfinden darf und nicht<br />
irgendein externes Programm.<br />
Scharfe Anwendungen<br />
Um zu zeigen, dass sich nicht nur Systemprogramme,<br />
sondern auch Userprogramme<br />
mit Capsicum absichern lassen,<br />
wurde von Google der Webbrowser Chromium<br />
an die neue Umgebung angepasst.<br />
Googles Chromium erzeugt beim Start<br />
mehrere Prozesse, denen Aufgaben wie<br />
Verarbeiten von HMTL-Code, JavaScript<br />
und Verschlüsselung von Daten zufallen.<br />
Der ursprüngliche FreeBSD-Port des Webbrowsers<br />
enthielt keinerlei Sicherheitsmerkmale<br />
wie Sandboxing.<br />
Dass das Programm bereits in logische<br />
Abschnitte unterteilt ist (Stichwort: Compartmentalisation),<br />
erleichtert die Anpassung<br />
an die Capsicum-Umgebung von<br />
FreeBSD erheblich. Der Subprozess, der<br />
die grafische Darstellung der Webseite<br />
übernimmt, erhält besondere Berechtigungen,<br />
um mit dem Grafiksystem von<br />
X.org zu kommunizieren. Geschützte<br />
Speicherbereiche dienen zum Transport<br />
von Daten zwischen den einzelnen Subprozessen.<br />
Subprozesse zur Kompilierung<br />
von Javascript, HTML und XML<br />
haben keinen Zugriff auf Speicherbereiche<br />
außerhalb der Sandbox. Obwohl der<br />
Code-Umfang von Chromium gewaltig<br />
ist – man spricht von 4,3 Millionen Zeilen<br />
Code – erfolgte die Implementierung von<br />
Capsicum mit circa einhundert Zeilen<br />
nahezu reibungslos. Will man beispielsweise<br />
unter Windows die gleiche Sicherheit<br />
erreichen, sind mehr als 23 000<br />
Zeilen Code nötig ([8]). Auch hat der<br />
Entwickler der GNUStep-Desktop-Suite<br />
bereits angekündigt, Capsicum in den<br />
Anwendungen einzusetzen.<br />
Fazit<br />
Mit FreeBSD 9 haben die Entwickler den<br />
Sicherheitsmechanismus Capsicum eingeführt.<br />
Der volle Umfang der Capsicum-<br />
Funktionalität wird ab FreeBSD 10 zur<br />
Verfügung stehen. Alle sicherheitskritischen<br />
Systemprogramme werden dann<br />
das neue Framework nutzen. Zusätzlich<br />
werden möglicherweise weitere Applikationen<br />
wie Apache an die neue FreeBSD-<br />
Umgebung angepasst sein. So möchten<br />
einige Entwickler von GNUStep-Anwendungen<br />
diese an FreeBSD-Capsicum<br />
anpassen. Es wurde bereits von KDE-<br />
Maintainern angekündigt, Capsicum in<br />
KDE zu implementieren. Man darf daher<br />
gespannt sein, was die Zukunft für Capsicum<br />
bringen wird. (ofr)<br />
n<br />
Infos<br />
[1] Kris Kennaway: Introducing Capsicum:<br />
Practical Capabilities for UNIX<br />
[2] Capsicum-Berechtigungen: [http:// www.<br />
dankoweit. de/ FreeBSD/ hp_freebsd_capsicum_capabilities.<br />
html]<br />
[3] Manpages: capsicum(4), cap_enter(2),<br />
cap_new(2)<br />
[4] Rwhod (BSD-Lizenz): [http:// svnweb.<br />
freebsd. org/ base/ head/ usr. sbin/ rwhod/<br />
rwhod. c? revision=252605& view=markup]<br />
[5] Compartmentalisation (r252603): [http://<br />
lists. freebsd. org/ pipermail/ svn‐src‐head/<br />
2013‐July/ 049115. html]<br />
[6] Capsicum-Flags setzen (r252605): [http://<br />
lists. freebsd. org/ pipermail/ svn‐src‐head/<br />
2013‐July/ 049116. html]<br />
[7] Vollständiger Quellcode von tcpdump<br />
(BSD-Lizenz): [http:// p4db. freebsd. org/<br />
fileDownLoad. cgi? FSPC=// depot/ user/ pjd/<br />
capsicum/ contrib/ tcpdump/ tcpdump. c&<br />
REV=17]<br />
[8] Vergleich der Sandboxing-Technologien,<br />
Robert N. M. Watson, University of<br />
Cambridge, Seite 11: [http:// www. cl.<br />
cam. ac. uk/ ~jra40/ publications/ 2010/<br />
USENIXSEC‐capsicum. pdf]<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
107
Raspberry<br />
Abbildung 1: Der Raspberry Pi mit seinen diversen Anschlüssen: Links oben (blau) die SD-Karte, darunter der Micro-USB-Stromanschluss, oben Video- (gelb) und<br />
Audioausgang, unten HDMI, rechts in der Mitte USB, darunter das gelbe Netzwerkkabel. Ein Gehäuse wie das Abgebildete muss man allerdings extra kaufen.<br />
NetBSD auf dem Raspberry Pi<br />
Netberry<br />
Eines der interessantesten Computerprojekte der letzten Zeit ist der<br />
Rasp berry Pi. Normalerweise wird er mit Linux betrieben, NetBSD funktioniert<br />
aber auch und sogar ohne lokalen Monitor. Die Vorbereitung ist dann<br />
nur etwas ungewöhnlich. Jörg Braun und Rosa Riebl<br />
Seit der ersten Veröffentlichung sind<br />
laut der Website raspberrypi.org über<br />
eine Million Exemplare des Raspberry<br />
Pi verkauft worden. Kein Wunder, denn<br />
dieser Einplatinencomputer besticht<br />
durch ein günstiges Preis-/Leistungsverhältnis<br />
und seine nahezu unbegrenzte<br />
Ausbaufähigkeit. Als Standardbetriebssystem<br />
wird Linux empfohlen, von dem<br />
es ein vorgefertigtes Image gibt, das sich<br />
zum Booten auf eine mindestens 4 GByte<br />
große SD-Karte übertragen lässt. Es gibt<br />
mehrere Distributionen und das speziell<br />
angepasste Debian GNU/Linux lässt eigentlich<br />
keine Wünsche offen.<br />
Der Raspberry Pi ist sehr klein, der dennoch<br />
vollwertige Computer basiert auf<br />
einem mit 700 MHz getakteten ARM-<br />
Prozessor. Die größere und etwas teurere<br />
Variante Typ B besitzt 512 MByte RAM,<br />
zwei USB-2-Schnittstellen und eine eingebaute<br />
Netzwerkkarte mit 10/100 MBit/s<br />
(kein Gigabit-Netzwerk). Die kleinere<br />
und etwas günstigere Variante A ohne<br />
Netzwerk und mit nur 256 MByte RAM<br />
wurde nicht getestet. Weiteres RAM kann<br />
man nicht einbauen, aber zusätzliche Peripherie<br />
lässt sich über einen USB-Hub<br />
anschließen.<br />
Der Raspberry besitzt außer den erwähnten<br />
Schnittstellen einen einfachen<br />
Video- und Audioausgang und für die<br />
Ausgabe auf modernen Fernsehern einen<br />
HDMI-Ausgang – ein Versuch, über einen<br />
Adapter das HDMI-Signal auch auf einen<br />
anderen Bildschirm umzuleiten, führte<br />
zu keinem Ergebnis. Die Stromzufuhr geschieht<br />
per Micro-USB-Stecker und bei einer<br />
Leistungsaufnahme von 700 mA beim<br />
Raspberry Pi Typ B am besten mit einem<br />
USB-Netzumwandler. An die diversen<br />
Verbindungskabel und an die Anschaffung<br />
eines Gehäuses sollte man gleich<br />
beim Kauf der Platine denken.<br />
Anschlussfreudig<br />
Der Raspberry Pi kann, abgesehen von<br />
einem primären Zweck der Ansteuerung<br />
unterschiedlicher Peripheriegeräte,<br />
über sein ausgereiftes Bussystem auch<br />
als Mini-PC lokal betrieben werden<br />
108 Ausgabe 05-2013 Admin www.admin-magazin.de
Raspberry<br />
Die Installation beginnt mit dem Download<br />
eines ISO-Images des aktuellen<br />
NetBSD-Releases. Das Image des aktuellen<br />
32-Bit-Systems für Intel-Maschinen<br />
finden Sie unter [6]. Wie bei NetBSD üblich<br />
ist das CD-Image »NetBSD‐6.1‐i386.<br />
iso« mit 312 MByte einigermaßen schlank<br />
und braucht bei der Installation trotzdem<br />
keine Internetverbindung für das Nachund<br />
beispielsweise einen HDMI-fähigen<br />
Fernseher sehr einfach und kostengünstig<br />
Internet-tauglich machen. Man kann<br />
damit aber auch im Netzwerk einen<br />
stromsparenden Web- oder Dateiserver<br />
implementieren. Über den Aufbau eines<br />
Webservers mit dem Raspberry findet<br />
man unzählige Beiträge im Internet und<br />
in Zeitschriften. Dabei beschränkt sich<br />
die eigentlich Rasp berry-typische Arbeit<br />
auf das Einspielen des Linux-Systems,<br />
der Rest der Arbeiten ist eins zu eins<br />
identisch zu denen auf anderen Debianbasierten<br />
Serversystemen, also Apache<br />
und PHP einrichten und konfigurieren.<br />
Linux, nein danke<br />
Auf den Download-Seiten von [1] findet<br />
man zwar ständig aktualisierte Linux-<br />
Distributionen und echte Exoten wie<br />
Risc OS, daneben aber recht versteckt<br />
auch Verweise auf FreeBSD und NetBSD.<br />
FreeBSD empfiehlt sich aber nicht unbedingt,<br />
denn es gibt bei diesem Betriebssystem<br />
keine vorkompilierten externen<br />
Programme; man muss sich alles selbst<br />
aus den Ports kompilieren. Auf dem<br />
Raspberry wird das zur echten Geduldsprobe,<br />
speziell auch deshalb, weil bei<br />
FreeBSD kein X enthalten ist und dieses<br />
sehr große Programmpaket ebenfalls aus<br />
den Ports kompiliert werden muss.<br />
Die Unterstützung durch NetBSD ist<br />
besser, was eigentlich nicht verwundert,<br />
ist NetBSD doch das auf den meisten<br />
Plattformen verfügbare Betriebssystem<br />
und für ARM sind sogar mehrere Ports<br />
erhältlich. Gültig für den Raspberry und<br />
verwandte Hardware ist NetBSD/evbarm.<br />
Wie FreeBSD muss man auch NetBSD aus<br />
den aktuellen Entwicklerquellen installieren,<br />
was manchmal funktioniert, oft aber<br />
auch nicht. Eine rudimentäre Anleitung<br />
dazu gibt es auf [2]. Man kann mit dieser<br />
Anleitung und etwas Hintergrundwissen<br />
zu NetBSD das System recht einfach und<br />
elegant installieren, darf dabei nur zum<br />
Schluss im Installationsprogramm nicht<br />
vergessen, den SSHD einzuschalten und<br />
ein Benutzerkonto anzulegen. Mit den<br />
Quellen vom 12.6.2013 (siehe [3]) funktioniert<br />
die Installation auch – nur war<br />
anschließend kein Einloggen möglich,<br />
weil keine Bibliothek für die Passwortprüfung<br />
eingeschaltet wird. Das System<br />
ist damit unbrauchbar.<br />
Es gibt aber eine einfachere Möglichkeit,<br />
NetBSD erfolgreich auf dem Raspberry<br />
einzurichten. Der Ablauf wirkt nur auf<br />
den ersten Blick etwas seltsam. Benötigt<br />
werden dazu nämlich zwei Images,<br />
eines für den Raspberry Pi von [4] und<br />
außerdem eines für eine Installation von<br />
NetBSD/i386 oder NetBSD/AMD64 in<br />
einer virtuellen Maschine. Letzteres ist<br />
aber nur nötig, wenn man keinen geeigneten<br />
Bildschirm für den Raspberry<br />
zur Verfügung hat und sich mit SSH in<br />
das Betriebssystems des Winzlings einloggen<br />
muss. Im vorgefertigten Image ist<br />
nämlich kein Benutzerkonto angelegt,<br />
weshalb SSH den Dienst verweigert (es<br />
arbeitet sich auf dem Intel-System aber<br />
auch besser als auf dem ursprünglich<br />
doch recht rudimentären Image).<br />
Haben Sie bereits eine native Installation<br />
von NetBSD in Betrieb, können Sie sich<br />
theoretisch das Anlegen einer virtuellen<br />
NetBSD-Maschine sparen und die benötigten<br />
Dateien aus den Verzeichnissen<br />
»/etc« und »/home« des laufenden Systems<br />
in das gleichnamige Verzeichnis<br />
auf dem angelegten Image einspielen.<br />
Sie übertragen damit aber auch die anderen<br />
Benutzerkonten, was normalerweise<br />
nicht gewünscht sein dürfte.<br />
Wenn Sie die Arbeiten unter Windows<br />
durchführen wollen, brauchen Sie außer<br />
den Images für die NetBSD-Installationen<br />
den Win32DiskImager, können aber<br />
auf ihn verzichten, wenn Sie NetBSD in<br />
der virtuellen Maschine (zum Beispiel<br />
unter VirtualBox) installieren, weil sich<br />
das Image auch daraus auf die SD-Karte<br />
schrei ben lässt. Natürlich muss die<br />
Möglichkeit bestehen, auf dem PC die<br />
SD-Karte zu beschreiben, entweder mit<br />
einem eingebauten oder einem per USB<br />
angeschlossenen Kartenleser. Dies gilt<br />
aber auch für andere (Linux-)Images des<br />
Raspberry.<br />
Lieber NetBSD<br />
laden fehlender Daten, wie man es von<br />
kleineren Linux-Images kennt.<br />
Für die NetBSD-Installation sollten in<br />
der Virtualisierungslösung eine nicht zu<br />
kleine Festplatte (5 GByte und mehr reichen<br />
jedoch) und 512 MByte Arbeitsspeicher<br />
gewählt werden. NetBSD wird bei<br />
der VirtualBox als Gastsystem direkt angeboten,<br />
bei VMware Workstation muss<br />
FreeBSD gewählt werden (NetBSD-Gäste<br />
kennt man bei VMware nicht).<br />
Sie sollten die VirtualBox-Installation um<br />
die proprietären Erweiterungen ergänzen,<br />
damit USB-2-Zugriffe möglich sind. Andernfalls<br />
dauern die Arbeiten unerträglich<br />
lange – grundsätzlich geht es aber<br />
ohne. Nach dem Anlegen der virtuellen<br />
PC-Maschine mit den oben angegebenen<br />
Daten und nach dem Einbinden des von<br />
[6] heruntergeladenen ISO-Images als<br />
CD-Laufwerk wird NetBSD installiert.<br />
Diese Installation verläuft im Textmodus<br />
und ist schlicht und funktional. Die einzige<br />
Stelle, an der Sie aufpassen müssen,<br />
ist die Definition des Festplattenlabels.<br />
Zusätzlich zu den vorgeschlagenen BSD-<br />
Partitionen »a« für das Rootverzeichnis<br />
und »b« für den Auslagerungsbereich,<br />
deren Daten übernommen werden können,<br />
sollte der Rest als Partition »e« dem<br />
Mountpunkt »/usr« zugewiesen werden.<br />
Dies geschieht nicht automatisch.<br />
Benutzer anlegen<br />
Nach dem Abschluss der Installation<br />
halten Sie das Gastsystem an, binden<br />
das ISO-Image aus und booten von der<br />
virtuellen Festplatte. In das neue System<br />
loggen Sie sich als Root ein. Jetzt sollte<br />
dem Administratorkonto »root« mit dem<br />
Befehl »passwd« ein Passwort vergeben<br />
und anschließend mit »useradd« ein zusätzliches<br />
Benutzerkonto definiert werden.<br />
Die hier getroffenen Angaben gelten<br />
später auch für den Raspberry.<br />
Beachten Sie, dass »useradd« nicht interaktiv<br />
ist und Sie bei seinem Aufruf<br />
unbedingt den Schalter »‐m« verwenden,<br />
damit das Verzeichnis für das Konto auch<br />
angelegt wird. Der Befehl lautet dann<br />
beispielsweise<br />
useradd ‐m ‐s /bin/ksh ‐b /home rosa<br />
wobei »rosa« der Name des neu angelegten<br />
Kontos und der Name des Home-<br />
Verzeichnisses ist. Weitere Angaben sind<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
109
Raspberry<br />
nicht nötig. Nun müssen Sie mit dem<br />
Befehl<br />
passwd rosa<br />
noch das Passwort festlegen und in der<br />
»/etc/group« das neue Konto mit »vi«<br />
der Gruppe »wheel« zuordnen. Die Zeile<br />
sollte anschließend<br />
wheel:*:0:root,rosa<br />
lauten. Das neue Konto kann auf dieselbe<br />
Weise auch anderen Gruppen wie »operator«,<br />
»staff« oder »users« zugewiesen<br />
werden. Dies ist für manche Programme<br />
günstig, für das Einloggen mit »ssh« aber<br />
nicht unbedingt nötig.<br />
Zuerst der virtuelle PC …<br />
Haben Sie den Schalter »‐m« vergessen,<br />
müssen Sie als »root« das Verzeichnis<br />
mit »mkdir« zuerst anlegen und dann<br />
dem Konto manuell zuweisen. Das sieht<br />
dann so aus:<br />
mkdir /home/rosa<br />
cp /etc/skel/.* /home/rosa<br />
chown rosa:wheel /home/rosa<br />
Diese einfache virtuelle Maschine lässt<br />
sich noch ausbauen, beispielsweise indem<br />
externe Software-Pakete installiert<br />
werden. Dafür bearbeiten Sie am einfachsten<br />
die »/etc/.profile« des Root-Kontos<br />
und entfernen vor den drei Zeilen mit<br />
»export PKG_PATH=?« das Gatter-Zeichen.<br />
Linux-Anwender werden bei dieser<br />
Gelegenheit feststellen, dass der »vi« von<br />
NetBSD recht primitiv ist.<br />
Nach dem Speichern der Datei mit »:w!«<br />
und dem »:q« loggen Sie sich aus der<br />
Maschine aus und dann wieder ein und<br />
können dann mit »pkg_add« beliebige<br />
Pakete, zum Beispiel »Midnight Commander«,<br />
den Debian-Editor »Nano« und<br />
»Sudo« installieren:<br />
in jedem Fall besser. Unter Unix/Linux<br />
überträgt man die Image-Datei mit dem<br />
Befehl »dd« auf das Device, unter NetBSD<br />
zum Beispiel mit<br />
dd if=2013‐03‐04‐netbsd‐raspi.img of=U<br />
/dev/sd0<br />
Dies gilt allerdings nur dann, wenn<br />
NetBSD nicht auf einer SCSI-, sondern<br />
einer IDE- oder SATA-Platte und damit<br />
auf »wd0« installiert wurde. Wie das Device<br />
wirklich heißt, sieht man an dem<br />
grünen Namen, der auf der ersten Konsole<br />
nach dem Einstecken der SD-Karte<br />
beziehungsweise von deren Adapter erscheint.<br />
Unter Windows entpacken Sie<br />
das Archiv mit dem Win32DiskImager in<br />
ein beliebiges Verzeichnis und rufen das<br />
Exe-Programm dort auf.<br />
Haben Sie NetBSD in einer virtuellen<br />
Maschine unter Windows installiert,<br />
spricht überhaupt nichts dagegen, die<br />
SD-Karte aus der virtuellen Installation<br />
zu beschreiben. Dazu muss (das ist voreingestellt)<br />
USB für den Gast eingeschaltet<br />
sein. Dann stecken Sie die Karte ein.<br />
Erkennt Windows sie, taucht sie in der<br />
Statuszeile des VirtualBox-Fensters auf.<br />
Mit dem Eintrag in der Statuszeile des<br />
Fensters der virtuellen Maschine wird das<br />
Gerät Windows entzogen und der VM<br />
zugeordnet.<br />
Nach dem Signalton entfernen Sie jetzt<br />
die Hardware physisch vom PC und binden<br />
sie dann sofort wieder ein. Erst danach<br />
wird sie der virtuellen Maschine<br />
zugeteilt, wie der Name zeigt (siehe Abbildung<br />
2 und 3).<br />
Für das Übertragen der Daten wird die<br />
Karte nicht gemountet. Erst nachdem Sie<br />
die Daten korrekt mit »dd« aufgespielt<br />
haben, wird das Device eingebunden.<br />
Das NetBSD-System befindet sich auf der<br />
Partition »a«. Die Aufrufe lauten<br />
dd if=rpi‐20130124.img of=/dev/sd0<br />
mount /dev/sd0a /mnt<br />
Das Einbinden des Images in die NetBSD-<br />
Instanz ist entscheidend, weil jetzt noch<br />
die angesprochenen Korrekturen folgen.<br />
Zuerst kopieren Sie die Passwortdateien<br />
und die Gruppendatei mit »cp« nach »/<br />
mnt/etc« (falls die Karte wie gezeigt nach<br />
»/mnt« eingebunden wurde):<br />
cp ‐a /etc/passwd /mnt/etc<br />
cp ‐a /etc/master.passwd /mnt/etc<br />
cp ‐a /etc/spwd.db /mnt/etc<br />
cp ‐a /etc/pwd.db /mnt/etc<br />
cp ‐a /etc/group /mnt/etc<br />
Der Parameter »‐a« fasst die Rekursion der<br />
Inhalte und das Beibehalten der Datei-<br />
Attribute und ‐rechte zusammen. Einfacher<br />
und bequemer lassen sich die Daten<br />
mit dem Midnight Commander kopieren.<br />
Außerdem übertragen Sie das Verzeichnis<br />
»/home«, in dem sich nur das eine zuvor<br />
angelegte Benutzerverzeichnis befinden<br />
sollte, auf das ARM-System:<br />
cp ‐a /home /mnt<br />
E<br />
pkg_add mc nano sudo<br />
Die Programme stehen nach der Installation<br />
sofort zur Verfügung.<br />
… und jetzt der Raspberry<br />
Im nächsten Schritt laden Sie das NetBSD-<br />
Image für den Raspberry von [4] herunter,<br />
packen es aus und übertragen es auf<br />
die SD-Karte. Die Karte muss dafür mindestens<br />
2 GByte groß sein, mehr ist aber<br />
Abbildung 2: Das USB-Gerät wurde von der VirtualBox erkannt und kann zugeordnet werden.<br />
110 Ausgabe 05-2013 Admin www.admin-magazin.de
TEsten Sie<br />
android user<br />
Sparen Sie 66 %: 3 Ausgaben lesen - nur eine zahlen*!<br />
Jetzt bestellen unter:<br />
www.android–user.de/miniabo<br />
Telefon 07131 / 2707 274 • Fax 07131 / 2707 78 601 • E-Mail: abo@android-user.de<br />
(*Mini-Abo: 3x Printausgaben nur 5,90 Euro, 3x PDF-Ausgaben nur 3,99 Euro)<br />
NEU: MINI-ABO<br />
NACH WAHL<br />
ALS Print- oder<br />
PDF-Version!
Raspberry<br />
Jetzt fehlen nur noch einige Anpassungen,<br />
damit das System auch richtig funktioniert.<br />
Damit benötigt man übrigens<br />
auch keinen DHCP-Server, der sonst bei<br />
allen Remote-Raspberry-Installationen<br />
gefordert wird. In »/mnt/etc« werden<br />
eine Reihe Dateien angelegt: »myname«<br />
enthält als Eintrag nur den Namen des<br />
Systems, beispielsweise »raspberry« ohne<br />
weitere Umrahmungen und Definitionen.<br />
»resolv.conf« nimmt die Liste der Nameserver<br />
auf. Sie kann etwa so aussehen:<br />
nameserver 192.168.0.1<br />
nameserver 8.8.8.8<br />
nameserver 8.8.4.4<br />
In »mygate« steht die IP-Adresse des Routers,<br />
der ins Internet führt, ohne weitere<br />
Zusatzangaben, also beispielsweise<br />
»192.168.0.1«.<br />
Netzwerkkarte<br />
Wie die Netzwerkkarte konfiguriert ist,<br />
stellen Sie in der neu anzulegenden »ifconfig.usmsc0«<br />
ein. Die Dateiendung ist<br />
NetBSD-spezifisch und drückt die Gerätekennung<br />
aus, das »eth0« von Linux<br />
sucht man bei allen BSD-Systemen vergebens.<br />
Das führende »u« der Endung<br />
zeigt im Übrigen an, dass die Karte über<br />
die USB-Schnittstelle betrieben wird. Dies<br />
ist der Grund, warum beim Raspberry Pi<br />
kein Betrieb mit einem Gigabit-Ethernet<br />
möglich ist.<br />
Befindet sich ein DHCP-Server im Netzwerk,<br />
von dem der Raspberry seine IP-<br />
Adresse dynamisch erhalten soll, reicht<br />
es, wenn in der Datei der Eintrag »dhcp«<br />
steht. Bei fester IP-Adresszuweisung wird<br />
hinter der Kennung »inet« die IP-Adresse<br />
und nach einem »netmask« in der selben<br />
Zeile die klassische Maske angegeben.<br />
Das sieht beispielsweise so aus (die IP-<br />
Adresse und die Maske müssen natürlich<br />
angepasst werden):<br />
inet 192.168.0.20 netmask 255.255.255.0<br />
Zusätzliche Angaben, die in der Manpage<br />
zu »ifconfig.if« zu finden sind, werden<br />
Listing 1: Paketquellen<br />
01 # Uncomment the following line(s) to install binary packages<br />
02 # from ftp.NetBSD.org via pkg_add. (See also pkg_install.conf)<br />
beim Raspberry nicht benötigt. Wollen<br />
Sie statt einer statischen IP-Adresse lieber<br />
DHCP nutzen, sind die Angaben zum<br />
Router und DNS von oben übrigens optional.<br />
Das »dhclient«-Skript, das die IP-<br />
Adresse anfordert, erzeugt beim Booten<br />
automatisch die anderen Dateien.<br />
Startprogramme<br />
Jetzt fehlt noch die zentrale Konfigurationsdatei<br />
»/etc/rc.conf«. Hinter der Zeile<br />
mit »Add local overrides below« tragen<br />
Sie die beim Start des Geräts zu ladenden<br />
Dienste ein:<br />
sshd=YES<br />
ntpd=YES<br />
ntpdate=YES<br />
wscons=YES<br />
# SSH‐Daemon<br />
# Uhrzeit aus<br />
# dem Netz<br />
# Konsolendefinition<br />
Damit das System mit einer deutschen<br />
Tastatur startet, tragen Sie in »/etc/<br />
wscons.conf« die Zeile<br />
encoding de.nodead<br />
ein. Andere Tastaturbelegungen werden<br />
jeweils durch das Voranstellen eines Gatters<br />
ausgeschaltet.<br />
Das war es schon fast. Nur noch die<br />
»/root/.profile« verlangt dringend nach<br />
einer Anpassung, damit nach dem Start<br />
des Raspberrys auch Software aus der<br />
Paketverwaltung installiert werden kann.<br />
Die Liste muss um die NetBSD-6.1-Pakete<br />
ergänzt werden. Die internen Variablen<br />
kann man entfernen, wie die ersten beiden<br />
Beispiele zeigen (Listing 1). Wichtig<br />
ist, dass die Angaben insgesamt zwischen<br />
Anführungszeichen stehen.<br />
Passende Pakete<br />
03 export PKG_PATH="ftp://ftp.NetBSD.org/pub/pkgsrc/packages/NetBSD/evbarm/6.1/All"<br />
Mit diesen Werten sucht die Paketverwaltung<br />
zuerst nach neueren, dann<br />
nach älteren Programmpaketen dieser<br />
Hardware-Plattform, falls sie für neuere<br />
NetBSD-Versionen nicht kompiliert<br />
wurden. Hier wurde die in der Originaldatei<br />
enthaltene Suche nach NetBSD-<br />
5.0-Paketen entfernt, weil die Erfahrung<br />
zeigt, dass bei neuen Installationen von<br />
04 export PKG_PATH="${PKG_PATH};ftp://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/evbarm/6.0/All/"<br />
05 export PKG_PATH="${PKG_PATH};ftp://ftp.NetBSD.org/pub/pkgsrc/packages/NetBSD/$(uname ‐m)/5.1/All"<br />
NetBSD 6.x bereits schon das Einbinden<br />
von Programmen für NetBSD 5.1 zu Problemen<br />
führen kann.<br />
Installiert man beispielsweise auf dem<br />
Raspberry mit den obigen Angaben den<br />
Midnight Commander mit dem Aufruf<br />
pkg_add mc<br />
wird das Paket aus den Paketquellen von<br />
NetBSD 5 geholt. Anschließend stimmen<br />
aber die Verweise auf zwei Linkbibliotheken<br />
nicht, die bei NetBSD 6.x in der<br />
Versionskennung 1, bei NetBSD 5 in der<br />
Versionskennung 0 zu finden sind. Man<br />
muss dann ins Verzeichnis »/usr/lib«<br />
wechseln und dort zwei Links für die<br />
Bibliotheken anlegen:<br />
ln libintl.so.1 libintl.so.0<br />
ln libpthread.so.1 libpthread.so.0<br />
Der Midnight Commander funktioniert<br />
zwar nach diesen Änderungen, schön ist<br />
das aber nicht.<br />
Es ist jedoch unrealistisch zu versuchen,<br />
Programme auf dem verhältnismäßig leistungsschwachen<br />
System zu kompilieren.<br />
Auch das Neukompilieren des Betriebssystems<br />
ist kaum machbar. Das Dateisystem<br />
lässt sich zwar mit einem USB-Stick<br />
recht einfach für »/usr/src« oder »/usr/<br />
pkgsrc« erweitern, allein das Auspacken<br />
der Systemquellen dauerte bei einem solchen<br />
Versuch aber bereits mehrere Stunden.<br />
Trotzdem: Wer möchte, kann den<br />
Raspberry ja so lange laufen lassen, bis<br />
das Build-Skript seine Arbeit im Hintergrund<br />
abgeschlossen hat.<br />
Sind alle benötigten Änderungen am<br />
ARM-System durchgeführt, wird die SD-<br />
Karte mit »umount /mnt« ausgebunden,<br />
in den Raspberry Pi eingesteckt und<br />
dieser von ihr gebootet. Man muss sich<br />
etwas in Geduld üben, bis man per SSH<br />
auf das Gerät zugreifen kann, denn der<br />
Kernel ist mit Debug-Informationen vollgestopft<br />
und damit etwas träge.<br />
Größenänderungen<br />
Ist NetBSD auf einer mehr als 2 GByte<br />
großen Karte installiert, stellt sich noch<br />
die Frage, wie man das Disklabel vergrößert.<br />
Lokal geht das, wie in [2] beschrieben,<br />
recht einfach, man muss nur einmal<br />
die »cmdline.txt« auf der DOS-Partition so<br />
bearbeiten, dass das Betriebssystem im<br />
Single-User-Modus startet. Denn unter<br />
112 Ausgabe 05-2013 Admin www.admin-magazin.de
Raspberry<br />
binden Sie jetzt nicht ein, sondern bearbeiten<br />
nur die angemeldete und nicht<br />
eingebundene SD-Karte. Im ersten Schritt<br />
ist noch einmal der gleiche »fsck« wie<br />
eben fällig, um sicherzugehen, dass die<br />
Karte nicht durch ein zu frühes Ausschalten<br />
des Raspberry Datenfehler aufweist.<br />
Zu beachten ist, dass je nach Festplattendefinition<br />
die Karte auch hier wieder<br />
»sd1« heißen kann, was man aber beim<br />
Einstecken angezeigt bekommt (siehe<br />
Abbildung 3). Ist die Prüfung abgeschlossen,<br />
vergrößern Sie das Disklabel:<br />
resize_ffs ‐y /dev/rsd0a<br />
Danach prüfen Sie im letzten Schritt noch<br />
einmal den Datenträger:<br />
Abbildung 3: Der SD-Kartenleser mit einer 8-GByte-Karte ist nach dem Aus- und wieder Einstecken der<br />
NetBSD-Maschine zugewiesen.<br />
BSD kann nur eine nicht eingebundene<br />
Partition bearbeitet werden.<br />
Die Änderungen lassen sich auch bei dem<br />
Gerät ohne lokalen Monitor durchführen,<br />
es braucht (und darf) dann aber die<br />
»cmdline.txt« nicht geändert zu werden.<br />
Benötigt wird auch hier wieder die virtuelle<br />
Maschine oder ein natives beliebiges<br />
anderes NetBSD. Die Schritte sind dann<br />
im Prinzip dieselben wie in [2].<br />
Zuerst booten Sie das NetBSD-System<br />
auf der SD-Karte auf dem Raspberry, loggen<br />
sich mit dem Benutzerkonto ein und<br />
holen sich mit »su« die obligatorischen<br />
Administratorrechte. Mit<br />
disklabel ‐i ld0<br />
gelangen Sie in den interaktiven Modus<br />
des Programms Disklabel, »ld0« ist hier<br />
die Kennung der SD-Karte am Raspberry.<br />
Es erscheint ein Prompt, an dem man<br />
mit [?] eine kurze Hilfe angezeigt bekommt.<br />
An diesem Prompt drücken Sie<br />
[A] (Großbuchstabe!) und sehen eine<br />
Frage ähnlich der Folgenden:<br />
Adjust disklabel sector from 4194304U<br />
to 62333952 [n]? y<br />
Die Zielgrößenangabe ist natürlich von<br />
der Gesamtgröße der Karte abhängig.<br />
Den Befehl »A« kennt das Disklabel-<br />
Programm der Intel-Version von NetBSD<br />
nicht, deshalb muss dieser Schritt im<br />
ARM-System durchgeführt werden.<br />
Die Änderung des Labels bestätigen Sie<br />
mit [y]. Im nächsten Schritt werden Sie<br />
nach der Partition gefragt und müssen<br />
hier [a] angeben, weil genau diese zu<br />
vergrößern ist. Wenn Sie nach dem Dateisystem<br />
gefragt werden, brauchen Sie die<br />
Voreinstellung 4.2BSD nur mit [Enter]<br />
zu bestätigen. Auch bei der Frage nach<br />
dem Start-Offset genügt die Eingabe von<br />
[Enter].<br />
Neu partitionieren<br />
Anders ist es bei der Definition der Partitionsgröße.<br />
Hier führt ein $-Zeichen<br />
dazu, dass der komplette restliche, momentan<br />
unbelegte Bereich der Label-<br />
Partition »a« zugeschlagen wird. Mit [W]<br />
(wiederum per Großbuchstabe) wird das<br />
Label schließlich geschrieben, wenn Sie<br />
die dafür verlangte Sicherheitsabfrage<br />
mit [y] bestätigen. Jetzt können Sie das<br />
Programm mit [Q] verlassen. Sicherheitshalber<br />
führen Sie gleich noch einen ersten<br />
Dateisystem-Check durch:<br />
fsck ‐fy /dev/rld0a<br />
Nun fahren Sie NetBSD mit »poweroff«<br />
auf der Kommandozeile herunter. Ist<br />
das System nach einiger Zeit zur Ruhe<br />
gekommen, wird die SD-Karte aus dem<br />
Raspberry entnommen.<br />
Die weiteren Arbeitsschritte führen Sie<br />
wieder in der virtuellen Maschine oder<br />
in der nativen NetBSD-Installation durch.<br />
Nach dem Booten von NetBSD auf dem<br />
PC stecken Sie die Karte ein und melden<br />
sich an. Das in Grün angezeigte Device<br />
fsck ‐fy /dev/rsd0a<br />
Das »/dev/r« bei den Geräteangaben können<br />
Sie übrigens auch weglassen, es wird<br />
dann ergänzt.<br />
Die Karte kann jetzt aus dem Intel-System<br />
aus- und in den Raspberry eingesteckt<br />
werden. Nach dem Booten zeigt »df«<br />
die neue Größe an. Auf dem ursprünglichen<br />
2-GByte-Image waren fast achtzig<br />
Prozent des Platzes belegt, bei einer<br />
4-GByte-Karte sind es jetzt nur noch vierzig<br />
Prozent.<br />
Von dieser mühsam produzierten Basis-<br />
Betriebssysteminstallation sollten Sie am<br />
besten ein Sicherungs-Image ziehen, unter<br />
Linux/Unix mit »dd«, unter Windows<br />
mit dem Win32DiskImager. (ofr) n<br />
Infos<br />
[1] Raspberry Pi:<br />
[http:// www. raspberrypi. org]<br />
[2] Beschreibung für die Installation von<br />
NetBSD/evbarm: [http:// wiki. netbsd. org/<br />
ports/ evbarm/ raspberry_pi/]<br />
[3] Offizielle Installationsdateien für NetBSD/<br />
evbarm zum Zeitpunkt des Schreibens<br />
dieses Beitrags: [ftp:// nyftp. netbsd. org/<br />
pub/ NetBSD‐daily/ HEAD/ 201306120600Z/<br />
evbarm/ binary/ sets/]<br />
[4] NetBSD-Image für den Raspberry Pi:<br />
[ftp:// ftp. netbsd. org/ pub/ NetBSD/ misc/<br />
jun/ raspberry‐pi/ 2013‐03‐04‐netbsd‐raspi.<br />
img. gz]<br />
[5] Win32DiskImager: [http:// sourceforge. net/<br />
projects/ win32diskimager/]<br />
[6] ISO-Images für die Installation von NetBSD<br />
6.1: [http:// ftp. netbsd. org/ pub/ NetBSD/<br />
NetBSD‐6. 1/ iso/]<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 05-2013<br />
113
Service<br />
Impressum und <strong>Vorschau</strong><br />
Impressum ISSN 2190-1066<br />
<strong>ADMIN</strong>-<strong>Magazin</strong> eine Publikation der Medialinx AG<br />
Redaktionsanschrift Putzbrunner Straße 71<br />
81739 München<br />
Tel.: 0 89/99 34 11-0<br />
Fax: 0 89/99 34 11-99 oder -96<br />
Internet<br />
www.admin-magazin.de<br />
E-Mail<br />
redaktion@admin-magazin.de<br />
Geschäftsleitung<br />
Chefredakteure<br />
Redaktion<br />
News/Report<br />
Software/Test<br />
Security/Networking<br />
Ständige Mitarbeiter<br />
Produktionsleitung<br />
Grafik<br />
Abo-Infoseite<br />
Abonnenten-Service<br />
Brian Osborn (Vorstand), bosborn@medialinx-gruppe.de<br />
Hermann Plank (Vorstand), hplank@medialinx-gruppe.de<br />
Oliver Frommel (V.i.S.d.P.),<br />
ofrommel@admin-magazin.de (ofr)<br />
Jens-Christoph Brendel<br />
jbrendel@admin-magazin.de (jcb)<br />
ulrich Bantle (Ltg.), ubantle@medialinx-gruppe.de (uba)<br />
Mathias Huber, mhuber@medialinx-gruppe.de (mhu)<br />
marcel Hilzinger, mhilzinger@medialinx-gruppe.de, (mhi)<br />
Kristian Kißling, kkissling@medialinx-gruppe.de, (kki)<br />
Markus Feilner, mfeilner@medialinx-gruppe.de (mfe)<br />
Thomas Leichtenstern, tleichtenstern@medialinx-gruppe.de (tle)<br />
David Göhler (Schlussredaktion),<br />
Carsten Schnober, Tim Schürmann, Claudia Thalgott<br />
Christian Ullrich, cullrich@medialinx-gruppe.de<br />
Klaus Rehfeld<br />
Titel: Judith Erb, Ausgangsgrafik: Luciano De Polo, 123RF<br />
www.admin-magazin.de/abo<br />
Gudrun Blanz (Teamleitung)<br />
abo@admin-magazin.de<br />
Tel.: 07131/27 07 274, Fax: 07131/27 07 78 601<br />
Preise Print Deutschland Österreich Schweiz Ausland EU<br />
Einzelheft € 9,80 € 10,80 Sfr 19,60 (siehe Titel)<br />
Mini-Abo (3 Ausgaben) € 9,80 € 10,80 Sfr 19,60 (siehe Titel)<br />
Jahres-DVD (Einzelpreis) € 14,95 € 14,95 Sfr 18,90 € 14,95<br />
Jahres-DVD (zum Abo 1 ) € 6,70 € 6,70 Sfr 8,50 € 6,70<br />
Jahresabo € 99,90 € 109,90 Sfr 159,90 € 129,90<br />
Preise Digital Deutschland Österreich Schweiz Ausland EU<br />
Heft-PDF Einzelausgabe € 9,80 € 9,80 Sfr 10,71 € 9,80<br />
DigiSub (12 Ausgaben) € 89,90 € 89,90 Sfr 129,50 € 89,90<br />
DigiSub (zum Printabo) € 12,— € 12,— sfr 12,— € 12,—<br />
HTML-Archiv (zum Abo 1 ) € 48,— € 48,— sfr 48,— € 48,—<br />
Preise Kombiabos<br />
Profi-Abo 2 € 181,90 € 198,90 Sfr 235,90 € 219,90<br />
1<br />
nur erhältlich in Verbindung mit einem Jahresabo Print oder Digital<br />
2<br />
mit Linux-<strong>Magazin</strong>-Abo und beiden Jahres-DVDs<br />
Schüler- und Studenten-Ermäßigung: 20 Prozent gegen Vorlage eines Schülerausweises oder einer aktuellen<br />
Immatrikulationsbescheinigung. Der aktuelle Nachweis ist bei Verlängerung neu zu erbringen. Andere Abo-<br />
Formen, Ermäßigungen im Ausland etc. auf Anfrage.<br />
Adressänderungen bitte umgehend mitteilen, da Nachsendeaufträge bei der Post nicht für Zeitschriften gelten.<br />
Pressemitteilungen info@admin-magazin.de<br />
Anzeigen/Repräsentanz Es gilt die Anzeigenpreisliste vom 01.01.2013<br />
National<br />
Pressevertrieb<br />
Druck<br />
Petra Jaser<br />
Tel.: 089/99 34 11 24, Fax: 089/99 34 11 99<br />
E-Mail: pjaser@medialinx-gruppe.de<br />
michael Seiter<br />
Tel.: 089/99 34 11 23, Fax: 089/99 34 11 99<br />
E-Mail: mseiter@medialinx-gruppe.de<br />
MZV, Moderner Zeitschriften Vertrieb GmbH<br />
Breslauer Straße 5, 85386 Eching<br />
Tel.: 089/31906-0, Fax: 089/31906-113<br />
Vogel Druck und Medienservice GmbH<br />
97204 Höchberg<br />
Der Begriff Unix wird in dieser Schreibweise als generelle Bezeichnung für die Unix-ähnlichen Betriebssysteme verschiedener<br />
Hersteller, zum Beispiel Eurix (Comfood), Ultrix (Digital Equipment), HP/UX (Hewlett-Packard) oder Sinix (Siemens) benutzt,<br />
nicht als die Bezeichnung für das Trademark von X/Open. Linux ist ein eingetragenes Marken zeichen von Linus Torvalds und<br />
wird in unserem Markennamen mit seiner Erlaubnis verwendet. Alle anderen Marken sind Eigentum der jeweiligen Inhaber.<br />
Eine Haftung für die Richtigkeit von Veröffentlichungen kann trotz sorgfältiger Prüfung durch die Redaktion vom Verlag<br />
nicht übernommen werden. Mit der Einsendung von Manu s kripten gibt der Verfasser seine Zustimmung zum Abdruck im<br />
<strong>ADMIN</strong>-<strong>Magazin</strong>. Für unverlangt ein gesandte Manuskripte kann keine Haftung übernommen werden. Die Redaktion behält<br />
sich vor, Artikel zu kürzen. Das Exklusiv- und Verfügungsrecht für angenommene Manuskripte liegt beim Verlag. Es darf kein<br />
Teil des Inhalts ohne ausdrückliche schriftliche Genehmigung des Verlags in irgendeiner Form vervielfältigt oder verbreitet<br />
werden. Copyright © 1994–2013 Medialinx AG<br />
Inserentenverzeichnis<br />
Netgear http://www.netgear.de 39<br />
AddOn Systemhaus GmbH http://www.addon.de 65<br />
Android User GY http://www.android-user.de 111<br />
Angel Business Communications Ltd http://www.angelbc.co.uk 71<br />
ConSol Software GmbH http://www.consol.de 11<br />
Deutsche Python Konferenz - PyCon http://de.pycon.org 77<br />
Diavlon GmbH http://www.tuxhardware.de 13<br />
Fernschule Weber GmbH http://www.fernschule-weber.de 17<br />
Galileo Press http://www.galileo-press.de 19<br />
Host Europe GmbH http://www.hosteurope.de 51<br />
IT-Security Messe http://www.it-sa.de 67<br />
Kettner Mathias - Linux Experte http://www.mathias-kettner.de 75<br />
Linux-Hotel http://www.linuxhotel.de 53<br />
Linux-<strong>Magazin</strong> http://www.linux-magazin.de 91<br />
Medialinx IT-Academy http://www.medialinx-academy.de 79, 87, 99<br />
Netways GmbH http://www.netways.de 61<br />
outbox AG http://www.outbox.de 2<br />
pascom - Netzwerktechnik GmbH & Co.KG http://www.pascom.net 37<br />
PlusServer AG http://www.plusserver.de 7, 9, 21, 27, 30, 43, 55<br />
QNAP Systems http://www.qnap.com/de/index.php 47<br />
Raspberry Pi Geek http://www.raspberry-pi-geek.de 115<br />
Thomas Krenn AG http://www.thomas-krenn.com 116<br />
Windows Phone User http://www.windows-phone-user.de 73, 89<br />
Dieser Ausgabe liegt eine Sonderbeilage des <strong>ADMIN</strong>-<strong>Magazin</strong> (http://www.admin-magazin.de) bei.<br />
Wir bitten unsere Leser um freundliche Beachtung.<br />
Autoren dieser Ausgabe<br />
Jörg Braun Netberry 108<br />
Martin Braun Technisches K.O. 80<br />
Michael Bredel Leitstandstechnik 68<br />
Jürgen Dankoweit Scharf gewürzt 102<br />
Bernd Erk Griff zu den Sternen 28<br />
Torsten Förtsch Ans Licht gebracht 94<br />
Andrea Held Datenbank zum Einstöpseln 84<br />
Bernd Helmle Datenbank-Tuning 48<br />
Geoff Higginbottom Gut vernetzt 34<br />
Thomas Joos Alles, was recht ist 62<br />
Thomas Joos Moderne Bilder 76<br />
Anna Kobylinska Krieg in den Wolken 16<br />
Martin Loschwitz Bausteinprinzip 22<br />
Thorsten Scherf Spaziergang 14<br />
Tim Schürmann Koalas Liebling 40<br />
Jörg Steffens Besser sichern 56<br />
Philipp Storz Besser sichern 56<br />
VORSCHAU<br />
<strong>ADMIN</strong> 11/2013 erscheint am 10. Oktober 2013<br />
Privacy<br />
Config Packets<br />
© Maksim Kabakou, 123RF<br />
Wer nichts tut, steht nackt da:<br />
Private Daten muss man aktiv<br />
schützen. Das beginnt bei passwortgesicherten<br />
Festplatten, führt<br />
etwa über Security-Plugins für den<br />
Browser und hört bei Anonymisierern<br />
wie Tor noch nicht auf.<br />
Die Idee ist bestechend: Mit der Paketverwaltung<br />
existiert unter Linux<br />
bereits ein System, das vielfältige<br />
Aktionen in einer bestimmten<br />
Reihenfolge anstoßen kann: Könnte<br />
man damit nicht die gesamte Konfiguration<br />
erledigen und verwalten?<br />
© Dirk Ercken, 123RF<br />
114 Ausgabe 05-2013 Admin www.admin-magazin.de