From be6b4f87350ae44de04947356a5f9f9836c152b0 Mon Sep 17 00:00:00 2001
From: Kristian Klausen <kristian@klausen.dk>
Date: Thu, 17 Dec 2020 14:33:04 +0100
Subject: [PATCH] Setup MTA-STS in testing mode

https://tools.ietf.org/html/rfc8461
---
 playbooks/mail.archlinux.org.yml        |  2 ++
 roles/mta_sts/defaults/main.yml         |  1 +
 roles/mta_sts/tasks/main.yml            | 11 +++++++
 roles/mta_sts/templates/nginx.d.conf.j2 | 38 +++++++++++++++++++++++++
 tf-stage1/archlinux.tf                  | 16 +++++++++++
 5 files changed, 68 insertions(+)
 create mode 100644 roles/mta_sts/defaults/main.yml
 create mode 100644 roles/mta_sts/tasks/main.yml
 create mode 100644 roles/mta_sts/templates/nginx.d.conf.j2

diff --git a/playbooks/mail.archlinux.org.yml b/playbooks/mail.archlinux.org.yml
index f06f7ab0f..70272765d 100644
--- a/playbooks/mail.archlinux.org.yml
+++ b/playbooks/mail.archlinux.org.yml
@@ -8,6 +8,8 @@
     - { role: root_ssh }
     - { role: borg_client, tags: ['borg'] }
     - { role: certbot }
+    - { role: nginx }
+    - { role: mta_sts }
     - { role: postfix, postfix_server: true, postfix_smtpd_public: true, tags: ['mail'] }
     - { role: dovecot }
     - { role: rspamd, tags: ["mail"] }
diff --git a/roles/mta_sts/defaults/main.yml b/roles/mta_sts/defaults/main.yml
new file mode 100644
index 000000000..4ec5575a8
--- /dev/null
+++ b/roles/mta_sts/defaults/main.yml
@@ -0,0 +1 @@
+mta_sts_domain: mta-sts.archlinux.org
diff --git a/roles/mta_sts/tasks/main.yml b/roles/mta_sts/tasks/main.yml
new file mode 100644
index 000000000..26dca3eac
--- /dev/null
+++ b/roles/mta_sts/tasks/main.yml
@@ -0,0 +1,11 @@
+---
+- name: create ssl cert
+  command: certbot certonly --email webmaster@archlinux.org --agree-tos --rsa-key-size 4096 --renew-by-default --webroot -w {{ letsencrypt_validation_dir }} -d '{{ mta_sts_domain }}' creates='/etc/letsencrypt/live/{{ mta_sts_domain }}/fullchain.pem'
+
+- name: make nginx log dir
+  file: path=/var/log/nginx/{{ mta_sts_domain }} state=directory owner=root group=root mode=0755
+
+- name: set up nginx
+  template: src=nginx.d.conf.j2 dest="/etc/nginx/nginx.d/mta-sts.conf" owner=root group=root mode=644
+  notify: reload nginx
+  tags: ['nginx']
diff --git a/roles/mta_sts/templates/nginx.d.conf.j2 b/roles/mta_sts/templates/nginx.d.conf.j2
new file mode 100644
index 000000000..894a56f53
--- /dev/null
+++ b/roles/mta_sts/templates/nginx.d.conf.j2
@@ -0,0 +1,38 @@
+server {
+    listen       80;
+    listen       [::]:80;
+    server_name  {{ mta_sts_domain }};
+
+    access_log   /var/log/nginx/{{ mta_sts_domain }}/access.log reduced;
+    error_log    /var/log/nginx/{{ mta_sts_domain }}/error.log;
+
+    include snippets/letsencrypt.conf;
+
+    location / {
+        access_log off;
+        return 301 https://$server_name$request_uri;
+    }
+}
+
+server {
+    listen       443 ssl http2;
+    listen       [::]:443 ssl http2;
+    server_name  {{ mta_sts_domain }};
+
+    access_log   /var/log/nginx/{{ mta_sts_domain }}/access.log reduced;
+    error_log    /var/log/nginx/{{ mta_sts_domain }}/error.log;
+
+    ssl_certificate      /etc/letsencrypt/live/{{ mta_sts_domain }}/fullchain.pem;
+    ssl_certificate_key  /etc/letsencrypt/live/{{ mta_sts_domain }}/privkey.pem;
+    ssl_trusted_certificate /etc/letsencrypt/live/{{ mta_sts_domain }}/chain.pem;
+
+    location /.well-known/mta-sts.txt {
+        default_type text/plain;
+        return 200 'version: STSv1\nmode: testing\nmax_age: 604800\nmx: mail.archlinux.org\n';
+    }
+
+    location / {
+        access_log off;
+        return 404;
+    }
+}
diff --git a/tf-stage1/archlinux.tf b/tf-stage1/archlinux.tf
index e8cfc7536..b3ebb51ec 100644
--- a/tf-stage1/archlinux.tf
+++ b/tf-stage1/archlinux.tf
@@ -613,6 +613,22 @@ resource "hetznerdns_record" "archlinux_org_mail_aaaa" {
   type    = "AAAA"
 }
 
+resource "hetznerdns_record" "archlinux_org_mtasts_cname" {
+  zone_id = hetznerdns_zone.archlinux.id
+  name    = "mta-sts"
+  value   = "mail"
+  type    = "CNAME"
+}
+
+resource "hetznerdns_record" "archlinux_org__mtasts_txt" {
+  zone_id = hetznerdns_zone.archlinux.id
+  name    = "_mta-sts"
+  ttl     = 600
+  # date +%s
+  value = "\"v=STSv1; id=1608210175\""
+  type  = "TXT"
+}
+
 resource "hetznerdns_record" "archlinux_org_origin_mx" {
   for_each = toset(["@", "aur", "master-key"])
 
-- 
GitLab