From 1977ffdb9d1a902e59cda4f2e9f1f5cab4da202c Mon Sep 17 00:00:00 2001
From: Julien Moutinho <julm@sourcephile.fr>
Date: Wed, 4 Mar 2020 17:37:37 +0100
Subject: [PATCH] nsd: re-add autogeree.net zone

---
 servers/mermet/knot.nix                 |   8 ++
 servers/mermet/knot/autogeree.net.nix   | 103 ++++++++++++++++++++++++
 servers/mermet/knot/sourcephile.fr.nix  |   2 +-
 servers/mermet/production/shorewall.nix |   1 +
 4 files changed, 113 insertions(+), 1 deletion(-)
 create mode 100644 servers/mermet/knot/autogeree.net.nix

diff --git a/servers/mermet/knot.nix b/servers/mermet/knot.nix
index d925c80..17302fe 100644
--- a/servers/mermet/knot.nix
+++ b/servers/mermet/knot.nix
@@ -5,6 +5,7 @@ let
 in
 {
 imports = [
+  knot/autogeree.net.nix
   knot/sourcephile.fr.nix
 ];
 options.services.knot = {
@@ -92,6 +93,9 @@ services.knot = {
       - id: secondary_gandi
         address: 217.70.177.40@53
 
+      - id: secondary_muarf
+        address: 78.192.65.63@53
+
     submission:
       - id: dnssec_validating_resolver
         parent: local_resolver
@@ -124,6 +128,10 @@ services.knot = {
         address: 217.70.177.40
         action: transfer
 
+      - id: acl_muarf
+        address: 78.192.65.63
+        action: transfer
+
   '' + lib.concatStringsSep "\n" (lib.mapAttrsToList (domain: {conf, ...}: conf) knot.zones);
 };
 };
diff --git a/servers/mermet/knot/autogeree.net.nix b/servers/mermet/knot/autogeree.net.nix
new file mode 100644
index 0000000..b6f485d
--- /dev/null
+++ b/servers/mermet/knot/autogeree.net.nix
@@ -0,0 +1,103 @@
+{ pkgs, lib, config, ... }:
+let
+  inherit (builtins.extraBuiltins) pass git;
+  inherit (pkgs.lib) unlinesAttrs types;
+  inherit (config) networking;
+  inherit (config.services) knot;
+  inherit (config) users;
+  # Use the Git commit time of the ${domain}.nix file to set the serial number.
+  # WARNING: the ${domain}.nix must be committed into Git for this to work.
+  # WARNING: this does not take other .nix into account, though they may contribute to the zone's data.
+  serial = domain: toString (git ./. [ "log" "-1" "--format=%ct" "--" (domain + ".nix") ]);
+  mermetIPv4 = "80.67.180.129";
+  domain = "autogeree.net";
+in
+{
+security.acme.certs."${domain}" = {
+  email = "root+letsencrypt@${domain}";
+  extraDomains = {
+    "*.${domain}" = null;
+  };
+  group = users.groups.acme.name;
+  allowKeysForGroup = true;
+  keyType = "rsa4096";
+  dnsProvider = "rfc2136";
+  credentialsFile = pkgs.writeText "credentials" ''
+    RFC2136_NAMESERVER=127.0.0.1:5353
+    LEGO_EXPERIMENTAL_CNAME_SUPPORT=1
+  '';
+};
+services.knot.zones."${domain}" = {
+  conf = ''
+    acl:
+      - id: acl_acme_challenge_autogeree_net
+        address: 127.0.0.1
+        action: update
+        update-owner: name
+        update-owner-match: equal
+        update-owner-name: [_acme-challenge.${domain}]
+        update-type: [TXT]
+
+    zone:
+      - domain: ${domain}
+        file: ${domain}.zone
+        serial-policy: increment
+        semantic-checks: on
+        notify: secondary_gandi
+        notify: secondary_muarf
+        acl: acl_gandi
+        acl: acl_muarf
+        acl: acl_acme_challenge_autogeree_net
+        dnssec-signing: off
+        dnssec-policy: ed25519
+  '';
+  # TODO: increase the TTL once things have settled down
+  data = ''
+    $ORIGIN ${domain}.
+    $TTL 500
+
+    ; SOA (Start Of Authority)
+    @ SOA ns admin (
+      ${serial domain} ; Serial number
+      24h   ; Refresh
+      15m   ; Retry
+      1000h ; Expire (1000h)
+      1d    ; Negative caching
+    )
+
+    ; NS (Name Server)
+    @ NS ns
+    @ NS ns6.gandi.net.
+
+    ; A (DNS -> IPv4)
+    @          A ${mermetIPv4}
+    mermet     A ${mermetIPv4}
+    autoconfig A ${mermetIPv4}
+    code       A ${mermetIPv4}
+    git        A ${mermetIPv4}
+    imap       A ${mermetIPv4}
+    mail       A ${mermetIPv4}
+    ns         A ${mermetIPv4}
+    pop        A ${mermetIPv4}
+    smtp       A ${mermetIPv4}
+    submission A ${mermetIPv4}
+    www        A ${mermetIPv4}
+    chomsky    A 91.216.110.36
+    alpes      A 195.88.84.51
+
+    ; SPF (Sender Policy Framework)
+    @ 3600 IN SPF "v=spf1 mx ip4:${mermetIPv4} -all"
+    @ 3600 IN TXT "v=spf1 mx ip4:${mermetIPv4} -all"
+
+    ; MX (Mail eXchange)
+    @ 180 MX 5 mail
+
+    ; SRV (SeRVice)
+    _git._tcp.git 18000 IN SRV 0 0 9418 git
+
+    ; CAA (Certificate Authority Authorization)
+    ; DOC: https://blog.qualys.com/ssllabs/2017/03/13/caa-mandated-by-cabrowser-forum
+    @ CAA 128 issue "letsencrypt.org"
+  '';
+};
+}
diff --git a/servers/mermet/knot/sourcephile.fr.nix b/servers/mermet/knot/sourcephile.fr.nix
index e79ac47..4201805 100644
--- a/servers/mermet/knot/sourcephile.fr.nix
+++ b/servers/mermet/knot/sourcephile.fr.nix
@@ -68,7 +68,7 @@ services.knot.zones."${domain}" = {
     @ NS ns6.gandi.net.
 
     ; A (DNS -> IPv4)
-    @ A ${mermetIPv4}
+    @          A ${mermetIPv4}
     mermet     A ${mermetIPv4}
     autoconfig A ${mermetIPv4}
     code       A ${mermetIPv4}
diff --git a/servers/mermet/production/shorewall.nix b/servers/mermet/production/shorewall.nix
index 16159bb..d8ab15a 100644
--- a/servers/mermet/production/shorewall.nix
+++ b/servers/mermet/production/shorewall.nix
@@ -11,6 +11,7 @@ let
     # By port
     DNS(ACCEPT)    $FW net {user=${users.users.unbound.name}}
     DNS(ACCEPT)    $FW net:217.70.177.40 # for knot to notify ns6.gandi.net
+    DNS(ACCEPT)    $FW net:78.192.65.63  # for knot to notify ns0.muarf.org
     Git(ACCEPT)    $FW net
     HKP(ACCEPT)    $FW net {user=${users.users.julm.name}}
     HTTP(ACCEPT)   $FW net
-- 
2.47.2