Compare commits

..

4 Commits

Author SHA1 Message Date
John Lancaster 6c26e898b2 improving renew script 2026-04-04 09:46:55 -05:00
John Lancaster 710f13ace4 renew script tweaks 2026-04-04 09:33:08 -05:00
John Lancaster 1a7a1189e7 privileged port permissions for https 2026-04-03 18:16:29 -05:00
John Lancaster ff74205c57 mtls file permissions 2026-04-03 18:16:12 -05:00
2 changed files with 66 additions and 20 deletions
+7
View File
@@ -2,6 +2,7 @@
flake.modules.nixos.forgejo = {config, pkgs, lib, ... }: flake.modules.nixos.forgejo = {config, pkgs, lib, ... }:
let let
cfg = config.forgejo; cfg = config.forgejo;
needsPrivilegedPort = cfg.port < 1024;
in in
{ {
options.forgejo = { options.forgejo = {
@@ -25,6 +26,12 @@
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
networking.firewall.allowedTCPPorts = lib.optionals cfg.openFirewall [ cfg.port ]; networking.firewall.allowedTCPPorts = lib.optionals cfg.openFirewall [ cfg.port ];
systemd.services.forgejo.serviceConfig = lib.mkIf needsPrivilegedPort {
AmbientCapabilities = [ "CAP_NET_BIND_SERVICE" ];
CapabilityBoundingSet = [ "CAP_NET_BIND_SERVICE" ];
PrivateUsers = lib.mkForce false;
};
sops.secrets = { sops.secrets = {
"forgejo/secret_key".owner = config.services.forgejo.user; "forgejo/secret_key".owner = config.services.forgejo.user;
"forgejo/internal_token".owner = config.services.forgejo.user; "forgejo/internal_token".owner = config.services.forgejo.user;
+59 -20
View File
@@ -66,9 +66,9 @@ let
default = "root"; default = "root";
}; };
group = lib.mkOption { group = lib.mkOption {
description = "Group to run the mTLS renewal service as. Defaults to the configured renewal user when null."; description = "Group to run the mTLS renewal service as. Defaults to the configured renewal user.";
type = lib.types.nullOr lib.types.str; type = lib.types.nullOr lib.types.str;
default = null; default = cfg.user;
}; };
reloadUnits = lib.mkOption { reloadUnits = lib.mkOption {
description = "systemd units to try-reload-or-restart after a successful certificate renewal."; description = "systemd units to try-reload-or-restart after a successful certificate renewal.";
@@ -92,8 +92,14 @@ let
keyFile, keyFile,
bundleFile, bundleFile,
lifetime, lifetime,
user,
group,
}: }:
let let
catCmd = lib.getExe' pkgs.coreutils "cat";
echoCmd = lib.getExe' pkgs.coreutils "echo";
chownCmd = lib.getExe' pkgs.coreutils "chown";
chmodCmd = lib.getExe' pkgs.coreutils "chmod";
stepCmd = lib.getExe pkgs.step-cli; stepCmd = lib.getExe pkgs.step-cli;
sanArgs = lib.concatMapStringsSep " " (s: "--san \"${s}\"") san; sanArgs = lib.concatMapStringsSep " " (s: "--san \"${s}\"") san;
in in
@@ -105,7 +111,9 @@ let
--provisioner ${provisioner} \ --provisioner ${provisioner} \
${sanArgs} \ ${sanArgs} \
"$@" "$@"
cat ${certFile} ${keyFile} > ${bundleFile} (umask 077; ${catCmd} ${certFile} ${keyFile} > ${bundleFile})
${chownCmd} ${user}:${group} ${certFile} ${keyFile} ${bundleFile}
${chmodCmd} 640 ${certFile} ${keyFile} ${bundleFile}
''; '';
mkMtlsCheckScript = { pkgs, bundleFile }: pkgs.writeShellScriptBin "mtls-check" '' mkMtlsCheckScript = { pkgs, bundleFile }: pkgs.writeShellScriptBin "mtls-check" ''
@@ -120,18 +128,24 @@ let
certFile, certFile,
keyFile, keyFile,
bundleFile, bundleFile,
user,
group,
reloadUnits ? [ ], reloadUnits ? [ ],
postCommands ? [ ], postCommands ? [ ],
systemctlArgs ? [ ], systemctlArgs ? [ ],
}: }:
let let
catCmd = lib.getExe' pkgs.coreutils "cat";
echoCmd = lib.getExe' pkgs.coreutils "echo"; echoCmd = lib.getExe' pkgs.coreutils "echo";
systemctl = lib.getExe' pkgs.systemd "systemctl"; chownCmd = lib.getExe' pkgs.coreutils "chown";
escapedArgs = lib.escapeShellArgs systemctlArgs; chmodCmd = lib.getExe' pkgs.coreutils "chmod";
systemctlCommand = "${systemctl} ${escapedArgs}"; stepCmd = lib.getExe pkgs.step-cli;
hasReloadUnits = reloadUnits != [ ];
hasPostCommands = postCommands != [ ];
systemctlCmd = "${lib.getExe' pkgs.systemd "systemctl"} ${lib.escapeShellArgs systemctlArgs}";
renewReloadScript = lib.concatMapStringsSep "\n" (unit: '' renewReloadScript = lib.concatMapStringsSep "\n" (unit: ''
if ${systemctlCommand} --quiet is-active "${unit}"; then if ${systemctlCmd} --quiet is-active "${unit}"; then
${systemctlCommand} try-reload-or-restart "${unit}" ${systemctlCmd} try-reload-or-restart "${unit}"
fi fi
'') reloadUnits; '') reloadUnits;
renewPostCommands = lib.concatStringsSep "\n" postCommands; renewPostCommands = lib.concatStringsSep "\n" postCommands;
@@ -139,23 +153,42 @@ let
pkgs.writeShellScriptBin "mtls-renew" '' pkgs.writeShellScriptBin "mtls-renew" ''
set -euo pipefail set -euo pipefail
if ${lib.getExe pkgs.step-cli} certificate needs-renewal "${certFile}"; then YELLOW_BANG="\e[33m!\e[0m"
${echoCmd} "Renewing mTLS certificate"
else force=0
while [[ $# -gt 0 ]]; do
case $1 in
--force)
force=1
shift
;;
*)
${echoCmd} -e "$YELLOW_BANG Warning: ignoring unrecognized argument '$1'"
exit 1
;;
esac
done
if [[ $force -eq 0 ]] && ! ${stepCmd} certificate needs-renewal "${certFile}"; then
${echoCmd} "Skipping renew" ${echoCmd} "Skipping renew"
exit "$?" exit 0
fi fi
${lib.getExe pkgs.step-cli} ca renew --force "${certFile}" "${keyFile}" ${echoCmd} "Renewing mTLS certificate"
${stepCmd} ca renew --force "${certFile}" "${keyFile}"
umask 077 (umask 077; ${catCmd} "${certFile}" "${keyFile}" > "${bundleFile}")
${lib.getExe' pkgs.coreutils "cat"} "${certFile}" "${keyFile}" > "${bundleFile}" ${chownCmd} ${user}:${group} ${certFile} ${keyFile} ${bundleFile}
${chmodCmd} 640 ${certFile} ${keyFile} ${bundleFile}
${lib.optionalString hasReloadUnits ''
${echoCmd} "Reloading units:" ${echoCmd} "Reloading units:"
${renewReloadScript} ${renewReloadScript}
''}
${lib.optionalString hasPostCommands ''
${echoCmd} "Post commands:" ${echoCmd} "Post commands:"
${renewPostCommands} ${renewPostCommands}
''}
''; '';
mkNixosMtlsRenewService = { mkNixosMtlsRenewService = {
@@ -171,7 +204,7 @@ let
let let
serviceGroup = if group == null then user else group; serviceGroup = if group == null then user else group;
renewScript = mkMtlsRenewScript { renewScript = mkMtlsRenewScript {
inherit pkgs certFile keyFile bundleFile reloadUnits postCommands; inherit pkgs certFile keyFile bundleFile reloadUnits postCommands user group;
}; };
in in
{ {
@@ -271,13 +304,18 @@ in
(mkMtlsGenerateScript { (mkMtlsGenerateScript {
inherit pkgs; inherit pkgs;
inherit (cfg) subject provisioner san certFile keyFile bundleFile lifetime; inherit (cfg) subject provisioner san certFile keyFile bundleFile lifetime;
inherit (cfg.renew) user group;
}) })
(mkMtlsCheckScript { inherit pkgs; inherit (cfg) bundleFile; }) (mkMtlsCheckScript { inherit pkgs; inherit (cfg) bundleFile; })
(mkMtlsRenewScript { inherit pkgs; inherit (cfg) certFile keyFile bundleFile; }) (mkMtlsRenewScript {
inherit pkgs;
inherit (cfg) certFile keyFile bundleFile;
inherit (cfg.renew) user group;
})
]; ];
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
"d ${cfg.certDir} 0750 ${cfg.renew.user} ${if cfg.renew.group == null then cfg.renew.user else cfg.renew.group} -" "d ${cfg.certDir} 0750 ${cfg.renew.user} ${cfg.renew.group} -"
]; ];
systemd.services.mtls-renew = lib.mkIf cfg.renew.enable (mkNixosMtlsRenewService { systemd.services.mtls-renew = lib.mkIf cfg.renew.enable (mkNixosMtlsRenewService {
@@ -314,10 +352,11 @@ in
# step-cli # step-cli
(mkMtlsGenerateScript { (mkMtlsGenerateScript {
inherit (cfg) subject provisioner san lifetime; inherit (cfg) subject provisioner san lifetime;
inherit (cfg.renew) user group;
inherit pkgs certFile keyFile bundleFile; inherit pkgs certFile keyFile bundleFile;
}) })
(mkMtlsCheckScript { inherit pkgs bundleFile; }) (mkMtlsCheckScript { inherit pkgs bundleFile; })
(mkMtlsRenewScript { inherit pkgs certFile keyFile bundleFile; }) (mkMtlsRenewScript { inherit pkgs certFile keyFile bundleFile; inherit (cfg.renew) user group; })
]; ];
systemd.user.tmpfiles.rules = lib.mkIf cfg.enable [ systemd.user.tmpfiles.rules = lib.mkIf cfg.enable [