По умолчанию exim позволяет любому пользователю отправлять электронное письмо с любым адресом «От:», который он пожелает, что может привести к подмене пользователями друг друга. Как мне ограничить, с каких адресов каждый пользователь системы может отправлять сообщения? Например, пользователь james
должна иметь возможность отправлять с james @ localhost, но также с me@my-domain.com и james@other-domain.com.
Я хочу, чтобы все пользователи системы могли отправлять электронную почту со своего SYSTEM_USER @ HOSTNAME, но если они попытаются отправить с другого адреса, я хочу найти этот адрес в текстовом файле, чтобы узнать, разрешено ли это.
В настоящее время у меня есть список, но он по каким адресам будет получать пользователь системы. Но все еще могло работать. На примере me@my-domain.com
данные хранятся в файле /etc/exim4/virtual/my-domain.com
где контент выглядит так:
me : james@localhost
Было бы здорово, если бы мы могли повторно использовать существующие файлы. Но любые предложения были бы полезны. Заранее спасибо.
Exim4 уже выполняет стандартные проверки отправителя конверта, From:
и Sender:
отправленных локально сообщений (см. доверенные пользователи). Поскольку вы хотите продлить эту проверку, вам следует:
Для сообщений, отправленных через sendmail
(т.е. exim4 -bm
), добавьте в основной раздел конфигурации:
# allow untrusted users to set an envelope sender
untrusted_set_sender = *
# don't delete the Sender: header
local_sender_retain = true
# don't add Sender: header
local_from_check = false
Для сообщений, отправленных через SMTP
вам нужно добавить control = submission/sender_retain
модификатор. Например. В Debian MAIL
acl правило:
accept
authenticated = *
control = submission/sender_retain
control = dkim_disable_verify
Для настройки чека вам нужно добавить пару ACL
правила на разных этапах обработки почты. Поскольку эти правила необходимо применять к различным способам отправки сообщений, вы можете создать новый именованный ACL
(Я предполагаю, что все твои /etc/exim4/virtual/<domain>
файлы возвращаются username@localhost
как значение):
# Requires system user id in $acl_arg1
acl_check_sender:
# Users with default domain
accept
condition = ${if eq{$sender_address}{$acl_arg1@$qualify_domain}}
condition = ${if eq{${address:$h_from:}}{$acl_arg1@$qualify_domain}}
condition = ${if match_address{${address:$h_sender:}}{:$acl_arg1@$qualify_domain}}
deny
! condition = ${if and{\
{exists{/etc/exim4/virtual/${domain:${address:$h_from:}}}}\
{eq {${acl_arg1}@localhost}\
{${lookup {${local_part:${address:$h_from:}}}\
lsearch{/etc/exim4/virtual/${domain:${address:$h_from:}}}\
}}\
}\
}}
message = Spoofed From: header.
# Most messages don't have a Sender: header, but if it is not empty, check it.
deny
! condition = ${if or{\
{eq {$h_sender:}{}}\
{and{\
{exists{/etc/exim4/virtual/${domain:${address:$h_sender:}}}}\
{eq {${acl_arg1}@localhost}\
{${lookup {${local_part:${address:$h_sender:}}}\
lsearch{/etc/exim4/virtual/${domain:${address:$h_sender:}}}\
}}\
}\
}}\
}}
message = Spoofed Sender: header.
deny
! condition = ${if and{\
{exists{/etc/exim4/virtual/$sender_address_domain}}\
{eq {${acl_arg1}@localhost}\
{${lookup {$sender_address_local_part}\
lsearch{/etc/exim4/virtual/$sender_address_domain}\
}}\
}\
}}
message = Spoofed envelope sender.
accept
Чтобы узнать о синтаксисе раскрытия строки (довольно много фигурных скобок), проверьте Глава 11 документации Exim. Ты можешь использовать exim4 -bem <message> <expansion_string>
чтобы проверить их (отправитель конверта передается в сообщении как mbox формат).
Вы можете применить его к различным ситуациям:
Для сообщений, отправленных через exim4 -bm
добавить в acl_not_smtp
ACL следующее правило:
deny
! acl = acl_check_sender ${sender_ident}
Для сообщений, отправленных аутентифицированными пользователями через SMTP
добавить к acl_smtp_data
ACL что-то вроде:
deny
authenticated = *
! acl = acl_check_sender ${authenticated_id}
Некоторые программы отправляют сообщения с помощью не-аутентифицирован SMTP
связь с localhost
(или exim -bs
). Для них вы можете добавить в acl_smtp_data
ACL:
deny
hosts = : localhost
! acl = acl_check_sender ${sender_ident}
и установить некоторые идентификатор на сервере.