This commit is contained in:
WrenIX 2023-05-17 17:05:52 +02:00
commit 5cb2d40193
Signed by: wrenix
GPG key ID: 7AFDB012974B1BB5
37 changed files with 846 additions and 0 deletions

1
.domains Normal file
View file

@ -0,0 +1 @@
wrenix.eu

0
.gitignore vendored Normal file
View file

7
.gitmodules vendored Normal file
View file

@ -0,0 +1,7 @@
[submodule "themes/anatole-zola"]
path = themes/anatole-zola
url = https://github.com/longfangsong/anatole-zola.git
[submodule "public"]
path = public
url = git@codeberg.org:wrenix/pages.git

38
.woodpecker/page.yml Normal file
View file

@ -0,0 +1,38 @@
clone:
git:
image: woodpeckerci/plugin-git
recursive: true
submodule_override:
public: https://codeberg.org/wrenix/pages.git
pipeline:
'build: page':
image: "ghcr.io/getzola/zola:v0.17.2"
when:
event: push
branch:
- main
commands:
- zola build
'publish: page':
image: "docker.io/node"
when:
event: push
branch:
- main
secrets:
- "ssh_private_key_write"
commands:
- eval $(ssh-agent -s)
- echo $${SSH_PRIVATE_KEY_WRITE} | base64 -d | ssh-add -
- mkdir -p ~/.ssh && chmod 700 ~/.ssh && ssh-keyscan codeberg.org >> ~/.ssh/known_hosts
# Git configuration
- git config --global user.email "woodpecker@ci"
- git config --global user.name "Woodpecker CI"
# Needed for custom domains
- "[ -f .domains ] && cp .domains public"
# Commit and push all static files with pipeline started timestamp
- cd public
- git add .
- git commit -m "Woodpecker CI ${CI_BUILD_CREATED}"

50
config.toml Normal file
View file

@ -0,0 +1,50 @@
base_url = "https://wrenix.eu"
title = "WrenIX"
description = "Der Zaunkönig im Netzwerk"
generate_feed = true
compile_sass = false
build_search_index = true
default_language = "de"
theme = "anatole-zola"
# theme = "tabi"
[markdown]
external_links_target_blank = true
# Whether to do syntax highlighting
# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
highlight_code = true
highlight_theme = "base16-ocean-light"
[languages.de.translations]
language_name = "Deutsch"
about = "About Me"
home = "Home"
archive = "Archiv"
date_format = "%d.%m.%Y"
next_page = "Nächste Seite"
last_page = "Vorherige Seite"
#[languages.en]
#title = "WrenIX"
#description = "The wren in the network"
#[languages.en.translations]
#language_name = "English"
#home = "Home"
#about = "About Me"
#archive = "Archive"
#date_format = "%Y-%m-%d"
#next_page = "Next Page"
#last_page = "Last Page"
[extra]
[extra.social]
mastodon = "https://chaos.social/@wrenix"
[extra.social.git]
url = "https://codeberg.org/wrenix"
name = "Codeberg"

546
content/2023-05-gpg.md Normal file
View file

@ -0,0 +1,546 @@
+++
title = "eToken und GPG-Key"
template = "page.html"
date = 2023-05-17T13:37:00Z
+++
Ich nutze den GPG-Key für folgende Funktionen:
- SSH-Key (gpg-agent und unter Android [TermBot](https://f-droid.org/en/packages/org.sufficientlysecure.termbot/) der OpenKeyChain Support wurde ersetzt, Gründe gab es mal wurden von der Webseite entfernt)
- Password-Manager [pass](https://www.passwordstore.org/) (in Firefox mit [browserpass](https://github.com/browserpass/browserpass-extension) auf Android mit [Password Store](https://f-droid.org/packages/dev.msfjarvis.aps/) und [OpenKeychain](https://www.openkeychain.org/))
- gelegentlich E-Mails
Dieser Artikel soll allerdings nicht den Einsatz beschreiben, sondern die Einrichtung auf ein eToken.
Für die Einrichtung nutze ich ein yubiKey, doch dies sollte einfach für ein NitroKey funktionieren,
was ich villt. nachhole.
## 1. Generierung von Schlüsseln
### Wo wird / Sollte der Schlüssel generiert werden
Mit dem Spruch "kein Backup kein Mitleid", muss zunächst die Schlüssel auf ein Rechner generiert werden (und im 3. Schritt auf den eToken übertragen).
Im Allgemeinen gilt, das die meisten eTokens selbst Schlüssel-Generatoren besitzen.
**Vorteil**:
Die privaten Schlüssel, nie ein Rechner, der möglicherweise Infiziert ist, betrehten und auf Hardwareebene vorm Auslesen geschützt sind.
**Nachteil**:
Der eToken kann ausversehen (oder mit Absicht) zerstört, verloren, geklaut werden und somit den privaten Schlüssel.
Wenn dieser private Schlüssel die einziege Zugangsmöglichkeit ist / werden soll, schliest man sich ggf. selbst aus.
PS: Natürlich ist es möglich mehrere GPG- und SSH-Keys in den meisten Systemen zu hinterlegen.
Zudem sollten mal bevor man eine Entscheidung trifft, sich auch den Zufallszahlen-Generator anschauen.
Auf ein Rechner lässt sich eher den aktuelle Version eines Generators verwenden, als das er im Hardware-Token ausgetausch wird (wobei dies auch durch Firmware-Updates je nach hersteller möglich ist).
In der Vergangenheit wurden natürlich auf beiden Seiten ([Kernel](https://www.golem.de/news/fehler-im-zufallsgenerator-netbsd-erzeugt-schwache-schluessel-1303-98350.html) und eToken-Chips) festgestellt, das die Zufallszahlen nicht ganz so zufällig waren.
Ein Unternehmen, für das ich tätig war, hat ganz kurz bei dieser Nachricht geschwitzt gehabt:
PS: Es ist auch bekannt, das Geheimdienste versuchen schwache oder pseudo Zufallszahlengenerator:
https://www.heise.de/news/NSA-Affaere-Generatoren-fuer-Zufallszahlen-unter-der-Lupe-1953716.html
PSS: Pseudo-Generatoren sind generelle Sinnvoll, wenn es um kurzlebige Schlüssel geht und diese von ein "sicheren" Schlüssel abgeleitet werden (z.B. OTP).
Kurz:
### Schlüsselverfahren und -länge
Je länger desto sicherer, ...
#### Quanten-Computer
Hier ein netter Vortrag, auch wenn von ein CIS-Mann oft unterbrochen über Quanten-Sichere Kryptographie in VPN-Software [Rosenpass](https://media.ccc.de/v/eh20-4-rosenpass-ein-vpn-zum-schutz-vor-quantencomputern).
Aktuelle ist es mir nicht bekannt, das es ein einheitlichen weltweiten Standard oder ein Hersteller von eToken die Quantensicher sind gibt.
Daher betrachte ich aktuelle noch nicht dieses Problem in meiner Umsetzung (auch wenn ich mich weiter informiere und über informationen mich freue).
### GPG-Befehle
Nun lege ich los. Ich hab mich für ein ED25519 - Elliptic Curve Cryptography entschieden, denn ich einmal im Jahr verlängere.
Diesen werde ich auf mein Rechner (der frisch aufgesetzt wurde und die aktuellen Softwareversionen besitzt).
Bei den folgenden zwei Befehlen werden wir nach ein Passphrase gefragt, diese
```bash
# gpg --full-generate-key
gpg (GnuPG) 2.4.0; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(9) ECC (sign and encrypt) *default*
(10) ECC (sign only)
(14) Existing key from card
Your selection?
Please select which elliptic curve you want:
(1) Curve 25519 *default*
(4) NIST P-384
(6) Brainpool P-256
Your selection?
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Thu 16 May 2024 11:22:03 CEST
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: WrenIX
Email address: dev@wrenix.eu
Comment:
You selected this USER-ID:
"WrenIX <dev@wrenix.eu>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: directory '/home/wrenix/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/wrenix/.gnupg/openpgp-revocs.d/B9C35FDD7362F063A8706A2E7AFDB012974B1BB5.rev'
public and secret key created and signed.
pub ed25519/0x7AFDB012974B1BB5 2023-05-17 [SC] [expires: 2024-05-16]
Key fingerprint = B9C3 5FDD 7362 F063 A870 6A2E 7AFD B012 974B 1BB5
uid WrenIX <dev@wrenix.eu>
sub cv25519/0x4964120E6A1FB3D4 2023-05-17 [E] [expires: 2024-05-16]
```
Nun haben wir bereits ein Key zum Signieren und ein zum Verschlüsseln, zuletzt brauchen wir noch ein zum Authentifizieren (z.B. für SSH).
```bash
# gpg2 --expert --edit-key dev@wrenix.eu
gpg (GnuPG) 2.4.0; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
sec ed25519/0x7AFDB012974B1BB5
created: 2023-05-17 expires: 2024-05-16 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/0x4964120E6A1FB3D4
created: 2023-05-17 expires: 2024-05-16 usage: E
[ultimate] (1). WrenIX <dev@wrenix.eu>
gpg> addkey
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(12) ECC (encrypt only)
(13) Existing key
(14) Existing key from card
Your selection? 11
Possible actions for this ECC key: Sign Authenticate
Current allowed actions: Sign
(S) Toggle the sign capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? S
Possible actions for this ECC key: Sign Authenticate
Current allowed actions:
(S) Toggle the sign capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? A
Possible actions for this ECC key: Sign Authenticate
Current allowed actions: Authenticate
(S) Toggle the sign capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? Q
Please select which elliptic curve you want:
(1) Curve 25519 *default*
(2) Curve 448
(3) NIST P-256
(4) NIST P-384
(5) NIST P-521
(6) Brainpool P-256
(7) Brainpool P-384
(8) Brainpool P-512
(9) secp256k1
Your selection? 1
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Thu 16 May 2024 11:33:00 CEST
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
sec ed25519/0x7AFDB012974B1BB5
created: 2023-05-17 expires: 2024-05-16 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/0x4964120E6A1FB3D4
created: 2023-05-17 expires: 2024-05-16 usage: E
ssb ed25519/0x133519C60482A816
created: 2023-05-17 expires: 2024-05-16 usage: A
[ultimate] (1). WrenIX <dev@wrenix.eu>
gpg> save
```
Nun haben wir die drei benötigten Schlüssel, die wir einzeln in die drei Smartcard-Slots im eToken (yubiKey) übertragen werden,
nachdem wir ein Backup der Keys gemacht haben.
## 2. Backup von Schlüsseln
Während der Schlüsselgenerierung wurde ein sogennanten RevokeKey schon gebackuped, diese Speichern wir ebenfalls in unser Backup:
```bash
# backup from revoke key
mv ~/.gnupg/openpgp-revocs.d/B9C35FDD7362F063A8706A2E7AFDB012974B1BB5.rev .
# backup from privaten schluessel
gpg2 --armour -o dev@wrenix.eu.private.gpg --export-secret-keys B9C35FDD7362F063A8706A2E7AFDB012974B1BB5
# backup from public schluessel (just for be safe)
gpg2 --armour -o dev@wrenix.eu.gpg --export B9C35FDD7362F063A8706A2E7AFDB012974B1BB5
# backup mit backup function (new for me, just for be safe)
gpg2 -o dev@wrenix.eu.private-bak.gpg --export-options backup --export-secret-keys B9C35FDD7362F063A8706A2E7AFDB012974B1BB5
```
## 3. Transfer des Schlüssel auf ein eToken
### zunächst zurücksetzen
```
ykman fido reset
ykman oath reset
ykman openpgp reset
ykman otp delete 2
ykman otp delete 1
ykman piv reset
```
### eToken / Smartcard einrichten
disable all not needed
```
ykman config usb -d OTP
ykman config usb -d OATH
ykman config usb -d PIV
ykman config usb -d HSMAUTH
```
```
# gpg2 --card-edit
Reader ...........: Yubico YubiKey FIDO CCID 00 00
Application ID ...: D1234567890123456789012345678901
Application type .: OpenPGP
Version ..........: x.y
Manufacturer .....: Yubico
Serial number ....: 12345678
Name of cardholder: [not set]
Language prefs ...: [not set]
Salutation .......:
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
KDF setting ......: off
UIF setting ......: Sign=off Decrypt=off Auth=off
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]
gpg/card> admin
Admin commands are allowed
gpg/card> passwd
gpg: OpenPGP card no. D1234567890123456789012345678901 detected
1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit
Your selection? 3
PIN changed.
1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit
Your selection? 1
PIN changed.
1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit
Your selection? q
gpg/card> name
Cardholder's surname: WrenIX
Cardholder's given name:
gpg/card> login
Login data (account name): wrenix
gpg/card> url
URL to retrieve public key: https://wrenix.eu/keys/dev.gpg
gpg/card> list
Reader ...........: Yubico YubiKey FIDO CCID 00 00
Application ID ...: D1234567890123456789012345678901
Application type .: OpenPGP
Version ..........: x.y
Manufacturer .....: Yubico
Serial number ....: 12345678
Name of cardholder: WrenIX
Language prefs ...: [not set]
Salutation .......:
URL of public key : https://wrenix.eu/keys/dev.gpg
Login data .......: wrenix
Signature PIN ....: not forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
KDF setting ......: off
UIF setting ......: Sign=off Decrypt=off Auth=off
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]
gpg/card> quit
```
### Transfer der Schlüssels
Nun ab auf die Smartcard
```bash
# gpg2 --edit-key B9C35FDD7362F063A8706A2E7AFDB012974B1BB5
gpg (GnuPG) 2.4.0; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
sec ed25519/0x7AFDB012974B1BB5
created: 2023-05-17 expires: 2024-05-16 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/0x4964120E6A1FB3D4
created: 2023-05-17 expires: 2024-05-16 usage: E
ssb ed25519/0x133519C60482A816
created: 2023-05-17 expires: 2024-05-16 usage: A
[ultimate] (1). WrenIX <dev@wrenix.eu>
gpg> key 2
sec ed25519/0x7AFDB012974B1BB5
created: 2023-05-17 expires: 2024-05-16 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/0x4964120E6A1FB3D4
created: 2023-05-17 expires: 2024-05-16 usage: E
ssb* ed25519/0x133519C60482A816
created: 2023-05-17 expires: 2024-05-16 usage: A
[ultimate] (1). WrenIX <dev@wrenix.eu>
gpg> keytocard
Please select where to store the key:
(3) Authentication key
Your selection? 3
sec ed25519/0x7AFDB012974B1BB5
created: 2023-05-17 expires: 2024-05-16 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/0x4964120E6A1FB3D4
created: 2023-05-17 expires: 2024-05-16 usage: E
ssb* ed25519/0x133519C60482A816
created: 2023-05-17 expires: 2024-05-16 usage: A
[ultimate] (1). WrenIX <dev@wrenix.eu>
gpg> key 2
sec ed25519/0x7AFDB012974B1BB5
created: 2023-05-17 expires: 2024-05-16 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/0x4964120E6A1FB3D4
created: 2023-05-17 expires: 2024-05-16 usage: E
ssb ed25519/0x133519C60482A816
created: 2023-05-17 expires: 2024-05-16 usage: A
[ultimate] (1). WrenIX <dev@wrenix.eu>
gpg> key 1
sec ed25519/0x7AFDB012974B1BB5
created: 2023-05-17 expires: 2024-05-16 usage: SC
trust: ultimate validity: ultimate
ssb* cv25519/0x4964120E6A1FB3D4
created: 2023-05-17 expires: 2024-05-16 usage: E
ssb ed25519/0x133519C60482A816
created: 2023-05-17 expires: 2024-05-16 usage: A
[ultimate] (1). WrenIX <dev@wrenix.eu>
gpg> keytocard
Please select where to store the key:
(2) Encryption key
Your selection? 2
sec ed25519/0x7AFDB012974B1BB5
created: 2023-05-17 expires: 2024-05-16 usage: SC
trust: ultimate validity: ultimate
ssb* cv25519/0x4964120E6A1FB3D4
created: 2023-05-17 expires: 2024-05-16 usage: E
ssb ed25519/0x133519C60482A816
created: 2023-05-17 expires: 2024-05-16 usage: A
[ultimate] (1). WrenIX <dev@wrenix.eu>
gpg> key 1
sec ed25519/0x7AFDB012974B1BB5
created: 2023-05-17 expires: 2024-05-16 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/0x4964120E6A1FB3D4
created: 2023-05-17 expires: 2024-05-16 usage: E
ssb ed25519/0x133519C60482A816
created: 2023-05-17 expires: 2024-05-16 usage: A
[ultimate] (1). WrenIX <dev@wrenix.eu>
gpg> key 0
sec ed25519/0x7AFDB012974B1BB5
created: 2023-05-17 expires: 2024-05-16 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/0x4964120E6A1FB3D4
created: 2023-05-17 expires: 2024-05-16 usage: E
ssb ed25519/0x133519C60482A816
created: 2023-05-17 expires: 2024-05-16 usage: A
[ultimate] (1). WrenIX <dev@wrenix.eu>
gpg> keytocard
Really move the primary key? (y/N) y
Please select where to store the key:
(1) Signature key
(3) Authentication key
Your selection? 1
sec ed25519/0x7AFDB012974B1BB5
created: 2023-05-17 expires: 2024-05-16 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/0x4964120E6A1FB3D4
created: 2023-05-17 expires: 2024-05-16 usage: E
ssb ed25519/0x133519C60482A816
created: 2023-05-17 expires: 2024-05-16 usage: A
[ultimate] (1). WrenIX <dev@wrenix.eu>
gpg> save
```
Verifiy
```bash
# gpg --card-status
Reader ...........: Yubico YubiKey FIDO CCID 00 00
Application ID ...: D1234567890123456789012345678901
Application type .: OpenPGP
Version ..........: x.y
Manufacturer .....: Yubico
Serial number ....: 12345678
Name of cardholder: WrenIX
Language prefs ...: [not set]
Salutation .......:
URL of public key : https://wrenix.eu/keys/dev.gpg
Login data .......: wrenix
Signature PIN ....: not forced
Key attributes ...: ed25519 cv25519 ed25519
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
KDF setting ......: off
UIF setting ......: Sign=off Decrypt=off Auth=off
Signature key ....: B9C3 5FDD 7362 F063 A870 6A2E 7AFD B012 974B 1BB5
created ....: 2023-05-17 09:22:53
Encryption key....: 5BE1 61D4 F68C 442E AABC B331 4964 120E 6A1F B3D4
created ....: 2023-05-17 09:22:53
Authentication key: 1698 32F9 8797 2EFE AE29 4BD2 1335 19C6 0482 A816
created ....: 2023-05-17 09:32:23
General key info..: pub ed25519/0x7AFDB012974B1BB5 2023-05-17 WrenIX <dev@wrenix.eu>
sec> ed25519/0x7AFDB012974B1BB5 created: 2023-05-17 expires: 2024-05-16
card-no: 0006 12345678
ssb> cv25519/0x4964120E6A1FB3D4 created: 2023-05-17 expires: 2024-05-16
card-no: 0006 12345678
ssb> ed25519/0x133519C60482A816 created: 2023-05-17 expires: 2024-05-16
card-no: 0006 12345678
```
### 4 PGP-Key nutzen
Hierzu einfach die verschiedenen Fingerprints-Formate anzeigen lassen:
```bash
gpg2 -k --with-wkd-hash --with-keygrip --with-fingerprint
```
Bei mein Keys sind das demnach:
```
/home/wrenix/.gnupg/pubring.kbx
-------------------------------
pub ed25519/0x7AFDB012974B1BB5 2023-05-17 [SC] [expires: 2024-05-16]
Key fingerprint = B9C3 5FDD 7362 F063 A870 6A2E 7AFD B012 974B 1BB5
Keygrip = E3C999FF61A1D44FB1D1E7CCAF59484A224D98DC
uid [ultimate] WrenIX <dev@wrenix.eu>
gudx35f8m3ns6jx87gkuda1nmtsb53nd@wrenix.eu
sub cv25519/0x4964120E6A1FB3D4 2023-05-17 [E] [expires: 2024-05-16]
Key fingerprint = 5BE1 61D4 F68C 442E AABC B331 4964 120E 6A1F B3D4
Keygrip = C674F36DB4CCF3299AA217F66EC40AAECC7774AA
sub ed25519/0x133519C60482A816 2023-05-17 [A] [expires: 2024-05-16]
Key fingerprint = 1698 32F9 8797 2EFE AE29 4BD2 1335 19C6 0482 A816
Keygrip = 32FBA5CC5D0707227615543C81B3E72CBBAAD908
```
#### 4.1 als SSH-Key nutzen
Dies gelingt uns in zwei Schritten:
##### 1. ssh-agent in gpg aktivieren:
Wir können den GPG-Key Support in der Datei `~/.gnupg/gpg-agent.conf` aktivieren, indem wir dort `enable-ssh-support` eintragen.
Ausserdem muss noch die Enviromentvariable `SSH_AUTH_SOCK` auf den SSH-Agent von GPG zeigen.
Der befindet sich entweder in `~/.gnupg/S.gpg-agent.ssh` oder in `/run/user/$(uid)/gnupg/S.gpg-agent.ssh`,
dieser wird bei mir von NixOS mittels Home-Manager direkt gesetzt, indem ich die option [services.gpg-agent.enableSshSupport](https://nix-community.github.io/home-manager/options.html#opt-services.gpg-agent.enableSshSupport) setze.
##### 2. GPG-Key in auswählen:
Den Authentifizierung Keygrip, in `~/.gnupg/sshcontrol` eintragen.
An den Beispiel von mir, wäre es: `32FBA5CC5D0707227615543C81B3E72CBBAAD908`
##### Kontrollieren
Ob am Ende alles funktioniert kann mit den Befehl `ssh-add -L` verifiziert werden.
Dieser sollte daraufhin den Public-Key des SSH-Keys ausgeben:
```
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGONGPQ79A9WZ7EwM6vMfBKBkgPD2dsjExFoo2UXyd79 (none)
```
#### 4.2 in Webseite / Webkey-Deliever eintragen:
```bash
gpg2 --no-armour -o .well-known/openpgpkey/hu/gudx35f8m3ns6jx87gkuda1nmtsb53nd --export B9C35FDD7362F063A8706A2E7AFDB012974B1BB5
```

12
content/2023-05-pass.md Normal file
View file

@ -0,0 +1,12 @@
+++
title = "Passwordmanager mit GPG-Key"
template = "page.html"
date = 2023-05-18T13:37:00Z
+++
```
pass init 0x7AFDB012974B1BB5
pass edit dev/codeberg.org
git remote add origin git@codeberg.org:wrenix/password-store.git
git push -u origin main
```

View file

@ -0,0 +1,89 @@
+++
title = "Modernes Logging Konzept"
template = "page.html"
date = 2023-06-22T13:37:00Z
+++
- Logging Schema / Format
- Collector , Parsen und Transformieren/Filtern
- Logging Backend
## Logging Schema / Format
Wenn man sich heutzutage mit Logging beschäftigt, möchte man oftmals gerne einheitliche Logs haben, um sich schnell zurecht zu finden und Korrelation, in Anwendungen die direkt oder indirekt zusammen arbeiten, zu finden.
Das Thema Logging existiert eigentlich seit es Anwendungen/Service im Unix-Bereich gibt. Durch die Historie, wurden immer wieder neue Formate definiert mit hinsicht auf der Funktion, der einzelnen Anwendungen.
Apache und Nginx haben ihre eigenen Formate, die z.B. im Nginx Ingress Controller für Kubernetes wieder umdefiniert worden, was das einsammeln und parsen durch ein Collector oder spätere Suchen im Backend erschwärt.
Ein weiteres super Beispiel für Unleserlichkeit von Logs ist Redis, hier werden die Loglevel wie Info, Warning oder Debug nicht mit Anfangbuchstaben, sondern mit Sonderzeichen kodiert: https://build47.com/redis-log-format-levels/
Der erste Versuch einer Standartisierung ist wohl syslog, dieser Standard wurde über die Jahre auch weiter entwickelt und beherscht neben loglevel / serenity und timestamps inzwischen auch TCP und signierung um verlorende Logs zu identifizieren. Leider fehlt nach wievor eine definition für die Log-Message selbst oder weitere Felder.
Inzwischen ist man auf die Idee von JSON als Logformat gekommen, zwar erkennt man hier nicht ohne weiteres ob alle Logs abgekommen sind. Doch es lassen sich **weitere Felder** definieren, wie z.B Benutzernamen, IP-Adressen, HTTP-Statuscode, Funktionsnamen in der Anwendung usw. die zusätzlich zur Log-Message übertragen wird. Durch eine Trennung der Log-Message von solchen Feldern, ergeben sich Vorteile im Backend, hier kann nun einfach nach IP-Adressen oder Nutzern einfach gesucht werden (oder beim Tracing nach eine Aufrufe-ID und diese dann durch die verschiedenen Anwendungen wie bei ein Stack-Trace nachvollzogen).
Genauso, lassen sich solche Felder in einigen Backend speziell behandeln. So ist es möglich, die Felder wie Benutzer aus Datenschutzgründen vorzeitig zu löschen und dabei den Rest eines Logs anonym noch gespeichert zu haben. Dabei ist eine Grundvorrausetzung, das keine extra-Information in der Log-Message zu finden ist. Hieraus könnte man **printf als antipattern** für die Anwendungsentwicklung ableiten.
Mit der Funktion von solchen Feldern, kommt man auf die Fragestellung, wie sollten diese alle genannt werden und unter welchen Objekt-Key zur Verfügung gestellt werden.
Dieses Schema sollte über die verschieden Anwendungen hinweg gelten, damit man wie oben beim Tracing auch hier z.B. die Interaktion eines Benutzer in den verschiedenen Anwendungen nachvollziehen kann.
Eine gute Grundlage zur Benennung bietet das [Elastic Common Schema](https://www.elastic.co/guide/en/ecs/current/index.html) (ECS).
Zu letzten Krönung, kann man sich fragen, ob es JSON sein muss, mit hinblick auf die Administration vorort (ohne das einsameln und suchen in ein Backend) und den unklarheiten in JSON ( [Why JSON is sometimes bad and should feel Bad](https://media.ccc.de/v/iger-2022-48-why-json-is-sometimes-bad-and-should-feel-bad)).
Für die Admininstration vor Ort, ist JSON beim Lesen wirklich unübersichtlich. Hier würde ich als Entwickler die Option auf ein anderes Format mit den Namen [logfmt](https://brandur.org/logfmt) empfehlen,
Zur Übertragung, Abspeichern usw. könnte man noch auf die Idee
neuere, noch Bessere und komprimiertere Formate, wie [msgpack](https://msgpack.org/), zu wählen. Die Idee ist löblich und findet meine Unterstützung (immerhin ist das Logging einer der größten energiefresser in der Informatik), doch damit verlieren wir noch mehr an Leserlichkeit und viele Tools (Collectoren usw.) aus dem Loggingbereich sind aktuelle noch nicht darauf vorbereitet. Daher solltet ihr das Logformat durch ein Option auf JSON oder zumindest logfmt (oder beides) einstellbar machen.
Fast alle modernen Logging-Library unterstützen das Einstellen von Logformaten (auch Anwendungen reichen oft Optionen neben den Loglevel raus, wie nginx und apache, auch wenn nicht mit eingeschränkte Optionen). Bitte nicht das Rad neuerfinden, führt nur zu Problemen beim Parsen und macht die Welt nur komplizierter (wie Redis).
Empfehlung:
- Loglibrary mit Logformaten einstellbar machen:
- JSON first
- logfmt second (für Administratoren kleiner Infrastruktur ohne Logging Backend)
- Sich an [Elastic Common Schema](https://www.elastic.co/guide/en/ecs/current/index.html) (ECS) halten
- printf als AntiPattern definieren
## Collector, Parsen und Transformieren
Es ist schön wenn wir nette Logs haben, doch am Ende müssen wir diese einsammeln und zentral zugänglich machen.
Hierfür gibt es Collectoren, die diese einlesen, aus File, Journald und vielen weiteren Orten. Diese Parsen, aus Formaten wie logfmt, json usw. In ein Unternehmensweiten einheitlichen Format bringen (siehe Elastic Common Schema), mit Informationen anreichen (Hostname, KundenNummer, Stage, Rechenzentrum Zonen, GeoIP usw.) und möglicherweise Metriken ableiten (z.B. Error log counter).
Falls man sich mit den Collector auseinander setzen muss, ist es sinnvoll darauf zu achten, das man sich mit den Collector nicht in ein Vendor-Lock begibt. Daher sollte man darauf achten, das der Collector mehrere Backends unterstützt (nicht wie die Beats oder Beat-Agent von Elastic), sind hierfür z.B. Fluentbit,Fluentd, Logstash und vector.dev bekannt (wobei die Entwicklung von Fluentd und Logstash allmählich einschläft).
Wahrscheinlich gibt es weitere,von mir, noch nicht nähere betrachtete Collectoren, wie die folgenden:
- promtail (aus der Loki- / Grafana-Welt, kA ob weitere Backends unterstützt werden)
- syslog-ng (etwas legacy, ggf. kein gutes parsing und transformieren)
Empfehlungen:
1. vector.dev:
- In Rust geschrieben (security vorteile, one-binary)
- cool GraphQL-API mit Top und Graph output zum Debugging von Flows und Errors
- gutes Error-Handling in deren Remap language und in den Metriken
2. fluentbit
- ähnliche Umfangreiches Funktionen
- In C geschrieben (abhänig von Libaries .so)
- etwas schwerer zu debugging
### Collector Strategien im Kubernetes
Hier ein kleiner Exkurse, wie es im Cloud / Kubernetes Kontext aussieht.
Kubernetes hat selbst keine Lösung für Logging, doch stellt die folgende Konzepte vor, um eine Lösung zu bauen, damit die Logs in ein Backend landen: https://kubernetes.io/docs/concepts/cluster-administration/logging/
1. Die Logs werden von Pods auf stdout und stderr geschrieben und durch die Container-Engine ( e.g. docker, containerd/oci) weiter verarbeitet. Diese landen denn meist in Logdateien auf dem entsprechenden Kubernetes-Node, wo sie wieder eingelesen werden können. Ein Implementierung, wo der Collector gut konfiguriert werden kann (auf die Bedürfnisse der verschiedenen Containers) mittels "Flows", ist der Kube-Logging Operator (der auf fluentbit und fluentd aufsetzt - oder neuerdings auch syslog-ng): https://kube-logging.dev/docs/ , welcher bereits durch Banzai/Cisco/Axoflow und [Rancher](https://ranchermanager.docs.rancher.com/pages-for-subheaders/logging) etwas Verbreitung gewonnen hat.
(Diese CRD-Flows ermöglichen Hersteller, ein angepastes Parsing für ihrere Anwendung in ein [Helm](https://helm.sh)-Chart mit auszuliefern.)
Hier gibt es die folgenden Ansätze, wie die Logs auf stdout und stderr kommen:
- Entweder kann das die Anwendung im Container selbst
- oder es wird ein Sidecar dazugestellt, welche z.B. tail -F auf die log-datei ausführt und so die Logs des eigentlichen Containers auf stdout bringt
2. Die Logs werden direkt vom Pod an ein Backend versendet.
Meine Erfahrung sagt mir, das die folgenden Implementierung extrem Aufwendig sind, dieses überall noch zusätzlich für all den Kram den man so deployen möchte, unzusetzen. Hierfür müssten man die ganzen HelmChart von Herstellern (sofern vorhanden), krass konfigurieren oder sogar umschreiben. Oder sogar im Container hineinbauen (was man aus mininalismus in ein Container eigentlich nicht möchte).
Auf der anderen Seite steht, das mache Kubernetes-Cluster in Rechenzentren stehen, die nicht vertraut werden (hier wäre es wünschenswert, das Logs nicht auf dem Node/VM geschrieben werden, wo sie ggf. abgegriffen werden).
- Entweder direkt von der Software oder dem Container ans Backend gesendet
- oder es gibt hierfür ein Sidecar im Pod, wobei die original-software z.B in Dateien schreibt (z.B in emptyDir) und von ein anderen Container (sidecar) im selben Pod eingelesen und versendet
## Logging Backend
Es gibt viele Logging Backends, sowohl OpenSource, als auch proritär. In den meisten Fällen, gibt es bereits etwas, das im Rechenzentrum existiert.
TODO:
- elasticsearch
- loki von grafana

5
content/_index.en.md Normal file
View file

@ -0,0 +1,5 @@
+++
title = "Home"
# template = "section.html"
+++
# WrenIX

7
content/_index.md Normal file
View file

@ -0,0 +1,7 @@
+++
title = "Home"
template = "index.html"
transparent = true
sort_by = "date"
paginate_by = 10
+++

View file

@ -0,0 +1,5 @@
+++
title = "Home"
# template = "section.html"
+++
# WrenIX

20
content/about/_index.md Normal file
View file

@ -0,0 +1,20 @@
+++
title = "About ME"
template = "about.html"
paginate_by = 0
+++
Ich nenne mich WrenIX.
## Kontakt
E-Mail: [contact@wrenix.eu](mailto:contact@wrenix.eu)
## Kryptographie
SSH: `ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGONGPQ79A9WZ7EwM6vMfBKBkgPD2dsjExFoo2UXyd79 dev@wrenix.eu`
* [Download](/keys/ssh.txt)
GPG-Fingerprint: `B9C3 5FDD 7362 F063 A870 6A2E 7AFD B012 974B 1BB5`
* [Armour](/keys/dev.gpg.txt)
* [Binary](/keys/dev.gpg.bin)

View file

@ -0,0 +1,5 @@
+++
title = "Home"
# template = "section.html"
+++
# WrenIX

View file

@ -0,0 +1,5 @@
+++
title = "Home"
# template = "section.html"
+++
# WrenIX

18
image.sh Executable file
View file

@ -0,0 +1,18 @@
#!/bin/sh
AVATAR="avatar.png"
cd static/images
convert $AVATAR -background white -flatten avatar.jpg
convert $AVATAR favicon.png
convert $AVATAR logo@2x.png
convert $AVATAR -resize 50% logo.png
convert $AVATAR -resize x57 apple-touch-icon-57x57.png
convert $AVATAR -resize x72 apple-touch-icon-72x72.png
convert $AVATAR -resize x120 apple-touch-icon-120x120.png
convert $AVATAR -resize x144 apple-touch-icon-144x144.png
# used https://image2svg.com/
# autotrace -output-format svg avatar.jpg > bimi.svg

6
keys.sh Executable file
View file

@ -0,0 +1,6 @@
#!/bin/sh
KEY_ID=B9C35FDD7362F063A8706A2E7AFDB012974B1BB5
gpg2 --no-armour -o static/keys/dev.gpg.bin --export $KEY_ID
gpg2 --armour -o static/keys/dev.gpg.txt --export $KEY_ID

7
matrix.sh Executable file
View file

@ -0,0 +1,7 @@
#!/bin/sh
cd static
curl https://matrix.wrenix.eu/.well-known/matrix/client > .well-known/matrix/client
curl https://matrix.wrenix.eu/.well-known/matrix/server > .well-known/matrix/server
tail .well-known/matrix/*

1
public Submodule

@ -0,0 +1 @@
Subproject commit 86810a32593a9f6f53a43bae9dd5b1f2b31a6dd6

1
static/.domains Symbolic link
View file

@ -0,0 +1 @@
../.domains

View file

@ -0,0 +1 @@
{"m.homeserver":{"base_url":"https://matrix.wrenix.eu:443"}}

View file

@ -0,0 +1 @@
{"m.server":"matrix.wrenix.eu:443"}

View file

@ -0,0 +1 @@
../../../keys/dev.gpg.bin

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
static/images/avatar.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
static/images/avatar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

1
static/images/bimi.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 11 KiB

BIN
static/images/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

BIN
static/images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
static/images/logo@2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

BIN
static/images/logo@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

BIN
static/keys/dev.gpg.bin Normal file

Binary file not shown.

17
static/keys/dev.gpg.txt Normal file
View file

@ -0,0 +1,17 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEZGSc7RYJKwYBBAHaRw8BAQdAD2T7ZvoePXeOHRKyCGDcBEj2pcw9YhbC8Hin
PbHGbNy0FldyZW5JWCA8ZGV2QHdyZW5peC5ldT6IlAQTFgoAPBYhBLnDX91zYvBj
qHBqLnr9sBKXSxu1BQJkZJztAhsDBQkB4TOABAsJCAcEFQoJCAUWAgMBAAIeBQIX
gAAKCRB6/bASl0sbtZaRAP4yyp8CTYZwF+sZv3hHUue6QsAPV3VY3eG1JDv49NBb
YgEAzH7AqEfOYnrFzMOCfwqi7dqsMZ09ztcDM2U5JK8LkA24OARkZJztEgorBgEE
AZdVAQUBAQdARmbAz3+y7RWwyYl1L5EiD6ZfXJdZmhlruP5pSs6GimADAQgHiH4E
GBYKACYWIQS5w1/dc2LwY6hwai56/bASl0sbtQUCZGSc7QIbDAUJAeEzgAAKCRB6
/bASl0sbtXOMAP0ZfBU2qRMspHsgw8Qbs20A66U1ryHsO9MaKHWU1Jx7dQEAzoob
AtLpd662WeLUbPWbeXnAqsurSUdkmh7vqL3K7Ai4MwRkZJ8nFgkrBgEEAdpHDwEB
B0BjjRj0O/QPVmexMDOrzHwSgZIDw9nbIxMRaKNlF8ne/Yh+BBgWCgAmFiEEucNf
3XNi8GOocGouev2wEpdLG7UFAmRknycCGyAFCQHhM4AACgkQev2wEpdLG7XMxgEA
/kfbBaedNc7W2Jg7QgelXwLoY+CbURtkb6HuA4Fzz0gA/2FfQlMg4rbiPB9JkWDt
/xghwSRQGTRU7PK+oaTp+qME
=WEPM
-----END PGP PUBLIC KEY BLOCK-----

1
static/keys/ssh.txt Normal file
View file

@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGONGPQ79A9WZ7EwM6vMfBKBkgPD2dsjExFoo2UXyd79 dev@wrenix.eu

1
themes/anatole-zola Submodule

@ -0,0 +1 @@
Subproject commit 3495f12be84ae6a7d543ce2ccf96314a17ce0aa7