From a6a419bad7aa1bb2d01f77dfe1a0756dd71be1ad Mon Sep 17 00:00:00 2001 From: beatzaplenty Date: Fri, 24 Jul 2026 06:22:31 +1000 Subject: [PATCH] updated structure --- .../.gitea/workflows/secret-scan.yml | 28 + .../.github/workflows/secret-scan.yml | 28 + .../debian-restructure/.gitleaks.toml | 41 + .../debian-restructure/pihole/apply-config.sh | 60 + .../config/dnsmasq.d/99-ipxe-chainload.conf | 20 + .../pihole/config/pihole.toml | 1767 +++++++++++++++++ .../debian-restructure/pihole/pull-config.sh | 51 + .../pihole/sanitize-config.sh | 40 + .../debian-restructure/proxmox/.gitignore | 2 + .../debian-restructure/proxmox/CLAUDE.md | 84 + .../debian-restructure/proxmox/README.md | 55 + .../config/pve-firewall/cluster.fw.example | 44 + .../proxmox/docs/00-overview.md | 116 ++ .../proxmox/docs/01-hardware-node1.md | 92 + .../proxmox/docs/02-storage-zfs-ceph.md | 66 + .../proxmox/docs/03-networking.md | 66 + .../proxmox/docs/04-security-hardening.md | 112 ++ .../proxmox/docs/05-node-roles.md | 83 + .../proxmox/docs/06-pve-test-wifi-network.md | 191 ++ .../proxmox/scripts/audit.sh | 133 ++ .../proxmox/scripts/bootstrap.sh | 67 + .../proxmox/scripts/create-admin-user.sh | 43 + .../proxmox/scripts/deploy-firewall.sh | 48 + .../scripts/disable-subscription-nag.sh | 24 + .../proxmox/scripts/harden-ssh.sh | 43 + .../proxmox/scripts/lib/common.sh | 47 + .../proxmox/scripts/lib/nag-patch.sh | 22 + .../proxmox/scripts/setup-admin-sudo.sh | 61 + .../proxmox/scripts/setup-linux-admin-user.sh | 82 + .../scripts/setup-unattended-upgrades.sh | 46 + .../scripts/setup-wifi-bond-network.sh | 133 ++ .../scripts/switch-to-no-subscription-repo.sh | 42 + .../scripts/check-secrets.sh | 80 + .../scripts/install-hooks.sh | 17 + 34 files changed, 3834 insertions(+) create mode 100644 .claude/worktrees/debian-restructure/.gitea/workflows/secret-scan.yml create mode 100644 .claude/worktrees/debian-restructure/.github/workflows/secret-scan.yml create mode 100644 .claude/worktrees/debian-restructure/.gitleaks.toml create mode 100755 .claude/worktrees/debian-restructure/pihole/apply-config.sh create mode 100644 .claude/worktrees/debian-restructure/pihole/config/dnsmasq.d/99-ipxe-chainload.conf create mode 100644 .claude/worktrees/debian-restructure/pihole/config/pihole.toml create mode 100755 .claude/worktrees/debian-restructure/pihole/pull-config.sh create mode 100755 .claude/worktrees/debian-restructure/pihole/sanitize-config.sh create mode 100644 .claude/worktrees/debian-restructure/proxmox/.gitignore create mode 100644 .claude/worktrees/debian-restructure/proxmox/CLAUDE.md create mode 100644 .claude/worktrees/debian-restructure/proxmox/README.md create mode 100644 .claude/worktrees/debian-restructure/proxmox/config/pve-firewall/cluster.fw.example create mode 100644 .claude/worktrees/debian-restructure/proxmox/docs/00-overview.md create mode 100644 .claude/worktrees/debian-restructure/proxmox/docs/01-hardware-node1.md create mode 100644 .claude/worktrees/debian-restructure/proxmox/docs/02-storage-zfs-ceph.md create mode 100644 .claude/worktrees/debian-restructure/proxmox/docs/03-networking.md create mode 100644 .claude/worktrees/debian-restructure/proxmox/docs/04-security-hardening.md create mode 100644 .claude/worktrees/debian-restructure/proxmox/docs/05-node-roles.md create mode 100644 .claude/worktrees/debian-restructure/proxmox/docs/06-pve-test-wifi-network.md create mode 100755 .claude/worktrees/debian-restructure/proxmox/scripts/audit.sh create mode 100755 .claude/worktrees/debian-restructure/proxmox/scripts/bootstrap.sh create mode 100755 .claude/worktrees/debian-restructure/proxmox/scripts/create-admin-user.sh create mode 100755 .claude/worktrees/debian-restructure/proxmox/scripts/deploy-firewall.sh create mode 100755 .claude/worktrees/debian-restructure/proxmox/scripts/disable-subscription-nag.sh create mode 100755 .claude/worktrees/debian-restructure/proxmox/scripts/harden-ssh.sh create mode 100755 .claude/worktrees/debian-restructure/proxmox/scripts/lib/common.sh create mode 100755 .claude/worktrees/debian-restructure/proxmox/scripts/lib/nag-patch.sh create mode 100755 .claude/worktrees/debian-restructure/proxmox/scripts/setup-admin-sudo.sh create mode 100755 .claude/worktrees/debian-restructure/proxmox/scripts/setup-linux-admin-user.sh create mode 100755 .claude/worktrees/debian-restructure/proxmox/scripts/setup-unattended-upgrades.sh create mode 100755 .claude/worktrees/debian-restructure/proxmox/scripts/setup-wifi-bond-network.sh create mode 100755 .claude/worktrees/debian-restructure/proxmox/scripts/switch-to-no-subscription-repo.sh create mode 100755 .claude/worktrees/debian-restructure/scripts/check-secrets.sh create mode 100755 .claude/worktrees/debian-restructure/scripts/install-hooks.sh diff --git a/.claude/worktrees/debian-restructure/.gitea/workflows/secret-scan.yml b/.claude/worktrees/debian-restructure/.gitea/workflows/secret-scan.yml new file mode 100644 index 0000000..8aae27d --- /dev/null +++ b/.claude/worktrees/debian-restructure/.gitea/workflows/secret-scan.yml @@ -0,0 +1,28 @@ +name: Secret Scan + +on: + push: + branches: ["**"] + pull_request: + branches: ["**"] + +jobs: + secret-scan: + name: Scan for secrets and sensitive config + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # full history for gitleaks git-log scan + + - name: Install gitleaks + run: | + GITLEAKS_VERSION="8.21.2" + curl -sSL "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" \ + | tar -xz -C /usr/local/bin gitleaks + gitleaks version + + - name: Run secret scan + run: bash scripts/check-secrets.sh diff --git a/.claude/worktrees/debian-restructure/.github/workflows/secret-scan.yml b/.claude/worktrees/debian-restructure/.github/workflows/secret-scan.yml new file mode 100644 index 0000000..8aae27d --- /dev/null +++ b/.claude/worktrees/debian-restructure/.github/workflows/secret-scan.yml @@ -0,0 +1,28 @@ +name: Secret Scan + +on: + push: + branches: ["**"] + pull_request: + branches: ["**"] + +jobs: + secret-scan: + name: Scan for secrets and sensitive config + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # full history for gitleaks git-log scan + + - name: Install gitleaks + run: | + GITLEAKS_VERSION="8.21.2" + curl -sSL "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_x64.tar.gz" \ + | tar -xz -C /usr/local/bin gitleaks + gitleaks version + + - name: Run secret scan + run: bash scripts/check-secrets.sh diff --git a/.claude/worktrees/debian-restructure/.gitleaks.toml b/.claude/worktrees/debian-restructure/.gitleaks.toml new file mode 100644 index 0000000..2bc8a26 --- /dev/null +++ b/.claude/worktrees/debian-restructure/.gitleaks.toml @@ -0,0 +1,41 @@ +# Gitleaks configuration for debian-configuration repo. +# Extends the default ruleset with Pi-hole-specific secret patterns. +# https://github.com/gitleaks/gitleaks + +title = "debian-configuration secret scan" + +[extend] + useDefault = true + +# ── Custom rules ─────────────────────────────────────────────────────────────── + +[[rules]] + id = "pihole-pwhash" + description = "Pi-hole password hash (pihole.toml webserver.api.pwhash)" + regex = '''pwhash\s*=\s*"[^"]{10,}"''' + tags = ["pihole", "password"] + +[[rules]] + id = "pihole-totp-secret" + description = "Pi-hole 2FA TOTP secret" + regex = '''totp_secret\s*=\s*"[^"]{10,}"''' + tags = ["pihole", "2fa"] + +[[rules]] + id = "pihole-app-pwhash" + description = "Pi-hole app password hash" + regex = '''app_pwhash\s*=\s*"[^"]{10,}"''' + tags = ["pihole", "password"] + +# ── Allowlist ────────────────────────────────────────────────────────────────── + +[allowlist] + description = "Known-safe patterns in this repo" + regexes = [ + # TLS cert path reference — not the key itself + '''cert\s*=\s*"/etc/pihole/tls\.pem"''', + ] + paths = [ + # Example/template files are intentionally non-live + '''\.example$''', + ] diff --git a/.claude/worktrees/debian-restructure/pihole/apply-config.sh b/.claude/worktrees/debian-restructure/pihole/apply-config.sh new file mode 100755 index 0000000..97f5a83 --- /dev/null +++ b/.claude/worktrees/debian-restructure/pihole/apply-config.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +# Apply a Pi-hole configuration directory to a destination Pi-hole instance. +# +# Usage: apply-config.sh +# source-dir Local directory containing config files (as written by pull-config.sh) +# dest-host SSH-reachable hostname or IP of the destination Pi-hole +# +# Example: +# ./apply-config.sh ./config root@pihole-new +# ./apply-config.sh /backup/pihole-20260723 root@192.168.2.101 +# +# The destination Pi-hole must already have Pi-hole v6 installed. +# pihole-FTL is restarted at the end to apply the new config. + +set -euo pipefail + +usage() { + echo "Usage: $(basename "$0") " >&2 + echo " source-dir Local directory with config files (from pull-config.sh)" >&2 + echo " dest-host SSH target for the destination Pi-hole (e.g. root@pihole)" >&2 + exit 1 +} + +[[ $# -eq 2 ]] || usage + +SOURCE="$1" +DEST="$2" + +[[ -d "${SOURCE}" ]] || { echo "Error: source directory '${SOURCE}' not found" >&2; exit 1; } +[[ -f "${SOURCE}/pihole.toml" ]] || { echo "Error: '${SOURCE}/pihole.toml' not found — is this a valid config dir?" >&2; exit 1; } + +echo "Applying Pi-hole config from ${SOURCE} → ${DEST}" + +# ── Verify destination is running Pi-hole ────────────────────────────────────── +ssh "${DEST}" "command -v pihole-FTL >/dev/null 2>&1 || { echo 'pihole-FTL not found on destination'; exit 1; }" + +# ── pihole.toml ──────────────────────────────────────────────────────────────── +echo " pihole.toml" +ssh "${DEST}" "cp /etc/pihole/pihole.toml /etc/pihole/pihole.toml.pre-apply 2>/dev/null || true" +scp "${SOURCE}/pihole.toml" "${DEST}:/etc/pihole/pihole.toml" +ssh "${DEST}" "chown pihole:pihole /etc/pihole/pihole.toml; chmod 640 /etc/pihole/pihole.toml" + +# ── custom dnsmasq drop-ins ──────────────────────────────────────────────────── +if [[ -d "${SOURCE}/dnsmasq.d" ]] && [[ -n "$(ls "${SOURCE}/dnsmasq.d/"*.conf 2>/dev/null)" ]]; then + echo " dnsmasq.d/ (custom drop-ins)" + for f in "${SOURCE}/dnsmasq.d/"*.conf; do + name="$(basename "$f")" + echo " ${name}" + scp "${f}" "${DEST}:/etc/dnsmasq.d/${name}" + done +fi + +# ── Restart pihole-FTL ───────────────────────────────────────────────────────── +echo " Restarting pihole-FTL" +ssh "${DEST}" "systemctl restart pihole-FTL" +sleep 2 +ssh "${DEST}" "systemctl is-active pihole-FTL" + +echo "Done. Config applied to ${DEST}." +echo "Note: gravity (blocklists) is not transferred — run 'pihole updateGravity' on ${DEST} to rebuild." diff --git a/.claude/worktrees/debian-restructure/pihole/config/dnsmasq.d/99-ipxe-chainload.conf b/.claude/worktrees/debian-restructure/pihole/config/dnsmasq.d/99-ipxe-chainload.conf new file mode 100644 index 0000000..f9e9eda --- /dev/null +++ b/.claude/worktrees/debian-restructure/pihole/config/dnsmasq.d/99-ipxe-chainload.conf @@ -0,0 +1,20 @@ +# Detect iPXE clients (already running iPXE). +dhcp-match=set:ipxe,175 +dhcp-userclass=set:ipxe,iPXE + +# Detect UEFI x86_64 clients by client architecture. +dhcp-match=set:efi64,option:client-arch,7 +dhcp-match=set:efi64,option:client-arch,9 + +# Boot file selection — more positive tags = higher priority. +# EFI iPXE (2 tags): already running iPXE on EFI, chain to HTTP menu. +dhcp-boot=tag:ipxe,tag:efi64,http://192.168.2.247/boot.ipxe + +# BIOS iPXE (1 tag): already running iPXE, chain to HTTP menu. +dhcp-boot=tag:ipxe,http://192.168.2.247/boot.ipxe + +# EFI non-iPXE (1 tag): send the EFI iPXE binary. +dhcp-boot=tag:efi64,ipxe.efi,,192.168.2.247 + +# BIOS/legacy fallback (0 tags): send the BIOS iPXE binary. +dhcp-boot=undionly.kpxe,,192.168.2.247 diff --git a/.claude/worktrees/debian-restructure/pihole/config/pihole.toml b/.claude/worktrees/debian-restructure/pihole/config/pihole.toml new file mode 100644 index 0000000..1dd17f1 --- /dev/null +++ b/.claude/worktrees/debian-restructure/pihole/config/pihole.toml @@ -0,0 +1,1767 @@ +# Pi-hole configuration file (v6.7) +# Encoding: UTF-8 +# This file is managed by pihole-FTL +# Last updated on 2026-07-23 02:11:01 UTC + +[dns] + # Upstream DNS Servers to be used by Pi-hole. If this is not set, Pi-hole will not + # resolve any non-local queries. + # + # Example: [ "8.8.8.8", "127.0.0.1#5335", "docker-resolver" ] + # + # Allowed values are: + # Array of IP addresses and/or hostnames, optionally with a port (#...) + upstreams = [ + "45.90.28.142", + "45.90.30.142" + ] ### CHANGED, default = [] + + # Use this option to control deep CNAME inspection. Disabling it might be beneficial + # for very low-end devices + # + # Allowed values are: + # true or false + CNAMEdeepInspect = true + + # Should _esni. subdomains of blocked domains also be blocked by default? Encrypted + # Server Name Indication (ESNI) is certainly a good step into the right direction to + # enhance privacy on the web. It prevents on-path observers, including ISPs, coffee + # shop owners and firewalls, from intercepting the TLS Server Name Indication (SNI) + # extension by encrypting it. This prevents the SNI from being used to determine which + # websites users are visiting. + # + # ESNI will obviously cause issues for pixelserv-tls which will be unable to generate + # matching certificates on-the-fly when it cannot read the SNI. According to the IETF + # draft (link above), we can easily restore pixelserv-tls's operation by replying + # NXDOMAIN to _esni. subdomains of blocked domains as this mimics a "not configured + # for this domain" behavior. + # + # ESNI is mostly obsolete. It was previously rolled out by Cloudflare and Firefox, but + # they, as well as almost every client and server, are now using Encrypted Client + # Hello (ECH) instead of ESNI. ECH is served via the HTTPS record on the same RRname, + # so it will automatically be blocked. + # + # Allowed values are: + # true or false + blockESNI = true + + # Should we overwrite the query source when client information is provided through + # EDNS0 client subnet (ECS) information? This allows Pi-hole to obtain client IPs even + # if they are hidden behind the NAT of a router. This feature has been requested and + # discussed on Discourse where further information how to use it can be found: + # https://discourse.pi-hole.net/t/support-for-add-subnet-option-from-dnsmasq-ecs-edns0-client-subnet/35940 + # + # Allowed values are: + # true or false + EDNS0ECS = true + + # Should FTL hide queries made by localhost? + # + # Allowed values are: + # true or false + ignoreLocalhost = false + + # Should FTL analyze and show internally generated DNSSEC queries? + # + # Allowed values are: + # true or false + showDNSSEC = true + + # Should FTL analyze *only* A and AAAA queries? + # + # Allowed values are: + # true or false + analyzeOnlyAandAAAA = false + + # Controls whether and how FTL will reply with for address for which a local interface + # exists. Changing this setting causes FTL to restart. + # + # Allowed values are: + # - "NONE" + # Pi-hole will not respond automatically on PTR requests to local interface + # addresses. Ensure pi.hole and/or hostname records exist elsewhere. + # - "HOSTNAME" + # Serve the machine's hostname. The hostname is queried from the kernel through + # uname(2)->nodename. If the machine has multiple network interfaces, it can + # also have multiple nodenames. In this case, it is unspecified and up to the + # kernel which one will be returned. On Linux, the returned string is what has + # been set using sethostname(2) which is typically what has been set in + # /etc/hostname. + # - "HOSTNAMEFQDN" + # Serve the machine's hostname (see limitations above) as fully qualified domain + # by adding the local domain. If no local domain has been defined (config option + # dns.domain.name), FTL tries to query the domain name from the kernel using + # getdomainname(2). If this fails, FTL appends ".no_fqdn_available" to the + # hostname. + # - "PI.HOLE" + # Respond with "pi.hole". + piholePTR = "HOSTNAME" ### CHANGED, default = "PI.HOLE" + + # How should FTL handle queries when the gravity database is not available? + # + # Allowed values are: + # - "BLOCK" + # Block all queries when the database is busy. + # - "ALLOW" + # Allow all queries when the database is busy. + # - "REFUSE" + # Refuse all queries which arrive while the database is busy. + # - "DROP" + # Just drop the queries, i.e., never reply to them at all. Despite "REFUSE" + # sounding similar to "DROP", it turned out that many clients will just + # immediately retry, causing up to several thousands of queries per second. This + # does not happen in "DROP" mode. + replyWhenBusy = "ALLOW" + + # FTL's internal TTL to be handed out for blocked queries in seconds. This settings + # allows users to select a value different from the dnsmasq config option local-ttl. + # This is useful in context of locally used hostnames that are known to stay constant + # over long times (printers, etc.). + # + # Note that large values may render whitelisting ineffective due to client-side + # caching of blocked queries. + # + # Allowed values are: + # A positive integer value in seconds + blockTTL = 2 + + # Array of custom DNS records + # + # Example: [ "127.0.0.1 mylocal", "192.168.0.1 therouter" ] + # + # Allowed values are: + # Array of custom DNS records each one in HOSTS form: "IP HOSTNAME [HOSTNAME ...]" + hosts = [ + "192.168.2.253 pihole", + "192.168.2.254 router", + "192.168.2.252 server", + "192.168.2.250 win11", + "192.168.2.249 docker", + "192.168.2.108 pbs", + "192.168.2.108 pbs.sweet.home", + "192.168.2.250 pve1", + "192.168.2.250 pve1.sweet.home", + "192.168.2.248 pdm", + "192.168.2.248 pdm.sweet.home", + "192.168.2.251 pve-test", + "192.168.2.251 pve-test.sweet.home" + ] ### CHANGED, default = [] + + # If set, queries for plain names, without dots or domain parts, are never forwarded to + # upstream nameservers + # + # Allowed values are: + # true or false + domainNeeded = false + + # If set, the domain is added to simple names (without a period) in /etc/hosts in the + # same way as for DHCP-derived names + # + # Allowed values are: + # true or false + expandHosts = false + + # Should all reverse lookups for private IP ranges (i.e., 192.168.x.y, etc) which are + # not found in /etc/hosts or the DHCP leases file be answered with "no such domain" + # rather than being forwarded upstream? + # + # Allowed values are: + # true or false + bogusPriv = true + + # Validate DNS replies using DNSSEC? + # + # Allowed values are: + # true or false + dnssec = false + + # Interface to use for DNS (see also dns.listeningMode) and DHCP (if enabled). Leave + # empty for auto-detection. + # + # Allowed values are: + # a valid interface name + interface = "eth0" ### CHANGED, default = "" + + # Add an A, AAAA and PTR record to the DNS. This adds a singular name to the DNS with + # associated IPv4 (A) and IPv6 (AAAA) records + # + # Example: "laptop,laptop.lan,192.168.0.1,1234::100" + # + # Allowed values are: + # A string in the format + # "[,....],[],[][,]" + hostRecord = "" + + # Pi-hole interface listening modes + # + # Allowed values are: + # - "LOCAL" + # Allow only local requests. This setting accepts DNS queries only from hosts + # whose address is on a local subnet, i.e., a subnet for which an interface + # exists on the server. It is intended to be set as a default on installation, + # to allow unconfigured installations to be useful but also safe from being used + # for DNS amplification attacks if (accidentally) running public. + # - "SINGLE" + # Permit all origins, accept only on the specified interface. Respond only to + # queries arriving on the specified interface. The loopback (lo) interface is + # automatically added to the list of interfaces to use when this option is used. + # Make sure your Pi-hole is properly firewalled! + # - "BIND" + # By default, FTL binds the wildcard address. If this is not what you want, you + # can use this option as it forces FTL to really bind only the interfaces it is + # listening on. Note that this may result in issues when the interface may go + # down (cable unplugged, etc.). About the only time when this is useful is when + # running another nameserver on the same port on the same machine. This may also + # happen if you run a virtualization API such as libvirt. When this option is + # used, IP alias interface labels (e.g. enp2s0:0) are checked rather than + # interface names. + # - "ALL" + # Permit all origins, accept on all interfaces. Make sure your Pi-hole is + # properly firewalled! This truly allows any traffic to be replied to and is a + # dangerous thing to do as your Pi-hole could become an open resolver. You + # should always ask yourself if the first option doesn't work for you as well. + # - "NONE" + # Do not add any configuration concerning the listening mode to the dnsmasq + # configuration file. This is useful if you want to manually configure the + # listening mode in auxiliary configuration files. This option is really meant + # for advanced users only, support for this option may be limited. + listeningMode = "LOCAL" + + # Log DNS queries and replies to pihole.log + # + # Allowed values are: + # true or false + queryLogging = true + + # List of CNAME records which indicate that is really . If the is + # given, it overwrites the value of local-ttl + # + # Allowed values are: + # Array of CNAMEs, each one in the following form: ",[,]" + cnameRecords = [] + + # Port used by the DNS server + # + # Allowed values are: + # Any available valid (1 - 65535) port number + port = 53 + + # Enable/Disable the localise-queries option of dnsmasq. When this setting is disabled + # dnsmasq will return all possible values for local DNS Records. Enabled by default + # + # Allowed values are: + # true or false + localise = true + + # Reverse server (formerly called "conditional forwarding") + # + # If not configured as your DHCP server, Pi-hole typically won't be able to determine + # the names of devices on your local network. As a result, tables such as Top Clients + # will only show IP addresses. + # + # One solution for this is to configure Pi-hole to forward these requests to your DHCP + # server (most likely your router), but only for devices on your home network. To + # configure this we will need to know the IP address of your DHCP server and which + # addresses belong to your local network. + # + # Example: [ "true,192.168.0.0/24,192.168.0.1,fritz.box" ] + # + # Allowed values are: + # Array of reverse servers each one in the following form: + # + # ",[/],[#][,]" + # + # Explanation of individual components: + # + # - "": either "true" or "false" + # + # - "[/]": Address range for the reverse server feature in + # CIDR notation. If the prefix length is omitted, either 32 (IPv4) or 128 (IPv6) + # are substituted (exact address match). This is almost certainly not what you + # want here. + # Example: "192.168.0.0/24" for the range 192.168.0.1 - 192.168.0.255 + # + # - "[#]": Target server to be used for the reverse server feature + # Example: "192.168.0.1#53" + # + # - "": Domain used for the reverse server feature (e.g., "fritz.box") + # Example: "fritz.box" + revServers = [ + "true,100.0.0.0/8,100.100.100.100,ts.net" + ] ### CHANGED, default = [] + + [dns.domain] + # The DNS domain used by your Pi-hole. + # + # This DNS domain is purely local. FTL may answer queries from its local cache and + # configuration but *never* forwards any requests upstream *unless* you have + # configured a dns.revServer exactly for this domain. In the latter case, all queries + # for this domain are sent exclusively to this server (including reverse lookups). + # + # For DHCP, this has two effects; firstly it causes the DHCP server to return the + # domain to any hosts which request it, and secondly it sets the domain which it is + # legal for DHCP-configured hosts to claim. The intention is to constrain hostnames so + # that an untrusted host on the LAN cannot advertise its name via DHCP as e.g. + # "google.com" and capture traffic not meant for it. If no domain suffix is specified, + # then any DHCP hostname with a domain part (ie with a period) will be disallowed and + # logged. If a domain is specified, then hostnames with a domain part are allowed, + # provided the domain part matches the suffix. In addition, when a suffix is set then + # hostnames without a domain part have the suffix added as an optional domain part. + # For instance, we can set domain=mylab.com and have a machine whose DHCP hostname is + # "laptop". The IP address for that machine is available both as "laptop" and + # "laptop.mylab.com". + # + # You can disable setting a domain by setting this option to an empty string. + # + # Allowed values are: + # Any valid domain + name = "sweet.home" ### CHANGED, default = "lan" + + # If set, the domain configured by dns.domain.name is considered local and queries for + # this domain are never forwarded upstream unless a dns.revServer is configured for + # this domain. + # + # If unset, queries for this domain are forwarded upstream to (possibly public) server + # which is probably not what you want *unless* you have added extra configuration for + # this domain *or* your upstream servers are able to handle local domains (e.g., + # router). + # + # Allowed values are: + # true or false + local = true + + [dns.cache] + # Cache size of the DNS server. Note that expiring cache entries naturally make room + # for new insertions over time. + # + #Setting this number too high will have an adverse effect as not only more space is + # needed, but also lookup speed gets degraded in the 10,000+ range. dnsmasq may issue + # a warning when you go beyond 10,000+ cache entries. + # + # Allowed values are: + # A positive integer value + size = 10000 + + # Query cache optimizer: If a DNS name exists in the cache, but its time-to-live has + # expired only recently, the data will be used anyway (a refreshing from upstream is + # triggered). This can improve DNS query delays especially over unreliable Internet + # connections. This feature comes at the expense of possibly sometimes returning + # out-of-date data and less efficient cache utilization, since old data cannot be + # flushed when its TTL expires, so the cache becomes mostly least-recently-used. To + # mitigate issues caused by massively outdated DNS replies, the maximum overaging of + # cached records is limited. We strongly recommend staying below 86400 (1 day) with + # this option. + # + # Setting the TTL excess time to zero will serve stale cache data regardless how long + # it has expired. This is not recommended as it may lead to stale data being served + # for a long time. Setting this option to any negative value will disable this feature + # altogether. + # + # Allowed values are: + # A positive integer value in seconds, or any negative to disable this feature + optimizer = 3600 + + # This setting allows you to specify the TTL used for queries blocked upstream. Once + # the TTL expires, the query will be forwarded to the upstream server again to check + # if the block is still valid. Defaults to caching for one day (86400 seconds). + # Setting this value to zero disables caching of queries blocked upstream. + # + # Allowed values are: + # A positive integer value in seconds, or zero to disable caching of upstream + # blocked queries + upstreamBlockedTTL = 86400 + + # This is dnsmasq's --cache-rr option, which allows you to define which DNS record + # types should be cached by PiHole. This option can take a comma-separated list of + # RR-types as input. The default value ANY caches all record types. + # + # Allowed values are: + # Valid DNS record types in the following form: [,...] + rrtype = "ANY" + + [dns.blocking] + # Should FTL block queries? + # + # Allowed values are: + # true or false + active = true + + # How should FTL reply to blocked queries? + # + # Allowed values are: + # - "NULL" + # In NULL mode, which is both the default and recommended mode for Pi-hole + # FTLDNS, blocked queries will be answered with the "unspecified address" + # (0.0.0.0 or ::). The "unspecified address" is a reserved IP address specified + # by RFC 3513 - Internet Protocol Version 6 (IPv6) Addressing Architecture, + # section 2.5.2. + # - "IP_NODATA_AAAA" + # In IP-NODATA-AAAA mode, blocked queries will be answered with the local IPv4 + # addresses of your Pi-hole. Blocked AAAA queries will be answered with + # NODATA-IPV6 and clients will only try to reach your Pi-hole over its static + # IPv4 address. + # - "IP" + # In IP mode, blocked queries will be answered with the local IP addresses of + # your Pi-hole. + # - "NX" + # In NXDOMAIN mode, blocked queries will be answered with an empty response + # (i.e., there won't be an answer section) and status NXDOMAIN. A NXDOMAIN + # response should indicate that there is no such domain to the client making the + # query. + # - "NODATA" + # In NODATA mode, blocked queries will be answered with an empty response (no + # answer section) and status NODATA. A NODATA response indicates that the domain + # exists, but there is no record for the requested query type. + mode = "NULL" + + # Should FTL enrich blocked replies with EDNS0 information? + # + # Allowed values are: + # - "NONE" + # In NONE mode, no additional EDNS information is added to blocked queries + # - "CODE" + # In CODE mode, blocked queries will be enriched with EDNS info-code BLOCKED (15) + # - "TEXT" + # In TEXT mode, blocked queries will be enriched with EDNS info-code BLOCKED (15) + # and a text message describing the reason for the block + edns = "TEXT" + + [dns.specialDomains] + # Should Pi-hole always reply with NXDOMAIN to A and AAAA queries of + # use-application-dns.net to disable Firefox automatic DNS-over-HTTP? + # + # This follows the recommendation on + # https://support.mozilla.org/en-US/kb/configuring-networks-disable-dns-over-https + # + # Allowed values are: + # true or false + mozillaCanary = true + + # Should Pi-hole always reply with NXDOMAIN to A and AAAA queries of mask.icloud.com + # and mask-h2.icloud.com to disable Apple's iCloud Private Relay to prevent Apple + # devices from bypassing Pi-hole? + # + # This follows the recommendation on + # https://developer.apple.com/support/prepare-your-network-for-icloud-private-relay + # + # Allowed values are: + # true or false + iCloudPrivateRelay = true + + # Should Pi-hole always reply with NODATA to all queries to zone resolver.arpa to + # prevent devices from bypassing Pi-hole using Discovery of Designated Resolvers? + # + # This is based on recommendations at the end of RFC 9462, section 4. + # + # Allowed values are: + # true or false + designatedResolver = true + + [dns.reply.host] + # Use a specific IPv4 address for the Pi-hole host? By default, FTL determines the + # address of the interface a query arrived on and uses this address for replying to A + # queries with the most suitable address for the requesting client. + # + # This setting can be used to use a fixed, rather than the dynamically obtained, + # address when Pi-hole responds to the following names: + # - "pi.hole" + # - "" + # - "pi.hole." + # - "." + # + # Allowed values are: + # true or false + force4 = false + + # Custom IPv4 address for the Pi-hole host + # + # Allowed values are: + # A valid IPv4 address or empty string ("") + IPv4 = "" + + # Use a specific IPv6 address for the Pi-hole host? See description for the IPv4 + # variant above for further details. + # + # Allowed values are: + # true or false + force6 = false + + # Custom IPv6 address for the Pi-hole host + # + # Allowed values are: + # A valid IPv6 address or empty string ("") + IPv6 = "" + + [dns.reply.blocking] + # Use a specific IPv4 address in IP blocking mode? By default, FTL determines the + # address of the interface a query arrived on and uses this address for replying to A + # queries with the most suitable address for the requesting client. + # + # This setting can be used to use a fixed, rather than the dynamically obtained, + # address when Pi-hole responds in the following cases: + # - IP blocking mode is used and this query is to be blocked + # - regular expressions with the ;reply=IP regex extension. + # + # Allowed values are: + # true or false + force4 = false + + # Custom IPv4 address for IP blocking mode + # + # Allowed values are: + # A valid IPv4 address or empty string ("") + IPv4 = "" + + # Use a specific IPv6 address in IP blocking mode? See description for the IPv4 variant + # above for further details. + # + # Allowed values are: + # true or false + force6 = false + + # Custom IPv6 address for IP blocking mode + # + # Allowed values are: + # A valid IPv6 address or empty string ("") + IPv6 = "" + + [dns.rateLimit] + # Rate-limited queries are answered with a REFUSED reply and not further processed by + # FTL. + # + # The default settings for FTL's rate-limiting are to permit no more than 1000 queries + # in 60 seconds. Both numbers can be customized independently. It is important to note + # that rate-limiting is happening on a per-client basis. Other clients can continue to + # use FTL while rate-limited clients are short-circuited at the same time. + # + # For this setting, both numbers, the maximum number of queries within a given time, + # and the length of the time interval (seconds) have to be specified. For instance, if + # you want to set a rate limit of 1 query per hour, the option should look like + # dns.rateLimit.count=1 and dns.rateLimit.interval=3600. The time interval is relative + # to when FTL has finished starting (start of the daemon + possible delay by + # DELAY_STARTUP) then it will advance in steps of the rate-limiting interval. If a + # client reaches the maximum number of queries it will be blocked until the end of the + # current interval. This will be logged to /var/log/pihole/FTL.log, e.g. Rate-limiting + # 10.0.1.39 for at least 44 seconds. If the client continues to send queries while + # being blocked already and this number of queries during the blocking exceeds the + # limit the client will continue to be blocked until the end of the next interval + # (FTL.log will contain lines like Still rate-limiting 10.0.1.39 as it made additional + # 5007 queries). As soon as the client requests less than the set limit, it will be + # unblocked (Ending rate-limitation of 10.0.1.39). + # + # Rate-limiting may be disabled altogether by setting both values to zero (this + # results in the same behavior as before FTL v5.7). + # + # How many queries are permitted... + # + # Allowed values are: + # A positive integer value + count = 1000 + + # ... in the set interval before rate-limiting? + # + # Allowed values are: + # A positive integer value in seconds + interval = 60 + +[dhcp] + # Is the embedded DHCP server enabled? + # + # Allowed values are: + # true or false + active = true ### CHANGED, default = false + + # Start address of the DHCP address pool + # + # Example: "192.168.0.10" + # + # Allowed values are: + # A valid IPv4 address, or empty string ("") + start = "192.168.2.100" ### CHANGED, default = "" + + # End address of the DHCP address pool + # + # Example: "192.168.0.250" + # + # Allowed values are: + # A valid IPv4 address, or empty string ("") + end = "192.168.2.150" ### CHANGED, default = "" + + # Address of the gateway to be used (typically the address of your router in a home + # installation) + # + # Example: "192.168.0.1" + # + # Allowed values are: + # A valid IPv4 address, or empty string ("") + router = "192.168.2.254" ### CHANGED, default = "" + + # The netmask used by your Pi-hole. For directly connected networks (i.e., networks on + # which the machine running Pi-hole has an interface) the netmask is optional and may + # be set to an empty string (""): it will then be determined from the interface + # configuration itself. + # + # For networks which receive DHCP service via a relay agent, we cannot determine the + # netmask itself, so it should explicitly be specified, otherwise Pi-hole guesses + # based on the class (A, B or C) of the network address. + # + # Example: "255.255.255.0" + # + # Allowed values are: + # Any valid netmask, or an empty string ("") for auto-discovery + netmask = "255.255.255.0" ### CHANGED, default = "" + + # If the lease time is given, then leases will be given for that length of time. If not + # given, the default lease time is one hour for IPv4 and one day for IPv6. + # + # Allowed values are: + # The lease time can be in seconds, or minutes (e.g., "45m") or hours (e.g., "1h") + # or days (like "2d") or even weeks ("1w"). You may also use "infinite" as string + # but be aware of the drawbacks + leaseTime = "24h" ### CHANGED, default = "" + + # Should Pi-hole make an attempt to also satisfy IPv6 address requests (be aware that + # IPv6 works a whole lot different than IPv4) + # + # Allowed values are: + # true or false + ipv6 = true ### CHANGED, default = false + + # Enable DHCPv4 Rapid Commit Option specified in RFC 4039. Should only be enabled if + # either the server is the only server for the subnet to avoid conflicts + # + # Allowed values are: + # true or false + rapidCommit = false + + # Advertise DNS server multiple times to clients. Some devices will add their own + # proprietary DNS servers to the list of DNS servers, which can cause issues with + # Pi-hole. This option will advertise the Pi-hole DNS server multiple times to + # clients, which should prevent this from happening. + # + # Allowed values are: + # true or false + multiDNS = false + + # Enable logging for DHCP. This will log all relevant DHCP-related activity, including, + # e.g., all the options sent to DHCP clients and the tags used to determine them (if + # any). This can be useful for debugging DHCP issues. The generated output is saved to + # the file specified by files.log.dnsmasq below. + # + # Allowed values are: + # true or false + logging = false + + # Ignore unknown DHCP clients. + # If this option is set, Pi-hole ignores all clients which are not explicitly + # configured through dhcp.hosts. This can be useful to prevent unauthorized clients + # from getting an IP address from the DHCP server. + # + # It should be noted that this option is not a security feature, as clients can still + # assign themselves an IP address and use the network. It is merely a convenience + # feature to prevent unknown clients from getting a valid IP configuration assigned + # automatically. + # + # Note that you will need to configure new clients manually in dhcp.hosts before they + # can use the network when this feature is enabled. + # + # Allowed values are: + # true or false + ignoreUnknownClients = false + + # Per host parameters for the DHCP server. This allows a machine with a particular + # hardware address to be always allocated the same hostname, IP address and lease time + # or to specify static DHCP leases + # + # Example: [ "00:20:e0:3b:13:af,192.168.0.123,laptop,24h", + # "00:20:e0:ab:cd:ef,192.168.0.124,desktop,24h"] + # + # Allowed values are: + # Array of static leases each one in the following form: + # "[][,id:|*][,set:][,tag:][,][,][,][,ignore]" + hosts = [ + "BC:24:11:D6:B6:D3,192.168.2.252,server", + "BC:24:11:32:79:DF,192.168.2.249,docker", + "bc:24:11:15:97:41,192.168.2.108,pbs", + "BC:24:11:FE:BE:C1,192.168.2.247,pxe-boot", + "bc:24:11:8b:be:21,192.168.2.107,tor-relay", + "BC:24:11:52:99:6E,192.168.2.120,nix-cache", + "BC:24:11:2C:33:56,192.168.2.248,pdm" + ] ### CHANGED, default = [] + + [ntp.ipv4] + # Should FTL act as network time protocol (NTP) server (IPv4)? + # + # Allowed values are: + # true or false + active = true + + # IPv4 address to listen on for NTP requests + # + # Allowed values are: + # A valid IPv4 address, or empty string (""). For wildcard (0.0.0.0) + address = "" + + [ntp.ipv6] + # Should FTL act as network time protocol (NTP) server (IPv6)? + # + # Allowed values are: + # true or false + active = true + + # IPv6 address to listen on for NTP requests + # + # Allowed values are: + # A valid IPv6 address, or empty string (""). For wildcard (::) + address = "" + + [ntp.sync] + # Should FTL try to synchronize the system time with an upstream NTP server? + # + # Allowed values are: + # true or false + active = true + + # NTP upstream server to sync with, e.g., "pool.ntp.org". Note that the NTP server + # should be located as close as possible to you in order to minimize the time offset + # possibly introduced by different routing paths. + # + # Allowed values are: + # A valid NTP upstream server + server = "pool.ntp.org" + + # Interval in seconds between successive synchronization attempts with the NTP server + # + # Allowed values are: + # A positive integer value in seconds + interval = 3600 + + # Number of NTP syncs to perform and average before updating the system time + # + # Allowed values are: + # A positive integer value + count = 8 + + [ntp.sync.rtc] + # Should FTL update a real-time clock (RTC) if available? + # + # Allowed values are: + # true or false + set = false + + # Path to the RTC device to update. + # + # Example: "/dev/rtc0" + # + # Allowed values are: + # A valid RTC device path, or empty string ("") for auto-discovery + device = "" + + # Should the RTC be set to UTC? + # + # Allowed values are: + # true or false + utc = true + +[resolver] + # Should FTL try to resolve IPv4 addresses to hostnames? + # + # Allowed values are: + # true or false + resolveIPv4 = true + + # Should FTL try to resolve IPv6 addresses to hostnames? + # + # Allowed values are: + # true or false + resolveIPv6 = true + + # Control whether FTL should attempt to obtain client names from the network table by + # MAC address. + # + #This can provide hostnames for devices that do not have a hostname or have multiple + # IP addresses (e.g. IPv4 and IPv6). + #However, MAC-derived names can be ambiguous (e.g., when a MAC appears for multiple + # IPs due to a router/NAT or MAC reuse), which may lead to incorrect hostnames being + # shown. Disabling this option can prevent such issues but may lead to more clients + # without hostnames. + # + # Allowed values are: + # true or false + macNames = true + + # Control whether FTL should use the fallback option to try to obtain client names from + # checking the network table. This behavior can be disabled with this option. + # + # Assume an IPv6 client without a host names. However, the network table knows - + # though the client's MAC address - that this is the same device where we have a host + # name for another IP address (e.g., a DHCP server managed IPv4 address). In this + # case, we use the host name associated to the other address as this is the same + # device. + # + # Allowed values are: + # true or false + networkNames = true + + # With this option, you can change how (and if) hourly PTR requests are made to check + # for changes in client and upstream server hostnames. + # + # Allowed values are: + # - "IPV4_ONLY" + # Do hourly PTR lookups only for IPv4 addresses. This is the new default since + # Pi-hole FTL v5.3.2. It should resolve issues with more and more very + # short-lived PE IPv6 addresses coming up in a lot of networks. + # - "ALL" + # Do hourly PTR lookups for all addresses. This was the default until FTL + # v5.3(.1). It has been replaced as it can create a lot of PTR queries for those + # with many IPv6 addresses in their networks. + # - "UNKNOWN" + # Only resolve unknown hostnames. Already existing hostnames are never refreshed, + # i.e., there will be no PTR queries made for clients where hostnames are known. + # This also means that known hostnames will not be updated once known. + # - "NONE" + # Don't do any hourly PTR lookups. This means we look host names up exactly once + # (when we first see a client) and never again. You may miss future changes of + # host names. + refreshNames = "IPV4_ONLY" + +[database] + # Should FTL load information from the database on startup to be aware of the most + # recent history? + # + # Allowed values are: + # true or false + DBimport = true + + # How long should queries be stored in the database [days]? + # + # Allowed values are: + # A positive integer value in days, or 0 to disable the database + maxDBdays = 91 + + # How often do we store queries in FTL's database [seconds]? + # + # Allowed values are: + # A positive integer value in seconds + DBinterval = 60 + + # Should FTL enable Write-Ahead Log (WAL) mode for the on-disk query database + # (configured via files.database)? + # + # It is recommended to leave this setting enabled for performance reasons. About the + # only reason to disable WAL mode is if you are experiencing specific issues with it, + # e.g., when using a database that is accessed from multiple hosts via a network + # share. When this setting is disabled, FTL will use SQLite3's default journal mode + # (rollback journal in DELETE mode). + # + # Allowed values are: + # true or false + useWAL = true + + # Should FTL force the use of disk storage for the history database? By default, FTL + # uses an in-memory database for much improved performance when browsing the history + # from the dashboard. However, on systems with very limited RAM and only occasional + # usage of the web interface, it may be useful to force the use of disk storage + # instead of holding everything in memory. + # + # Note that using disk storage *will* reduce performance, especially on systems with + # slow storage media (e.g., SD cards). + # + # Allowed values are: + # true or false + forceDisk = false + + [database.network] + # Should FTL analyze the local ARP cache? When disabled, client identification and the + # network table will stop working reliably. + # + # Allowed values are: + # true or false + parseARPcache = true + + # How long should IP addresses be kept in the network_addresses table [days]? IP + # addresses (and associated host names) older than the specified number of days are + # removed to avoid dead entries in the network overview table. + # + # Allowed values are: + # A positive integer value in days + expire = 91 + +[webserver] + # On which domain is the web interface served? + # + # Allowed values are: + # A valid domain + domain = "pi.hole" + + # Webserver access control list (ACL) allowing for restrictions to be put on the list + # of IP addresses which have access to the web server. The ACL is a comma separated + # list of IP subnets, where each subnet is prepended by either a - or a + sign. A plus + # sign means allow, where a minus sign means deny. + # + # If a subnet mask is omitted, such as -1.2.3.4, this means to deny only that single + # IP address. If this value is not set (empty string), all accesses are allowed. + # Otherwise, the default setting is to deny all accesses. On each request the full + # list is traversed, and the last (!) match wins. IPv6 addresses may be specified in + # CIDR-form [a:b::c]/64. + # + # Example 1: "+127.0.0.1,+[::1]" ---> deny all access, except from 127.0.0.1 and ::1 + # + # Example 2: "+192.168.0.0/16" ---> deny all accesses, except from the 192.168.0.0/16 + # subnet + # + # Example 3: "+[::]/0" ---> allow only IPv6 access. + # + # Allowed values are: + # A valid ACL + acl = "" + + # Ports to be used by the webserver. + # + # Comma-separated list of ports to listen on. It is possible to specify an IP address + # to bind to. In this case, an IP address and a colon must be prepended to the port + # number. For example, to bind to the loopback interface on port 80 (IPv4) and to all + # interfaces port 8080 (IPv4), use "127.0.0.1:80,8080". "[::]:80" can be used to + # listen to IPv6 connections to port 80. IPv6 addresses of network interfaces can be + # specified as well, e.g. "[::1]:80" for the IPv6 loopback interface. "[::]:80" will + # bind to port 80 IPv6 only. + # + # In order to use port 80 for all interfaces, both IPv4 and IPv6, use either the + # configuration "80,[::]:80" (create one socket for IPv4 and one for IPv6 only), or + # "+80" (create one socket for both, IPv4 and IPv6). The '+' notation to use IPv4 and + # IPv6 will only work if no network interface is specified. Depending on your + # operating system version and IPv6 network environment, some configurations might not + # work as expected, so you have to test to find the configuration most suitable for + # your needs. In case "+80" does not work for your environment, you need to use + # "80,[::]:80". + # + # If the port is TLS/SSL, a letter 's' (secure) must be appended, for example, + # "80,443s" will open port 80 and port 443, and connections on port 443 will be + # encrypted. For non-encrypted ports, it is allowed to append letter 'r' (as in + # redirect). Redirected ports will redirect all their traffic to the first configured + # SSL port. For example, if webserver.port is "80r,443s", then all HTTP traffic coming + # at port 80 will be redirected to HTTPS port 443. + # + # When specifying 'o' (optional) behind a port, inability to use this port is not + # considered an error. For instance, specifying "80o,8080o" will allow the webserver + # to listen on either 80, 8080, both or even none of the two ports. This flag may be + # combined with 'r' and 's' like "80or,443os,8080,4443s" (80 redirecting to SSL if + # available, 443 encrypted if available, 8080 mandatory and unencrypted, 4443 + # mandatory and encrypted). + # + # If this value is not set (empty string), the web server will not be started and, + # hence, the API will not be available. + # + # Allowed values are: + # A comma-separated list of <[ip_address:]port> + port = "80o,443os,[::]:80o,[::]:443os" + + # Maximum number of worker threads allowed. + # + # The Pi-hole web server handles each incoming connection in a separate thread. + # Therefore, the value of this option is effectively the number of concurrent HTTP + # connections that can be handled. Any other connections are queued until they can be + # processed by a unoccupied thread. + # + # The total number of threads you see may be lower than the configured value as + # threads are only created when needed due to incoming connections. + # + # The value 0 means the number of threads is 50 (as per default settings of CivetWeb) + # for backwards-compatible behavior. + # + # Allowed values are: + # A positive integer value, or 0 for default (50) + threads = 50 + + # Additional HTTP headers added to the web server responses. + # + # The headers are added to all responses, including those for the API. + # Note about the default additional headers: + # - X-DNS-Prefetch-Control: off: Usually browsers proactively perform domain name + # resolution on links that the user may choose to follow. We disable DNS prefetching + # here. + # - Content-Security-Policy: [...] 'unsafe-inline' is both required by Chart.js + # styling some elements directly, and index.html containing some inlined Javascript + # code. + # - X-Frame-Options: DENY: The page can not be displayed in a frame, regardless of the + # site attempting to do so. + # - X-Xss-Protection: 0: Disables XSS filtering in browsers that support it. This + # header is usually enabled by default in browsers, and is not recommended as it can + # hurt the security of the site. + # (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection). + # - X-Content-Type-Options: nosniff: Marker used by the server to indicate that the + # MIME types advertised in the Content-Type headers should not be changed and be + # followed. This allows to opt-out of MIME type sniffing, or, in other words, it is a + # way to say that the webmasters knew what they were doing. Site security testers + # usually expect this header to be set. + # - Referrer-Policy: strict-origin-when-cross-origin: A referrer will be sent for + # same-site origins, but cross-origin requests will send no referrer information. + # The latter four headers are set as expected by https://securityheaders.io + # + # Allowed values are: + # An array of HTTP headers + headers = [ + "Content-Security-Policy: default-src 'self' 'unsafe-inline';", + "X-Frame-Options: DENY", + "X-XSS-Protection: 0", + "X-Content-Type-Options: nosniff", + "Referrer-Policy: strict-origin-when-cross-origin" + ] ### CHANGED, default = [ "X-DNS-Prefetch-Control: off", "Content-Security-Policy: default-src 'none'; connect-src 'self'; font-src 'self'; frame-ancestors 'none'; img-src 'self'; manifest-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; form-action 'self'", "X-Frame-Options: DENY", "X-XSS-Protection: 0", "X-Content-Type-Options: nosniff", "Referrer-Policy: strict-origin-when-cross-origin" ] + + # Should the web server serve all files in webserver.paths.webroot directory? + # + # If disabled, only files within the path defined through webserver.paths.webhome and + # /api will be served. + # + # Allowed values are: + # true or false + serve_all = false + + # Additional options passed directly to the web server. + # + # This can be used to set any option supported by the underlying web server + # (CivetWeb). See the CivetWeb documentation for a list of supported options. The + # options are passed as an array of strings, where each string is an option in the + # form "