nix machine / user configurations

feat(wolumonde): setup openbao for tangled spindle secrets

ptr.pet ba8ae055 20aaab0a

verified
Changed files
+250 -6
hosts
wolumonde
modules
secrets
-3
hosts/wolumonde/modules/nginx.nix
···
# "bsky.gaze.systems"
"dawn.gaze.systems"
"guestbook.gaze.systems"
-
"webhook.gaze.systems"
"dash.gaze.systems"
"knot.gaze.systems"
"spindle.gaze.systems"
-
"skeetdeck.gaze.systems"
-
"likes.gaze.systems"
"id.gaze.systems"
"vpn.gaze.systems"
];
+10 -1
hosts/wolumonde/modules/openbao.nix hosts/wolumonde/modules/openbao.nix/default.nix
···
-
{config, ...}: let
+
{lib, config, ...}: let
port = 5394;
domain = "bao.${config.services.headscale.settings.dns.base_domain}";
cfg = config.services.openbao.settings;
apiAddress = "127.0.0.1:${toString port}";
in {
+
imports = [./spindle-proxy];
+
services.openbao = {
enable = true;
settings = {
···
listener.default = {
type = "tcp";
address = apiAddress;
+
tls_disable = true;
};
cluster_addr = "http://127.0.0.1:8201";
···
storage.file.path = "/var/lib/openbao/data";
};
};
+
+
systemd.services.openbao.preStart = ''
+
mkdir -p /var/lib/openbao
+
rm -rf /var/lib/openbao/policies
+
cp -r ${./policies} /var/lib/openbao/policies
+
'';
services.headscale.settings.dns.extra_records = [
{
+19
hosts/wolumonde/modules/openbao.nix/policies/spindle.hcl
···
+
# Full access to spindle KV v2 data
+
path "spindle/data/*" {
+
capabilities = ["create", "read", "update", "delete"]
+
}
+
+
# Access to metadata for listing and management
+
path "spindle/metadata/*" {
+
capabilities = ["list", "read", "delete", "update"]
+
}
+
+
# Allow listing at root level
+
path "spindle/" {
+
capabilities = ["list"]
+
}
+
+
# Required for connection testing and health checks
+
path "auth/token/lookup-self" {
+
capabilities = ["read"]
+
}
+21
hosts/wolumonde/modules/openbao.nix/spindle-proxy/README.md
···
+
see https://tangled.sh/@tangled.sh/core/blob/master/docs/spindle/openbao.md
+
+
set BAO_ADDRESS: `$env.BAO_ADDRESS = "http://bao.lan.gaze.systems"`
+
set BAO_TOKEN: `$env.BAO_TOKEN = "<root key>"`
+
+
create mount: `bao secrets enable -path=spindle -version=2 kv`
+
+
setup policy: `
+
bao policy write spindle /var/lib/openbao/policies/spindle.hcl
+
bao auth enable approle
+
bao write auth/approle/role/spindle \
+
token_policies="spindle" \
+
token_ttl=1h \
+
token_max_ttl=4h \
+
bind_secret_id=true \
+
secret_id_ttl=0 \
+
secret_id_num_uses=0
+
`
+
+
get role-id: `bao read -field=role_id auth/approle/role/spindle/role-id`
+
get secret-id: `bao write -f auth/approle/role/spindle/secret-id`
+63
hosts/wolumonde/modules/openbao.nix/spindle-proxy/config.hcl
···
+
vault {
+
address = "%vault_address%"
+
+
# Retry configuration
+
retry {
+
num_retries = 5
+
}
+
}
+
+
# Auto-Auth using AppRole
+
auto_auth {
+
method "approle" {
+
mount_path = "auth/approle"
+
config = {
+
role_id_file_path = "%role_id%"
+
secret_id_file_path = "%secret_id%"
+
remove_secret_id_file_after_reading = false
+
}
+
}
+
+
# Write authenticated token to file
+
sink "file" {
+
config = {
+
path = "/var/lib/%name%/token"
+
mode = 0640
+
}
+
}
+
}
+
+
# API Proxy listener for Spindle
+
listener "tcp" {
+
address = "127.0.0.1:%listener_port%"
+
tls_disable = true
+
+
# Security headers
+
require_request_header = false
+
+
# Enable proxy API for management
+
proxy_api {
+
enable_quit = true
+
}
+
}
+
+
# Enable API proxy with auto-auth token
+
api_proxy {
+
use_auto_auth_token = true
+
}
+
+
cache {
+
}
+
+
# Logging configuration
+
log_level = "info"
+
log_format = "standard"
+
log_file = "/var/lib/%name%/proxy.log"
+
log_rotate_duration = "24h"
+
log_rotate_max_files = 30
+
+
# Process management
+
pid_file = "/var/lib/%name%/proxy.pid"
+
+
# Disable idle connections for reliability
+
disable_idle_connections = ["auto-auth", "proxying"]
+93
hosts/wolumonde/modules/openbao.nix/spindle-proxy/default.nix
···
+
{ config, lib, pkgs, ... }:
+
let
+
port = 8945;
+
secrets = config.age.secrets;
+
cfgFile = pkgs.writeText "openbao-proxy-spindle-config.hcl" (
+
lib.replaceStrings
+
[
+
"%role_id%"
+
"%secret_id%"
+
"%vault_address%"
+
"%listener_port%"
+
"%name%"
+
]
+
[
+
secrets.spindleOpenbaoRoleId.path
+
secrets.spindleOpenbaoSecretId.path
+
config.services.openbao.settings.api_addr
+
(toString port)
+
name
+
]
+
(lib.fileContents ./config.hcl)
+
);
+
domain = "spindle.bao.lan.gaze.systems";
+
name = "openbao-proxy-spindle";
+
in
+
{
+
age.secrets.spindleOpenbaoRoleId = {
+
file = ../../../../../secrets/spindleOpenbaoRoleId.age;
+
mode = "600";
+
owner = name;
+
group = name;
+
};
+
age.secrets.spindleOpenbaoSecretId = {
+
file = ../../../../../secrets/spindleOpenbaoSecretId.age;
+
mode = "600";
+
owner = name;
+
group = name;
+
};
+
+
users.users.${name} = {
+
isSystemUser = true;
+
group = name;
+
};
+
users.groups.${name} = {
+
members = [name];
+
};
+
+
systemd.services.${name} = {
+
description = "OpenBao Proxy with Auto-Auth for tangled spindle";
+
after = [ "openbao.service" ];
+
before = [ "spindle.service" ];
+
requires = [ "openbao.service" ];
+
wantedBy = [ "multi-user.target" ];
+
serviceConfig = {
+
ExecStart = "${pkgs.openbao}/bin/bao proxy -config=${cfgFile}";
+
Restart = "on-failure";
+
RestartSec = "5";
+
LimitNOFILE = "65536";
+
User = name;
+
Group = name;
+
RuntimeDirectory=name;
+
RuntimeDirectoryMode=0700;
+
StateDirectory=name;
+
StateDirectoryMode=0700;
+
ProcSubset="pid";
+
ProtectClock=true;
+
ProtectControlGroups=true;
+
ProtectHome=true;
+
ProtectHostname=true;
+
ProtectKernelLogs=true;
+
ProtectKernelModules=true;
+
ProtectKernelTunables=true;
+
ProtectProc="invisible";
+
RestrictNamespaces=true;
+
RestrictRealtime=true;
+
RestrictAddressFamilies=["AF_INET" "AF_INET6" "AF_UNIX"];
+
SystemCallArchitectures="native";
+
SystemCallFilter=["@system-service" "@resources" "~@privileged"];
+
};
+
};
+
+
services.headscale.settings.dns.extra_records = [
+
{
+
name = domain;
+
type = "A";
+
value = "100.64.0.2";
+
}
+
];
+
services.nginx.virtualHosts.${domain} = {
+
quic = true;
+
locations."/".proxyPass = "http://127.0.0.1:${toString port}";
+
};
+
}
+2 -2
hosts/wolumonde/modules/tangled.nix
···
owner = "did:plc:dfl62fgb7wtjj3fcbb72naae";
secrets = {
provider = "openbao";
-
openbao.proxyAddr = "http://bao.lan.gaze.systems";
+
openbao.proxyAddr = "http://spindle.bao.lan.gaze.systems";
};
};
};
···
users.groups.spindle = { };
users.groups.podman.members = [ "spindle" ];
systemd.services.spindle = {
-
after = lib.mkForce [ "network.target" ];
+
after = lib.mkForce [ "network.target" "openbao-proxy-spindle.service" ];
serviceConfig = {
User = "spindle";
Group = "spindle";
+8
secrets/secrets.nix
···
yusdacra
develMobi
];
+
"spindleOpenbaoRoleId.age".publicKeys = [
+
yusdacra
+
wolumonde
+
];
+
"spindleOpenbaoSecretId.age".publicKeys = [
+
yusdacra
+
wolumonde
+
];
}
+17
secrets/spindleOpenbaoRoleId.age
···
+
age-encryption.org/v1
+
-> ssh-rsa Abmvag
+
i1WEFfFEf7rvpH8pfM4+Z7mBSJwzAa/xNP5YMp0aVk9AMpFoT/39mwzr0LMtnruk
+
u8Dz3ILegSyc69L9Ge1rNX6L5mN0qUyjsN1h/cMCh9Cgw4DxYkRB9NYI3xNUQFau
+
xHVbgJ8DBDwZ3XnM0JYf9c23Kk1oft+PV07JKtyBN6r8JGCpu7N5Ccb/oj4epnS0
+
0DgoEDLT9DgiZXVo+Q6w++gfSq58ClYaguoHaDCTBdRKHans9BWIqJ7pAOu9hXcl
+
vyuw/jz0bwKKh474xiCHArw4xN+ji7aFTRG3FkeK52giWoK95+P4z5ieaHJKz2jk
+
I4HiGjgpfDGJzsgz5yEJFhntlnOWVHChvyZ1QSEKe2OIGAQmfGSbDRBYPS2wrfeL
+
v8JueFHCG4ABh53+guzmjTMZTRjh8O5d2YEcrrWhGgwssHxUTzNE4KUCVkNV4/OS
+
6+hvmU1NC8rYBNMRiZtYiu6osmtWndYYFCsJpURfyFoDzCWmvjl6pxNFTtTTukMm
+
WBgKxC2K4EwQ27k6IExm2epDH5kwdJrPGe8yZIl3zK9Y1Sa+Q3LYp8D5QWUv2uts
+
lQXTVvJVrg9wn1AfxCnGBApCPIvEiw8PwU/adfa+UMKN/kGMvE6iL0+J2aGTxO4l
+
zmyLUErh9f8iBIF/90DIqf9FrjBWcbtv3zphmgHZkII
+
-> ssh-ed25519 KjIL7g GZl/qIbkVajzJn0ZsI0ImzIyGdjm1tMFbEh4LnOALAA
+
WXYCRfsfYU+nI67+4d6PX/iER2aA7Flt6xWPlvYELDg
+
--- Y8pLVkJQfP5piXtWJ3AegPsLLj3NDWXpmt3aoiwicgo
+
E�RR�y��������@����X���t�$ǻ��s���Ǟ���~��|�r�F�~�n��NG
+17
secrets/spindleOpenbaoSecretId.age
···
+
age-encryption.org/v1
+
-> ssh-rsa Abmvag
+
G3DtXBNVhNcRiXlpQ7iJ8kZrsu59WF62pnLheEGKj2JGg6m+LLOqLChQg1YOSjB1
+
zIy3QwpfXB4Rn081lXEXKvs6Jr1FbAkhggeLLtflPEAouxPiJ1HkxtyCNv02L+Pj
+
uBvi32fMnTw3Kep6LTNBqkAhsvFNf02zsNxm+KfFpwn+kWvUtGdsHeAsWIXO/4lL
+
FjbPI860FvbfrAp0r7Hv79MRLYTUhki7gX+VZooEngobCImTiq9NR++MpdsMmovC
+
hst6CESEuTdqhw2SrTteGU10E+5q1jd1z0T+ttHe0GqKmQwuQB4S1KtSx74xiQhV
+
gg8ZyVAVdSt49s9YLRMdJjFWHXNPC3GKQzlXWZ4xLrpeBc3YrQhp3+7iRhRB92gX
+
GhWdw/UN9fKPbILi2W+3bSEByGzJ2iBo0BMxK0I7541ZgpQHOOvySLHzElnpRdwD
+
I3+GuDif1cHusLBVruwUubfr11UwzOLkUgzP504Sf55liMSjnq5DxzkaUERzTg/T
+
SNmC9misXkxUpwWSYKjSEe5p3x8CsJwmVkrXh+N9GFiYD+Al/9aWPrmw+Kl4CMe6
+
MJlxCpfVKTdx3ePA7d7POx1RQuBf78nTg5XCyBf2BB2lycKkg05hX+1VzTCYMChZ
+
zLh1RiSWtRxgIbljwWanPW0AmZaDkRTxdilbFg2sa7U
+
-> ssh-ed25519 KjIL7g C+NvzMVX+2NdIXoYGPv1yeGRaHnSEQQuG7MS3e5SKlE
+
L5TFRde0T/sn8teeFuBy3c8fydmiI07NT+pFnIIyYwE
+
--- fcPjYFQG6lbT2cGzt/oZhO5PahAoiN4yUT12xa4Kc8s
+
�ZZ�/h��������p�]�AR!�O��`�2��K<���Eo��R����VN �����G�p��0u