Das ist die Webseite Koeppe.Rocks

Mein Name ist Alexander. Dass diese Webseite so aussieht als wenn Sie in den 90'ern erstellt wurde ist Absicht.
Zum einen hab ich keine Lust mich mit den neuesten abgefahrenen Features von CSS zu beschäftigen,
zum Anderen finde ich solche Webseiten sehr sympatisch, da hier der Inhalt und nicht das Aussehen im Vordergrund steht.
Ich möchte hier einfach ein paar Kniffe und Tipps teilen die vielleicht auch für den Einen oder Anderen von Nutzen sein könnten.

Inhalt:

  1. Arbeiten mit Exim Message IDs
  2. Das Linux Terminal effektiv nutzen
  3. SSL CSR richtig erstellen

Arbeiten mit Exim Message IDs

Wer als MTA Exim einsetzt hat sicherlich schon mal ähnliche Zeilen in der Logdatei von exim gesehen:

    2018-09-05 08:31:45 1fxRLs-0000Xv-VM Completed
   
Rot markiert ist die Message ID die für Exim eindeutig ist. Bleibt zum Beispiel eine oder mehrere Nachrichten hängen bzw. können nicht zugestellt werden, bleiben Sie in der Queue und können mit dem Commando
exim4 -bp
angezeigt werden.
    # exim4 -bp
    13d  1.2K 1vaDH0-0107QZ-B5 <foo@example.org>
              bar@example.com
    
    3h   22K 1JbOHr-00d4ev-bn <foo@example.org>
             bar@example.com
    #
   
Damit man nicht mühsam jede Message ID rauskopieren muss, um z.B. die erneute Zustellung zu triggern oder die Empfangs- oder Absendeinformationen zu modifizieren oder die Nachrichten gar komplett zu löschen, habe ich ein Einzeiler Perl-Skript geschrieben, das klein aber fein und sehr effektiv hilft die Brücke von der Queue- Anzeige zu Weiterverwendung von anderen Exim Kommandos zu schlagen:
    $ cat messageids.pl
    #! /usr/bin/perl
    while (<>) {print "$1\n" if /(\b\S+-\S+-\S+\b)/;}
    $
   
Das Skript liest von der Standardeingabe und gibt nur die Message IDs zeile aus. Leitet man also nun die Ausgabe von
exim4 -bp
an das Skript weiter wird die oben gezeigte Ausgabe zu:
    # exim4 -bp | ./messageids.pl
    1vaDH0-0107QZ-B5
    1JbOHr-00d4ev-bn
    #
   
Habe allerdings mittlerweile herausgefunden, dass das Exim Github Wiki neben vielen weiteren nützlichen Tricks, einen Befehl beschreibt, der genau dasselbe tut und auch Bestandteil der Exim Installation ist:
    # exim4 -bp | exiqgrep -i
    1vaDH0-0107QZ-B5
    1JbOHr-00d4ev-bn
    #
   
Damit kann man jetzt wiederrum mit der Hilfe von
xargs
Exim bedienen. z.B. die Nachrichten aus dem Frozen Status zu befreien, die Abarbeitung erneut zu triggern oder die Nachrichten aus der Queue zu löschen.
Zur Erklärung:
xargs
nimmt zeilenweise die Standardeingabe und hängt sie als Parameter an das Kommando an und führt es aus.
Somit wird aus
    # exim4 -bp | exiqgrep -i | xargs exim4 -Mrm
   
dann
    # exim4 -Mrm 1vaDH0-0107QZ-B5 1JbOHr-00d4ev-bn
   
Vielleicht hilft dieses kleine Skript ja noch jemand anders. Natürlich macht es erst so richtig Sinn wenn nicht 2 Nachrichten in der Queue stehen sondern Hunderte.

Das Linux Terminal effektiv nutzen

Mit folgenden Tastenkombinationen lässt sich wesentlich schneller auf der Linux Konsole navigieren und dessen Inhalt bearbeiten als wenn man mit der Links-, Rechts- und Rück-Taste rumhantiert. Die folgende Tabelle listet diese Tastenkombinationen auf.

SteuersequenzBedeutung
Strg + LTerminal leeren (ala
clear
)
Strg + DLogout (End-of-Document) (geht nur bei leerer Zeile)
Strg + RRückwärts in der Befehlshistorie suchen
Befehlseingabe bearbeiten
Strg + UAktuelle Zeile vom Cursor bis Anfang löschen
Strg + KAktuelle Zeile vom Cursor bis Ende Löschen
Strg + ACursor an den Anfang der aktuellen Zeile bewegen
Strg + ECursor an das Ende der aktuellen Zeile bewegen
Strg + WWort vor dem Cursor löschen
Esc + DVom Cursor bis zum Wortende löschen
Esc + UNächstes Wort vom Cursor in GROßBUCHSTABEN ändern
Esc + LNächstes Wort vom Cursor in kleinbuchstaben ändern
Während der Befehlsausführung
Strg + CBefehlsabbruch (SIGTERM)
Strg + ZBefehlsunterbrechung (SIGSTOP) - kann mit
fg
oder
bg
fortgesetzt werden
Strg + \Befehlsabbruch wenn gar nichts mehr geht (SIGKILL)
Strg + STerminalausgabe einfrieren - hilfreich während build-Fehler
Strg + QTerminalausgabe fortsetzen
Spezialitäten
Strg + FCursor ein Zeichen weiter bewegen - wie Pfeil rechts
Strg + BCursor ein Zeichen zurück bewegen - wie Pfeil links
Strg + HBackspace - falls Backspace mal nicht funktioniert
Strg + MEnter - falls mal die Entertaste kaputt ist
Strg + PRückwärts in der Befehlshistorie - wie Pfeil hoch
Strg + NVorwärts in der Befehlshistorie - wie Pfeil runter
Esc + C Ersten Buchstaben vom Cursor in Groß-, bis Wortende in Kleinschreibung (Substantiv)

Ich habe die Steuerbefehle nach der Alltagshäufigkeit sortiert. Viele von denen verwende ich mittlerweile unbewusst und kann mich damit sehr schnell auf der Konsole bewegen. Wer möchte kann sich noch die Funktionstasten mit Makros belegen. Dazu in die Datei
~/.Xresources
folgendes eintragen:
     xterm*VT100.translations: #override
     F1: string("cat /home/marco/.myxterm.hlp")
     F2: string("ls -la")
     F3: string("df -h")
     F4: string("cd -")
     F5: string("cd ..")
     F6: string("cd")
     F7: string("uname -a")
     F8: string("ps -aux | more")
     F9: string("uptime")
     F10: string("free")
     F11: string("clear")
     F12: string("exit") 
   
Das hat allerdings nur auf
xterm
-basierenden Terminals Wirkung. Terminals wie das
mate-terminal
oder
xfce-terminal
ignorieren die ~/.X[...] Dateien.

SSL CSR rightig erstellen

Seit dem Chrome angefangen hat (wie ich finde korrekterweise), der SAN Erweiterung mehr Bedeutung zuzuschreiben, als dem eher lose definierbaren X.509 "Subject" Attribut, ist die Erstellung eines Zertifikatsantrags mit OpenSSL etwas komplizierter geworden. Andernsfalls riskiert man eine unschöne Sicherheitswarnung oder sogar eine komplette Unbenutzbarkeit der Webseite falls HSTS vorab zum Einsatz kam.

Die Subject Alternative Name Erweiterung hat nämlich den Vorteil, explizit zwischen IP Addresse und DNS Namen unterscheiden zu können. Es können beliebig viele Variationen enthalten sein, z.B. gern in Unternehmensnetzen verwendeten nicht-vollqualifizierten Hostnamen im Browser einzugeben:

https://webserver
anstatt normalerweise
https://webserver.company.example
oder gar
https://192.0.2.80
(der Vollständigkeit-halber natürlich auch
https://[2001:db8::80]
).

Aus diesem Grund habe ich mir ein kleines Perl-Skript geschrieben, das den typischen OpenSSL CSR Dialog nachbildet, dann aber noch explizit auf die SAN Erweiterung eingeht und diese im CSR mit einbaut.
Dieses Skript möchte ich Anderen nicht vorenthaten, da ich denke, dass es nichts Nervigeres gibt, wie nicht ordentlich erstellte SSL Zertifikate.

  #!/usr/bin/env perl
  use strict;
  use warnings;
  use Getopt::Long;

  my $keyfile = "";
  my $days = 365;
  GetOptions("key=s" => \$keyfile, "days=i" => \$days) or 
     die "Keyfile not supplied. Use $0 --key=<location of keyfile>.";
  die "Keyfile not supplied. Use $0 --key=<location of keyfile>." unless ($keyfile);
  die "Days must be a positive number" if $days < 0;

  print STDERR "Generate a certificate signing request with proper configuration\n\n";
  print STDERR "Please answer the following questions:\n";

  print STDERR "Country code [DE]: ";
  chomp(my $country = <STDIN>);
  $country ||= "DE";

  print STDERR "State [Hesse]: ";
  chomp(my $state = <STDIN>);
  $state ||= "Hesse";

  print STDERR "Location [e.g. Bembelhausen]: ";
  chomp(my $location = <STDIN>);
  $location ||= "Bembelhausen";

  print STDERR "Organization [My Org]: ";
  chomp(my $organization = <STDIN>);
  $organization ||= "My Org";

  print STDERR "Organizational unit [IT]: ";
  chomp(my $orgunit = <STDIN>);
  $orgunit ||= "IT";

  print STDERR "E-Mail address [webmaster\@company.example]: ";
  chomp(my $email = <STDIN>);
  $email ||= 'webmaster@company.example';

  print STDERR "Primary domainname (e.g. www.company.example): ";
  chomp(my $domainname = <STDIN>);

  my $cnf_tmpl = <<"EOF";
  [req]
  default_bits = 2048
  prompt = no
  default_md = sha256
  req_extensions = req_ext
  distinguished_name = dn
  
  [ dn ]
  C = $country
  ST = $state
  L = $location
  O = $organization
  OU = $orgunit
  emailAddress = $email
  CN = $domainname
  
  [ req_ext ]
  subjectAltName = \@alt_names
  
  [ alt_names ]
  DNS.1 = $domainname
  EOF


  my $i = 2;
  print STDERR "Additional domain names: (leave empty to proceed): ";
  while (<>) {
     chomp;
     last unless length;
     $cnf_tmpl .= "DNS.$i = $_\n";
     $i++;
  } continue {
     print STDERR "Additional domain names: (leave empty to proceed): ";
  }

  $i=1;
  print STDERR "Shall the certificate be also valid for an IP?: (leave empty to finish): ";
  while (<>) {
     chomp;
     last unless length;
     $cnf_tmpl .= "IP.$i = $_\n";
     $i++;
  } continue {
     print STDERR "Shall the certificate be also valid for an IP?: (leave empty to finish): ";
  }

  my $cmd =  "openssl req -new -days $days -sha256 -key \"$keyfile\" -config <(printf \'$cnf_tmpl\')";

  system "bash -c \"$cmd\"";


  __END__
  Author: Alexander Koeppe
  Date Created: 14.09.2017
  Date Modified: 13.04.2018 - adding IP attribute
  

Syntax Highlighting dank http://tohtml.com