cluster/services/storage: provision garage keys with locksmith
This commit is contained in:
parent
1d59d4e4f6
commit
d7f816ee39
1 changed files with 75 additions and 6 deletions
|
@ -1,4 +1,4 @@
|
||||||
{ config, lib, pkgs, ... }:
|
{ config, depot, lib, pkgs, ... }:
|
||||||
|
|
||||||
let
|
let
|
||||||
cfg = config.services.garage;
|
cfg = config.services.garage;
|
||||||
|
@ -102,13 +102,39 @@ in
|
||||||
};
|
};
|
||||||
keys = mkOption {
|
keys = mkOption {
|
||||||
type = with types; attrsOf (submodule {
|
type = with types; attrsOf (submodule {
|
||||||
options.allow = {
|
options = {
|
||||||
|
allow = {
|
||||||
createBucket = mkOption {
|
createBucket = mkOption {
|
||||||
description = "Allow the key to create new buckets.";
|
description = "Allow the key to create new buckets.";
|
||||||
type = bool;
|
type = bool;
|
||||||
default = false;
|
default = false;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
locksmith = {
|
||||||
|
nodes = mkOption {
|
||||||
|
description = "Nodes that this key will be made available to via Locksmith.";
|
||||||
|
type = listOf str;
|
||||||
|
default = [];
|
||||||
|
};
|
||||||
|
format = mkOption {
|
||||||
|
description = "Locksmith secret format.";
|
||||||
|
type = enum [ "files" "aws" "envFile" ];
|
||||||
|
default = "files";
|
||||||
|
};
|
||||||
|
owner = mkOption {
|
||||||
|
type = str;
|
||||||
|
default = "root";
|
||||||
|
};
|
||||||
|
group = mkOption {
|
||||||
|
type = str;
|
||||||
|
default = "root";
|
||||||
|
};
|
||||||
|
mode = mkOption {
|
||||||
|
type = str;
|
||||||
|
default = "0400";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
});
|
});
|
||||||
default = {};
|
default = {};
|
||||||
};
|
};
|
||||||
|
@ -237,5 +263,48 @@ in
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
services.locksmith.providers.garage = {
|
||||||
|
wantedBy = [ "garage-apply.service" ];
|
||||||
|
after = [ "garage-apply.service" ];
|
||||||
|
secrets = lib.mkMerge (lib.mapAttrsToList (key: kCfg: let
|
||||||
|
common = {
|
||||||
|
inherit (kCfg.locksmith) mode owner group nodes;
|
||||||
|
};
|
||||||
|
getKeyID = "${cfg.package}/bin/garage key info ${lib.escapeShellArg key} | grep -m1 'Key ID:' | cut -d ' ' -f3";
|
||||||
|
getSecretKey = "${cfg.package}/bin/garage key info ${lib.escapeShellArg key} | grep -m1 'Secret key:' | cut -d ' ' -f3";
|
||||||
|
in if kCfg.locksmith.format == "files" then {
|
||||||
|
"${key}-id" = common // {
|
||||||
|
command = getKeyID;
|
||||||
|
};
|
||||||
|
"${key}-secret" = common // {
|
||||||
|
command = getSecretKey;
|
||||||
|
};
|
||||||
|
} else let
|
||||||
|
template = pkgs.writeText "garage-key-template" {
|
||||||
|
aws = ''
|
||||||
|
[default]
|
||||||
|
aws_access_key_id=@@GARAGE_KEY_ID@@
|
||||||
|
aws_secret_access_key=@@GARAGE_SECRET_KEY@@
|
||||||
|
'';
|
||||||
|
envFile = ''
|
||||||
|
AWS_ACCESS_KEY_ID=@@GARAGE_KEY_ID@@
|
||||||
|
AWS_SECRET_ACCESS_KEY=@@GARAGE_SECRET_KEY@@
|
||||||
|
'';
|
||||||
|
}.${kCfg.locksmith.format};
|
||||||
|
in {
|
||||||
|
${key} = common // {
|
||||||
|
command = pkgs.writeShellScript "garage-render-key-template" ''
|
||||||
|
tmpFile="$(mktemp -ut garageKeyTemplate-XXXXXXXXXXXXXXXX)"
|
||||||
|
cp ${template} "$tmpFile"
|
||||||
|
trap "rm -f $tmpFile" EXIT
|
||||||
|
chmod 600 "$tmpFile"
|
||||||
|
${getKeyID} | ${pkgs.replace-secret}/bin/replace-secret '@@GARAGE_KEY_ID@@' /dev/stdin "$tmpFile"
|
||||||
|
${getSecretKey} | ${pkgs.replace-secret}/bin/replace-secret '@@GARAGE_SECRET_KEY@@' /dev/stdin "$tmpFile"
|
||||||
|
cat "$tmpFile"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}) cfg.keys);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue