mirror of
https://github.com/oddlama/nix-config.git
synced 2025-10-10 23:00:39 +02:00
feat: remove generate-wireguard-keys in favor of agenix-rekey generators
This commit is contained in:
parent
dec790c589
commit
cfb7c88862
7 changed files with 62 additions and 163 deletions
26
README.md
26
README.md
|
@ -34,7 +34,6 @@ This is my personal nix config.
|
|||
- `default.nix` Collects all apps and generates a definition for a specified system
|
||||
- `draw-graph.nix` (**WIP:** infrastructure graph renderer)
|
||||
- `format-secrets.nix` Runs the code formatter on the secret .nix files
|
||||
- `generate-wireguard-keys.nix` Generates wireguard keys for each server-and-peer pair
|
||||
- `show-wireguard-qr.nix` Generates a QR code for external wireguard participants
|
||||
- `checks.nix` pre-commit-hooks for this repository
|
||||
- `colmena.nix` Setup for distributed deployment using colmena (actually defines all NixOS hosts)
|
||||
|
@ -62,7 +61,7 @@ This is my personal nix config.
|
|||
- fill net.nix
|
||||
- fill fs.nix (you need to know the device by-id paths in advance for formatting to work!)
|
||||
- generate an initrd hostkey if necessary `ssh-keygen -t ed25519 -N "" -f /tmp/key; rage ...`
|
||||
- run generate-wireguard-keys
|
||||
- run generate-secrets
|
||||
|
||||
#### Initial deploy
|
||||
|
||||
|
@ -140,13 +139,30 @@ openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
|
|||
# Recover admin account (server must not be running)
|
||||
> systemctl stop kanidmd
|
||||
> kanidmd recover_account -c server.toml admin
|
||||
qU6UUdN5PbaetgtjKDttQx6D7XQwa0bBef5N5N0sjchg8gNz
|
||||
aM4Fk1dvM8AjyYzuVsFuxGkY4PqcVJaZwaHSfvFQGvFkH2Ez
|
||||
> systemctl start kanidmd
|
||||
# Login with recovered root account
|
||||
> kanidm login -D admin
|
||||
> kanidm login --name admin
|
||||
# Generate new credentials for idm_admin account
|
||||
> kanidm service-account credential generate -D admin idm_admin
|
||||
xbwa3tbUefdRBxKqbDYQfW2StqjZYa0zwp6FQRyWXy0dCYUb
|
||||
cVXKuT9LGpCN0RTjgjEG52bPFANxbPKbT9LjSb3H4K2NeW2g
|
||||
# Generate new oauth2 app for grafana
|
||||
> kanidm group create grafana-access
|
||||
> kanidm group create grafana-server-admins
|
||||
> kanidm group create grafana-admins
|
||||
> kanidm group create grafana-editors
|
||||
> kanidm system oauth2 create grafana "Grafana" https://grafana.${personalDomain}
|
||||
> kanidm system oauth2 update-scope-map grafana grafana-access openid profile email
|
||||
> kanidm system oauth2 update-sup-scope-map grafana grafana-server-admins server_admin
|
||||
> kanidm system oauth2 update-sup-scope-map grafana grafana-admins admin
|
||||
> kanidm system oauth2 update-sup-scope-map grafana grafana-editors editor
|
||||
> kanidm system oauth2 show-basic-secret grafana
|
||||
# Add new user
|
||||
> kanidm login --name idm_admin
|
||||
> kanidm person create myuser "My User"
|
||||
> kanidm person update myuser --legalname "Full Name" --mail "myuser@example.com"
|
||||
> kanidm group add_members grafana-access myuser
|
||||
> kanidm group add_members grafana-server-admins myuser
|
||||
|
||||
|
||||
```
|
||||
|
|
40
flake.lock
generated
40
flake.lock
generated
|
@ -31,10 +31,12 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1686159246,
|
||||
"narHash": "sha256-6+u3Ed6rsYKJ1gnjt1DoEnxgF6Xmi4qPFUy7OBEiN5E=",
|
||||
"type": "git",
|
||||
"url": "file:///root/projects/agenix-rekey"
|
||||
"lastModified": 1686343990,
|
||||
"narHash": "sha256-/XkX73eAccg0l+2plLpDQHX4bl4sk2enSRwxUzuCcsc=",
|
||||
"owner": "oddlama",
|
||||
"repo": "agenix-rekey",
|
||||
"rev": "1dd5cf245e842c4b698b537a7097c417f2912efe",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "oddlama",
|
||||
|
@ -117,11 +119,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1686150639,
|
||||
"narHash": "sha256-QHorMn3tgvCE0BM4QlNb/7vuquz11cS2ke1GSfmgiPo=",
|
||||
"lastModified": 1686222354,
|
||||
"narHash": "sha256-dtqnAwzucKZv54dTrLetIXhOavUrCsdqOe+JtFH9riE=",
|
||||
"owner": "nix-community",
|
||||
"repo": "disko",
|
||||
"rev": "f1178c6e72b7d8ab2b55990397969324822275eb",
|
||||
"rev": "5d9f362aecd7a4c2e8a3bf2afddb49051988cab9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -208,11 +210,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1686142265,
|
||||
"narHash": "sha256-IP0xPa0VYqxCzpqZsg3iYGXarUF+4r2zpkhwdHy9WsM=",
|
||||
"lastModified": 1686342731,
|
||||
"narHash": "sha256-GwCwviXcc5nrewuFwtsrxys8srrZcI+m8hdIGOt+fHY=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "39c7d0a97a77d3f31953941767a0822c94dc01f5",
|
||||
"rev": "0945875a2a20de314093b0f9d4d5448e9b4fdccb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -258,11 +260,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1686092477,
|
||||
"narHash": "sha256-ewXevzxR3FGhI5ip1QX+jCAQW2En9BTwBI9+kGip9DA=",
|
||||
"lastModified": 1686244773,
|
||||
"narHash": "sha256-AtS5u3Qfrvtd1OiaRugEWKymbm6kwd7DGYiCiV8x3/U=",
|
||||
"owner": "astro",
|
||||
"repo": "microvm.nix",
|
||||
"rev": "c6416c6b9fed22b71f526720cb120b0218c51b62",
|
||||
"rev": "8f759ded0bbc7728738b064516a879b36ee115b9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -309,11 +311,11 @@
|
|||
},
|
||||
"nixos-hardware": {
|
||||
"locked": {
|
||||
"lastModified": 1684899633,
|
||||
"narHash": "sha256-NtwerXX8UFsoNy6k+DukJMriWtEjQtMU/Urbff2O2Dg=",
|
||||
"lastModified": 1686217350,
|
||||
"narHash": "sha256-Nb9b3m/GEK8jyFsYfUkXGsqj6rH05GgJ2QWcNNbK7dw=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixos-hardware",
|
||||
"rev": "4cc688ee711159b9bcb5a367be44007934e1a49d",
|
||||
"rev": "e4b34b90f27696ec3965fa15dcbacc351293dc67",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -386,11 +388,11 @@
|
|||
"nixpkgs-stable": "nixpkgs-stable"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1686050334,
|
||||
"narHash": "sha256-R0mczWjDzBpIvM3XXhO908X5e2CQqjyh/gFbwZk/7/Q=",
|
||||
"lastModified": 1686213770,
|
||||
"narHash": "sha256-Re6xXLEqQ/HRnThryumyGzEf3Uv0Pl4cuG50MrDofP8=",
|
||||
"owner": "cachix",
|
||||
"repo": "pre-commit-hooks.nix",
|
||||
"rev": "6881eb2ae5d8a3516e34714e7a90d9d95914c4dc",
|
||||
"rev": "182af51202998af5b64ddecaa7ff9be06425399b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
|
@ -158,7 +158,7 @@
|
|||
${peerPresharedKeySecret nodeName other} = {
|
||||
rekeyFile = peerPresharedKeyPath nodeName other;
|
||||
owner = "systemd-network";
|
||||
# TODO gen func
|
||||
generator.script = {pkgs, ...}: "${pkgs.wireguard-tools}/bin/wg genpsk";
|
||||
};
|
||||
})
|
||||
neededPeers)
|
||||
|
@ -166,7 +166,15 @@
|
|||
${peerPrivateKeySecret nodeName} = {
|
||||
rekeyFile = peerPrivateKeyPath nodeName;
|
||||
owner = "systemd-network";
|
||||
# TODO gen func
|
||||
generator.script = {
|
||||
pkgs,
|
||||
file,
|
||||
...
|
||||
}: ''
|
||||
${pkgs.wireguard-tools}/bin/wg genkey \
|
||||
| tee /dev/stdout \
|
||||
| ${pkgs.wireguard-tools}/bin/wg pubkey > ${lib.escapeShellArg (lib.removeSuffix ".age" file + ".pub")}
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
pkgs = self.pkgs.${system};
|
||||
inherit
|
||||
(pkgs.lib)
|
||||
flip
|
||||
nameValuePair
|
||||
removeSuffix
|
||||
;
|
||||
|
@ -13,9 +14,12 @@
|
|||
apps = [
|
||||
./draw-graph.nix
|
||||
./format-secrets.nix
|
||||
./generate-secrets.nix
|
||||
./generate-wireguard-keys.nix
|
||||
./show-wireguard-qr.nix
|
||||
];
|
||||
in
|
||||
builtins.listToAttrs (map (appPath: nameValuePair (removeSuffix ".nix" (builtins.baseNameOf appPath)) (mkApp (import appPath args))) apps)
|
||||
builtins.listToAttrs (flip map apps (
|
||||
appPath:
|
||||
nameValuePair
|
||||
(removeSuffix ".nix" (builtins.baseNameOf appPath))
|
||||
(mkApp (import appPath args))
|
||||
))
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
{
|
||||
self,
|
||||
pkgs,
|
||||
...
|
||||
} @ inputs: let
|
||||
inherit
|
||||
(pkgs.lib)
|
||||
assertMsg
|
||||
removePrefix
|
||||
hasPrefix
|
||||
concatStringsSep
|
||||
filterAttrs
|
||||
escapeShellArg
|
||||
flatten
|
||||
mapAttrsToList
|
||||
;
|
||||
|
||||
inherit (self.extraLib) rageEncryptArgs;
|
||||
|
||||
flakeDir = toString self.sourceInfo.outPath;
|
||||
relativeToFlake = x: let
|
||||
xFile = toString x;
|
||||
in
|
||||
assert assertMsg (hasPrefix flakeDir xFile) "${xFile} must be a subpath of ${flakeDir}";
|
||||
"." + removePrefix flakeDir xFile;
|
||||
|
||||
x = nodeName: nodeCfg:
|
||||
mapAttrsToList (_: s: ''
|
||||
echo ${escapeShellArg (relativeToFlake s.file)}
|
||||
'') (filterAttrs (_: s: s.generate != null) nodeCfg.config.rekey.secrets);
|
||||
in
|
||||
pkgs.writeShellScript "generate-secrets" ''
|
||||
set -euo pipefail
|
||||
if [[ ! -e flake.nix ]] ; then
|
||||
echo "this script must be executed from your flake's root directory." >&2;
|
||||
exit 1
|
||||
fi
|
||||
${concatStringsSep "\n" (flatten (mapAttrsToList x self.nodes))}
|
||||
''
|
|
@ -1,92 +0,0 @@
|
|||
{
|
||||
self,
|
||||
pkgs,
|
||||
...
|
||||
} @ inputs: let
|
||||
inherit
|
||||
(pkgs.lib)
|
||||
attrNames
|
||||
concatMap
|
||||
concatMapStrings
|
||||
concatStringsSep
|
||||
escapeShellArg
|
||||
filter
|
||||
optionalString
|
||||
removeSuffix
|
||||
substring
|
||||
unique
|
||||
;
|
||||
|
||||
inherit (self.extraLib) rageEncryptArgs;
|
||||
|
||||
nodeNames = attrNames self.nodes;
|
||||
wireguardNetworks = unique (concatMap (n: attrNames self.nodes.${n}.config.extra.wireguard) nodeNames);
|
||||
|
||||
generateNetworkKeys = wgName: let
|
||||
inherit
|
||||
(self.extraLib.wireguard wgName)
|
||||
allPeers
|
||||
externalPeersForNode
|
||||
participatingClientNodes
|
||||
participatingNodes
|
||||
participatingServerNodes
|
||||
peerPresharedKeyFile
|
||||
peerPrivateKeyFile
|
||||
peerPublicKeyFile
|
||||
sortedPeers
|
||||
;
|
||||
|
||||
# Every peer needs a private and public key.
|
||||
generatePeerKeys = peerName: let
|
||||
keyBasename = escapeShellArg ("./" + removeSuffix ".pub" (peerPublicKeyFile peerName));
|
||||
pubkeyFile = escapeShellArg ("./" + peerPublicKeyFile peerName);
|
||||
privkeyFile = escapeShellArg ("./" + peerPrivateKeyFile peerName);
|
||||
in ''
|
||||
if [[ ! -e ${privkeyFile} ]] || [[ ! -e ${pubkeyFile} ]]; then
|
||||
mkdir -p $(dirname ${privkeyFile})
|
||||
echo "Generating [34m"${keyBasename}".{[31mage[34m,[32mpub[34m}[m"
|
||||
privkey=$(${pkgs.wireguard-tools}/bin/wg genkey)
|
||||
echo "$privkey" | ${pkgs.wireguard-tools}/bin/wg pubkey > ${pubkeyFile}
|
||||
${pkgs.rage}/bin/rage -e ${rageEncryptArgs} <<< "$privkey" > ${privkeyFile} \
|
||||
|| { echo "[1;31merror:[m Failed to encrypt wireguard private key for peer ${peerName} on network ${wgName}!" >&2; exit 1; }
|
||||
else
|
||||
echo "[90mSkipping existing "${keyBasename}".{age,pub}[m"
|
||||
fi
|
||||
'';
|
||||
|
||||
# Generates the psk for peer1 and peer2.
|
||||
generatePeerPsk = {
|
||||
peer1,
|
||||
peer2,
|
||||
}: let
|
||||
pskFile = escapeShellArg ("./" + peerPresharedKeyFile peer1 peer2);
|
||||
in ''
|
||||
if [[ ! -e ${pskFile} ]]; then
|
||||
mkdir -p $(dirname ${pskFile})
|
||||
echo "Generating [33m"${pskFile}"[m"
|
||||
psk=$(${pkgs.wireguard-tools}/bin/wg genpsk)
|
||||
${pkgs.rage}/bin/rage -e ${rageEncryptArgs} <<< "$psk" > ${pskFile} \
|
||||
|| { echo "[1;31merror:[m Failed to encrypt wireguard psk for peers ${peer1} and ${peer2} on network ${wgName}!" >&2; exit 1; }
|
||||
else
|
||||
echo "[90mSkipping existing "${pskFile}"[m"
|
||||
fi
|
||||
'';
|
||||
|
||||
# This generates all psks for each combination of peers given.
|
||||
# xs is a list of peers and fys a function that generates a list of peers
|
||||
# for any given x.
|
||||
psksForPeerCombinations = xs: fys: map generatePeerPsk (unique (concatMap (x: map (sortedPeers x) (fys x)) xs));
|
||||
in
|
||||
["echo ==== ${wgName} ===="]
|
||||
++ map generatePeerKeys (attrNames allPeers)
|
||||
# All server-nodes need a psk for each other, but not reflexive.
|
||||
++ psksForPeerCombinations participatingServerNodes (n: filter (x: x != n) participatingServerNodes)
|
||||
# Each server-node need a psk for all client nodes
|
||||
++ psksForPeerCombinations participatingServerNodes (_: participatingClientNodes)
|
||||
# Each server-node need a psk for all their external peers
|
||||
++ psksForPeerCombinations participatingServerNodes (n: attrNames (externalPeersForNode n));
|
||||
in
|
||||
pkgs.writeShellScript "generate-wireguard-keys" ''
|
||||
set -euo pipefail
|
||||
${concatStringsSep "\n" (concatMap generateNetworkKeys wireguardNetworks)}
|
||||
''
|
|
@ -233,16 +233,16 @@ in rec {
|
|||
};
|
||||
|
||||
peerPublicKeyFile = peerName: "secrets/wireguard/${wgName}/keys/${peerName}.pub";
|
||||
peerPublicKeyPath = peerName: "${../.}/" + peerPublicKeyFile peerName;
|
||||
peerPublicKeyPath = peerName: "${self.outPath}/" + peerPublicKeyFile peerName;
|
||||
|
||||
peerPrivateKeyFile = peerName: "secrets/wireguard/${wgName}/keys/${peerName}.age";
|
||||
peerPrivateKeyPath = peerName: "${../.}/" + peerPrivateKeyFile peerName;
|
||||
peerPrivateKeyPath = peerName: "${self.outPath}/" + peerPrivateKeyFile peerName;
|
||||
peerPrivateKeySecret = peerName: "wireguard-${wgName}-priv-${peerName}";
|
||||
|
||||
peerPresharedKeyFile = peerA: peerB: let
|
||||
inherit (sortedPeers peerA peerB) peer1 peer2;
|
||||
in "secrets/wireguard/${wgName}/psks/${peer1}+${peer2}.age";
|
||||
peerPresharedKeyPath = peerA: peerB: "${../.}/" + peerPresharedKeyFile peerA peerB;
|
||||
peerPresharedKeyPath = peerA: peerB: "${self.outPath}/" + peerPresharedKeyFile peerA peerB;
|
||||
peerPresharedKeySecret = peerA: peerB: let
|
||||
inherit (sortedPeers peerA peerB) peer1 peer2;
|
||||
in "wireguard-${wgName}-psks-${peer1}+${peer2}";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue