Speicherung der Credentials für GIT auf der Komandozeile

Oft ist es so, dass man auf einem Server (wo man nur die Kommandozeile zur Verfügung hat) sehr mühselig jedes Mal beim Pushen oder Pullen die Credentials einzugeben. GIT kann diese dauerhaft speichern, was den Komfort deutlich erhöhen kann. Ob dieses zu einem Sicherheitsrisiko führt, ist hier nicht Thema und wird nicht weiter betrachtet.

File Storage einrichten

git config --global credential.helper 'store --file ~/.my-credentials'

Warten auf ein Deployment

Muss man in einem Skript auf ein Rollout eines Deployment warten, dann hilft folgendes Konstrukt dabei:

#
# wait for rollout
#
ATTEMPTS=0
SLEEP=10
DEPLOYMENT=flux
NAMESPACE=flux

ROLLOUT_STATUS_CMD="kubectl rollout status deployment/$DEPLOYMENT -n $NAMESPACE"
until $ROLLOUT_STATUS_CMD || [ $ATTEMPTS -eq 60 ]; do
  $ROLLOUT_STATUS_CMD
  ATTEMPTS=$((attempts + 1))
  sleep $SLEEP
done

Rückwärtssuche

Wie viele Wissen, kann man mit STRG + r Suchbegriff in der Historie der Shell danach Suchen. Durch erneutes drücken von STRG + r springt zum vorherigen usw.

Vorwärtssuche

Damit man die Suchrichtung ändern kann, muss man STRG + s verwenden. Falls es nicht funktioniert, dann muss die Suspension der Shell mit

stty -ixon

abgeschaltet werden. Nun kann man mit STRG + r rückwärts und mit STRG + s vorwärts suchen in der Historie.

Das Secret Management System Vault

Vault ermöglicht das verteilte Arbeiten mit Geheimnissen. Diese können über AppRoles und ACLs geschützt werden, was Vault sehr flexibel macht.

Hier zeige ich wie man aus dem internen KV Store in der Version 2 Daten abrufen kann. Der Aufbau ist wie folgt: Es gibt einen Mountpoint administrator in dem ein KV2 Secretstore gemountet ist. In diesem werden Passswörter für Benutzer auf Systemen abgelegt. Damit eine Sortierung einfacher wird, ist eine weitere Ebene im Pfad ORT vorhanden. Der Server heißt server und das Geheimnis password.

Die neuste Version eines Secrets ermitteln

Da der KV2 gegenüber der ersten Version nun über eine Versionierung der Geheimnisse verfügt, muss man nun auch immer die Version abgeben die man abrufen möchte. Dazu kann man aus den Metadaten die neuste Versionsnummer ermitteln.

Allgemeiner Abruf

Die Metadaten sind unterhalb des Mountpoint unter /metadata zu finden. Der Pfad zum Geheimnis muss zusätzlich angehangen werden.

curl -H "X-Vault-Token:s.XXX" -X GET https://vault.XXX.org:443/v1/administrator/metadata/ORT/server/password

Als Ausgabe erhält man ein JSON welches die Metadaten enthält. In versions sind die aktuellen Versionen zu finden. Hier im Beispiel also 1.

{
    "request_id": "680ec30e-3013-6416-8ee8-2937f694b5e2",
    "lease_id": "",
    "renewable": false,
    "lease_duration": 0,
    "data": {
    "cas_required": false,
    "created_time": "2020-03-08T08:51:56.895667901Z",
    "current_version": 1,
    "delete_version_after": "0s",
    "max_versions": 0,
    "oldest_version": 0,
    "updated_time": "2020-03-08T08:51:56.895667901Z",
    "versions": {
        "1": {
        "created_time": "2020-03-08T08:51:56.895667901Z",
        "deletion_time": "",
        "destroyed": false
        }
    }
    },
    "wrap_info": null,
    "warnings": null,
    "auth": null
}

Mit JQ die Version filtern

Mit JQ kann mit die Information recht einfach herausfiltern.

curl -H "X-Vault-Token:s.XXX" -X GET https://vault.XXX.org:443/v1/administrator/metadata/ORT/server/password | jq '.data.versions | keys[0]'

"1"

KV2 Value auslesen

Wenn man die aktuelle Version bestimmt hat, dann kann man die Version eines Geheimisses auslesen. Die Daten befinden sich unterhalb /data.

curl -H "X-Vault-Token:s.XXX" -X GET https://vault.mrpeacock.duckdns.org:443/v1/administrator/data/ORT/server/password?version=1 | jq '.'

Als Antwort erhält man auch hier ein JSON.

{
    "request_id": "4b7613ef-c752-f8b7-dc94-aecd0999d1c0",
    "lease_id": "",
    "renewable": false,
    "lease_duration": 0,
    "data": {
    "data": {
        "password": "admin123"
    },
    "metadata": {
        "created_time": "2020-03-08T08:51:56.895667901Z",
        "deletion_time": "",
        "destroyed": false,
        "version": 1
    }
    },
    "wrap_info": null,
    "warnings": null,
    "auth": null
}

Value mit JQ herausfiltern

Auch hier können wir JQ zur Hilfe nehmen und direkt das Passwort auslesen. Die Informationen stecken, Achtung in data.data. Siehe JSON.

curl -H "X-Vault-Token:s.XXX" -X GET https://vault.XXX.org:443/v1/administrator/data/ORT/server/password?version=1 | jq '.data.data.password'

JQ gibt dann das Passwort aus:

"admin123"

Eclipse und der Modulepath

Mit Java 9 wurden die Module neu eingeführt (Projekt Jigsaw). Wenn man ein Projekt mit Modulen baut, dann müssen die Module auch in dem Modulepath vorhanden sein.

Das Buildship-Plugin von Eclipse setzt leider nicht alle Module automatisch auf den Modulepath, sodass bei jeder Änderung am gradle.build Skript man von Hand die Einträge im Buildpath Konfigurationsdialog verschieben muss.

Folgendes kleines Skript erledigt die Aufgabe für uns, wenn der Gradle Task eclipse ausgeführt wird.

//
// Will be executed when gradle Task Eclipse was called
//

eclipse {
    project {
        natures 'org.eclipse.buildship.core.gradleprojectnature'
    }

    classpath {
        file {
            whenMerged {
                entries.findAll { isModule(it) }.each {
                    it.entryAttributes['module'] = 'true'
                }

                entries.findAll { isSource(it) && isTestScope(it) }.each {
                    it.entryAttributes['test'] = 'true'
                }

                entries.findAll { isLibrary(it) && isTestScope(it) }.each {
                    it.entryAttributes['test'] = 'true'
                }
            }
        }

        defaultOutputDir = file('build')
        downloadSources = true
        downloadJavadoc = true
    }
}

boolean isLibrary(entry) { return entry.properties.kind.equals('lib') }
boolean isTestScope(entry) { return entry.entryAttributes.get('gradle_used_by_scope').equals('test'); }
boolean isModule(entry) { isLibrary(entry) && !isTestScope(entry); }
boolean isSource(entry) { return entry.properties.kind.equals('src'); }

Custom Starter

Spring Boot beinhaltet eigene Starter. Ein Starter ist eine Sammlung von Dependencys die aufeinander abgestimmt sind. Diese werden über das Dependency Management von dem Parent POM bzw. über ein Gradle Plugin mit den passenden Versionen verwaltet. So kann man sehr einfach und fehlerfrei Dependencys in eine Spring Boot Anwendung einbringen.

Nun bietet Spring Boot aber nicht für alle 3rd Party Libraries einen Spring Boot Starter. Es werden aber (nach Pull Request) auf der GitHub Seite Custom Starters gelistet.

Spring-Boot-CLI Tools

Spring Boot bietet auch ein Kommandozeilewerkzeug. Die Installation unter Manjaro erfolgt mit

yaourt --noconfirm -S spring-boot-cli

sehr schnell.

Password encoden

Nun kann mit dem spring Kommando einen Hash für ein Passwort schnell auf der Kommandozeile erstellen:

$ spring encodepassword meinGeheimesPasswort
{bcrypt}$2a$10$ip/Y7fBiC4Eh7vyvltUuruJnUpZeDD44JU8rbrvFfV94QIIzZkFKm

Das normale Verhalten von VLC ist das der Screensaver und somit auch das Hibernating verhindert wird, wenn man ein Video schaut. Dieses ist aber nicht der Fall, wenn man einen Internetradiostream hört. Dann ist voreingestellt das keine Visualisierung dargestellt wird und das Fenster von VLC nur das Icon von VLC anzeigt. Dieses hat zur Folge das VLC nicht den Screensaver blockiert. Den gewünschten Effekt kann man also erreichen in dem man eine Visualisierung aktiviert.