public
nobgit
read
NobMail
Based on mailcow: dockerized
Languages
Repository composition by tracked source files.
PHP
49%
JavaScript
35%
HTML
9%
CSS
4%
Shell
2%
Python
1%
Lua
0%
Perl
0%
Ruby
0%
SCSS
0%
Create file
Wiki Documentation
Clone
https://nobgit.com/orgs/nobgit/nobmail.git
ssh://[email protected]:2222/orgs/nobgit/nobmail.git
Commit
[Postfix/Rspamd] Do not reject unauthenticated sender mismatches but rewrite their subject and assign symbol SPOOFED_SENDER with score 1.0
073c6c6e
data/conf/postfix/main.cf | 2 +-
data/conf/rspamd/local.d/force_actions.conf | 7 ++++++-
data/conf/rspamd/local.d/metrics.conf | 4 ++++
data/conf/rspamd/local.d/multimap.conf | 17 ++++++++++++-----
data/conf/rspamd/lua/rspamd.local.lua | 3 +++
5 files changed, 26 insertions(+), 7 deletions(-)
Diff
diff --git a/data/conf/postfix/main.cf b/data/conf/postfix/main.cf
index 3ee6e59c..edf5c6d5 100644
--- a/data/conf/postfix/main.cf
+++ b/data/conf/postfix/main.cf
@@ -62,7 +62,7 @@ smtpd_sasl_authenticated_header = yes
smtpd_sasl_path = inet:dovecot:10001
smtpd_sasl_type = dovecot
smtpd_sender_login_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_sender_acl.cf
-smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch, permit_mynetworks, reject_sender_login_mismatch, permit_sasl_authenticated, reject_unlisted_sender, reject_unknown_sender_domain
+smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch, permit_mynetworks, permit_sasl_authenticated, reject_unlisted_sender, reject_unknown_sender_domain
smtpd_soft_error_limit = 3
smtpd_tls_auth_only = yes
smtpd_tls_dh1024_param_file = /etc/ssl/mail/dhparams.pem
diff --git a/data/conf/rspamd/local.d/force_actions.conf b/data/conf/rspamd/local.d/force_actions.conf
index 3373ce15..956402f5 100644
--- a/data/conf/rspamd/local.d/force_actions.conf
+++ b/data/conf/rspamd/local.d/force_actions.conf
@@ -2,7 +2,7 @@ rules {
DKIM_FAIL {
action = "add header";
expression = "R_DKIM_REJECT & !MAILLIST & !MAILCOW_WHITE & !MAILCOW_BLACK";
- require_action = ["no action", "greylist"];
+ require_action = ["no action", "greylist", "soft reject"];
}
VIRUS_FOUND {
action = "reject";
@@ -19,4 +19,9 @@ rules {
expression = "WHITELISTED_FWD_HOST";
require_action = ["greylist", "soft reject"];
}
+ ADD_UNAUTH_SUBJ {
+ action = "rewrite subject";
+ subject = "[Unauth] %s";
+ expression = "SPOOFED_SENDER";
+ }
}
diff --git a/data/conf/rspamd/local.d/metrics.conf b/data/conf/rspamd/local.d/metrics.conf
index b3afa78c..d3eb2657 100644
--- a/data/conf/rspamd/local.d/metrics.conf
+++ b/data/conf/rspamd/local.d/metrics.conf
@@ -34,3 +34,7 @@ group "MX" {
one_shot = "true";
}
}
+symbol "SPOOFED_SENDER" {
+ description = "Sender is not authenticated but part of mailcow managed domains";
+ score = 1.0;
+}
diff --git a/data/conf/rspamd/local.d/multimap.conf b/data/conf/rspamd/local.d/multimap.conf
index d524264e..d9dd88ce 100644
--- a/data/conf/rspamd/local.d/multimap.conf
+++ b/data/conf/rspamd/local.d/multimap.conf
@@ -1,22 +1,29 @@
RCPT_MAILCOW_DOMAIN {
type = "rcpt";
- filter = "email:domain"
- map = "redis://DOMAIN_MAP"
+ filter = "email:domain";
+ map = "redis://DOMAIN_MAP";
}
RCPT_WANTS_SUBJECT_TAG {
type = "rcpt";
filter = "email:addr"
- map = "redis://RCPT_WANTS_SUBJECT_TAG"
+ map = "redis://RCPT_WANTS_SUBJECT_TAG";
}
WHITELISTED_FWD_HOST {
type = "ip";
- map = "redis://WHITELISTED_FWD_HOST"
+ map = "redis://WHITELISTED_FWD_HOST";
}
KEEP_SPAM {
type = "ip";
- map = "redis://KEEP_SPAM"
+ map = "redis://KEEP_SPAM";
action = "accept";
}
+
+SPOOFED_SENDER {
+ type = "rcpt";
+ filter = "email:domain";
+ map = "redis://DOMAIN_MAP";
+ require_symbols = "AUTH_NA | !RCVD_VIA_SMTP_AUTH";
+}
diff --git a/data/conf/rspamd/lua/rspamd.local.lua b/data/conf/rspamd/lua/rspamd.local.lua
index c1a8f48f..3d515bf0 100644
--- a/data/conf/rspamd/lua/rspamd.local.lua
+++ b/data/conf/rspamd/lua/rspamd.local.lua
@@ -58,6 +58,9 @@ rspamd_config:register_symbol({
local redis_params = rspamd_parse_redis_server('dyn_rl')
local rspamd_logger = require "rspamd_logger"
local envfrom = task:get_from(1)
+ if not envfrom then
+ return false
+ end
local env_from_domain = envfrom[1].domain:lower() -- get smtp from domain in lower case
local env_from_addr = envfrom[1].addr:lower() -- get smtp from addr in lower case