SFTP vorbereiten und nutzen

Zur Übertragung von Daten ist derzeit das FTP-Protokoll sehr weit verbreitet. Da das Internet auch schon vor über 30 Jahren Neuland war, hat man sich seinerzeit über Datensicherheit keine besonders großen Gedanken gemacht, dementsprechend ist FTP in seiner Urform vollständig unverschlüsselt. Zwar lässt sich die Kommunikation mit FTPS immerhin auf dem Kontroll-Kanal durch TLS schützen, die Daten selbst werden jedoch gemeinhin unverschlüsselt übertragen.

Auch heute ist das Internet noch Neuland, jedoch gibt es mittlerweile etablierte und nicht weniger komfortable Möglichkeiten, Daten wirklich sicher zwischen zwei Rechnern zu übertragen. Eine sehr empfehlenswerte Variante ist hierbei SFTP in Kombination mit WinSCP als Client. Da die Übertragung in dieser Variante auf SSH basiert sind sowohl Kommunikation als auch zu übertragende Daten komplett verschlüsselt. daneben begnügt sich SFTP mit einem einzigen Port, was insbesondere die Verwaltung von Firewall-Regeln im Vergleich zu FTP(S) start vereinfacht.

Die Erstellung eines SSH-Schlüssels und die Einrichtung von WinSCP soll nun an dieser Stelle erläutert werden.


SSH-Schlüssel erzeugen

Um einen SSH-Schlüssel für die Nutzung mit SFTP zu erstellen, benötigt man zuerst das kostenlose Tool „puttygen“, es kann unter https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html in der jeweils aktuellsten Version heruntergeladen werden. Nach dem Starten des Helferleins sollte man lediglich die Bitlänge des Schlüssels auf 4096 setzen

Nur die Länge des Schlüssels sollte angepasst werden um auch strengeren Anforderungen einiger Anbieter gerecht zu werden.

Mit Klick auf den Button „Generate“ beginnt die Erzeugung des Schlüssels. Durch Bewegen der Maus im oberen Bereich des Fensters sorgt man für einen gewissen Zufallsfaktor.

Zur Erstellung des Schlüssels bewegen Sie den Mauszeiger im oberen Kasten, bis sich der Fortschrittsbalken komplett gefüllt hat.

Ist der Vorgang abgeschlossen und das Schlüsselpaar erstellt, sollte man einen aussagekräftigen Kommentar im Feld „Key comment“ vergeben und den Schlüssel mit einem Passwort schützen. Es wird dringend davon abgeraten, Schlüssel ohne Passwort in produktiven Umgebungen einzusetzen.

Ein aussagekräftiger Kommentar erleichtert den Überblick, ein starkes Passwort schützt Ihren Schlüssel vor Missbrauch.

Mit Klick auf „Save private key“ speichert man den privaten Teil des Schlüssels nun sicher ab. Wichtig: Der private Teil eines SSH-Schlüssels ist essentiell und unersetzlich. Geht er verloren gibt es keine Möglichkeit, ihn wiederherzustellen. Den öffentlichen Teil des Schlüssels speichert man ebenfalls über den entsprechenden Button ab. Wer seinen Administratoren die Arbeit erleichtern möchte, legt sich auch den Inhalt des oberen Kastens (den mit dem Buchstabensalat) in einer Text-Datei ab – damit erspart man den Admins die Konvertierung, aber das nur nebenbei.

Um eine neue Verbindung mit diesem Schlüssel zu nutzen, übergibt man den öffentlichen Teil des Schlüssels an den Admin / Serverbetreiber des Zielsystems. Der hinterlegt auf seinem System den Schlüssel und man erhält von ihm einen Hostnamen (hier „sftp_demo.example.org“) und einen Benutzername (hier „demouser“), für den der Schlüssel genutzt werden kann.

Einrichtung des SFTP-Clients

Es existieren div. Client-Programme zur Arbeit mit SFTP, die Einrichtung soll nun am Beispiel von WinSCP erläutert werden. WinSCP kann unter https://winscp.net/eng/download.php kostenfrei heruntergeladen werden. Nach der Installation öffnet sich mit dem Start des Programms mit der Verbindungsübersicht (die nach einer Neuinstallation verständlicherweise noch leer ist).

Als Übertragungsprotokoll wählt man nun also SFTP aus, Rechnername und Benutzername haben Sie von Ihrem Anbieter erhalten, tragen Sie sie entsprechend ein. Es fehlt nun noch der Hinweis für WinSCP, welcher Schlüssel genutzt werden soll. Klicken Sie dazu auf den Button „Erweitert“. Wählen Sie im neu erscheinenden Fenster links die Option „Authentifizierung“. Hinterlegen Sie hier im Feld „Datei mit privatem Schlüssel“ den zuvor erzeugten Schlüssel.

Durch Klick auf „…“ am Ende des Eingabefeldes kann man bequem zur privaten Schlüsseldatei navigieren.

Schließen Sie das Fenster mit Klick auf „OK“, sie gelangen nun wieder in die Verbindungsübersicht. Sie können die Verbindung nun für spätere Nutzungen speichern.

Werden Verbindungen wiederholt genutzt, empfiehlt sich das Speichern des Verbindungsziels

Mit Klick auf „Anmelden“ starten Sie den Verbindungsaufbau.

Hinweisfenster bei der ersten Verbindung mit einem unbekannten Server.

Bei der ersten Verbindung werden Sie darauf hingewiesen, dass der vom Server gesendete Schlüssel nun lokal gespeichert und bei späteren Verbindungen geprüft wird. Damit wird sichergestellt, dass Sie sich auch zukünftig immer mit dem korrekten Server verbinden. Bestätigen Sie den Hinweis. Im Anschluss werden Sie aufgefordert, das Passwort einzugeben, welches Sie beim Erstellen des Schlüssels vergeben haben.

Nach der Eingabe des Passworts und der Bestätigung mit „OK“ stellt WinSCP die Verbindung mit dem Zielsystem her und wechselt in die Commander-Ansicht.

Commander-Ansicht von WinSCP nach erfolgreichem Verbindungsaufbau.

Sie können nun wie gewohnt auf dem Zielsystem arbeiten.

Noch ein abschließendes Wort zu FileZilla: Nach wie vor nutzen viele Anwender FileZilla als FTP-Client. Wir raten explizit von diesem Programm ab, da Zugangsdaten ohne weitere Konfiguration im Klartext abgespeichert und damit relativ einfach ausgespäht und missbraucht werden können. Obgleich das Risiko bei der Arbeit mit SFTP etwas gemindert ist, ist ein derartig sorgloser Umgang mit sensiblen Daten abzulehnen.

Mehrere Presets für CKeditor verwenden

Um für ein Inputfeld ein von der Standardvorlage abweichendes RTE Preset zu verwenden, muss man wie folgt vorgehen:

 

Zunächst wird das Preset als .yaml Datei im Verzeichnis Configuration/RTE/ angelegt (in diesem Beispiel Custom.yaml). Hier kann als Vorlage zunächst die Default.yaml kopiert werden.

In ext_localconf.php wird nun eine Bezeichnung für das neue Preset definiert:

$GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['custom'] = 'EXT:vendor_namespace/Configuration/RTE/Custom.yaml';

Um dieses Preset per TCA einem Inputfeld zuweisen zu können, muss in der RTE.tsconfig unter Configuration/TsConfig/Page/ die eben gewählte Bezeichnung einem im TCA verfügbaren Wert zugeordnet werden:

RTE {
  custom {
    preset = custom
  }
}

Sollte hier die Standardvorlage per default gesetzt sein, muss diese zwingend entfernet werden, da zusätzlich angelegte Presets sonst ignoriert werden.

Die Standardvorlage muss dann stattdessen ebenfalls über die ext_localconf.php gesetzt werden:

$GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['default'] = 'EXT:vendor_namespace/Configuration/RTE/Default.yaml'

Zuletzt muss dem Inputfeld im Bereich config das eben definierte Preset zugewiesen werden:

'config' => [
  'richtextConfiguration' => 'custom'
],

Das neue Preset kann jetzt nach Belieben bearbeitet werden, eine Liste der konfigurierbaren Optionen findet man hier: https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html

Caching Framework: automatisch Cache leeren bei Datensatzänderung

Das Caching Framework lässt sich gut verwenden, um aufwändig generierte/abgefragte Daten zur Wiederverwendung schneller parat zu haben. Die prinzipielle Funktionsweise haben wir in „Caching Framework nutzen“ erklärt und findet sich auch in der Doku sowie in zahlreichen anderen Blogs.
Was aber oftmals fehlt: wie aktualisiert man den Cache bzw. invalidert ihn bei Veränderung der Daten?

Häufig hängt der Inhalt des Caches von Datensätzen ab. D.h. der Cache-Inhalt veraltet, wenn sich ein Datensatz verändert. Und damit ist auch der Ansatzpunkt für die Invalidierung klar: der processDatamap_afterDatabaseOperations-Hook im DataHandler. Er wird immer nach Datenbankoperationen („new“ bzw. „update“) aufgerufen und bekommt auch den Taballennamen mit übergeben. Somit ist es recht einfach, die eigenen Datensätze zu erkennen und auf die Veränderung zu reagieren:

EXT:my_extension/Classes/Hooks/DataHandler.php:

<?php
namespace Netzhaut\MyExtension\Hooks;

use TYPO3\CMS\Core\Cache\CacheManager;
use TYPO3\CMS\Core\Utility\GeneralUtility;

class DataHandler
{
    public function processDatamap_afterDatabaseOperations($status, $tableName, $recordId, array $databaseData, \TYPO3\CMS\Core\DataHandling\DataHandler $dataHandler)
    {
        if ($tableName === 'tx_myextension_domain_model_example') {
            $cache = GeneralUtility::makeInstance(CacheManager::class)->getCache('myCache');
            $cache->flushByTag('tag_123');
        }
    }
}

Dann noch am Hook registrieren, und fertig:

EXT:my_extension/ext_localconf.php

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass']['myextension_clearcfcache'] = 'Netzhaut\\MyExtension\\Hooks\\DataHandler';

Links

Mac Firefox vs. Chrome

Im Screenshot haben wir einmal das Problem, dass der Firefox die Schriften anders darstellt als im Chrome.

1. Font-Smoothing

body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-smoothing: antialiased;
}

Firefox benötigt an dieser Stelle den Wert grayscale statt antialiased.

 

2. Inputfelder

Inputfelder werden im Firefox um 2px höher dargestellt als im Chrome. Dies ist nicht unbedingt ein offensichtliches Problem aber bei Fieldsets mit Hintergrund, welche nebeneinander platziert sind, wird es einen Versatz geben.

Dieses Problem konnten wir wie folgt lösen:

input{
margin-top:-2px;
line-height:34px;
}

Die line-height muss natürlich entsprechend angepasst werden.

Reports – Remaining updates

Im Reports-Modul stieß ich letzens auf eine Meldung, die mich verwunderte:

„This installation is not configured for the TYPO3 version it is running.“

 

2016-02-04 15-28-09

Die TYPO3-Instanz war jedoch eine frisch aufgesetzte Installation…

Bei weitergehender Analyse, wie das Modul hierauf kommt, fand sich rasch die Ursache: die Datenbankstruktur stimmte nicht mit den Erwartungen/der hinterlegten Definitionen überein. Im Installtool unter Important actions findet sich der Database analyzer, der nähere Infos liefert.