Skip to content

Commit 511af0c

Browse files
committed
feat(dkim): Replace OpenDKIM with DKIM Milter
Signed-off-by: Jagoda Ślązak <jslazak@jslazak.com>
1 parent 0e7ab96 commit 511af0c

15 files changed

Lines changed: 160 additions & 269 deletions

File tree

cmdeploy/src/cmdeploy/deployers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525
configure_remote_units,
2626
get_resource,
2727
)
28+
from .dkim_milter.deployer import DkimMilterDeployer
2829
from .dovecot.deployer import DovecotDeployer
2930
from .mtail.deployer import MtailDeployer
3031
from .nginx.deployer import NginxDeployer
31-
from .opendkim.deployer import OpendkimDeployer
3232
from .postfix.deployer import PostfixDeployer
3333
from .www import build_webpages, find_merge_conflict, get_paths
3434

@@ -565,7 +565,7 @@ def deploy_chatmail(config_path: Path, disable_mail: bool) -> None:
565565
WebsiteDeployer(config),
566566
ChatmailVenvDeployer(config),
567567
MtastsDeployer(),
568-
OpendkimDeployer(mail_domain),
568+
DkimMilterDeployer(mail_domain),
569569
# Dovecot should be started before Postfix
570570
# because it creates authentication socket
571571
# required by Postfix.
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
"""
2+
Installs DKIM Milter.
3+
"""
4+
5+
from pyinfra import host
6+
from pyinfra.facts.files import File
7+
from pyinfra.operations import apt, files, server, systemd
8+
9+
from cmdeploy.basedeploy import Deployer, get_resource
10+
11+
12+
class DkimMilterDeployer(Deployer):
13+
required_users = [("dkim-milter", None, ["dkim-milter"])]
14+
15+
def __init__(self, mail_domain):
16+
self.mail_domain = mail_domain
17+
18+
def install(self):
19+
"""Builds and installs dkim-milter"""
20+
21+
# openssl is required to generate the signing key
22+
apt.packages(
23+
name="Install openssl required by DKIM Milter",
24+
packages=["openssl"],
25+
)
26+
27+
# TODO: publish the binaries and install script
28+
server.shell(
29+
name="Install DKIM Milter",
30+
commands=[
31+
"""INSTALL_PATH='/usr/sbin' bash -c 'curl --proto "=https" --tlsv1.2 -LsSf https://github.com/chatmail/dkim-milter/releases/download/1.0.0/dkim-milter-installer.sh | sh'"""
32+
],
33+
)
34+
35+
def configure(self):
36+
"""Configures dkim-milter"""
37+
38+
domain = self.mail_domain
39+
# note - we are using "opendkim" for backward compatibility
40+
# for relays that were set up before we migrated from OpenDKIM
41+
# to DKIM Milter.
42+
selector = "opendkim"
43+
signing_key_name = selector
44+
# for backward compatibility with opendkim-genkey
45+
signing_key_filename = f"{signing_key_name}.private"
46+
config = {
47+
"domain": domain,
48+
"selector": selector,
49+
"signing_key_name": signing_key_name,
50+
"signing_key_filename": signing_key_filename,
51+
}
52+
53+
self.need_restart = False
54+
55+
self.need_restart |= files.directory(
56+
name="Create a directory for DKIM Milter config",
57+
path="/etc/dkim-milter",
58+
user="dkim-milter",
59+
group="dkim-milter",
60+
mode="750",
61+
present=True,
62+
).changed
63+
64+
self.need_restart |= files.directory(
65+
name="Create dkimkeys directory",
66+
path="/etc/dkimkeys",
67+
user="opendkim",
68+
group="opendkim",
69+
mode="750",
70+
present=True,
71+
).changed
72+
73+
self.need_restart |= files.template(
74+
src=get_resource("dkim_milter/dkim-milter.conf"),
75+
dest="/etc/dkim-milter/dkim-milter.conf",
76+
user="dkim-milter",
77+
group="dkim-milter",
78+
mode="644",
79+
config=config,
80+
).changed
81+
82+
self.need_restart |= files.template(
83+
src=get_resource("dkim_milter/signing-keys"),
84+
dest="/etc/dkim-milter/signing-keys",
85+
user="dkim-milter",
86+
group="dkim-milter",
87+
mode="644",
88+
config=config,
89+
).changed
90+
91+
self.need_restart |= files.template(
92+
src=get_resource("dkim_milter/signing-senders"),
93+
dest="/etc/dkim-milter/signing-senders",
94+
user="dkim-milter",
95+
group="dkim-milter",
96+
mode="644",
97+
config=config,
98+
).changed
99+
100+
if not host.get_fact(File, f"/etc/dkimkeys/{signing_key_filename}"):
101+
server.shell(
102+
name=f"Generate DKIM Milter signing key '{signing_key_name}'",
103+
commands=[
104+
f"openssl genpkey -algorithm RSA -out /etc/dkimkeys/{signing_key_filename}"
105+
],
106+
)
107+
self.need_restart = True
108+
109+
# enforce restrictive permissions for the signing key
110+
self.need_restart |= files.file(
111+
path=f"/etc/dkimkeys/{signing_key_filename}",
112+
present=True,
113+
user="dkim-milter",
114+
group="dkim-milter",
115+
mode="0400",
116+
).changed
117+
118+
self.need_restart |= files.put(
119+
name="Create dkim-milter service",
120+
src=get_resource("dkim-milter/dkim-milter.service"),
121+
dest="/etc/systemd/system/dkim-milter.service",
122+
).changed
123+
124+
def activate(self):
125+
"""Start and enable DKIM Milter"""
126+
systemd.service(
127+
name="Start and enable DKIM Milter",
128+
service="dkim-milter.service",
129+
running=True,
130+
enabled=True,
131+
daemon_reload=self.need_restart,
132+
restarted=self.need_restart,
133+
)
134+
self.need_restart = False
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
signing_keys = /etc/dkim-milter/signing-keys
2+
signing_senders = /etc/dkim-milter/signing-senders
3+
socket = unix:dkim-milter/dkim-milter.sock
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[Unit]
2+
Description=DKIM Milter
3+
Documentation=man:dkim-milter(8) man:dkim-milter.conf(5)
4+
After=network-online.target nss-lookup.target
5+
Wants=network-online.target
6+
7+
[Service]
8+
User=dkim-milter
9+
ExecStart=/usr/sbin/dkim-milter
10+
ExecReload=/bin/kill -HUP $MAINPID
11+
Restart=on-failure
12+
13+
[Install]
14+
WantedBy=multi-user.target
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Key name Signing key
2+
{{ config.signing_key_name }} </etc/dkimkeys/{{ config.signing_key_filename }}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Sender expression Domain Selector Key name
2+
.{{ config.domain }} {{ config.domain }} {{ config.selector }} {{ config.signing_key_name }}

cmdeploy/src/cmdeploy/opendkim/KeyTable

Lines changed: 0 additions & 1 deletion
This file was deleted.

cmdeploy/src/cmdeploy/opendkim/SigningTable

Lines changed: 0 additions & 1 deletion
This file was deleted.

cmdeploy/src/cmdeploy/opendkim/deployer.py

Lines changed: 0 additions & 123 deletions
This file was deleted.

cmdeploy/src/cmdeploy/opendkim/final.lua

Lines changed: 0 additions & 42 deletions
This file was deleted.

0 commit comments

Comments
 (0)