Назад | Перейти на главную страницу

Exim - ограничить адреса, с которых пользователь может отправлять

По умолчанию 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}
    

    и установить некоторые идентификатор на сервере.