Files

150 lines
5.4 KiB
Nix

{
lib,
pkgs,
config,
...
}:
let
format = pkgs.formats.hcl1 { };
cfg = config.services.spire.server;
in
{
meta.maintainers = [ lib.maintainers.arianvp ];
imports = [ ./server-tpm.nix ];
options.services.spire.server = {
enable = lib.mkEnableOption "SPIRE Server";
openFirewall = lib.mkOption {
type = lib.types.bool;
description = "Whether to open firewall";
default = false;
};
settings = lib.mkOption {
description = ''
SPIRE Server configuration file options. See [the documentation](https://spiffe.io/docs/latest/deploying/spire_server/) for all available options.
'';
type = lib.types.submodule {
freeformType = format.type;
options = {
server = {
trust_domain = lib.mkOption {
type = lib.types.str;
description = "The trust domain that this server belongs to";
example = "example.com";
};
data_dir = lib.mkOption {
type = lib.types.str;
description = "The directory where SPIRE server stores its data";
default = "$STATE_DIRECTORY";
};
socket_path = lib.mkOption {
type = lib.types.str;
default = "/run/spire/server/private/api.sock";
description = "Path to bind the SPIRE Server API Socket to";
};
bind_address = lib.mkOption {
type = lib.types.str;
default = "[::]";
description = "The address on which the SPIRE server is listening";
};
bind_port = lib.mkOption {
type = lib.types.port;
default = 8081;
description = "The port on which the SPIRE server is listening";
};
};
plugins = lib.mkOption {
description = ''
Built-in plugin types can be found at [the plugin types documentation](https://spiffe.io/docs/latest/deploying/spire_server/#plugin-types).
See [plugin configuration](https://spiffe.io/docs/latest/deploying/spire_server/#plugin-configuration) for options and how to configure external plugins.
'';
type = lib.types.submodule {
freeformType = format.type;
options.NodeAttestor = lib.mkOption {
default = { };
description = ''
NodeAttestor plugins implement validation logic for nodes attempting to assert their identity.
They are generally paired with an agent plugin of the same type.
See [the documentation](https://spiffe.io/docs/latest/deploying/spire_server/#nodeattestor)
for the list of built-in NodeAttestor plugins.
'';
type = lib.types.submodule {
freeformType = format.type;
options.join_token = lib.mkOption {
default = null;
description = "Join token based node attestation.";
type = lib.types.nullOr (
lib.types.submodule {
freeformType = format.type;
options.plugin_data = lib.mkOption {
type = format.type;
default = { };
description = "Plugin data for the join_token NodeAttestor.";
};
}
);
};
};
};
};
example = {
KeyManager.memory.plugin_data = { };
DataStore.sql.plugin_data = {
database_type = "sqlite3";
connection_string = "$STATE_DIRECTORY/datastore.sqlite3";
};
NodeAttestor.join_token.plugin_data = { };
};
};
};
};
};
configFile = lib.mkOption {
type = lib.types.path;
default = format.generate "server.conf" (lib.filterAttrsRecursive (_: v: v != null) cfg.settings);
defaultText = "Config file generated from services.spire.server.settings";
description = ''
Path to the SPIRE server configuration file. See [the documentation](https://spiffe.io/docs/latest/deploying/spire_server/) for more information.
'';
};
expandEnv = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Expand environment variables in services.spire.server.settings and services.spire.server.configFile";
};
package = lib.mkPackageOption pkgs "spire" { };
};
config = lib.mkIf cfg.enable {
networking.firewall.allowedTCPPorts = lib.mkIf cfg.openFirewall [ cfg.settings.server.bind_port ];
environment.systemPackages = [ cfg.package ];
systemd.services.spire-server = {
wantedBy = [ "multi-user.target" ];
description = "SPIRE Server";
documentation = [ "https://spiffe.io/docs/latest/deploying/spire_server/" ];
serviceConfig = {
ExecStart =
"${lib.getExe' cfg.package "spire-server"} run "
+ lib.cli.toCommandLineShellGNU { } {
inherit (cfg) expandEnv;
config = cfg.configFile;
};
Restart = "on-failure";
StateDirectory = "spire/server";
StateDirectoryMode = "0700";
RuntimeDirectory = "spire/server";
DynamicUser = true;
UMask = "0027";
# TODO: hardening
};
};
};
}