25.02.2014 Aufrufe

ADMIN Magazin Freie Clouds (Vorschau)

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!