Seite wählen

NETWAYS Blog

Eine Taste für alle Fälle

Trotz der Stabilität von GNU/Linux kann es vor allem bei Vorabversionen u. U. vorkommen, dass sich das System aufhängt und nicht mehr auf Eingaben reagiert. Wer auf diesen Fall vorbereitet ist, muss im Zweifelsfall nicht gleich den Stecker ziehen und evtl. wertvolle Daten verlieren.

Magische S-Abf-Taste

Die Magische S-Abf-Taste ermöglicht es Benutzern, die vor einer physischen Tastatur sitzen, dem Kernel direkt Befehle zu erteilen. Je nach Distribution/Standard-Konfiguration muss dieser Kanal zuerst überhaupt freigeschaltet werden:

# sysctl kernel.sysrq=502

Zwecks Persistenz muss der Datei /etc/sysctl.conf eine entsprechende Zeile hinzugefügt (bzw. angepasst) werden:

kernel.sysrq=502

Nun ist es an der Zeit, die Taste zu testen. Dazu kann – vorzugsweise in einer Konsole (Strg+Alt+F2) – die Tastenkombination Alt+SysAbf+H, die die Hilfe anzeigen lässt, verwendet werden (Alt drücken und halten, SysAbf drücken und loslassen, H drücken und loslassen, Alt loslassen). Im Erfolgsfall kann zukünftig bspw. ein nicht mehr reagierender X-Server mit Alt+SysAbf+K abgeschossen werden.

Laptops und Netbooks

… haben meist eine kompakte(re) Tastatur im Vergleich zu Schreibtischrechnern mit weniger Tasten und evtl. keiner SysAbf-Taste. Eine vorhandene Druck-Taste muss nicht zwingend auch die SysAbf-Taste stellen. Um deren Funktionalität trotzdem nutzen zu können, muss eine andere Taste „umgebogen“ werden. Hierzu wird in einer Konsole showkey -s eingegeben. Dieses Kommando müsste folgende Ausgabe erzeugen:

KB-Modus war UNICODE
[ Wenn Sie das unter X probieren, muss es nicht funktionieren,
 da der X Server ebenfalls von /dev/console liest. ]
Drücken Sie eine Taste (Programmende 10 s nach dem letzten Tastendruck)...
0x9c

Nun muss die umzubiegende Taste – bspw. die Windows-Taste – gedrückt und losgelassen werden. Dies sollte folgende Ausgabe erzeugen:

0xe0 0x5b 0xe0 0xdb

Von diesen 4 Hexadezimalzahlen steht die erste Hälfte (0xe05b) für das Drücken und die zweite für das Loslassen der Taste. Nun kann die Windows-Taste mit folgendem Kommando umgebogen werden:

# setkeycodes e05b 99

Die 99 steht hierbei für die SysAbf-Taste.

$ grep -Fwe KEY_SYSRQ /usr/include/linux/input.h
#define KEY_SYSRQ        99
$

Zwecks Persistenz muss dieses Kommando automatisch beim Systemstart ausgeführt werden. Dies kann z. B. wie folgt eingerichtet werden:

# echo "
# Make the Windows key working like SysRq
@reboot root $(which setkeycodes) e05b 99" >>/etc/crontab

Fazit

Die meisten häufig genutzten Distributionen haben alles nötige schon von Haus aus eingerichtet. Meiner Meinung nach ist diese Anleitung trotzdem zumindest für Nutzer von Systemen wie Arch, Fedora oder Debian Testing absolutes Pflichtprogramm. Möglichen Datenverlusten einen Riegel vorzuschieben kann keinesfalls schaden.

Alexander Klimov
Alexander Klimov
Senior Developer

Alexander hat 2017 seine Ausbildung zum Developer bei NETWAYS erfolgreich abgeschlossen. Als leidenschaftlicher Programmierer und begeisterter Anhänger der Idee freier Software, hat er sich dabei innerhalb kürzester Zeit in die Herzen seiner Kollegen im Development geschlichen. Wäre nicht ausgerechnet Gandhi sein Vorbild, würde er von dort aus daran arbeiten, seinen geheimen Plan, erst die Abteilung und dann die Weltherrschaft an sich zu reißen, zu realisieren - tut er aber nicht. Stattdessen beschreitet er mit der Arbeit an Icinga Web 2 bei uns friedliche Wege.

Reverse proxying vom Feinsten

Kibana stellt seit Version 4 den Web-Server selbst. Dieser fungiert auch als (transparenter) Proxy zwischen dem Klienten und Elasticsearch. Dennoch scheint kaum einer (der Entwickler), sich Gedanken um die Sicherheit gemacht zu haben. Hinz und Kunz werden beim Versuch, auf Kibana zuzugreifen, von nichts und niemandem (außer vielleicht der Firewall) aufgehalten. Das ist – vor allem in (größeren) Produktionsumgebungen – nicht unbedingt die wünschenswerteste Situation. Dennoch muss deswegen noch lange niemand gleich Kibana patchen (oder sich vor den nächsten Zug werfen). Diese Lücke kann auch ein Reverse Proxy schließen.

Was ist ein Reverse Proxy?

Während ein konventioneller Proxy einem Klienten die Verbindung zu n Diensten ermöglicht – also für den Klienten von ihm gestellte Anfragen an Dienste weiter reicht – macht ein Reverse Proxy das Gegenteil. Er nimmt von n Klienten Anfragen, die für einen Dienst bestimmt sind, entgegen (und reicht diese entsprechend weiter).
Anwendungsbeispiele:

  • Cache
  • Lastverteiler
  • Honeypot
  • (zusätzliche) Firewall

Abschirmung von Kibana

Der Apache HTTPd kann bspw. als Reverse Proxy dienen und muss dafür wie folgt konfiguriert werden:

ProxyPass / http://127.0.0.1:5601/
ProxyPassReverse / http://127.0.0.1:5601/

Dadurch wird Apache angewiesen, alle (`/‚) Anfragen an Kibana weiterzuleiten und die Antworten entsprechend an die Klienten zurück zu senden.
Natürlich ist das an und für sich noch keine Abschirmung. Allerdings kann Apache (ganz einfach) mit Passwort-Authentifizierung, SSL u.v.m. ausgestattet werden.
Beispielkonfiguration:

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
    ProxyPass / http://127.0.0.1:5601/
    ProxyPassReverse / http://127.0.0.1:5601/
    <Location />
        AuthType Basic
        AuthName "Top secret"
        AuthBasicProvider file
        AuthUserFile /etc/httpd/passwd
        Require valid-user
    </Location>
</VirtualHost>

Und schon können wir etwas ruhiger schlafen. 🙂

Alexander Klimov
Alexander Klimov
Senior Developer

Alexander hat 2017 seine Ausbildung zum Developer bei NETWAYS erfolgreich abgeschlossen. Als leidenschaftlicher Programmierer und begeisterter Anhänger der Idee freier Software, hat er sich dabei innerhalb kürzester Zeit in die Herzen seiner Kollegen im Development geschlichen. Wäre nicht ausgerechnet Gandhi sein Vorbild, würde er von dort aus daran arbeiten, seinen geheimen Plan, erst die Abteilung und dann die Weltherrschaft an sich zu reißen, zu realisieren - tut er aber nicht. Stattdessen beschreitet er mit der Arbeit an Icinga Web 2 bei uns friedliche Wege.

Wo bin ich?

GNU/Linux-Distributionen gibt es wie Sand am Meer. Doch welche habe ich nun vor mir?
Natürlich wird sich kaum einer, der vor dem Recher, den er täglich nutzt, sitzt (und nicht unter Alzheimer leidet), diese Frage stellen. Aber stellen wir uns einmal vor, ein IT-Dienstleister muss – vor Ort – das ihm noch unbekannte System eines Kunden betreuen. Oder: die Arbeitsschritte einer plattformübergreifenden Anwendung hängen davon ab, auf welcher Distribution letztgenannte ausgeführt wird.
Letztgenannter Fall lag bei Icinga Web 2 vor. Vom Benutzer – zwecks Installation – manuell auszuführende Befehle hängen von der Distribution, auf der Icinga Web 2 installiert wird, ab. Das Problem: diese Information muss möglichst Distributionsneutral abgefragt werden. Die Lösung: /etc/os-release.
Letztgenannte Datei ist erweiterbar – und vor allem einfach zu analysieren:

'/(?<!.)\s*ID\s*=\s*([\'"]?)(.*?)\1\s*(?!.)/msi'

Mit diesem PCRE-PHP-String lässt sich jede Zeile der Datei darauf überprüfen, ob sie die Information, die wir haben wollen, enthält. Letztgenannte kann direkt extrahiert werden.
Aber leider gibt es nicht nur die tollen, neuen Distros, die auf systemd bauen – sondern auch solche, die schon fast Jahrzehnte auf dem Buckel haben (können). Diese haben nur ihre spezifischen Release-Files. Es folgen ein paar Beispiele:

  • /etc/fedora-release
  • /etc/centos-release
  • /etc/redhat-release
  • /etc/SuSE-release

Nur die Existenz der 2 letztgenannten Dateien zu überprüfen ist sehr unprezise, da bspw. /etc/redhat-release auch auf CentOS vorhanden ist. /etc/SuSE-release findet sich sowohl auf openSUSE, als auch auf SLES.
Wem das zu aufwändig ist – der kann auch von Icinga 2 gebrauch machen:

$ icinga2 --version
icinga2 - The Icinga 2 network monitoring daemon (version: v2.3.0-...)
Copyright (c) 2012-2015 Icinga Development Team (https://www.icinga.org)
.
.
.
System information:
  Operating system: Linux
  Operating system version: 3.13.0-48-generic
  Architecture: x86_64
  Distribution: CentOS release 6.5 (Final)

Fazit: systemd hat auch seine Vorteile. 😉

Alexander Klimov
Alexander Klimov
Senior Developer

Alexander hat 2017 seine Ausbildung zum Developer bei NETWAYS erfolgreich abgeschlossen. Als leidenschaftlicher Programmierer und begeisterter Anhänger der Idee freier Software, hat er sich dabei innerhalb kürzester Zeit in die Herzen seiner Kollegen im Development geschlichen. Wäre nicht ausgerechnet Gandhi sein Vorbild, würde er von dort aus daran arbeiten, seinen geheimen Plan, erst die Abteilung und dann die Weltherrschaft an sich zu reißen, zu realisieren - tut er aber nicht. Stattdessen beschreitet er mit der Arbeit an Icinga Web 2 bei uns friedliche Wege.

Azubis erzählen: April 2015 Alexander

This entry is part 8 of 17 in the series Azubis erzählen

Name: Alexander Klimov
Ausbildungsberuf: Fachinformatiker für Anwendungsentwicklung
Abteilung: Development
Lehrjahr: 1

Hallo Menschen!
Diesmal bin ich an der Reihe, Euch meinen Ausbildungsberuf nahezubringen.
Doch zuerst ein paar Angaben zu meiner Wenigkeit:
Ich heiße Alexander. Ich bin 20 Jahre jung und im 1. Lehrjahr. Mein Ausbildungsberuf heißt Fachinformatiker für Anwendungsentwicklung und mich erwartet im kommenden Lehrjahr erst mal die Zwischenprüfung. Die Abschlussprüfung sollte im Lehrjahr darauf folgen. Meine Kollegen Nadja und Marius mögen schon weiter sein, aber – wie ich gerne zu sagen pflege – kommt Zeit, kommt Rat! Neben der unglaublich spannenden Berufsschule bin ich in der Development-Abteilung von NETWAYS tätig.
Die Berufsbezeichnung ist relativ selbsterklärend. Meine (Haupt-)Aufgabe besteht darin, Anwendungen (weiter) zu entwickeln. Im Folgenden möchte ich euch ein paar davon vorstellen.

Icinga Web 2

An unserem PHP-Framework Icinga Web 2 gibt es noch alle Hände voll zu schrauben (schließlich soll es irgendwann mal fertig werden) – kein Wunder, dass der Löwenanteil meiner bisherigen Ausbildung diesem Projekt gewidmet war.
Icinga LogoNeben dem Erlernen der unglaublich tollen Programmiersprache PHP war es mir vergönnt, viele kleinere Fehler zu beheben und die Puppet-Manifeste radikal umzubauen, um Letztgenannte überschaubar(er) zu machen. Das Problem bestand darin, dass (fast) alles (fast 800 Zeilen) sich in einer .pp-Datei befand – und das hat den Code nicht viel übersichtlicher gemacht. Meine Aufgabe bestand darin, das Ganze zu modularisieren. Das hat zwar eine ganze Weile gedauert, aber mittlerweile ist es geschafft!

DbMaint

Das von mir Mitte 2014 entwickelte DbMaint soll u. a. beim Aktualisieren von Icinga 2 dazugehörige Datenbanken mit auf den neusten Stand bringen – und somit den Administrationsaufwand verringern. Für Debian gab es zwar schon dbconfig-common, aber in RPM-basierenden GNU-Distributionen fehlte ein derartiges Werkzeug.
DbMaint war in Python zu realisieren und sollte sowohl MySQL als auch PostgreSQL unterstützen. Als ob letztgenanntes nicht schon aufwändig genug war, lagen mir – dank RHEL 5 – Steine im Weg. Dieser Weg war entsprechend steinig und schwer – trotzdem ist mir die Fertigstellung gelungen.

Stammdaten-Verwaltung

Momentan verantworte ich die Fertigstellung eines Icinga Web 2 Moduls, das Stammdaten von Kunden verwalten soll. Dazu zählen bspw. Verträge und (im Rahmen letztgenannter) erworbene Produkte/Dienstleistungen. Da die voraussichtliche Datenmenge nicht überschaubar ist, kommt dafür nur eine relationale Datenbank in Frage. Sich mit solchen zu beschäftigen fand ich spannend und lehrreich. (Überhaupt lerne ich im Betrieb eine ganze Menge interessanter Sachen – die Berufsschule lasse ich an dieser Stelle mal unkommentiert..)
Zuerst hatte ich das Datenbankschema zu planen – wie die Datenbank aufgebaut sein soll und was sie überhaupt speichern soll. Danach sollte das Modul für Icinga Web 2 programmiert werden. Es soll die gespeicherten Daten anzeigen und auch das Hinzufügen, Bearbeiten und Löschen ermöglichen. (Für Leute, die sich nicht mit Datenbanken/SQL auskennen oder gerade keine Lust haben, viele/längere SQL-Abfragen abzutippen. 😉 )
Exploits of a MomAn dieser Stelle darf ich eine Lanze für Icinga Web 2 brechen, denn ohne seine Infrastruktur wäre ich so gut wie aufgeschmissen.

Fazit

In diesem Beruf reicht es nicht, in die Tasten hauen zu können – auch Köpfchen anstrengen will gelernt sein. Und wer auch um die Ecke denken kann – der findet bei uns bestimmt die richtige Stelle für sich.

Alexander Klimov
Alexander Klimov
Senior Developer

Alexander hat 2017 seine Ausbildung zum Developer bei NETWAYS erfolgreich abgeschlossen. Als leidenschaftlicher Programmierer und begeisterter Anhänger der Idee freier Software, hat er sich dabei innerhalb kürzester Zeit in die Herzen seiner Kollegen im Development geschlichen. Wäre nicht ausgerechnet Gandhi sein Vorbild, würde er von dort aus daran arbeiten, seinen geheimen Plan, erst die Abteilung und dann die Weltherrschaft an sich zu reißen, zu realisieren - tut er aber nicht. Stattdessen beschreitet er mit der Arbeit an Icinga Web 2 bei uns friedliche Wege.

Store passwords like a boss

Wer eine Web-Anwendung, die zwecks Authentifizierung Passwörter speichert, betreibt, der sollte sich – zwecks Sicherheit – Gedanken machen, welche kryptologische Hashfunktion die Anwendung zwecks Speicherung verwendet – schließlich soll bspw. ein eventueller Datenklau nicht gleich die betroffenen Konten vollständig kompromittieren.
Hintergrund: Wer ein Passwort (im Klartext) kennt, der gibt es einfach an der entsprechenden Stelle ein und hat Gewalt über das entsprechende Konto. Wer „nur“ einen Hash des Passwortes hat, muss letztgenanntes erst via Brute-Force mühsam erraten.
Um letztgenannte Methode zusätzlich zu erschweren – und damit weniger attraktiv zu machen, habe ich folgende PHP-Funktion geschrieben:

function hashPasswordLikeABoss($password) {
    if (CRYPT_SHA512 !== 1)
        throw new Exception('This platform doesn\'t support the algorithm `CRYPT_SHA512\'');
    if (false === ($salt = openssl_random_pseudo_bytes(12)))
        throw new Exception('Failed at openssl_random_pseudo_bytes()');
    $salt = sprintf(
        '$6$rounds=%d$%s',
        mt_rand(50000, 100000),
        str_replace('+', '.', base64_encode($salt))
    );
    if ($salt !== substr(
        $hashed = crypt($password, $salt),
        0,
        strlen($salt)
    ))
        throw new Exception('Failed at crypt()');
    return $hashed;
}

Erklärung

Zuerst wird überprüft, ob der zu verwendende SHA512-Algorithmus von der ausführenden Plattform überhaupt unterstützt wird.
Danach werden via openssl_random_pseudo_bytes() 12 zufällige Bytes für den Salt angefordert. (Das kann ebenfalls fehlschlagen.)
Aus denen werden daraufhin 16 – dank base64_encode(). Dieser Funktionsaufruf dient hauptsächlich dazu, nur die für den Salt zulässigen Zeichen a-zA-Z0-9./ übrig zu lassen. Lediglich eventuelle `+‘-Zeichen müssen noch durch Punkte ersetzt werden.
Um noch einen drauf zu setzen, werden zwischen 50000 und 100000 Runden verwendet – statt standartmäßig 5000.
Daraufhin wird der mit sprintf() zusammen gebaute Salt – zusammen mit dem Passwort – an crypt() übergeben und es wird überprüft, ob das Resultat mit dem übergebenen Salt beginnt, was für einen Erfolg spricht.
Zuletzt wird das gehashte Passwort zurückgegeben.

Fazit

Ob das die NSA von irgendwas abhält, kann ich nicht beurteilen – gegen den random (bad) Guy dürfte es aber allemal reichen.

Alexander Klimov
Alexander Klimov
Senior Developer

Alexander hat 2017 seine Ausbildung zum Developer bei NETWAYS erfolgreich abgeschlossen. Als leidenschaftlicher Programmierer und begeisterter Anhänger der Idee freier Software, hat er sich dabei innerhalb kürzester Zeit in die Herzen seiner Kollegen im Development geschlichen. Wäre nicht ausgerechnet Gandhi sein Vorbild, würde er von dort aus daran arbeiten, seinen geheimen Plan, erst die Abteilung und dann die Weltherrschaft an sich zu reißen, zu realisieren - tut er aber nicht. Stattdessen beschreitet er mit der Arbeit an Icinga Web 2 bei uns friedliche Wege.