init
1
.domains
Normal file
|
@ -0,0 +1 @@
|
|||
wrenix.eu
|
0
.gitignore
vendored
Normal file
7
.gitmodules
vendored
Normal 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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
||||
```
|
89
content/2023-06-logging.md
Normal 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
|
@ -0,0 +1,5 @@
|
|||
+++
|
||||
title = "Home"
|
||||
# template = "section.html"
|
||||
+++
|
||||
# WrenIX
|
7
content/_index.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
+++
|
||||
title = "Home"
|
||||
template = "index.html"
|
||||
transparent = true
|
||||
sort_by = "date"
|
||||
paginate_by = 10
|
||||
+++
|
5
content/about/_index.en.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
+++
|
||||
title = "Home"
|
||||
# template = "section.html"
|
||||
+++
|
||||
# WrenIX
|
20
content/about/_index.md
Normal 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)
|
5
content/archive/_index.en.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
+++
|
||||
title = "Home"
|
||||
# template = "section.html"
|
||||
+++
|
||||
# WrenIX
|
5
content/archive/_index.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
+++
|
||||
title = "Home"
|
||||
# template = "section.html"
|
||||
+++
|
||||
# WrenIX
|
18
image.sh
Executable 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
|
@ -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
|
@ -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
|
@ -0,0 +1 @@
|
|||
../.domains
|
1
static/.well-known/matrix/client
Normal file
|
@ -0,0 +1 @@
|
|||
{"m.homeserver":{"base_url":"https://matrix.wrenix.eu:443"}}
|
1
static/.well-known/matrix/server
Normal file
|
@ -0,0 +1 @@
|
|||
{"m.server":"matrix.wrenix.eu:443"}
|
|
@ -0,0 +1 @@
|
|||
../../../keys/dev.gpg.bin
|
BIN
static/images/apple-touch-icon-120x120.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
static/images/apple-touch-icon-144x144.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
static/images/apple-touch-icon-57x57.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
static/images/apple-touch-icon-72x72.png
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
static/images/avatar.jpg
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
static/images/avatar.png
Normal file
After Width: | Height: | Size: 45 KiB |
1
static/images/bimi.svg
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
static/images/favicon.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
static/images/logo.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
static/images/logo@2.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
static/images/logo@2x.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
static/keys/dev.gpg.bin
Normal file
17
static/keys/dev.gpg.txt
Normal 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
|
@ -0,0 +1 @@
|
|||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGONGPQ79A9WZ7EwM6vMfBKBkgPD2dsjExFoo2UXyd79 dev@wrenix.eu
|
1
themes/anatole-zola
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 3495f12be84ae6a7d543ce2ccf96314a17ce0aa7
|