MainWP Test

Es gibt im Moment in diese Mannschaft, oh, einige Spieler vergessen ihnen Profi was sie sind. Ich lese nicht sehr viele Zeitungen, aber ich habe gehört viele Situationen. Erstens: wir haben nicht offensiv gespielt. Es gibt keine deutsche Mannschaft spielt offensiv und die Name offensiv wie Bayern.

Letzte Spiel hatten wir in Platz drei Spitzen: Elber, Jancka und dann Zickler. Wir müssen nicht vergessen Zickler. Zickler ist eine Spitzen mehr, Mehmet eh mehr Basler. Ist klar diese Wörter, ist möglich verstehen, was ich hab gesagt? Danke.

Offensiv, offensiv ist wie machen wir in Platz. Zweitens: ich habe erklärt mit diese zwei Spieler: nach Dortmund brauchen vielleicht Halbzeit Pause. Ich habe auch andere Mannschaften gesehen in Europa nach diese Mittwoch. Ich habe gesehen auch zwei Tage die Training. Ein Trainer ist nicht ein Idiot!

Ein Trainer sei sehen was passieren in Platz. In diese Spiel es waren zwei, drei diese Spieler waren schwach wie eine Flasche leer! Haben Sie gesehen Mittwoch, welche Mannschaft hat gespielt Mittwoch? Hat gespielt Mehmet oder gespielt Basler oder hat gespielt Trapattoni?

Zend DI 3.0 is here!

Zend DI is a ZendFramework component, that provides auto-wiring capabilities for IoC containers. But the version 2.x had some mayor performance-drawbacks.
For version 3.0 we thought it would be a nice idea to get rid of these drawbacks…

Why we did it

Defining services in ZendServicemanager requires you to implement a factory for every instance you want to consume. For classes without dependencies, this is no problem at all, the ServiceManager provides setInvokableClass() for this case, but if classes consume dependencies, this requires writing simple factories that pass $container->get(InterfaceName::class) to the constructor most of the time.

A solution that provides automatic wiring for such simple cases would be great. Indeed there is one: Zend DI. But the version 2.x of this component adds performance penalties, inconsistencies and error-prone instantiation to your code.
Also, it is not recommend to use this in production…

Therefore one of our senior developers – who is also one of the ZendFramework experts in our team – decided to re-factor this component to provide a solid and production-ready solution.
In the true spirit of Open Source we decided to give it back to the community, which was accepted and published as the next major release of the component.
(*Yeah!*)

Why you should use it

So what’s the fuss about and why should you bother using it?
This is easy to answer: it is designed to assist you when implementing a ZendFramework Application (whether MVC or Expressive).

Let me give you an example: Assuming you are going to develop an expressive application that will use Doctrine as persistence framework, you will most likely consume the object manager in some classes (e.g. a Middleware to handle authentication).

So you would have something like this:


use Doctrine\Common\Persistence\ObjectManager;

class MyMiddleware
{
    public function __construct(ObjectManager $om)
    { /* ... */ }
}

class MyAction
{
    public function __construct(ObjectManager $om, SomeOtherService $foo)
    { /* ... */ }
}

Let’s assume you already have configured a service called „Doctrine\Common\Persistence\ObjectManager“ (e.g. an instance of doctrine ORM’s EntityManager) and another service called „SomeOtherService“.

So you now have to write a Service factory for each class to provide it via Zend ServiceManager:


use Doctrine\Common\Persistence\ObjectManager;
use Psr\Container\ContainerInterface;

class MyMiddlewareFactory
{
    public function __invoke(ContainerInterface $container)
    {
        return new MyMiddleware($container->get(ObjectManager::class));
    }
}

class MyActionFactory
{
    public function __invoke(ContainerInterface $container)
    {
        return new MyAction(
            $container->get(ObjectManager::class),
            $container->get(SomeOtherService::class)
        );
    }
}

You also have to create new factories for each new class you add. Even though the fact you can recycle factories like this, it will require another factory as soon as dependencies on the class change:


use Doctrine\Common\Persistence\ObjectManager;
use Psr\Container\ContainerInterface;

class ProvideObjectManagerFactory
{
    public function __invoke(ContainerInterface $container, $classname)
    {
        return new $classname($container->get(ObjectManager::class));
    }
}

And don’t forget as for best practices you should test your factories …

Now doing this rather trivial stuff seems like a waste of time!

It’s relatively clear that in general the ObjectManager (as shown in the example) should be the configured service with the class or interface name from the service manager – so let’s automate it with Zend DI 3!

At first, we will install the component with composer:

composer install zendframework/zend-di

When you are using ZendFramework’s component installer, it will take care of configuring the integration into MVC or Expressive for you. If not – and we’re assuming expressive in this example – there is a config provider that contains the required configuration: Zend\Di\ConfigProvider. For MVC there is a module available: Zend\Di\Module

Now after Zend DI is in place, you can get rid of the factories mentioned above and directly consume your class.

Zend DI will take care of injecting the ObjectManager instance:


use Doctrine\Common\Persistence\ObjectManager;

class MyMiddleware
{
    public function __construct(ObjectManager $om)
    { /* ... */ }
}

class MyAction
{
    public function __construct(ObjectManager $om, SomeServiceInterface $foo)
    { /* ... */ }
}

// No need for a factory now
$serviceManager->get(MyMiddleware::class);

But what if my class consumes an Interface as a dependency instead of a concrete class? The answer is pretty simple: Alias the interface in the service manager configuration. Adding the alias is enough.

The Concrete class will be instantiated by zend-di automatically:

/* part of the zend-servicemanager config: */
return [
    'aliases' => [
        SomeServiceInterface::class => SomeServiceImplementation::class,
        // But you can also alias to services provided by a factory as usual:
        ObjectManager::class => 'doctrine.orm.entity_manager.default',
    ],
];


So it’s simple math: without Zend DI 3 you need one factory per service, with Zend DI 3 you need none (best case) or just a small set of factories for complex cases.

How to get it in production

But what about performance?
…all dependencies are auto-wired at runtime at the cost of performance!

And this is why it comes with a code generator that allows you to resolve dependencies and generate factories ahead of time (AoT).

The official documentation shows how to implement this in detail.

By adding this feature to our project, we improve the performance drastically. The service manager now uses pre-generated factories without lookups to the abstract AutowireFactory or runtime wiring.

Before finally deploying the code to production we can improve performance even further by updating our autoloader with the -o option (Optimize by building class maps):

composer dump-autoload -o

How to use it with older PHP versions

Since newer ZendFramework component releases will drop support for PHP versions before 7.1, you may not be able to use Zend DI 3.x with these PHP versions. But we’ve got you covered. We created a PHP 5.6+ compatible backport on Github that you can use to benefit from these changes and make your code future-proof. When you are ready to upgrade to PHP 7.1 or later, you can then seamlessly switch to the official zend-di.

Please be aware that this backport is not an official part of ZendFramework.

Optimierung der Website Usability durch Heuristische Evaluation

Es gibt eine ganze Reihe von Methoden und Werkzeugen, um die Usability einer Website zu analysieren. Vom klassischen Usability Testing mit Testplan und Probanden über Prototyping bis hin zu umfangreichen Feldstudien. Obwohl alle Verfahren ihre Berechtigung und ihre spezifischen Vor- und Nachteile haben, bietet insbesondere die Heuristische Evaluation eine besonders gute Kosten-Nutzen-Effizienz.

Optimierung der Website Usability durch Heuristische Evaluation

Don’t make me think | photo by lucamascaro via Flickr

Was sind Heuristiken?

Im Grunde genommen sind Heuristiken einfache Verfahren (sozusagen „Faustregeln“), um sich einer Problemlösung anzunähern. Obwohl sie nicht den Anspruch haben fehlerfrei zu sein, sind sie durchaus nützlich, um eine Problemstellung innerhalb von kurzer Zeit zu analysieren.

Man kann die Heuristische Evaluation als Verfahren einsetzen, um die Usability einer Website zu analysieren (siehe auch: https://de.wikipedia.org/wiki/Heuristische_Evaluierung). Hierzu beurteilt ein kleiner Kreis von Experten (in der Regel 3-5 Personen) die Website anhand einer Liste von allgemein formulierten Heuristiken. Falls hierbei Hinweise auf Usability-Probleme gefunden werden, können diese den jeweiligen Heuristiken zugeordnet werden. Somit ist es möglich, allgemeine Aussagen darüber zu treffen, an welchen Stellen der User-Experience noch Optimierungsbedarf besteht.

Zwar muss ein solcher Experte kein Usability-Guru sein, er sollte aber schon über einige Jahre an praktischer Erfahrung im Bereich der Webgestaltung verfügen. Dafür kommen Frontend-Entwickler, Webdesigner, Webprojektleiter, aber natürlich auch auf Projektbetreuer auf Kundenseite in Frage. Wer regelmäßig mit Online-Projekten und der Gestaltung von Benutzeroberflächen zu tun hat, kennt die Prinzipien und Fallstricke der Usability und kann daher die Probleme in einem bestehenden System leicht identifizieren.

Es gibt verschiedene Heuristiken, die für die Heuristische Evaluation in Frage kommen. Im Folgenden werden beispielhaft die 10 Heuristiken vorgestellt, die Jakob Nielsen und Rolf Molich 1990 entwickelt haben und die Nielsen 1994 noch einmal verfeinert hat:

10 Heuristiken nach Nielsen

  1. Sichtbarkeit des Systemzustands
    Das System informiert den Nutzer darüber, was gerade passiert.
    Die Rückmeldungen sollen schnell erfolgen und eindeutig sein.
  2. Übereinstimmung zwischen System und Realwelt
    Das System verwendet bekannte Metaphern (z.B. „Diskette“ für „Speichern“).
    Technische Begriffe und Fehlercodes, die den Benutzer verwirren würden sollten vermieden werden.
  3. Benutzerkontrolle und Freiheit
    Ein System darf den Benutzer nicht in Situationen geraten lassen, aus denen er nicht wieder zurückfindet. Vielmehr sollte man als Nutzer Dialoge verlassen und Fehler korrigieren können. Aktionen sollten rückgängig gemacht und/oder wiederholt werden können.
  4. Konsistenz und Standards
    Benutzer sollten sich nicht über unterschiedliche Wortwahl für gleiche Situationen oder Aktionen wundern müssen. Plattformkonventionen sollten eingehalten werden
  5. Fehlerprävention
    Besser als gute Fehlermeldungen ist ein gutes Design, welches das Eintreten von Fehlern verhindert. Beispielsweise kann bereits bei der Eingabe von Werten eine unmittelbare Validierung erfolgen.
  6. Wiedererkennen statt sich erinnern
    Das Kurzzeitgedächtnis eines Benutzers ist begrenzt. Deshalb sollte er nicht gezwungen werden, sich an Informationen zu erinnern, die in einem anderen Bereich des Dialogs von Bedeutung waren. Objekte und Optionen sollten sichtbar sein und relevante Informationen die wieder benötigt werden permanent sichtbar bleiben.
  7. Flexibilität und Effizienz
    Das System sollte erfahrenen Nutzern die Möglichkeit bieten z.B. mit Tastaturkürzeln schneller ans Ziel kommen. Es sollte sich Präferenzen, die der Nutzer eingestellt hat merken.
  8. Ästhetik und minimalistisches Design
    Informationen sollten in einer natürlichen und logischen Ordnung erscheinen.
    Wichtiges darf nicht zwischen Unwichtigem „versteckt“ werden.
  9. Hilfe beim Erkennen, Diagnostizieren und Beheben von Fehlern
    Fehlermeldungen sollten in einer einfachen Sprache gehalten sein (ohne Fehlercodes und ohne impliziten Vorwurf an den User). Sie sollten gut erkennbar sein, das Problem präzise beschreiben und konkrete Lösungsvorschläge anbieten
  10. Hilfe und Dokumentation
    Sofern Funktionalitäten erklärungsbedürftig sind, sollte eine Hilfe und/oder Dokumentation angeboten werden.

So führen Sie die Heuristische Evaluation durch

Zur Durchführung erhalten die Evaluatoren eine Tabelle. Darin können alle beobachteten Auffälligkeiten systematisch erfassen werden. Die Tabelle enthält Spalten für das Problem, die Stelle an der es aufgetreten ist, die verletzte Heuristik und der Schweregrad der Problematik.

Muster eines Evaluationsbogens

Muster eines Evaluationsbogens

Zugegeben – das Schema ist recht subjektiv. Dennoch lassen sich damit erfahrungsgemäß drei Viertel der Usability-Probleme einer Website identifizieren und für die Lösung priorisieren. Damit können bereits in einer frühen Phase der Projektentwicklung Usability-Probleme identifiziert und behoben werden. Dadurch erspart man sich teure nachträgliche Korrekturen. Deshalb ist die Heuristische Evaluation ein vergleichsweise kostengünstiges Verfahren.

Allerdings sollte eines nicht verschwiegen werden: Die „Experten“ stellen keine realen Nutzer dar. Um eine belastbare Aussage über die Effektivität, Effizienz und Nutzerzufriedenheit zu erhalten, sollte man auf einen zusätzlichen Usability-Test mit den eigentlichen Zielgruppen der Website nicht verzichten.

Merken

Merken

Alles Definitionssache – besonders in der Projektkonzeption

Amerikanische Wissenschaftler haben herausgefunden, dass über 70% aller Softwareprojekte in der Planungsphase zu wenig Zeit/Ressourcen in die Projektkonzeption investierten – und wenn amerikanische Wissenschaftler das noch nicht rausgefunden haben, dann sollten sie das schleunigst tun.

Was der Kunde beschrieb vs. Was der Kunde wirklich brauchte - klassisches Missverständnis in der Projektkonzeption

Aber ernsthaft: Wer schon mehr als eine Handvoll Projekte mitgemacht hat, kann mit ziemlicher Sicherheit eine ganze Reihe von Anekdoten erzählen. Was damals für schlaflose Nächte und zerraufte Haare gesorgt hat, wird mit der nötigen zeitlichen Distanz oft mit einem Lächeln erzählt werden und hatte hoffentlich einen Lerneffekt bei allen Beteiligten.

Was der Kunde sagt

Können Sie das nicht definieren? Sie haben da doch mehr Erfahrung…

Wer einer Feierlichkeit plant würde auf die Frage des Dienstleisters „Für wie viele Gäste müssen wir denn die Räumlichkeiten herrichten?“ wahrscheinlich nie die oben zitierte Antwort geben.
Woher sollte der Dienstleiter wissen, wie viele Personen eingeladen sind und wie viele dann im Endeffekt kommen?

In der IT hingegen sind solche Antworten nicht selten – z.B. in Bezug auf Serverdimensionierung. Das führt dann dazu, dass eine unterdimensionierte Infrastruktur von Anfragen überrannt wird, Benutzer verärgert werden und Kunden zornig bei Dienstleistern anrufen. Und dann muss „mit heißer Nadel“ in nächtlichen Sitzungen die Applikationssoftware optimiert oder die Hardware aufgestockt werden.

Gut – in Zeiten von Cloud-Lösungen und skalierenden Systemen kann recht dynamisch auf veränderliche Anforderungen reagiert werden, aber auch hier gibt es Grenzen. Denn was in der Programmierung nicht berücksichtigt wurde, kann auch durch mehr Hardware nur bedingt kompensiert werden. Und wenn im Vorfeld – wahrscheinlich aus Kostengründen – keine dynamische Lösung geplant wurde, nutzt auch die ganze Magie der Cloud nichts…

Natürlich kann man nicht erwarten, dass ein Auftraggeber über umfangreiche Erfahrung verfügt, welche IT-Lösung für die Anforderungen angemessen ist. Aber zumindest sollte er die eigenen Anforderungen kennen oder das zu erwartende Mengengerüst definieren können. Mitunter reicht es schon aus, wenn die notwendigen Hinweise gegeben werden, so dass man im Dialog eine belastbare Lösung planen und umsetzen kann.

Was die Projektkonzeption braucht

Mit der Aktion werden acht Millionen Personen angesprochen

Dann werden daraus zwar nicht zwangsläufig acht Millionen Nutzer, aber es gibt eine maximale Obergrenze. Und damit kann dann anhand von Erfahrungswerten die reale Nutzerzahl genauer eingegrenzt werden.

Die Kampagne wird von massiver Printwerbung flankiert

Das wird die Zahl der realen Nutzer mit großer Wahrscheinlichkeit erhöhen.

Am Wochenende sind TV- und Radiowerbung geschaltet und für Donnerstag ist Bannerwerbung bei einem großen Webportal gebucht

Das sind Zeiträume, in denen mit Besucherspitzen zu rechnen ist!

Aber was ist die Ursache, dass Kunden mit solchen wichtigen Informationen hinter dem Berg halten? Eine Vermutung ist – Achtung: Unterstellung! – dass Budgetverantwortliche beim Kunden primär auf die Initialkosten eines Projekts schauen. Dadurch werden sie dazu verleitet, bei den Projektkennzahlen eher zu untertreiben. Keiner möchte am Ende dafür verantwortlich sein, dass eine überdimensionierte Lösung in Auftrag gegeben wurde. Wer etwas Erfahrung hat, weiß, dass das eine Milchmädchenrechnung ist, denn nachträgliche Anpassungen an Applikationssoftware oder Infrastruktur generieren zusätzliche Kosten.
Kosten, die vom Kunden getragen werden müssen und so im Endeffekt das Projekt teurer machen.

Und mit Infrastructure as a Service und einem Content Delivery Network können sogar sehr schwer abzuschätzende Projekte oder Projekte mit stark schwankenden Nutzerzahlen umgesetzt werden, ohne dass Unsummen in eine ausreichend dimensionierte Infrastruktur gesteckt werden, die sich dann vielleicht zu 80% der Zeit „langweilt“.
Man bezahlt bei diesen Modellen – abgesehen von den Grundkosten – ja nur das, was auch wirklich an Ressourcen abgerufen wird.

Lerneffekt

Also: den Kunden in die Pflicht nehmen, ihn nicht mit ausweichenden Antworten oder Schulterzucken durchkommen lassen, auf belastbare Zahlen bestehen bzw. genauere Definitionen gemeinsam erarbeiten.
Eigentlich sollte die Aussicht auf ein gelungenes Projekt genug intrinsische Motivation für den Kunden sein um zielführend bei der Projektkonzeption mitzuarbeiten und „mit offenen Karten zu spielen“.
Aber manchmal braucht es da eine kleine Erinnerung oder ein „Anstubsen“.

(Bildquelle: Paragon Innovations, Inc.)

Merken

Angular + Gulp

WebApps mit Angular 1.x und TypeScript

Seit etwas mehr als 20 Jahren ist JavaScript ein fester Bestandteil der Webtechnologien um clientseitig-dynamisch Seiten zu realisieren.
Auch wenn über die Jahre immer mehr Bibliotheken die Funktionalität erweiterten und Javascript 2004 mit AJAX eine Frischzellekur bekam, so fehlte noch ein Kozept für eine einfache Präsentationslogik, die es dem Entwickler erlaubt sich auf die Businesslogik zu konzentrieren.
Diese Lücke versuchen Angular und Material zu schließen.

Da Material für Agular 2 wohl noch einige Reifezeit benötigt, können wir produktive Anwendungen vorerst nur mit Angular 1.x und dem dazugehörigen stabilen Material-Modul umsetzen. Trotzdem wollen wir den Migrationspfad zu Angular 2 offen halten und schon jetzt TypeScript einsetzen.

Die gute Nachricht: Hierfür gibt es bereits TypeScript Definitionen und man kann jetzt schon den Code für die Zukunft rüsten. Zudem ist TypeScript deutlich Ausdrucksvoller als Vanilla-JavaScript, was die Lesbarkeit ebenfalls deutlich erhöht.

Der Code für eine Komponente könnte dann etwa so aussehen:

import * as ng from 'angular';

/** Component name and selector */
export const COMPONENT_NAME: string = 'myApp';

/**
 * The application component controller
 *
 * In Angular2 components are classes, in Angular1 they are
 * definitions and the controller is in fact the component 
 * implementation
 *
 * This implementation reflects the way it is done in angular 2
 */
export class ApplicationComponent
{
 /** ng1 injector definition */
 static $inject: string[] = [ '$scope' ];

 /** The current scope */
 private scope: ng.IScope;

 /** property bound by the template directive */
 public myInputProperty: string;

 /** Constructor */
 constructor(scope: ng.IScope)
 {
 this.scope = scope;
 }
}

/** Define the component for Angular1 */
export const Ng1AppComponent: ng.IComponentOptions = {
 controller: ApplicationComponent,
 templateUrl: 'assets/templates/app.html',
 bindings: {
 myInputProperty: '<'
 }
};

Selbstverständlich gibt es hier noch Optimierungspotential und der Code kann mit TypeScript/ES6 Decorators noch näher an den Stil von Angular2 angelehnt werden, was den Migrationsaufwand wieder deutlich verringert.

GulpTool Console OutputWie bekommen wir diese Komponenten aber nun performant im Browser lauffähig? Auch hierfür gibt es hervorragende Tools. Wir haben uns für Browserify und Gulp entschieden. Diese beiden Tools sind sehr mächtig und flexibel, verursachen dadurch viel zusätzlichen Code zum bauen eines Projekts (Boilerplate-Code). Da unsere Entwicklungsprozesse standardisiert sind, haben wir diesen in eine Bibliothek ausgelagert und können das Buildfile nun auf ein Minimum reduzieren:

var GulpTools = require('luka-gulp-tools');
var build = new GulpTools(__dirname);

build.sass() // Build sass files
 .ts('app') // Build the 'app.js' bundle from TypeScript
 .build(); // Create the build configuration

Dieses kleine Tool konfiguriert die Gulp Instanz für produktive und Entwicklungsbuilds. Im hintergrund passiert folgendes:

  • CSS wird aus den SCSS Quellen in src/scss/ gebaut und unter assets/css/ abgelegt.
  • Eine JavaScript-Datei wird für den Einsatz im Browser aus den TypeScript Quellen in src/ts/ gebaut und unter assets/js/ abgelegt.

Es werden dafür zwei Haupt-Tasks in Gulp definiert:

  • „build“ Für den produktiven Einsatz
  • „watch“ Für die entwicklungszeit

In Zukunft für Angular 2 könnte Rollup Browserify ablösen um noch bessere Code-Optimierungen zu erzielen. Dank Gulp völlig transparent für den Entwicklungsprozess.

Der Stand von PHP in 2017

In der akutellen „Developer Pulse“-Studie der Firma Rogue Wave Software wurden mehr aus 1200 Enwickler befragt. Dabei ging es vor allem um die Themen PHP7, Anwendungssicherheit und Entwicklungsmethodik. Eine besondere Rolle spielte  auch die Frage nach der Reife des „DevOps“-Modells.
Aus den Ergebnissen der Umfrage entstand eine interessante Info-Grafik. Darin sind die aktuellen Trends im PHP-Bereich gut erkennbar.

Informative Infografik rund um die Themen PHP7, Anwendungssicherheit, Entwicklungsmethodik. und die Reife des "DevOps"-Modells.

Infografik zum Stand von PHP in 2017

Die Hauptergebnisse im Überblick

Einige Erkenntnisse aus der diesjährigen Studie sind besonders interessant:

  • Über 50% der Befragten planen, innerhalb des nächsten Jahres auf PHP 7.x umzustellen. Das ist eine außerordentlich schnelle Akzeptanz der neuen Version.
  • Als größte Sicherheitsbdrohung werden die Schwachstellen im benutzerdefinierten Code empfunden
  • 21% der Befragten haben bereits eine Form von Continuous Delivery (CD) implementiert. Viele andere nutzen zumindest teilweise Automatisierungs-Technologien (wie CI, Testautomatisierung, Freigabeautomatisierung und Bereitstellungsautomatisierung).

Zur Herkunft der Developer-Pulse Studie

Rogue Wave führt mit der jährlichen Studie eine Tradition fort, die die Firma Zend im Jahre 2011 gestartet hatte. Dabei wurden in den vergangenen Jahren regelmäßig bis zu 4000 Entwickler nach Ihrer Einschätzung zu bestimmten Technologietrends befragt.

Die Datenbasis der aktuellen Umfrage war mit 1200 Teilnehmern etwas kleiner. Dennoch werfen die Aussagen ein durchaus repräsentatives Licht auf die aktuellen Themen im Umfeld der Webentwicklung mit PHP.

Rogue Wave erwarb die Firma Zend Technologies Inc. im Oktober 2015. Damit wurde der Anbieter von Entwicklungstools zum Technologieführer im PHP-Bereich. In den Jahren zuvor hatte Zend die Programmiersprache bereits erfolgreich weiterentwickeilt. So war es den beiden Hauptentwicklern Zeev Suraski und Andi Gutmans gelungen, sie aus der Nische der Scriptsprachen zu holen. Heute werden einige der größten Enterprise Anwendungen damit betrieben, so zum Beispiel Facebook, Yahoo, Wikipedia oder WordPress.

WannaCry ist erst der Anfang…

Die Zunahme von Erpressungs-Trojanern wie WannaCry zeigt, dass die groß angelegte „Nationale Strategie zum Schutz der Informationsinfrastrukturen“ kaum durchführbar ist, solange in den Großunternehmen eine Kultur herrscht, die elementare Sicherheitsanforderungen auf die lange Bank schiebt.

Von WannaCry - https://securelist.com/blog/incidents/78351/wannacry-ransomware-used-in-widespread-attacks-all-over-the-world/, Gemeinfrei, https://commons.wikimedia.org/w/index.php?curid=58846200

Wana-Decrypt0r-Screenshot

Wie sicher sind kritische Infrastrkturen?

Vor nunmehr 12 Jahren beschloss die Bundesregierung eine „Nationale Strategie zum Schutz der Informationsinfrastrukturen„.
Ich vermag nicht zu beurteilen, was seitdem unternommen wurde um kritische Infrastrukturen, wie Energieversorgung, Wasserwerke, Datennetzwerke und Verkehrsinfrastruktur entsprechend abzusichern. Man weiß ja, dass die Mühlen der Behörden mitunter langsam mahlen. Allzu viel scheint dabei bislang nicht herausgekommen zu sein.

WannaCry konnte Unternehmen mit zentraler Bedeutung für die öffentliche Infrastruktur ohne Mühe erfolgreich angreifen. Betroffen waren zum Beispiel:

  • Die spanische Telefónica
  • Die Deutsche Bahn
  • diverse Krankenhäuser in Großbritannien

Es mag sein, dass die Ausfälle von den Bürgern zum Teil eher als Unannehmlichkeiten wahrgenommen wurden und nicht als echte Bedrohung. Aber durch die zunehmende Vernetzung und das Internet of Things wird die Einstufung der Kritikalität zunehmend schwieger ..

Natürlich hängen keine Beatmungsapparate an öffentlichen Netzwerken. Man kann auch davon ausgehen, dass Betriebssysteme und sonstige Software dieser lebenswichtigen Geräge ausreichend auditiert werden. Aber es reicht ja schon, wenn die Aufnahme und Behandlung von ernsthaft erkrankten Patienten durch WannaCry verzögert und erschwert wurde. Wenn der PC in der Notaufnahme streikt ist die Abgrenzung von „kritischer“ gegenüber „weniger kritischer“ Infrastruktur rein theoretisch.

Der doppelte Skandal

Man kann es zu recht als Skandal einstufen, dass die NSA die Hintertür geschaffen hat, durch die der Wurm sich weiter verbreiten konnte.

Ein weiterer Skandal passiert jedoch täglich unbeachtet offenbar auch in großen Unternehmen. Dort werden die simpelsten Prinzipien der IT-Sicherheit offenbar mit Füßen getreten. Es gibt keine externen Kontrollinstanzen, die ein sauberes Arbeiten erzwingen. Daher werden Prozesse (und seien sie noch so kritisch) verschleppt, verzögert, verdrängt.

Dabei muss man wirklich kein Experte sein, um zu wissen, was gegen Ransomware hilft. Neben einfachen Regeln der Datensicherheit (nicht jeden Mailanhang aufrufen) hilft vor allem das Einspielen der neusten Sicherheitsupdates.

Das entsprechende Sicherheitsupdate MS17-010, das die längst bekannt gewordene Lücke stopft stand seit März zur Verfügung. Jeder Heimanwender hat bei einem ordentlcih konfigurierten Windows die Updates längst automatisch installiert. Dahingegen ist der Rollout eines Patches bei großen Unternhmen offenbar immer noch ein manueller Prozess. Zumindest scheint es ein Prozess zu sein, der nur mit erheblicher Verzögerung stattfindet. Nur so ist es zu erklären, dass es den IT-Abteilungen großer Unternehmen auch nach auch zwei Monate nach Veröffentlichung nicht möglich war, den Patch auszurollen.

Weckruf oder Schlummer-Taste?

Man kann von Glück sagen, dass der Erpressungstrojaner (wie schon einige Vorgänger) durch schlampige Programmierung und eher durch Zufall relativ frühzeitig ausgebremst werden konnten. Nicht auszudenken, welche Verbreitung diese neuartige Kombination von Ransomware und Wurm ansonsten erlangt hätte, wenn sie noch einige Stunden oder Tage länger aktiv gewesen wäre.

Man könnte es als „Weckruf“ bezeichnen, allerdings gab es von diesen Weckrufen schon einige und sie haben bislang nicht dazu geführt, dass es zu einem Umdenken kam. Der Siegeszug der Ransomware hat gerade erst begonnen und der nächste Erpressungstrojaner wird sich nicht wieder durch einen einfachen Killswitch ausschalten lassen. Zumindest soltle man sich darauf nicht verlassen!