repeated_keys
This commit is contained in:
@@ -167,53 +167,74 @@ let
|
||||
# but /var/lib/crowdsec already exists as a real dir. Disabling DynamicUser on
|
||||
# those two services lets them use the real crowdsec user/group instead, which is
|
||||
# consistent with how crowdsec.service itself runs.
|
||||
systemd.services.crowdsec.serviceConfig = lib.mkMerge [
|
||||
{ DynamicUser = lib.mkForce false; }
|
||||
(lib.mkIf (cfg.ntfy.enable && cfg.ntfy.envFile != "") {
|
||||
EnvironmentFile = [ cfg.ntfy.envFile ];
|
||||
})
|
||||
];
|
||||
systemd.services.crowdsec-firewall-bouncer.serviceConfig.DynamicUser = lib.mkForce false;
|
||||
systemd.services.crowdsec-firewall-bouncer-register.serviceConfig.DynamicUser = lib.mkForce false;
|
||||
systemd = {
|
||||
# The ntfy plugin config YAML (with credentials baked in) is managed as a
|
||||
# SOPS template in sops.nix — it renders to /run/secrets/rendered/crowdsec/
|
||||
# notifications/ntfy.yaml at runtime. We use a tmpfiles symlink to expose
|
||||
# it at the path CrowdSec scans, since environment.etc can't reference
|
||||
# /run paths as source.
|
||||
tmpfiles.rules = lib.mkIf cfg.ntfy.enable [
|
||||
"L /etc/crowdsec/notifications/ntfy.yaml - - - - ${
|
||||
config.sops.templates."crowdsec/notifications/ntfy.yaml".path
|
||||
}"
|
||||
];
|
||||
services = {
|
||||
crowdsec = {
|
||||
serviceConfig = lib.mkMerge [
|
||||
{ DynamicUser = lib.mkForce false; }
|
||||
(lib.mkIf (cfg.ntfy.enable && cfg.ntfy.envFile != "") {
|
||||
EnvironmentFile = [ cfg.ntfy.envFile ];
|
||||
})
|
||||
];
|
||||
};
|
||||
|
||||
# The upstream unit has Requires= but no After= for the register service, so
|
||||
# the bouncer starts in parallel and hits LoadCredential before the key file
|
||||
# exists. Adding After= enforces that the register service completes first.
|
||||
systemd.services.crowdsec-firewall-bouncer.after = [ "crowdsec-firewall-bouncer-register.service" ];
|
||||
# The upstream unit has Requires= but no After= for the register service, so
|
||||
# the bouncer starts in parallel and hits LoadCredential before the key file
|
||||
# exists. Adding After= enforces that the register service completes first.
|
||||
crowdsec-firewall-bouncer = {
|
||||
serviceConfig.DynamicUser = lib.mkForce false;
|
||||
after = [ "crowdsec-firewall-bouncer-register.service" ];
|
||||
};
|
||||
|
||||
# The upstream register script exits with an error when the bouncer is already
|
||||
# registered in the LAPI but the local api-key.cred file is missing (e.g. after
|
||||
# a system wipe or impermanence rotation). Override the script so that when the
|
||||
# key file is absent it deletes the stale registration and re-registers, producing
|
||||
# a fresh key file.
|
||||
systemd.services.crowdsec-firewall-bouncer-register.script =
|
||||
let
|
||||
apiKeyFile = "/var/lib/crowdsec-firewall-bouncer-register/api-key.cred";
|
||||
bouncerName = "nas-bouncer";
|
||||
cscli = lib.getExe' config.services.crowdsec.package "cscli";
|
||||
jq = lib.getExe pkgs.jq;
|
||||
in
|
||||
lib.mkForce ''
|
||||
if ${cscli} bouncers list --output json | ${jq} -e -- 'any(.[]; .name == "${bouncerName}")' >/dev/null; then
|
||||
# Bouncer already registered. Verify the API key is still present.
|
||||
if [ ! -f ${apiKeyFile} ]; then
|
||||
echo "Bouncer registered but API key file missing — deleting stale registration and re-registering"
|
||||
${cscli} bouncers delete -- ${bouncerName}
|
||||
rm -f '${apiKeyFile}'
|
||||
if ! ${cscli} bouncers add --output raw -- ${bouncerName} >${apiKeyFile}; then
|
||||
rm -f '${apiKeyFile}'
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
else
|
||||
# Bouncer not registered — fresh registration.
|
||||
rm -f '${apiKeyFile}'
|
||||
if ! ${cscli} bouncers add --output raw -- ${bouncerName} >${apiKeyFile}; then
|
||||
rm -f '${apiKeyFile}'
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
'';
|
||||
crowdsec-firewall-bouncer-register = {
|
||||
serviceConfig.DynamicUser = lib.mkForce false;
|
||||
|
||||
# The upstream register script exits with an error when the bouncer is already
|
||||
# registered in the LAPI but the local api-key.cred file is missing (e.g. after
|
||||
# a system wipe or impermanence rotation). Override the script so that when the
|
||||
# key file is absent it deletes the stale registration and re-registers, producing
|
||||
# a fresh key file.
|
||||
script =
|
||||
let
|
||||
apiKeyFile = "/var/lib/crowdsec-firewall-bouncer-register/api-key.cred";
|
||||
bouncerName = "nas-bouncer";
|
||||
cscli = lib.getExe' config.services.crowdsec.package "cscli";
|
||||
jq = lib.getExe pkgs.jq;
|
||||
in
|
||||
lib.mkForce ''
|
||||
if ${cscli} bouncers list --output json | ${jq} -e -- 'any(.[]; .name == "${bouncerName}")' >/dev/null; then
|
||||
# Bouncer already registered. Verify the API key is still present.
|
||||
if [ ! -f ${apiKeyFile} ]; then
|
||||
echo "Bouncer registered but API key file missing — deleting stale registration and re-registering"
|
||||
${cscli} bouncers delete -- ${bouncerName}
|
||||
rm -f '${apiKeyFile}'
|
||||
if ! ${cscli} bouncers add --output raw -- ${bouncerName} >${apiKeyFile}; then
|
||||
rm -f '${apiKeyFile}'
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
else
|
||||
# Bouncer not registered — fresh registration.
|
||||
rm -f '${apiKeyFile}'
|
||||
if ! ${cscli} bouncers add --output raw -- ${bouncerName} >${apiKeyFile}; then
|
||||
rm -f '${apiKeyFile}'
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# crowdsec-firewall-bouncer-register calls cscli without -c, so cscli
|
||||
# looks for /etc/crowdsec/config.yaml. The upstream crowdsec.service uses
|
||||
@@ -277,17 +298,6 @@ let
|
||||
};
|
||||
};
|
||||
|
||||
# The ntfy plugin config YAML (with credentials baked in) is managed as a
|
||||
# SOPS template in sops.nix — it renders to /run/secrets/rendered/crowdsec/
|
||||
# notifications/ntfy.yaml at runtime. We use a tmpfiles symlink to expose
|
||||
# it at the path CrowdSec scans, since environment.etc can't reference
|
||||
# /run paths as source.
|
||||
systemd.tmpfiles.rules = lib.mkIf cfg.ntfy.enable [
|
||||
"L /etc/crowdsec/notifications/ntfy.yaml - - - - ${
|
||||
config.sops.templates."crowdsec/notifications/ntfy.yaml".path
|
||||
}"
|
||||
];
|
||||
|
||||
};
|
||||
};
|
||||
in
|
||||
|
||||
Reference in New Issue
Block a user