deny private and reserved destinations for every squid user
This commit is contained in:
parent
501445ebc3
commit
3d9561a9a6
1 changed files with 167 additions and 37 deletions
|
|
@ -31,11 +31,30 @@ let
|
|||
selfcheckUnrestrictedUser = "selfcheck-unrestricted.squid";
|
||||
usersDir = builtins.dirOf cfg.usersFile;
|
||||
|
||||
# Evaluated top to bottom, first match wins. The three destination denies
|
||||
# sit before every allow, `allow unrestricted` included: squid resolves
|
||||
# names on the host, so a name that answers 127.0.0.1, 169.254.169.254 or a
|
||||
# bridge address would otherwise reach services the bridge firewall keeps
|
||||
# agents out of, and an unrestricted agent is still an agent. The IP-literal
|
||||
# Destinations that are not the public internet: loopback, link-local, the
|
||||
# bridge, and the private, shared (CGNAT), unspecified, multicast and
|
||||
# reserved ranges. Squid checks the address it connects to, so a name an
|
||||
# agent controls cannot point past them.
|
||||
privateRanges = [
|
||||
"10.0.0.0/8"
|
||||
"172.16.0.0/12"
|
||||
"192.168.0.0/16"
|
||||
"100.64.0.0/10"
|
||||
"0.0.0.0/8"
|
||||
"224.0.0.0/4"
|
||||
"240.0.0.0/4"
|
||||
"fc00::/7"
|
||||
"ff00::/8"
|
||||
];
|
||||
|
||||
# Evaluated top to bottom, first match wins. The destination denies sit
|
||||
# before every allow, `allow unrestricted` included: squid resolves names on
|
||||
# the host and connects from it, so a name that answers 127.0.0.1,
|
||||
# 169.254.169.254, the host's own LAN address or a private neighbour would
|
||||
# otherwise reach services the bridge firewall keeps agents out of, and an
|
||||
# unrestricted agent is still an agent. The same denies bind a listed name,
|
||||
# so a listed name must resolve to a public address on the host's resolver.
|
||||
# The IP-literal
|
||||
# denies come first because `dstdomain` on an IP literal does a reverse
|
||||
# lookup. The credential check sits right before the first allow, so only a
|
||||
# request that would otherwise be let through gets the 407 challenge. An
|
||||
|
|
@ -75,6 +94,7 @@ let
|
|||
acl selfcheck src ${netCfg.bridgeIp}/32
|
||||
|
||||
acl to_bridge dst ${netCfg.networkCidr}
|
||||
acl to_private dst ${lib.concatStringsSep " " privateRanges}
|
||||
# `dstdomain` on an IP-literal host does a reverse lookup, so a PTR record
|
||||
# an agent controls could match an allowed name.
|
||||
acl ip_v4_host url_regex ^([a-z]+://)?[0-9.]+(:[0-9]+)?(/|$)
|
||||
|
|
@ -95,6 +115,7 @@ let
|
|||
http_access deny to_localhost
|
||||
http_access deny to_linklocal
|
||||
http_access deny to_bridge
|
||||
http_access deny to_private
|
||||
http_access deny !authed
|
||||
http_access allow unrestricted
|
||||
${lib.optionalString (allowed != [ ]) "http_access deny !allowed_dst"}
|
||||
|
|
@ -181,8 +202,12 @@ in
|
|||
];
|
||||
description = ''
|
||||
Hostnames squid lets a client reach, by CONNECT or plain HTTP. Each
|
||||
entry matches that exact name. Everything else gets a 403. The
|
||||
self-check canary is allowed on top of this list.
|
||||
entry matches that exact name. Everything else gets a 403, except
|
||||
for an unrestricted user. The self-check canary is allowed on top of
|
||||
this list. A name must resolve, on this host's resolver, to a public
|
||||
address: one in a loopback, link-local, private, shared (100.64.0.0/10),
|
||||
multicast or reserved range, or in the bridge subnet, gets a 403 for
|
||||
every user.
|
||||
'';
|
||||
};
|
||||
|
||||
|
|
@ -246,9 +271,10 @@ in
|
|||
description = ''
|
||||
Hostname the self-check CONNECTs to on port 443 and expects squid to
|
||||
let through. Squid resolves it with this host's resolver, not the
|
||||
hive's: a host whose resolver answers a loopback or bridge address
|
||||
for it (a single-host swarm with the gateway's `localHostsEntry`) gets
|
||||
a 403, and the self-check reports `ok=false`.
|
||||
hive's: a host whose resolver answers a loopback, bridge or other
|
||||
private address for it (a single-host swarm with the gateway's
|
||||
`localHostsEntry`, or a split-horizon LAN) gets a 403, and the
|
||||
self-check reports `ok=false`.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue