Mit RSA-Schlüsseln auf Linux anmelden

Bislang habe ich immer die Kombination aus Username/Passwort für die Authentifizierung an meinen Linux-Maschinen genutzt, aus purer Faulheit stelle ich aber aktuell auf schlüssel-basierte Logins um. Hier eine kurze Anleitung, wie man die entsprechenden Schlüssel unter Windows erstellt.

Als SSH-Shell nutze ich unter Windows putty, das mit puttygen auch einen entsprechenden Key-Generator mit sich bringt. Diesen startet man, wählt „SSH-2 RSA“ aus, trägt bei der Schlüssellänge 4096 ein und drückt „Generate“

Anschließend bewegt man die Maus, um genügend Entropie zu erzeugen.

Nachdem die Schlüssel fertiggestellt sind, kann man mit „Save public key“ und „Save private key“ die beiden Schlüssel speichern. Ein Passwort legen wir hier explizit nicht fest, denn wir wollen ja ein passwort-losen Login.

Die public-Key-Datei kopieren wir dann auf die Linux-Maschine, ich habe dazu einfach WinSCP genutzt.

Auf der Linux-Maschine loggt man sich dann mit Username und Passwort ein und legt a) die Datei ~/.ssh/authorized_keys an, falls diese noch nicht existiert. Dann kopiert man mittels cat >> .ssh/authorized_keys den neuen Key an das Ende der authorized_keys.

Nun muss nur noch in Putty in den Eigenschaften der Verbindung der private key hinterlegt werden und die Session gespeichert werden, die schlüssel-basierte Verbindung sollte jetzt klappen.

Bei mir tat sie das nicht, mein Linux-Server brachte nur die Meldung „Server refused our key“. Die Lösung fand sich dann unter https://www.hpbyte.ch/index.php?/archives/842-PuTTY-und-Server-refused-our-key.html bzw. unter http://www.walkernews.net/2009/03/22/how-to-fix-server-refused-our-key-error-that-caused-by-putty-generated-rsa-public-key/

Der Key muss a) in einer Zeile stehen und b) es muss ssh-rsa davor stehen. Diese Anpassungen habe ich dann unter Windows schnell gemacht (per Ultraedit, jeder andere Editor sollte auch gehen, mit vim wie unter den Links beschrieben kenn ich mich nicht so gut aus) und die oben erwähnten Schritte (auf den Server kopieren, an die authorized_keys anhängen) nochmal gemacht. Jetzt klappt’s auch mit der Verbindung.

Doppelte Buchführung mit Beancount

This entry is part 1 of 1 in the series beancount

Seit einiger Zeit trage ich mich mit der Idee, privat auf doppelte Buchführung umzusteigen, um vielleicht einen besseren Überblick über die Finanzen zu gewinnen. Es gibt neben den diversen kommerziellen Lösungen einige OpenSource-Programme, die doppelte Buchführung umsetzen, ich bin bei Beancount hängengeblieben. Alternativen im OpenSource-Bereich wären noch hledger (https://hledger.org) oder GnuCash (https://www.gnucash.org).

An beancount hat mir gefallen, dass es a) in Python implementiert ist und b) es mit fava (https://github.com/beancount/fava) ein leistungsfähiges Web-Interface gibt. Die Installation unter Linux ist einfach, unter Windows benötigt man leider einen installierten C++ Compiler. Dazu vielleicht in einem anderen Beitrag mehr.

Hier nun ein Beispiel für beancount, ich wähle dazu eine einfache Blumengeldkasse, in die einige Kollegen einzahlen, um daraus Blumensträuße zu kaufen.

Die Datei beginnt damit, dass einige Standard-Kategorien eingedeutscht werden und dann zum 01.01.2019 eröffnet werden. Zum 1.10.2019 werden dann zwei Forderungen gebucht (gegenüber den beiden Kollegen Martina und John haben wir eine Forderung von jeweils 5 Euro), Martina Mustermann zahlt dann am 03.10.2019 ihre 5 Euro in bar ein, was einerseits die Reduktion der Forderungen und zweitens die Erhöhung der Barkasse nach sich zieht. Am 5.10.2019 werden dann aus der Kasse 2 Euro genommen und für Blumen ausgegeben.

option "name_assets"  "Vermoegen"
option "name_liabilities" "Verbindlichkeiten"
option "name_income"  "Einkommen"
option "name_expenses""Ausgaben"
option "name_equity"  "Eigenkapital"

2019-01-01 open Vermoegen:Forderungen EUR
2019-01-01 open Vermoegen:Barkasse EUR
2019-01-01 open Ausgaben:Blumengeld EUR
2019-01-01 open Einkommen:Blumengeld EUR

2019-10-01 * "Martina Mustermann"
  Vermoegen:Forderungen                         5.00 EUR
  Einkommen:Blumengeld                          -5.00 EUR

2019-10-01 * "John Doe"
  Vermoegen:Forderungen                         5.00 EUR
  Einkommen:Blumengeld                          -5.00 EUR

2019-10-03 * "Martina Mustermann"
  Vermoegen:Barkasse                            5.00 EUR
  Vermoegen:Forderungen                         -5.00 EUR

2019-10-05 * "Blumen für Max"
  Ausgaben:Blumengeld                              2 EUR
  Vermoegen:Barkasse                              -2 EUR

In fava sieht die Auswertung dann so aus:

Ich bin in dem Thema noch sehr am Anfang, je nach verfügbarer Zeit werde ich noch einige Grundlagenartikel zu diesem Thema schreiben.

Mehr Power im Terminal mit tmux – Teil 3

This entry is part 3 of 3 in the series tmux

Hier nun zum letzten Teil der tmux Serie. Neben der Möglichkeit, mehrere Fenster zu erstellen, zwischen denen man hin- und herwechseln kann, bietet tmux auch die Möglichkeit der sogenannten „panes“ bzw. „Scheiben“.

Wir schließen wir dazu alle Fenster und nutzen dann Ctrl-b %, um das Fenster entlang der vertikalen Achse zu splitten.

Mit Ctrl-b " könnten wir das Fenster entlang der horizontalen Achse splitten.

Diese beiden Befehle können auch kombiniert werden, wie das folgende Bild zeigt.

Zwischen den Fenstern wechselt man mittels Ctrl-b Pfeiltaste, mit Ctrl-b x wird die aktuelle „Scheibe“ geschlossen.

Noch mehr Hinweise zu tmux findet man unter anderem hier:

  • https://tmuxcheatsheet.com
  • „tmux 2: Productive Mouse-Free Development“ von Brian P. Hogan
  • „Getting Started with tmux“ von Victor Quinn J.D.

Mehr Power im Terminal mit tmux – Teil 2

This entry is part 2 of 3 in the series tmux

Ausgehend von einer laufenden tmux Session schauen wir uns heute die grundlegende Bedienung an.

Innerhalb meiner tmux Session kann man beispielsweise mittels Ctrl-b c ein neues Fenster erstellen.

Man erkennt es im folgenden Bild daran, dass neben 0:bash- ein 1:bash* steht. Das Sternchen steht dabei für das gerade aktive Fenster.

Zwischen den verschiedenen Fenstern kann man über die folgenden Tastenkombinationen wechseln:

  • Ctrl-b 0 .. 9 um direkt zu einer Shell zu springen
  • Ctrl-b n für das nächste Shell-Fenster
  • Ctrl-b p für das letzte

Mittels Ctrl-b & schließt das aktuelle Shell-Fenster, tmux fragt sicherheitshalber aber noch einmal nach, ob man das Fenster wirklich schließen möchte.

Da viele identische „Bash“ Strings als Bezeichner schnell unübersichtlich sind, kann man mit Ctrl-b , das aktuelle Fenster umbenennen.

Mehr Power im Terminal mit tmux – Teil 1

This entry is part 1 of 3 in the series tmux

In den letzten Tagen habe ich mich ein wenig mit tmux beschäftigt, einem Terminal-Multiplexer für Linux und Unix, der aber auch im Windows-Subsystem für Linux funktioniert.

Was ist ein Terminal-Multiplexer? Die englische Wikipedia [1] schreibt dazu folgendes:

„tmux is a terminal multiplexer for Unix-like operating systems. It allows multiple terminal sessions to be accessed simultaneously in a single window. It is useful for running more than one command-line program at the same time. It can also be used to detach processes from their controlling terminals, allowing SSH sessions to remain active without being visible.“

Also:

  • man kann mehrere Terminal-Sessions gleichzeitig in einem Fenster offen haben, bricht die Verbindung ab
  • bricht die SSH-Verbindung ab, so bleibt die Session trotzdem erhalten

Die Installation war recht einfach, per apt install tmux holt man sich das Paket auf die Maschine. Um bei jedem Login tmux sofort zur Verfügung zu haben, habe ich gemäß [2] folgendes der ~/.profile hinzugefügt:

if command -v tmux &> /dev/null && [ -z "$TMUX" ]; then
    tmux attach -t default || tmux new -s default
fi

Startet man jetzt tmux, so erhält man den folgenden Bildschirm:

Im nächsten Teil schauen wir uns dann die grundlegende Bedienung an.

[1] https://en.wikipedia.org/wiki/Tmux
[2] https://www.tecmint.com/tips-for-tmux-terminal-sessions/

Ordner anlegen mit Python und Excel

Für das Github-Repository der Vorträge von Dante e.V. Vereinstagungen habe ich heute eine Menge Unterordner nebst entsprechenden README-Dateien anlegen dürfen. Da die manuelle Anlage zu lange gedauert hätte (und Verschwendung wertvoller Lebenszeit bedeutet hätte), habe ich ein kleines Python-Skript genutzt, das sich die Daten aus einer Excel-Datei geholt hat.

Die Excel-Datei Daten.xlsx hatte dabei den folgenden Aufbau:

Mit dem folgenden Skript habe ich pro Jahr jeweils zwei Unterordner angelegt und die README-Datei jeweils mit dem passenden Titel versorgt. Man hätte es noch schöner schreiben können, für einen Quick und Dirty Hack war es aber mehr als ausreichend.

import pandas as pd
import os
 
df = pd.read_excel('Daten.xlsx')
 
for index, row in df.iterrows():
    jahr = str(row['Year'])
 
    f1 = jahr + '-Frühling'
    f2 = jahr + '-Herbst'
    spring = row['Spring']
    autumn = row['Autumn']
 
    try:
        if not os.path.exists(f1):
            os.makedirs(f1)
    except OSError:
        print ('Fehler bei Verzeichnis ' +  directory)
 
    with open(f1+'/README.md', 'wt') as file:
        file.write('# Vorträge der Dante e.V. Frühjahrstagung '+jahr + '\n\n')
        file.write('Datum: \n')
        file.write('Veranstaltungsort: ' + spring +'\n')
 
    try:
        if not os.path.exists(f2):
            os.makedirs(f2)
    except OSError:
        print ('Fehler bei Verzeichnis ' +  directory)
 
 
    with open(f2+'/README.md','wt') as file:
        file.write('# Vorträge der Dante e.V. Herbsttagung '+jahr + '\n\n')
        file.write('Datum: \n')
        file.write('Veranstaltungsort: ' + autumn +'\n')

CUPS auf dem Raspi installieren, mit iOS drucken

Um vom iPhone und iPad drucken zu können, habe ich heute meinen Raspi (der in der Unterversorgung hängt und damit 24/7 läuft) mit CUPS versehen. Ich bin dabei der Anleitung von https://www.elektronik-kompendium.de/sites/raspberry-pi/2007081.htm gefolgt, es lief ohne Probleme.

Als etwas komplizierter hat sich die Duplizierung eines Druckers erwiesen. Ich habe sowohl die entsprechende ppd-Datei als auch den Eintrag in der printers.conf angepasst, jedoch sehen die iOS-Geräte nur den ersten Drucker.

Die Lösung dazu habe ich auf https://www.johnlose.de/2018/02/drucker-airprint-faehig-machen-auf-ubuntu-16-04-airprint-cups-ubuntu-xenial/ gefunden: der avahi-Daemon war noch nicht vollständig konfiguriert, der die Bonjour-Erkennung übernimmt.

Mit wget https://raw.githubusercontent.com/tjfontaine/airprint-generate/master/airprint-generate.py kann man jedoch ein Python-Skript herunterladen, das die Erzeugung der Drucker-Dateien übernimmt, die man dann nach /etc/avahi/services verschiebt. Nach dem Neustart des Dienstes mittels /etc/init.d/avahi-daemon restart findet das iPhone dann auch den Drucker vie Airprint, einmal für einseitig, einmal für zweiseitig.

Update: Aktuell druckt der Drucker nur über den einen nicht-AirPrint-Server, warum weiß ich noch nicht.

Ubuntu/Debian/Raspian Cheat-Sheet

Hier mein persönliches Cheat-Sheet für die Arbeit mit den verschiedenen Linux-Derivaten. Es wird im Laufe der Zeit erweitert.

Ubuntu

lsb_release -a
Ermittelt die Ubuntu Version
cat /proc/cpuinfo
CPU-Informationen ausgeben
cat /proc/meminfo
Memory-Informationen ausgeben
ip address show
IP-Adressen der Interfaces anzeigen

Netzwerkverbindung unter Windows reparieren

Wenn unter Windows die Netzwerkverbindung nicht mehr verfügbar ist, können die folgenden Befehle von Deskmodder helfen, die auf einer Admin-Konsole einzugeben sind:

  1. netsh winsock reset
  2. netsh int ip reset
  3. ipconfig /release
  4. ipconfig /renew
  5. ipconfig /flushdns

Python-Übungsaufgabe: MD5-Hashes

Hier eine Übungsaufgabe, die ich mir heute basierend auf https://www.programmieraufgaben.ch/aufgabe/baeckerei-b-rot/xyikp5d5 ausgedacht habe:

Eine Firma hat sich im Streit von ihrem alten Administrator getrennt und hat jetzt ein Problem. Das Passwort für das Lohnzahlungssystem hatte nur der Admin, man kann es nicht zurücksetzen und sollte es einmal falsch eingegeben werden, werden alle Daten der letzten zehn Jahre gelöscht.

Studentin Susanne, die gerade ein Praktikum bei der Firma macht, findet im Dateisystem des Rechners eine Datei, die einen MD5-Hash vom Passwort enthält. Zusätzlich ist bekannt, dass es sich beim Passwort um (verschiedene Fälle mit steigender Komplexität)

* eine vierstellige Zahl (Hash lautet \texttt{48c8c3963853fff20bd9e8bee9bd4c07})
* eine fünfstellige Zahl (Hash selbst ausdenken) oder
* eine sechsstellige Zahl oder
* einen String aus vier (oder fünf oder sechs) Ziffern und Kleinbuchstaben (super als Hausaufgabe!)

handelt. Schreiben Sie ein Programm, das das Passwort im Klartext auf Basis des MD5-Hash ausgibt.

Für die Bestimmung des MD5-Hash nutzen Sie eine passende Bibliothek, eine Implementierung des Algorithmus ist natürlich nicht notwendig.