make squid's allowed domains editable at runtime in the swarm ui
This commit is contained in:
parent
86e80250bb
commit
c9abc2a42b
1 changed files with 2307 additions and 35 deletions
|
|
@ -47,6 +47,12 @@ let
|
|||
hiveOtelAllLocal = hiveWithController {
|
||||
deploy.bao.enable = true;
|
||||
deploy.authelia.enable = true;
|
||||
# The seed `allowedFile` starts as; the canary is listed too, to show it
|
||||
# is not written twice.
|
||||
squid.allowedDomains = [
|
||||
"github.com"
|
||||
"cache.nixos.org"
|
||||
];
|
||||
};
|
||||
|
||||
# Neither a leaf nor a secret file: the one shape the collector has no
|
||||
|
|
@ -500,12 +506,18 @@ let
|
|||
base = at "http_access allow base_dst";
|
||||
unrestricted = at "http_access allow unrestricted";
|
||||
authed = at "http_access deny !authed";
|
||||
firstAllow = lib.min base (lib.min unrestricted allow);
|
||||
# The generated per-agent `http_access allow` rules sit in this file.
|
||||
agentRules = at "include ${hiveOtel.services.hyperhive.squid.agentAllowFile}";
|
||||
firstAllow = lib.min agentRules (lib.min base (lib.min unrestricted allow));
|
||||
in
|
||||
allow != null
|
||||
&& base != null
|
||||
&& unrestricted != null
|
||||
&& authed != null
|
||||
&& agentRules != null
|
||||
&& authed < agentRules
|
||||
&& base < agentRules
|
||||
&& agentRules < unrestricted
|
||||
&& at "http_access deny to_localhost" != null
|
||||
&& at "http_access deny to_linklocal" != null
|
||||
&& at "http_access deny to_bridge" != null
|
||||
|
|
@ -602,13 +614,55 @@ let
|
|||
path = hiveOtel.systemd.paths.squid-unrestricted-reload;
|
||||
svc = hiveOtel.systemd.services.squid-unrestricted-reload.serviceConfig;
|
||||
in
|
||||
path.pathConfig.PathChanged == list
|
||||
path.pathConfig.PathChanged == [
|
||||
list
|
||||
hiveOtel.services.hyperhive.squid.allowedFile
|
||||
hiveOtel.services.hyperhive.squid.agentAllowFile
|
||||
]
|
||||
&& hiveOtel.systemd.services.squid-unrestricted-reload.startLimitIntervalSec == 0
|
||||
&& builtins.elem "paths.target" path.wantedBy
|
||||
&& lib.hasSuffix "systemctl try-reload-or-restart squid.service" svc.ExecStart
|
||||
&& builtins.elem "f ${list} 0640 hive-core squid - -" rules
|
||||
&& hiveOtelAllLocal.systemd.services.hive-c0re.environment.HIVE_SQUID_UNRESTRICTED_FILE == list;
|
||||
}
|
||||
{
|
||||
# The swarm's allow-list reaches squid as a file of names, which starts
|
||||
# as this hive's own `allowedDomains` (the canary left out, since the
|
||||
# configuration names it), and as an include that holds the per-agent
|
||||
# rules. Control: the seed holds the listed name, and the configuration
|
||||
# no longer names it, so the absence of the canary and of the list from
|
||||
# the seed and the configuration is not a lookup of nothing.
|
||||
name = "squid reads the swarm's allow-list from a file seeded with the hive's own names";
|
||||
ok =
|
||||
let
|
||||
sq = hiveOtelAllLocal.services.hyperhive.squid;
|
||||
lines = lib.splitString "\n" hiveOtelAllLocal.services.squid.configText;
|
||||
rules = hiveOtelAllLocal.systemd.tmpfiles.rules;
|
||||
env = hiveOtelAllLocal.systemd.services.hive-c0re.environment;
|
||||
in
|
||||
builtins.elem ''acl allowed_dst dstdomain "${sq.allowedFile}"'' lines
|
||||
&& builtins.elem "acl allowed_dst dstdomain ${sq.selfcheck.canary}" lines
|
||||
&& !(lib.hasInfix "github.com" hiveOtelAllLocal.services.squid.configText)
|
||||
&& sq.allowedFile == "/var/lib/hive-squid/allowed"
|
||||
&& sq.agentAllowFile == "/var/lib/hive-squid/agent-allow.conf"
|
||||
&& sq.allowedSeedFile.text == "github.com\n"
|
||||
&& builtins.elem "C ${sq.allowedFile} 0640 hive-core squid - ${sq.allowedSeedFile}" rules
|
||||
&& builtins.elem "f ${sq.agentAllowFile} 0640 hive-core squid - -" rules
|
||||
&& env.HIVE_SQUID_ALLOWED_FILE == sq.allowedFile
|
||||
&& env.HIVE_SQUID_AGENT_ALLOW_FILE == sq.agentAllowFile
|
||||
&& env.HIVE_SQUID_ALLOWED_SEED_FILE == toString sq.allowedSeedFile
|
||||
&&
|
||||
env.HIVE_SQUID_ALWAYS_ALLOWED == "api.anthropic.com claude.ai platform.claude.com cache.nixos.org";
|
||||
}
|
||||
{
|
||||
# The nixpkgs module parses the configuration at build time, which cannot
|
||||
# open the include; the parse moves to a check on the same text, so a
|
||||
# broken configuration still fails the host build.
|
||||
name = "squid's configuration is still parsed at build time, without the include";
|
||||
ok =
|
||||
!hiveOtel.services.squid.validateConfig
|
||||
&& lib.any (d: (d.name or "") == "squid-conf-check") hiveOtel.system.extraDependencies;
|
||||
}
|
||||
{
|
||||
# The helper is the NCSA one, on the file hive-c0re renders. The file
|
||||
# exists, empty, before squid starts (the helper exits on a missing one),
|
||||
|
|
|
|||
Loading…
Reference in a new issue