LINUX.ORG.RU
ФорумAdmin

postfix+opendkim подпись спуфингового письма

 ,


0

2

добрый день

обнаружил нынче в почте письмо, отправителем которого значился мой адрес. несколько удивленный этим фактом, полез смотреть внутрь, и обнаружил, что слегка легитимный сервер, тупо подмена From.

Return-Path: <pavel.kesler@expo-sochi.ru>
Delivered-To: me@mydomain.org
Received: by mail.mydomain.org (Postfix, from userid 115)
	id AF3E0FDE8F; Sun, 17 Feb 2019 02:32:38 +0300 (MSK)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mydomain.org; s=mail;
	t=1550359958; bh=sUf8VWPXX+cYhlkgNOetUuy2AhZpdYo9ZJg8iplVET4=;
	h=Date:Subject:To:From:From;
	b=koiFVqWusT3OSNN0KCEa8/VbK5Np1QbUN1APO0Z+7qtBrszqp56VOfrXtm0Ix7uqz
	 40veaFGcRv+u+onUrKv2xNdDKat5BNmV95G8wgbY3WJ7Ty1+XuAhvbZldYd20gFQDc
	 8yZYGHLVYlZmrKb6J02SLAeA0fsst1A29f612axo=
Received-SPF: None (mailfrom) identity=mailfrom; client-ip=80.250.219.18; helo=mail.expo-sochi.ru; envelope-from=pavel.kesler@expo-sochi.ru; receiver=<UNKNOWN> 
Received: from mail.expo-sochi.ru (unknown [80.250.219.18])
	(using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by mail.mydomain.org (Postfix) with ESMTPS id 82777FDE83
	for <me@mydomain.org>; Sun, 17 Feb 2019 02:32:35 +0300 (MSK)
X-Footer: ZXhwby1zb2NoaS5ydQ==
Received: from localhost ([127.0.0.1])
	by mail.expo-sochi.ru with ESMTPSA
	(using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256 bits))
	for me@mydomain.org;
	Sun, 17 Feb 2019 02:31:09 +0300
Date: Sun, 17 Feb 2019 00:32:20 +0100
X-aid: 9584699490
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=UTF-8
X-Mailer: iPad Mail (15G77)
Message-ID: <hlavf5vp3fkl02f0lqddqc1rbghgjj085tya@www.expo-sochi.ru>
Organization: Lkxtmmedgzfpx
X-Sender: pavel.kesler@expo-sochi.ru
Subject: mail
To: me@mydomain.org
Errors-To: security@expo-sochi.ru
X-Complaints-To: <abuse@mail.expo-sochi.ru>
From: <me@mydomain.org>
пошел в боевом настроение курить конфиги и читать интернеты, узнавать много нового, в том числе о себе, в том числе не очень приятного. в итоге для меня было открытием, что spf не судит по полю From (http://www.openspf.org/FAQ/Envelope_from_scope). а также отсутствие не костыльных решений отлупа писем с полем From, содержащем домен сервера принимающей стороны (при отсутствии авторизации это же абсолютная норма. или я ошибаюсь?). а потом я остановил взгляд на том, что на этом письме стоит DKIM подпись моего сервера. начал слать себе письма с другого сервера с подменой поля From, вербозные логи говорят следующее.
Feb 19 00:51:40 mail postfix/smtpd[21759]: connect from mail.test.ru[0.0.0.0]
Feb 19 00:51:41 mail policyd-spf[21765]: prepend Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=0.0.0.0; helo=mail.test.ru; envelope-from=root@test.ru; receiver=<UNKNOWN>
Feb 19 00:51:41 mail postfix/smtpd[21759]: 4C620EC130: client=mail.test.ru[0.0.0.0]
Feb 19 00:51:41 mail postfix/cleanup[21766]: 4C620EC130: message-id=<20190218215102.A16B5607F5B@mail.test.ru>
Feb 19 00:51:41 mail opendkim[21564]: 4C620EC130: mail.test.ru [0.0.0.0] not internal
Feb 19 00:51:41 mail opendkim[21564]: 4C620EC130: not authenticated
Feb 19 00:51:41 mail opendkim[21564]: 4C620EC130: no signature data
Feb 19 00:51:41 mail postfix/qmgr[21314]: 4C620EC130: from=<root@test.ru>, size=746, nrcpt=1 (queue active)
Feb 19 00:51:41 mail spamd[20702]: spamd: connection from ::1 [::1]:47136 to port 783, fd 5
Feb 19 00:51:41 mail spamd[20702]: spamd: setuid to debian-spamd succeeded
Feb 19 00:51:41 mail spamd[20702]: spamd: creating default_prefs: /var/lib/spamassassin/.spamassassin/user_prefs
Feb 19 00:51:41 mail spamd[20702]: spamd: processing message <20190218215102.A16B5607F5B@mail.test.ru> for debian-spamd:115
Feb 19 00:51:41 mail postfix/smtpd[21759]: disconnect from mail.test.ru[0.0.0.0] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7
Feb 19 00:51:41 mail spamd[20702]: spamd: clean message (1.1/3.0) for debian-spamd:115 in 0.5 seconds, 696 bytes.
Feb 19 00:51:41 mail spamd[20702]: spamd: result: . 1 - DKIM_ADSP_ALL,RCVD_IN_DNSWL_NONE,SPF_PASS scantime=0.5,size=696,user=debian-spamd,uid=115,required_score=3.0,rhost=::1,raddr=::1,rport=47136,mid=<20190218215102.A16B5607F5B@mail.test.ru>,autolearn=no autolearn_force=no
Feb 19 00:51:41 mail postfix/pickup[21313]: E79C8ED2A6: uid=115 from=<root@test.ru>
Feb 19 00:51:41 mail postfix/pipe[21767]: 4C620EC130: to=<me@mydomain.org>, relay=spamassassin, delay=1.3, delays=0.77/0.02/0/0.52, dsn=2.0.0, status=sent (delivered via spamassassin service)
Feb 19 00:51:41 mail postfix/qmgr[21314]: 4C620EC130: removed
Feb 19 00:51:41 mail postfix/cleanup[21766]: E79C8ED2A6: message-id=<20190218215102.A16B5607F5B@mail.test.ru>
Feb 19 00:51:41 mail opendkim[21564]: E79C8ED2A6: DKIM-Signature field added (s=mail, d=mydomain.org)
Feb 19 00:51:41 mail spamd[20701]: prefork: child states: II
Feb 19 00:51:42 mail postfix/qmgr[21314]: E79C8ED2A6: from=<root@test.ru>, size=1080, nrcpt=1 (queue active)
Feb 19 00:51:42 mail postfix/qmgr[21314]: E79C8ED2A6: removed
ниже привожу конфиги, а здесь возникшие вопросы: 1) я накосячил с конфигом, или что это за поведение opendkim? 2) как красиво закрыться от подобного спуфинга без dmarc? check_sender_access оперирует в данном случае полем Return-Path. header_checks не позволит ходить письмам внутри домена.

main.cf (то, что не по теме - убрал)

milter_default_action = accept
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

smtpd_client_restrictions =
 permit_mynetworks
 permit_sasl_authenticated
 check_client_access hash:/etc/postfix/whitelist  
 warn_if_reject reject_unknown_client_hostname
 reject_rbl_client bl.spamcop.net
 reject_rbl_client zen.spamhaus.org
 permit
 
smtpd_helo_restrictions =
 permit_mynetworks
 permit_sasl_authenticated
 check_helo_access pcre:/etc/postfix/checks/helo_checks.pcre
 reject_invalid_helo_hostname
 reject_unknown_helo_hostname
 reject_non_fqdn_helo_hostname
 warn_if_reject reject_unknown_helo_hostname
 permit
 
smtpd_sender_restrictions =
 permit_mynetworks
 reject_non_fqdn_sender
 reject_unknown_sender_domain
 reject_sender_login_mismatch
 permit_sasl_authenticated
 permit
 
smtpd_recipient_restrictions =
 permit_mynetworks
 permit_sasl_authenticated
 reject_unauth_pipelining
 reject_non_fqdn_recipient
 reject_unknown_recipient_domain
 reject_unauth_destination
 check_policy_service unix:private/policy-spf
 reject_unlisted_recipient
 check_sender_access pcre:/etc/postfix/checks/sender_checks.pcre
 permit
 
smtpd_data_restrictions =
 permit_mynetworks
 permit_sasl_authenticated
 reject_unauth_pipelining
 permit
 
smtpd_end_of_data_restrictions =
 permit_mynetworks
 permit_sasl_authenticated
 reject_multi_recipient_bounce
 permit

opendkim.conf

Syslog			yes
KeyTable		file:/etc/postfix/dkim/keytable
SigningTable		file:/etc/postfix/dkim/signingtable
SubDomains              yes
LogWhy yes
SyslogSuccess	yes
Canonicalization        relaxed/simple
Mode                    sv
Socket                  inet:8891@localhost
ReportAddress           postmaster@mydomain.org
SendReports             yes
PidFile               /var/run/opendkim/opendkim.pid
UserID                opendkim


Ответ на: комментарий от Bootmen

warn_if_reject reject_unknown_client_hostname

Калитка для ботов?

Это не калитка, это открытые ворота:

permit

mord0d ★★★★★
()

что только не делают, лишь бы dmarc не настроить.

anonymous
()
Ответ на: комментарий от Bootmen

warn_if_reject reject_unknown_client_hostname

двумя строками выше все реджектится.

Калитка для ботов?

Это не калитка, это открытые ворота:
permit

семь лет функционирует, ни того, ни другого как-то не найдено. что должно успешно отсеивается, банится, фильтруется. за редкими исключениями.

и чем вам не угодил permit после проверок?

что только не делают, лишь бы dmarc не настроить.

да, dmarc необходим.

а по теме кто-нибудь подскажет?

byy
() автор топика
Ответ на: комментарий от byy

а по теме кто-нибудь подскажет?

по теме, после пропуска аутифицированных ставите check_sender_access , где отсекаете все from от ваших доменов.

constin ★★★★
()
Ответ на: комментарий от constin

по теме, после пропуска аутифицированных ставите check_sender_access , где отсекаете все from от ваших доменов.

насчет этого я писал в первом сообщении:

check_sender_access оперирует в данном случае полем Return-Path.

для наглядности привожу вербозный лог письма с подделанным From, а также хидерсы этого письма. соответственно шлю с mail.test.ru от root@test.ru на mail.mydomain.org для me@mydomain.org. mail.test.ru работающий настроенный почтовый сервер.

Feb 20 01:28:09 mail postfix/smtpd[32216]: generic_checks: name=check_sender_access
Feb 20 01:28:09 mail postfix/smtpd[32216]: check_mail_access: root@test.ru
Feb 20 01:28:09 mail postfix/smtpd[32216]: ctable_locate: move existing entry key me@mydomain.org?root@test.ru
Feb 20 01:28:09 mail postfix/smtpd[32216]: check_access: root@test.ru
Feb 20 01:28:09 mail postfix/smtpd[32216]: dict_pcre_lookup: /etc/postfix/checks/sender_checks.pcre: root@test.ru
Feb 20 01:28:09 mail postfix/smtpd[32216]: check_domain_access: test.ru
Feb 20 01:28:09 mail postfix/smtpd[32216]: check_access: root@
Feb 20 01:28:09 mail postfix/smtpd[32216]: generic_checks: name=check_sender_access status=0
Return-Path: <root@test.ru>
Delivered-To: me@mydomain.org
Received: by mail.mydomain.org (Postfix, from userid 115)
	id 4A216DF9AF; Wed, 20 Feb 2019 01:28:10 +0300 (MSK)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mydomain.org; s=mail;
	t=1550615290; bh=i0QP7X7ADTgTY8llG4NeY5Dnal1PGxvfE7uKPgHSKoM=;
	h=To:Subject:From:Date;
	b=PUEg/sDiUgN3xmapOyf2BvYdiR7O2WIE0h+Otp4chlT3XQ5lbJtafwEKvNAfUf3Vr
	 ORp5gmZ/C4l0bA4ku65iaJyXw5wXeFqwV0ZqfbhOMljtFk/+ZE0IKZNKsWdCziHwl4
	 zl+CnHi2RHXN9A8l8iB0Gn/vuVTgkGqzvacf3ALE=
X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mydomain.org
X-Spam-Level: *
X-Spam-Status: No, score=1.1 required=3.0 tests=DKIM_ADSP_ALL,
	RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=no autolearn_force=no
	version=3.4.2
Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=1.2.3.4; helo=mail.test.ru; envelope-from=root@test.ru; receiver=<UNKNOWN> 
Received: from mail.test.ru (mail.test.ru [1.2.3.4])
	(using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by mail.mydomain.org (Postfix) with ESMTPS id 6E43EDF993
	for <me@mydomain.org>; Wed, 20 Feb 2019 01:28:08 +0300 (MSK)
Received: by mail.test.ru (Postfix, from userid 0)
	id 459AA607F5E; Wed, 20 Feb 2019 01:27:28 +0300 (MSK)
To: me@mydomain.org
Subject: Subject Here
From:me@mydomain.org
Message-Id: <20190219222728.459AA607F5E@mail.test.ru>
Date: Wed, 20 Feb 2019 01:27:28 +0300 (MSK)

byy
() автор топика
Ответ на: комментарий от byy

warn_if_reject reject_unknown_client_hostname
двумя строками выше все реджектится.

Вы уверены? ::)) Тогда что говорит вам эта строка из принятого?

Received: from mail.expo-sochi.ru (unknown [80.250.219.18])

Ботов надо убивать на подлете а не ковырятся в ихней писанине. Кстати с дким у спамемерюг всегда все в порядке.

Bootmen ☆☆☆
()
Последнее исправление: Bootmen (всего исправлений: 1)
Ответ на: комментарий от Bootmen

Там селектор из его домена. Если приватный ключ не угнали,подпись не может быть правильной.

From можно чекать в header_checks

anonymous
()
Ответ на: комментарий от byy

telnet 192.168.0.2 25                           # Comments
Trying 192.168.0.2...
Connected to 192.168.0.2 (192.168.0.2).
Escape character is '^]'.
220 mail.example.com ESMTP Postfix              # <-smtp_client_restrictions
HELO mail.example.com                           # <-smtp_helo_restrictions
250 mail.example.com                            #
MAIL FROM:<ned@example.com>                     # <-smtp_sender_restrictions
250 2.1.0 Ok                                    #
RCPT TO:<ned@example.com>                       # <-smtp_recipient_restrictions
250 2.1.5 Ok                                    #
DATA                                            # <-smtp_data_restrictions
354 End data with <CR><LF>.<CR><LF>             #
To:<ned@example.com>                            # <-header_checks
From:<ned@example.com>                          #
Subject:SMTP Test                               #
This is a test message                          # <-body_checks
.                                               #
250 2.0.0 Ok: queued as 301AE20034
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
constin ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.