2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-08-22 09:57:34 +00:00

postfix-3.5-20190210

This commit is contained in:
Wietse Venema 2019-02-10 00:00:00 -05:00 committed by Viktor Dukhovni
parent 67965c8458
commit c6eaaf0bf1
30 changed files with 1282 additions and 491 deletions

View File

@ -149,6 +149,7 @@ Postfix daemons:
src/oqmgr/ Old queue manager src/oqmgr/ Old queue manager
src/pickup/ Local pickup src/pickup/ Local pickup
src/pipe/ Pipe delivery src/pipe/ Pipe delivery
src/postlogd/ Syslog alternative, logs to file or stdout
src/postscreen/ Zombie blocker src/postscreen/ Zombie blocker
src/proxymap/ Table lookup proxy agent src/proxymap/ Table lookup proxy agent
src/qmgr/ Queue manager src/qmgr/ Queue manager
@ -159,7 +160,7 @@ Postfix daemons:
src/smtpd/ SMTP server src/smtpd/ SMTP server
src/spawn/ Run non-Postfix server src/spawn/ Run non-Postfix server
src/tlsmgr/ TLS session keys and random pool src/tlsmgr/ TLS session keys and random pool
src/tlsproxy/ TLS proxy for postscreen src/tlsproxy/ TLS proxy for postscreen and outbound connection reuse
src/trivial-rewrite/ Address rewriting and resolving src/trivial-rewrite/ Address rewriting and resolving
src/verify/ address verification service src/verify/ address verification service
src/virtual/ virtual mailbox-only delivery agent src/virtual/ virtual mailbox-only delivery agent

View File

@ -17692,7 +17692,7 @@ Apologies for any names omitted.
20120330 20120330
Workaround: specify "\c" at the start of an smtp_reject_footer Workaround: specify "\c" at the start of an smtpd_reject_footer
template to suppress the line break between the reply text template to suppress the line break between the reply text
and the footer text. Files: global/smtp_reply_footer.c, and the footer text. Files: global/smtp_reply_footer.c,
proto/postconf.proto. proto/postconf.proto.
@ -23633,10 +23633,10 @@ Apologies for any names omitted.
20180812 20180812
Feature: smtp_reject_footer_maps (as well as the postscreen Feature: smtpd_reject_footer_maps (as well as the postscreen
variant postscreen_reject_footer_maps). This is indexed variant postscreen_reject_footer_maps). This is indexed
with the SMTP server response text, and overrides the footer with the SMTP server response text, and overrides the footer
specified with smtp_reject_footer. Files: global/mail_params.h, specified with smtpd_reject_footer. Files: global/mail_params.h,
mantools/postlink, postscreen/postscreen.c, mantools/postlink, postscreen/postscreen.c,
postscreen/postscreen_send.c, postscreen/postscreen_smtpd.c, postscreen/postscreen_send.c, postscreen/postscreen_smtpd.c,
proto/postconf.proto, smtpd/smtpd.c, smtpd/smtpd_chat.c. proto/postconf.proto, smtpd/smtpd.c, smtpd/smtpd_chat.c.
@ -24105,3 +24105,12 @@ Apologies for any names omitted.
Debugging: tlsproxy(8) now logs more details about unexpected Debugging: tlsproxy(8) now logs more details about unexpected
configuration differences between the Postfix SMTP client configuration differences between the Postfix SMTP client
and the tlsproxy(8) daemon. and the tlsproxy(8) daemon.
20190210
Documentation: Postfix 3.4.0 RELEASE NOTES.
Documentation: added BDAT_README.
Documentation: global TLS settings. Files: mantools/postlink,
smtp/smtp.c, tlsproxy/tlsproxy.c.

View File

@ -78,6 +78,7 @@ OOtthheerr ttooppiiccss
* ADDRESS_CLASS_README: Address Classes * ADDRESS_CLASS_README: Address Classes
* CONNECTION_CACHE_README: Connection cache howto * CONNECTION_CACHE_README: Connection cache howto
* DSN_README: Postfix DSN support * DSN_README: Postfix DSN support
* BDAT_README: Postfix BDAT (CHUNKING) support
* PACKAGE_README: Guidelines for Package Builders * PACKAGE_README: Guidelines for Package Builders
* SCHEDULER_README: Queue Scheduler * SCHEDULER_README: Queue Scheduler
* XCLIENT_README: XCLIENT Command * XCLIENT_README: XCLIENT Command

View File

@ -0,0 +1,124 @@
PPoossttffiixx BBDDAATT ((CCHHUUNNKKIINNGG)) ssuuppppoorrtt
-------------------------------------------------------------------------------
OOvveerrvviieeww
Postfix SMTP server supports RFC 3030 CHUNKING (the BDAT command) without
BINARYMIME, in both smtpd(8) and postscreen(8). It is enabled by default.
Topics covered in this document:
* Disabling BDAT support
* Impact on existing configurations
* Example SMTP session
* Benefits of CHUNKING (BDAT) support without BINARYMIME
* Downsides of CHUNKING (BDAT) support
DDiissaabblliinngg BBDDAATT ssuuppppoorrtt
BDAT support is enabled by default. To disable BDAT support globally:
/etc/postfix/main.cf:
# The logging alternative:
smtpd_discard_ehlo_keywords = chunking
# The non-logging alternative:
smtpd_discard_ehlo_keywords = chunking, silent_discard
Specify '-o smtpd_discard_ehlo_keywords=' in master.cf for the submission and
smtps services, if you have clients that benefit from CHUNKING support.
IImmppaacctt oonn eexxiissttiinngg ccoonnffiigguurraattiioonnss
* There are no changes for smtpd_mumble_restrictions, smtpd_proxy_filter,
smtpd_milters, or for postscreen settings, except for the above mentioned
option to suppress the SMTP server's CHUNKING service announcement.
* There are no changes in the Postfix queue file content, no changes for
down-stream SMTP servers or after-queue content filters, and no changes in
the envelope or message content that Milters will receive.
EExxaammppllee SSMMTTPP sseessssiioonn
The main differences are that the Postfix SMTP server announces "CHUNKING"
support in the EHLO response, and that instead of sending one DATA request, the
remote SMTP client may send one or more BDAT requests. In the example below,
"S:" indicates server responses, and "C:" indicates client requests (bold
font).
S: 220 server.example.com
C: EEHHLLOO cclliieenntt..eexxaammppllee..ccoomm
S: 250-server.example.com
S: 250-PIPELINING
S: 250-SIZE 153600000
S: 250-VRFY
S: 250-ETRN
S: 250-STARTTLS
S: 250-AUTH PLAIN LOGIN
S: 250-ENHANCEDSTATUSCODES
S: 250-8BITMIME
S: 250-DSN
S: 250-SMTPUTF8
S: 250 CHUNKING
C: MMAAIILL FFRROOMM::<<sseennddeerr@@eexxaammppllee..ccoomm>>
S: 250 2.1.0 Ok
C: RRCCPPTT TTOO::<<rreecciippiieenntt@@eexxaammppllee..ccoomm>>
S: 250 2.1.5 Ok
C: BBDDAATT 1100000000
C: ....ffoolllloowweedd bbyy 1100000000 bbyytteess......
S: 250 2.0.0 Ok: 10000 bytes
C: BBDDAATT 112233
C: ....ffoolllloowweedd bbyy 112233 bbyytteess......
S: 250 2.0.0 Ok: 123 bytes
C: BBDDAATT 00 LLAASSTT
S: 250 2.0.0 Ok: 10123 bytes queued as 41yYhh41qmznjbD
C: QQUUIITT
S: 221 2.0.0 Bye
Internally in Postfix, there is no difference between mail that was received
with BDAT or with DATA. Postfix smtpd_mumble_restrictions, policy delegation
queries, smtpd_proxy_filter and Milters all behave as if Postfix received (MAIL
+ RCPT + DATA + end-of-data). However, Postfix will log BDAT-related failures
as "xxx after BDAT" to avoid complicating troubleshooting (xxx = 'lost
connection' or 'timeout'), and will log a warning when a client sends a
malformed BDAT command.
BBeenneeffiittss ooff CCHHUUNNKKIINNGG ((BBDDAATT)) ssuuppppoorrtt wwiitthhoouutt BBIINNAARRYYMMIIMMEE
Support for CHUNKING (BDAT) was added to improve interoperability with some
clients, a benefit that would reportedly exist even without Postfix support for
BINARYMIME. Since June 2018, Wietse's mail server has received BDAT commands
from a variety of systems.
Postfix does not support BINARYMIME at this time because:
* BINARYMIME support would require moderately invasive changes to Postfix, to
support email content that is not line-oriented. With BINARYMIME, the
Content-Length: message header specifies the length of content that may or
may not have line boundaries. Without BINARYMIME support, email RFCs
require that binary content is base64-encoded, and formatted as lines of
text.
* For delivery to non-BINARYMIME systems including UNIX mbox, the available
options are to convert binary content into 8bit text, one of the 7bit forms
(base64 or quoted-printable), or to return email as undeliverable. Any
conversion would obviously break digital signatures, so conversion would
have to happen before signing.
DDoowwnnssiiddeess ooff CCHHUUNNKKIINNGG ((BBDDAATT)) ssuuppppoorrtt
The RFC 3030 authors did not specify any limitations on how clients may
pipeline commands (i.e. send commands without waiting for a server response).
If a server announces PIPELINING support, like Postfix does, then a remote SMTP
client can pipeline all commands following EHLO, for example, MAIL/RCPT/BDAT/
BDAT/MAIL/RCPT/BDAT, without ever having to wait for a server response. This
means that with BDAT, the Postfix SMTP server cannot distinguish between a
well-behaved client and a spambot, based on their command pipelining behavior.
If you require "reject_unauth_pipelining" to block spambots, then turn off
Postfix's CHUNKING announcement as described above.
In RFC 4468, the authors write that a client may pipeline commands, and that
after sending BURL LAST or BDAT LAST, a client must wait for the server's
response. But as this text does not appear in RFC 3030 which defines BDAT, is
it a useless restriction that Postfix will not enforce.

View File

@ -1,19 +1,19 @@
This is the Postfix 3.4 (experimental) release. This is the Postfix 3.5 (experimental) release.
The stable Postfix release is called postfix-3.3.x where 3=major The stable Postfix release is called postfix-3.4.x where 3=major
release number, 3=minor release number, x=patchlevel. The stable release number, 4=minor release number, x=patchlevel. The stable
release never changes except for patches that address bugs or release never changes except for patches that address bugs or
emergencies. Patches change the patchlevel and the release date. emergencies. Patches change the patchlevel and the release date.
New features are developed in snapshot releases. These are called New features are developed in snapshot releases. These are called
postfix-3.4-yyyymmdd where yyyymmdd is the release date (yyyy=year, postfix-3.5-yyyymmdd where yyyymmdd is the release date (yyyy=year,
mm=month, dd=day). Patches are never issued for snapshot releases; mm=month, dd=day). Patches are never issued for snapshot releases;
instead, a new snapshot is released. instead, a new snapshot is released.
The mail_release_date configuration parameter (format: yyyymmdd) The mail_release_date configuration parameter (format: yyyymmdd)
specifies the release date of a stable release or snapshot release. specifies the release date of a stable release or snapshot release.
If you upgrade from Postfix 3.2 or earlier, read RELEASE_NOTES-3.3 If you upgrade from Postfix 3.3 or earlier, read RELEASE_NOTES-3.4
before proceeding. before proceeding.
License change License change
@ -24,217 +24,3 @@ historical IBM Public License 1.0, it is now also distributed with the
more recent Eclipse Public License 2.0. Recipients can choose to take more recent Eclipse Public License 2.0. Recipients can choose to take
the software under the license of their choice. Those who are more the software under the license of their choice. Those who are more
comfortable with the IPL can continue with that license. comfortable with the IPL can continue with that license.
Incompatible changes with snapshot 20190126-nonprod
====================================================
This introduces a new master.cf service 'postlog' with type
'unix-dgram' that is used by the new postlogd(8) daemon. The
'unix-dgram' service type is not supported by older Postfix versions.
Before backing out to an older version, edit the master.cf file and
remove the postlog entry.
Major changes with snapshot 20190126-nonprod
============================================
Support for logging to file or stdout, instead of using syslog.
- Logging to file solves a usability problem for MacOS, and
eliminates multiple problems with systemd-based systems.
- Logging to stdout is useful when Postfix runs in a container, as
it eliminates a syslogd dependency.
See MAILLOG_README for configuration examples and logfile rotation.
Incompatible changes with snapshot 20190106
===========================================
Postfix 3.4 drops support for OpenSSL 1.0.1 (end-of-life December
31, 2016) and earlier releases.
Major changes with snapshot 20190106
====================================
SNI support in the Postfix SMTP server, the Postfix SMTP client,
and in the tlsproxy daemon (both server and client roles). See the
postconf(5) documentation for the new tls_server_sni_maps and
smtp_tls_servername parameters.
Support for files that contain multiple (key, certificate, trust
chain) instances. This was required to implement server-side SNI
table lookups, but it also eliminates the need for separate cert/key
files for RSA, DSA, Elliptic Curve, and so on. The file format is
documented in the TLS_README sections "Server-side certificate and
private key configuration" and "Client-side certificate and private
key configuration", and in the postconf(5) documentation for the
parameters smtp_tls_chain_files, smtpd_tls_chain_files,
tlsproxy_client_chain_files, and tlsproxy_tls_chain_files.
Note: the command "postfix tls" does not yet support the new
consolidated certificate chain format. If you switch to the new
format, you'll need to manage your keys and certificates directly,
rather than via postfix-tls(1).
Major changes with snapshot 20180826
====================================
Postfix SMTP server support for RFC 3030 CHUNKING (the BDAT command)
without BINARYMIME, in both smtpd(8) and postscreen(8).
To disable the SMTP server's CHUNKING support:
/etc/postfix/main.cf:
# The logging alternative:
smtpd_discard_ehlo_keywords = chunking
# The non-logging alternative:
smtpd_discard_ehlo_keywords = chunking, silent_discard
Be sure to specify '-o smtpd_discard_ehlo_keywords=' in master.cf
for the submission and smtps services, in case you have clients
that benefit from CHUNKING support.
Impact on existing configurations:
----------------------------------
- There are no changes for smtpd_mumble_restrictions, smtpd_proxy_filter,
smtpd_milters, or for postscreen settings, except for the additional
option to suppress the SMTP server's CHUNKING service announcement.
- There are no changes in the Postfix queue file content, no changes
for down-stream SMTP servers or after-queue content filters, and
no changes in the envelope or message content that Milters will
receive.
Example SMTP session
--------------------
The main differences are that the Postfix SMTP server announces
"CHUNKING" support in the EHLO response, and that instead of sending
one DATA request, the remote SMTP client may send one or more BDAT
requests. In the example below, "S:" indicates server responses,
and "C:" indicates client requests.
S: 220 server.example.com
C: EHLO client.example.com
S: 250-server.example.com
S: 250-PIPELINING
S: 250-SIZE 153600000
S: 250-VRFY
S: 250-ETRN
S: 250-STARTTLS
S: 250-AUTH PLAIN LOGIN
S: 250-ENHANCEDSTATUSCODES
S: 250-8BITMIME
S: 250-DSN
S: 250-SMTPUTF8
S: 250 CHUNKING
C: MAIL FROM:<sender@example.com>
S: 250 2.1.0 Ok
C: RCPT TO:<recipient@example.com>
S: 250 2.1.5 Ok
C: BDAT 10000
C: ..followed by 10000 bytes...
S: 250 2.0.0 Ok: 10000 bytes
C: BDAT 123
C: ..followed by 123 bytes...
S: 250 2.0.0 Ok: 123 bytes
C: BDAT 0 LAST
S: 250 2.0.0 Ok: 10123 bytes queued as 41yYhh41qmznjbD
C: QUIT
S: 221 2.0.0 Bye
Internally in Postfix, there is no difference between mail that was
received with BDAT or with DATA. Postfix smtpd_mumble_restrictions,
policy delegation queries, smtpd_proxy_filter and Milters all behave
as if Postfix received (MAIL + RCPT + DATA + end-of-data). However,
Postfix will log BDAT-related failures as "xxx after BDAT" to avoid
complicating troubleshooting (xxx = 'lost connection' or 'timeout'),
and will log a warning when a client sends a malformed BDAT command.
Benefits of CHUNKING (BDAT) support without BINARYMIME:
-------------------------------------------------------
Support for CHUNKING (BDAT) was added to improve interoperability
with some clients, a benefit that would reportedly exist even without
Postfix support for BINARYMIME.
Postfix does not support BINARYMIME at this time because:
- BINARYMIME support would require moderately invasive changes to
support email content that is not line-oriented. With BINARYMIME,
the Content-Length: header specifies the length of arbitrary
content that has no line boundaries. Without BINARYMIME, binary
content is base64-encoded, and formatted as lines of text.
- There is no conversion of BINARYMIME to a line-oriented 8BITMIME
form that is compatible with legacy systems including UNIX mbox.
The available options are to convert binary content into one of
the 7bit forms (base64 or quoted-printable), or to return email
as undeliverable. Any conversion would break digital signatures,
so it would have to happen before signing.
Downsides of CHUNKING (BDAT) support:
-------------------------------------
The RFC 3030 authors did not specify any limitations on how clients
may pipeline commands (i.e. send commands without waiting for a
server response). If a server announces PIPELINING support, like
Postfix does, then a remote SMTP client can pipeline all commands
following EHLO, for example, MAIL/RCPT/BDAT/BDAT/MAIL/RCPT/BDAT,
without ever having to wait for a server response. This means that
with BDAT, the Postfix SMTP server cannot distinguish between a
well-behaved client and a spambot, based on their command pipelining
behavior. If you require "reject_unauth_pipelining" to block spambots,
turn off the CHUNKING support announcement as described above.
Incompatible change with snapshot 20180701
==========================================
To avoid performance loss under load, the tlsproxy(8) daemon now
requires a zero process limit in master.cf (this setting is provided
with the default master.cf file). As tlsproxy(8) processes become
too busy handling TLS connections, more processes will automatically
be added. By default, a tlsproxy(8) process will retire after several
hours.
To set the tlsproxy process limit to zero:
# postconf -F tlsproxy/unix/process_limit=0
# postfix reload
Major changes with snapshot 20180617
====================================
Preliminary Postfix SMTP client support for multiple deliveries per
TLS-encrypted connection. This is primarily to improve mail delivery
performance for destinations that throttle clients when they don't
combine deliveries.
This feature is enabled with "smtp_tls_connection_reuse=yes" in
main.cf, or with "tls_connection_reuse=yes" in smtp_tls_policy_maps.
It supports all Postfix TLS security levels including dane and
dane-only.
The implementation of TLS connection reuse relies on the same
scache(8) service as used for delivering plaintext SMTP mail, the
same tlsproxy(8) daemon as used by the postscreen(8) service for
inbound connections, and relies on the same hints from the qmgr(8)
daemon. It reuses the configuration parameters described in
CONNECTION_CACHE_README.
The following illustrates how TLS connections are reused:
Initial plaintext SMTP handshake:
smtp(8) -> remote SMTP server
Reused SMTP/TLS connection, or new SMTP/TLS connection:
smtp(8) -> tlsproxy(8) -> remote SMTP server
Cached SMTP/TLS connection:
scache(8) -> tlsproxy(8) -> remote SMTP server
There are a few refinements planned:
- Log the TLS properties every time a connection is reused.
Currently, the properties are logged when a TLS session is created.

208
postfix/RELEASE_NOTES-3.4 Normal file
View File

@ -0,0 +1,208 @@
This is the Postfix 3.4 (stable) release.
The stable Postfix release is called postfix-3.4.x where 3=major
release number, 4=minor release number, x=patchlevel. The stable
release never changes except for patches that address bugs or
emergencies. Patches change the patchlevel and the release date.
New features are developed in snapshot releases. These are called
postfix-3.5-yyyymmdd where yyyymmdd is the release date (yyyy=year,
mm=month, dd=day). Patches are never issued for snapshot releases;
instead, a new snapshot is released.
The mail_release_date configuration parameter (format: yyyymmdd)
specifies the release date of a stable release or snapshot release.
If you upgrade from Postfix 3.2 or earlier, read RELEASE_NOTES-3.3
before proceeding.
License change
---------------
This software is distributed with a dual license: in addition to the
historical IBM Public License 1.0, it is now also distributed with the
more recent Eclipse Public License 2.0. Recipients can choose to take
the software under the license of their choice. Those who are more
comfortable with the IPL can continue with that license.
Summary of changes
------------------
Incompatible changes, bdat support, containers, database support,
logging, safety, tls connection pooling, tls support, usability,
Incompatible changes
--------------------
[Incompat 20180826] The Postfix SMTP server announces CHUNKING (BDAT
command) by default. In the unlikely case that this breaks some
important remote SMTP client, disable the feature as follows:
/etc/postfix/main.cf:
# The logging alternative:
smtpd_discard_ehlo_keywords = chunking
# The non-logging alternative:
smtpd_discard_ehlo_keywords = chunking, silent_discard
See BDAT_README for more.
[Incompat 20190126] This introduces a new master.cf service 'postlog'
with type 'unix-dgram' that is used by the new postlogd(8) daemon.
Before backing out to an older Postfix version, edit the master.cf
file and remove the postlog entry.
[Incompat 20190106] Postfix 3.4 drops support for OpenSSL 1.0.1
(end-of-life was December 31, 2016) and all earlier releases.
[Incompat 20180701] To avoid performance loss under load, the
tlsproxy(8) daemon now requires a zero process limit in master.cf
(this setting is provided with the default master.cf file). By
default, a tlsproxy(8) process will retire after several hours.
To set the tlsproxy process limit to zero:
# postconf -F tlsproxy/unix/process_limit=0
# postfix reload
Major changes - bdat support
--------------------
[Feature 20180826] Postfix SMTP server support for RFC 3030 CHUNKING
(the BDAT command) without BINARYMIME, in both smtpd(8) and
postscreen(8). This has no effect on Milters, smtpd_mumble_restrictions,
and smtpd_proxy_filter. See BDAT_README for more.
Major changes - containers
--------------------------
[Feature 20190126] Support for logging to file or stdout, instead
of using syslog.
- Logging to file solves a usability problem for MacOS, and
eliminates multiple problems with systemd-based systems.
- Logging to stdout is useful when Postfix runs in a container, as
it eliminates a syslogd dependency.
See MAILLOG_README for configuration examples and logfile rotation.
[Feature 20180422] Better handling of undocumented(!) Linux behavior
whether or not signals are delivered to a PID=1 process.
Major changes - database support
--------------------------------
[Feature 20181105] Support for (key, list of filenames) in map
source text.
- Currently, this feature is used only by tls_server_sni_maps.
- When a map is created from source with "postmap -F maptype:mapname",
the command processes each key as usual and processes each value
as a list of filenames, concatenates the content of those files
(with one newline character in-between files), and stores an entry
with (key, base64-encoded result).
- When a map is queried with "postmap -F -q ...", the command
base64-decodes each value. It reports an error when a value is
not in base64 form.
This "postmap -F -q ..." behavior also works when querying the
memory-resident map types cidr:, inline:, pcre:, randmap:, regexp:,
and static:. Postfix reads the files specified as table values,
stores base64-encoded content, and base64-decodes content upon
table lookup.
Internally, Postfix will turn on this behavior for lookups (not
updates) when a map is opened with the DICT_FLAG_RHS_IS_FILE flag.
Major changes - logging
-----------------------
[Feature 20190126] Support for logging to file or stdout, instead
of using syslog.
- Logging to file solves a usability problem for MacOS, and
eliminates multiple problems with systemd-based systems.
- Logging to stdout is useful when Postfix runs in a container, as
it eliminates a syslogd dependency.
See MAILLOG_README for configuration examples and logfile rotation.
Major changes - safety
----------------------
[Feature 20180623] Automatic retirement: dnsblog(8) and tlsproxy(8) process
will now voluntarily retire after after max_idle*max_use, or some
sane limit if either limit is disabled. Without this, a process
could stay busy for days or more.
Major changes - tls connection pooling
--------------------------------------
[Feature 20180617] Postfix SMTP client support for multiple deliveries
per TLS-encrypted connection. This is primarily to improve mail
delivery performance for destinations that throttle clients when
they don't combine deliveries.
This feature is enabled with "smtp_tls_connection_reuse=yes" in
main.cf, or with "tls_connection_reuse=yes" in smtp_tls_policy_maps.
It supports all Postfix TLS security levels including dane and
dane-only.
The implementation of TLS connection reuse relies on the same
scache(8) service as used for delivering plaintext SMTP mail, the
same tlsproxy(8) daemon as used by the postscreen(8) service for
inbound connections, and relies on the same hints from the qmgr(8)
daemon. It reuses the configuration parameters described in
CONNECTION_CACHE_README.
The Postfix SMTP client now logs whether an SMTP-over-TLS connection
is newly established ("TLS connection established") or whether the
connection is reused ("TLS connection reused").
The following illustrates how TLS connections are reused:
Initial plaintext SMTP handshake:
smtp(8) -> remote SMTP server
Reused SMTP/TLS connection, or new SMTP/TLS connection:
smtp(8) -> tlsproxy(8) -> remote SMTP server
Cached SMTP/TLS connection:
scache(8) -> tlsproxy(8) -> remote SMTP server
Major changes - tls support
---------------------------
[Feature 20190106] SNI support in the Postfix SMTP server, the
Postfix SMTP client, and in the tlsproxy(8) daemon (both server and
client roles). See the postconf(5) documentation for the new
tls_server_sni_maps and smtp_tls_servername parameters.
[Feature 20190106] Support for files that contain multiple (key,
certificate, trust chain) instances. This was required to implement
server-side SNI table lookups, but it also eliminates the need for
separate cert/key files for RSA, DSA, Elliptic Curve, and so on.
The file format is documented in the TLS_README sections "Server-side
certificate and private key configuration" and "Client-side certificate
and private key configuration", and in the postconf(5) documentation
for the parameters smtp_tls_chain_files, smtpd_tls_chain_files,
tlsproxy_client_chain_files, and tlsproxy_tls_chain_files.
Note: the command "postfix tls" does not yet support the new
consolidated certificate chain format. If you switch to the new
format, you'll need to manage your keys and certificates directly,
rather than via postfix-tls(1).
Major changes - usability
-------------------------
[Feature 20180812] Support for smtpd_reject_footer_maps (as well
as the postscreen variant postscreen_reject_footer_maps) for more
informative reject messages. This is indexed with the Postfix SMTP
server response text, and overrides the footer specified with
smtpd_reject_footer. One will want to use a pcre: or regexp: map
with this.

View File

@ -1,18 +1,15 @@
Wish list: Wish list:
Move tls_proxy_client_scan.c _to_string() function Things to do before the stable release:
to tls_proxy_client_misc.c.
In tlsproxy, include parameter names in the diffs between Spell-check, double-word check, HTML validator check,
expected and client properties. This requires a function mantools/missing-proxy-read-maps check.
tls_proxy_client_init_with_names_to_string().
Disable -DSNAPSHOT and -DNONPROD in makedefs.
make tls_pre_jail_init() safe by design for use in programs make tls_pre_jail_init() safe by design for use in programs
that implement both clients and servers. that implement both clients and servers.
postfix rotate-log command: mv postfix.log postfix.log.$(date
+%Y%M%d-%H%M%S) to avoid data loss if called repeatedly.
In smtpd(8) and postscreen(8), set the ehlo_discard_mask In smtpd(8) and postscreen(8), set the ehlo_discard_mask
to ~0 so that STARTTLS, BDAT, DSN, etc. work only for clients to ~0 so that STARTTLS, BDAT, DSN, etc. work only for clients
that send EHLO. that send EHLO.
@ -23,13 +20,6 @@ Wish list:
In postscreen, don't fork after 'postfix reload' when In postscreen, don't fork after 'postfix reload' when
psc_check_queue_length (and psc_post_queue_length?) is zero. psc_check_queue_length (and psc_post_queue_length?) is zero.
Things to do before the stable release:
Spell-check, double-word check, HTML validator check,
mantools/missing-proxy-read-maps check.
Disable -DSNAPSHOT and -DNONPROD in makedefs.
After I/O error, store errno in VSTREAM object before errno After I/O error, store errno in VSTREAM object before errno
may be overwritten. may be overwritten.

View File

@ -0,0 +1,178 @@
<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Postfix BDAT (CHUNKING) support</title>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body>
<h1><img src="postfix-logo.jpg" width="203" height="98" ALT="">Postfix
BDAT (CHUNKING) support</h1>
<hr>
<h2>Overview </h2>
<p> Postfix SMTP server supports <a href="http://tools.ietf.org/html/rfc3030">RFC 3030</a> CHUNKING (the BDAT command)
without BINARYMIME, in both <a href="smtpd.8.html">smtpd(8)</a> and <a href="postscreen.8.html">postscreen(8)</a>. It is enabled
by default. </p>
<p> Topics covered in this document: </p>
<ul>
<li><a href="#disable"> Disabling BDAT support</a>
<li><a href="#impact"> Impact on existing configurations</a>
<li><a href="#example"> Example SMTP session</a>
<li> <a href="#benefits">Benefits of CHUNKING (BDAT) support without BINARYMIME</a>
<li> <a href="#downsides">Downsides of CHUNKING (BDAT) support</a>
</ul>
<h2> <a name="disable"> Disabling BDAT support </a> </h2>
<p> BDAT support is enabled by default. To disable BDAT support
globally: </p>
<blockquote>
<pre>
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
# The logging alternative:
<a href="postconf.5.html#smtpd_discard_ehlo_keywords">smtpd_discard_ehlo_keywords</a> = chunking
# The non-logging alternative:
<a href="postconf.5.html#smtpd_discard_ehlo_keywords">smtpd_discard_ehlo_keywords</a> = chunking, silent_discard
</pre>
</blockquote>
<p> Specify '-o <a href="postconf.5.html#smtpd_discard_ehlo_keywords">smtpd_discard_ehlo_keywords</a>=' in <a href="master.5.html">master.cf</a>
for the submission and smtps services, if you have clients
that benefit from CHUNKING support. </p>
<h2> <a name="impact"> Impact on existing configurations </a> </h2>
<ul>
<li> <p> There are no changes for smtpd_mumble_restrictions,
<a href="postconf.5.html#smtpd_proxy_filter">smtpd_proxy_filter</a>, <a href="postconf.5.html#smtpd_milters">smtpd_milters</a>, or for postscreen settings,
except for the above mentioned option to suppress the SMTP server's
CHUNKING service announcement. </p>
<li> <p> There are no changes in the Postfix queue file content,
no changes for down-stream SMTP servers or after-queue content
filters, and no changes in the envelope or message content that
Milters will receive. </p>
</ul>
<h2> <a name="example"> Example SMTP session</a> </h2>
<p> The main differences are that the Postfix SMTP server announces
"CHUNKING" support in the EHLO response, and that instead of sending
one DATA request, the remote SMTP client may send one or more BDAT
requests. In the example below, "S:" indicates server responses,
and "C:" indicates client requests (bold font). </p>
<blockquote>
<pre>
S: 220 server.example.com
C: <b>EHLO client.example.com</b>
S: 250-server.example.com
S: 250-PIPELINING
S: 250-SIZE 153600000
S: 250-VRFY
S: 250-ETRN
S: 250-STARTTLS
S: 250-AUTH PLAIN LOGIN
S: 250-ENHANCEDSTATUSCODES
S: 250-8BITMIME
S: 250-DSN
S: 250-SMTPUTF8
S: 250 CHUNKING
C: <b>MAIL FROM:&lt;sender@example.com&gt;</b>
S: 250 2.1.0 Ok
C: <b>RCPT TO:&lt;recipient@example.com&gt;</b>
S: 250 2.1.5 Ok
C: <b>BDAT 10000</b>
C: <b>..followed by 10000 bytes...</b>
S: 250 2.0.0 Ok: 10000 bytes
C: <b>BDAT 123</b>
C: <b>..followed by 123 bytes...</b>
S: 250 2.0.0 Ok: 123 bytes
C: <b>BDAT 0 LAST</b>
S: 250 2.0.0 Ok: 10123 bytes queued as 41yYhh41qmznjbD
C: <b>QUIT</b>
S: 221 2.0.0 Bye
</pre>
</blockquote>
<p> Internally in Postfix, there is no difference between mail that
was received with BDAT or with DATA. Postfix smtpd_mumble_restrictions,
policy delegation queries, <a href="postconf.5.html#smtpd_proxy_filter">smtpd_proxy_filter</a> and Milters all behave
as if Postfix received (MAIL + RCPT + DATA + end-of-data). However,
Postfix will log BDAT-related failures as "xxx after BDAT" to avoid
complicating troubleshooting (xxx = 'lost connection' or 'timeout'),
and will log a warning when a client sends a malformed BDAT command.
</p>
<h2> <a name="benefits">Benefits of CHUNKING (BDAT) support without
BINARYMIME</a> </h2>
<p> Support for CHUNKING (BDAT) was added to improve interoperability
with some clients, a benefit that would reportedly exist even without
Postfix support for BINARYMIME. Since June 2018, Wietse's mail
server has received BDAT commands from a variety of systems. </p>
<p> Postfix does not support BINARYMIME at this time because: </p>
<ul>
<li> <p> BINARYMIME support would require moderately invasive
changes to Postfix, to support email content that is not line-oriented.
With BINARYMIME, the Content-Length: message header specifies the
length of content that may or may not have line boundaries. Without
BINARYMIME support, email RFCs require that binary content is
base64-encoded, and formatted as lines of text. </p>
<li> <p> For delivery to non-BINARYMIME systems including UNIX mbox,
the available options are to convert binary content into 8bit text,
one of the 7bit forms (base64 or quoted-printable), or to return
email as undeliverable. Any conversion would obviously break digital
signatures, so conversion would have to happen before signing. </p>
</ul>
<h2> <a name="downsides">Downsides of CHUNKING (BDAT) support</a>
</h2>
<p> The <a href="http://tools.ietf.org/html/rfc3030">RFC 3030</a> authors did not specify any limitations on how
clients may pipeline commands (i.e. send commands without waiting
for a server response). If a server announces PIPELINING support,
like Postfix does, then a remote SMTP client can pipeline all
commands following EHLO, for example, MAIL/RCPT/BDAT/BDAT/MAIL/RCPT/BDAT,
without ever having to wait for a server response. This means that
with BDAT, the Postfix SMTP server cannot distinguish between a
well-behaved client and a spambot, based on their command pipelining
behavior. If you require "<a href="postconf.5.html#reject_unauth_pipelining">reject_unauth_pipelining</a>" to block spambots,
then turn off Postfix's CHUNKING announcement as described above.
</p>
<p> In <a href="http://tools.ietf.org/html/rfc4468">RFC 4468</a>, the authors write that a client may pipeline
commands, and that after sending BURL LAST or BDAT LAST, a client
must wait for the server's response. But as this text does not
appear in <a href="http://tools.ietf.org/html/rfc3030">RFC 3030</a> which defines BDAT, is it a useless restriction
that Postfix will not enforce. </p>
</body>
</html>

View File

@ -199,6 +199,8 @@ Recipients </a>
<li> <a href="DSN_README.html"> Postfix DSN support </a> <li> <a href="DSN_README.html"> Postfix DSN support </a>
<li> <a href="BDAT_README.html"> Postfix BDAT (CHUNKING) support </a>
<li> <a href="PACKAGE_README.html"> Guidelines for Package Builders <li> <a href="PACKAGE_README.html"> Guidelines for Package Builders
</a> </a>

View File

@ -547,6 +547,15 @@ SMTP(8) SMTP(8)
<b><a href="postconf.5.html#tls_disable_workarounds">tls_disable_workarounds</a> (see 'postconf -d' output)</b> <b><a href="postconf.5.html#tls_disable_workarounds">tls_disable_workarounds</a> (see 'postconf -d' output)</b>
List or bit-mask of OpenSSL bug work-arounds to disable. List or bit-mask of OpenSSL bug work-arounds to disable.
Available in Postfix version 2.11-3.1:
<b><a href="postconf.5.html#tls_dane_digest_agility">tls_dane_digest_agility</a> (on)</b>
Configure <a href="http://tools.ietf.org/html/rfc7671">RFC7671</a> DANE TLSA digest algorithm agility.
<b><a href="postconf.5.html#tls_dane_trust_anchor_digest_enable">tls_dane_trust_anchor_digest_enable</a> (yes)</b>
Enable support for <a href="http://tools.ietf.org/html/rfc6698">RFC 6698</a> (DANE TLSA) DNS records that contain
digests of trust-anchors with certificate usage "2".
Available in Postfix version 2.11 and later: Available in Postfix version 2.11 and later:
<b><a href="postconf.5.html#smtp_tls_trust_anchor_file">smtp_tls_trust_anchor_file</a> (empty)</b> <b><a href="postconf.5.html#smtp_tls_trust_anchor_file">smtp_tls_trust_anchor_file</a> (empty)</b>

View File

@ -31,7 +31,7 @@ POSTLOGD(8) POSTLOGD(8)
<b><a href="postconf.5.html#maillog_file">log_file</a></b> (also, logging to stdout would interfere with the operation of <b><a href="postconf.5.html#maillog_file">log_file</a></b> (also, logging to stdout would interfere with the operation of
some of these programs). These programs can log to <a href="postlogd.8.html"><b>postlogd</b>(8)</a> if they some of these programs). These programs can log to <a href="postlogd.8.html"><b>postlogd</b>(8)</a> if they
are run by the super-user, or if their executable file has set-gid per- are run by the super-user, or if their executable file has set-gid per-
mission. Do not set this permision on programs other than <a href="postdrop.1.html"><b>postdrop</b>(1)</a> mission. Do not set this permission on programs other than <a href="postdrop.1.html"><b>postdrop</b>(1)</a>
and <a href="postqueue.1.html"><b>postqueue</b>(1)</a>. and <a href="postqueue.1.html"><b>postqueue</b>(1)</a>.
<b>CONFIGURATION PARAMETERS</b> <b>CONFIGURATION PARAMETERS</b>

View File

@ -547,6 +547,15 @@ SMTP(8) SMTP(8)
<b><a href="postconf.5.html#tls_disable_workarounds">tls_disable_workarounds</a> (see 'postconf -d' output)</b> <b><a href="postconf.5.html#tls_disable_workarounds">tls_disable_workarounds</a> (see 'postconf -d' output)</b>
List or bit-mask of OpenSSL bug work-arounds to disable. List or bit-mask of OpenSSL bug work-arounds to disable.
Available in Postfix version 2.11-3.1:
<b><a href="postconf.5.html#tls_dane_digest_agility">tls_dane_digest_agility</a> (on)</b>
Configure <a href="http://tools.ietf.org/html/rfc7671">RFC7671</a> DANE TLSA digest algorithm agility.
<b><a href="postconf.5.html#tls_dane_trust_anchor_digest_enable">tls_dane_trust_anchor_digest_enable</a> (yes)</b>
Enable support for <a href="http://tools.ietf.org/html/rfc6698">RFC 6698</a> (DANE TLSA) DNS records that contain
digests of trust-anchors with certificate usage "2".
Available in Postfix version 2.11 and later: Available in Postfix version 2.11 and later:
<b><a href="postconf.5.html#smtp_tls_trust_anchor_file">smtp_tls_trust_anchor_file</a> (empty)</b> <b><a href="postconf.5.html#smtp_tls_trust_anchor_file">smtp_tls_trust_anchor_file</a> (empty)</b>

View File

@ -1322,7 +1322,8 @@ SMTPD(8) SMTPD(8)
<b>README FILES</b> <b>README FILES</b>
<a href="ADDRESS_CLASS_README.html">ADDRESS_CLASS_README</a>, blocking unknown hosted or relay recipients <a href="ADDRESS_CLASS_README.html">ADDRESS_CLASS_README</a>, blocking unknown hosted or relay recipients
<a href="ADDRESS_REWRITING_README.html">ADDRESS_REWRITING_README</a> Postfix address manipulation <a href="ADDRESS_REWRITING_README.html">ADDRESS_REWRITING_README</a>, Postfix address manipulation
<a href="BDAT_README.html">BDAT_README</a>, Postfix CHUNKING support
<a href="FILTER_README.html">FILTER_README</a>, external after-queue content filter <a href="FILTER_README.html">FILTER_README</a>, external after-queue content filter
<a href="LOCAL_RECIPIENT_README.html">LOCAL_RECIPIENT_README</a>, blocking unknown local recipients <a href="LOCAL_RECIPIENT_README.html">LOCAL_RECIPIENT_README</a>, blocking unknown local recipients
<a href="MILTER_README.html">MILTER_README</a>, before-queue mail filter applications <a href="MILTER_README.html">MILTER_README</a>, before-queue mail filter applications

View File

@ -55,7 +55,103 @@ TLSPROXY(8) TLSPROXY(8)
The text below provides only a parameter summary. See <a href="postconf.5.html"><b>postconf</b>(5)</a> for The text below provides only a parameter summary. See <a href="postconf.5.html"><b>postconf</b>(5)</a> for
more details including examples. more details including examples.
<b>STARTTLS SUPPORT CONTROLS</b> <b>STARTTLS GLOBAL CONTROLS</b>
The following settings are global and therefore cannot be overruled by
information specified in a <a href="tlsproxy.8.html"><b>tlsproxy</b>(8)</a> client request.
<b><a href="postconf.5.html#tls_append_default_CA">tls_append_default_CA</a> (no)</b>
Append the system-supplied default Certification Authority cer-
tificates to the ones specified with *_tls_CApath or
*_tls_CAfile.
<b><a href="postconf.5.html#tls_daemon_random_bytes">tls_daemon_random_bytes</a> (32)</b>
The number of pseudo-random bytes that an <a href="smtp.8.html"><b>smtp</b>(8)</a> or <a href="smtpd.8.html"><b>smtpd</b>(8)</a>
process requests from the <a href="tlsmgr.8.html"><b>tlsmgr</b>(8)</a> server in order to seed its
internal pseudo random number generator (PRNG).
<b><a href="postconf.5.html#tls_high_cipherlist">tls_high_cipherlist</a> (see 'postconf -d' output)</b>
The OpenSSL cipherlist for "high" grade ciphers.
<b><a href="postconf.5.html#tls_medium_cipherlist">tls_medium_cipherlist</a> (see 'postconf -d' output)</b>
The OpenSSL cipherlist for "medium" or higher grade ciphers.
<b><a href="postconf.5.html#tls_low_cipherlist">tls_low_cipherlist</a> (see 'postconf -d' output)</b>
The OpenSSL cipherlist for "low" or higher grade ciphers.
<b><a href="postconf.5.html#tls_export_cipherlist">tls_export_cipherlist</a> (see 'postconf -d' output)</b>
The OpenSSL cipherlist for "export" or higher grade ciphers.
<b><a href="postconf.5.html#tls_null_cipherlist">tls_null_cipherlist</a> (eNULL:!aNULL)</b>
The OpenSSL cipherlist for "NULL" grade ciphers that provide
authentication without encryption.
<b><a href="postconf.5.html#tls_eecdh_strong_curve">tls_eecdh_strong_curve</a> (prime256v1)</b>
The elliptic curve used by the Postfix SMTP server for sensibly
strong ephemeral ECDH key exchange.
<b><a href="postconf.5.html#tls_eecdh_ultra_curve">tls_eecdh_ultra_curve</a> (secp384r1)</b>
The elliptic curve used by the Postfix SMTP server for maximally
strong ephemeral ECDH key exchange.
<b><a href="postconf.5.html#tls_disable_workarounds">tls_disable_workarounds</a> (see 'postconf -d' output)</b>
List or bit-mask of OpenSSL bug work-arounds to disable.
<b><a href="postconf.5.html#tls_preempt_cipherlist">tls_preempt_cipherlist</a> (no)</b>
With SSLv3 and later, use the Postfix SMTP server's cipher pref-
erence order instead of the remote client's cipher preference
order.
Available in Postfix version 2.9 and later:
<b><a href="postconf.5.html#tls_legacy_public_key_fingerprint">tls_legacy_public_key_fingerprints</a> (no)</b>
A temporary migration aid for sites that use certificate <i>pub-</i>
<i>lic-key</i> fingerprints with Postfix 2.9.0..2.9.5, which use an
incorrect algorithm.
Available in Postfix version 2.11-3.1:
<b><a href="postconf.5.html#tls_dane_digest_agility">tls_dane_digest_agility</a> (on)</b>
Configure <a href="http://tools.ietf.org/html/rfc7671">RFC7671</a> DANE TLSA digest algorithm agility.
<b><a href="postconf.5.html#tls_dane_trust_anchor_digest_enable">tls_dane_trust_anchor_digest_enable</a> (yes)</b>
Enable support for <a href="http://tools.ietf.org/html/rfc6698">RFC 6698</a> (DANE TLSA) DNS records that contain
digests of trust-anchors with certificate usage "2".
Available in Postfix version 2.11 and later:
<b><a href="postconf.5.html#tlsmgr_service_name">tlsmgr_service_name</a> (tlsmgr)</b>
The name of the <a href="tlsmgr.8.html"><b>tlsmgr</b>(8)</a> service entry in <a href="master.5.html">master.cf</a>.
Available in Postfix version 3.0 and later:
<b><a href="postconf.5.html#tls_session_ticket_cipher">tls_session_ticket_cipher</a> (Postfix</b> &gt;<b>= 3.0: aes-256-cbc, Postfix</b> &lt; <b>3.0:</b>
<b>aes-128-cbc)</b>
Algorithm used to encrypt <a href="http://tools.ietf.org/html/rfc5077">RFC5077</a> TLS session tickets.
<b><a href="postconf.5.html#openssl_path">openssl_path</a> (openssl)</b>
The location of the OpenSSL command line program <b>openssl</b>(1).
Available in Postfix version 3.2 and later:
<b><a href="postconf.5.html#tls_eecdh_auto_curves">tls_eecdh_auto_curves</a> (see 'postconf -d' output)</b>
The prioritized list of elliptic curves supported by the Postfix
SMTP client and server.
Available in Postfix version 3.4 and later:
<b><a href="postconf.5.html#tls_server_sni_maps">tls_server_sni_maps</a> (empty)</b>
Optional lookup tables that map names received from remote SMTP
clients via the TLS Server Name Indication (SNI) extension to
the appropriate keys and certificate chains.
<b>STARTTLS SERVER CONTROLS</b>
These settings are clones of Postfix SMTP server settings. They allow
<a href="tlsproxy.8.html"><b>tlsproxy</b>(8)</a> to load the same certificate and private key information as
the Postfix SMTP server, before dropping privileges, so that the key
files can be kept read-only for root. These settings can currently not
be overruled by information in a <a href="tlsproxy.8.html"><b>tlsproxy</b>(8)</a> client request, but that
limitation may be removed in a future version.
<b><a href="postconf.5.html#tlsproxy_tls_CAfile">tlsproxy_tls_CAfile</a> ($<a href="postconf.5.html#smtpd_tls_CAfile">smtpd_tls_CAfile</a>)</b> <b><a href="postconf.5.html#tlsproxy_tls_CAfile">tlsproxy_tls_CAfile</a> ($<a href="postconf.5.html#smtpd_tls_CAfile">smtpd_tls_CAfile</a>)</b>
A file containing (PEM format) CA certificates of root CAs A file containing (PEM format) CA certificates of root CAs
trusted to sign either remote SMTP client certificates or inter- trusted to sign either remote SMTP client certificates or inter-
@ -155,27 +251,16 @@ TLSPROXY(8) TLSPROXY(8)
when a non-empty value is specified, this overrides the obsolete when a non-empty value is specified, this overrides the obsolete
parameters <a href="postconf.5.html#smtpd_use_tls">smtpd_use_tls</a> and <a href="postconf.5.html#smtpd_enforce_tls">smtpd_enforce_tls</a>. parameters <a href="postconf.5.html#smtpd_use_tls">smtpd_use_tls</a> and <a href="postconf.5.html#smtpd_enforce_tls">smtpd_enforce_tls</a>.
Available in Postfix version 2.11 and later:
<b><a href="postconf.5.html#tlsmgr_service_name">tlsmgr_service_name</a> (tlsmgr)</b>
The name of the <a href="tlsmgr.8.html"><b>tlsmgr</b>(8)</a> service entry in <a href="master.5.html">master.cf</a>.
Available in Postfix version 3.4 and later:
<b><a href="postconf.5.html#tlsproxy_tls_chain_files">tlsproxy_tls_chain_files</a> ($<a href="postconf.5.html#smtpd_tls_chain_files">smtpd_tls_chain_files</a>)</b> <b><a href="postconf.5.html#tlsproxy_tls_chain_files">tlsproxy_tls_chain_files</a> ($<a href="postconf.5.html#smtpd_tls_chain_files">smtpd_tls_chain_files</a>)</b>
Files with the Postfix <a href="tlsproxy.8.html"><b>tlsproxy</b>(8)</a> server keys and certificate Files with the Postfix <a href="tlsproxy.8.html"><b>tlsproxy</b>(8)</a> server keys and certificate
chains in PEM format. chains in PEM format.
<b><a href="postconf.5.html#tls_server_sni_maps">tls_server_sni_maps</a> (empty)</b> <b>STARTTLS CLIENT CONTROLS</b>
Optional lookup tables that map names received from remote SMTP These settings are clones of Postfix SMTP client settings. They allow
clients via the TLS Server Name Indication (SNI) extension to
the appropriate keys and certificate chains.
<b>TLS CLIENT CONTROLS</b>
These parameters are clones of SMTP client settings. They allow
<a href="tlsproxy.8.html"><b>tlsproxy</b>(8)</a> to load the same certificate and private key information as <a href="tlsproxy.8.html"><b>tlsproxy</b>(8)</a> to load the same certificate and private key information as
the SMTP client, before dropping privileges, so that the key files can the Postfix SMTP client, before dropping privileges, so that the key
be kept read-only for root. files can be kept read-only for root. Some settings may be overruled by
information in a <a href="tlsproxy.8.html"><b>tlsproxy</b>(8)</a> client request.
Available in Postfix version 3.4 and later: Available in Postfix version 3.4 and later:

View File

@ -34,7 +34,7 @@ Other non\-daemon Postfix programs will never write directly to
with the operation of some of these programs). These programs with the operation of some of these programs). These programs
can log to \fBpostlogd\fR(8) if they are run by the super\-user, can log to \fBpostlogd\fR(8) if they are run by the super\-user,
or if their executable file has set\-gid permission. Do not or if their executable file has set\-gid permission. Do not
set this permision on programs other than \fBpostdrop\fR(1) set this permission on programs other than \fBpostdrop\fR(1)
and \fBpostqueue\fR(1). and \fBpostqueue\fR(1).
.SH "CONFIGURATION PARAMETERS" .SH "CONFIGURATION PARAMETERS"
.na .na

View File

@ -489,6 +489,13 @@ Available in Postfix version 2.8 and later:
.IP "\fBtls_disable_workarounds (see 'postconf -d' output)\fR" .IP "\fBtls_disable_workarounds (see 'postconf -d' output)\fR"
List or bit\-mask of OpenSSL bug work\-arounds to disable. List or bit\-mask of OpenSSL bug work\-arounds to disable.
.PP .PP
Available in Postfix version 2.11\-3.1:
.IP "\fBtls_dane_digest_agility (on)\fR"
Configure RFC7671 DANE TLSA digest algorithm agility.
.IP "\fBtls_dane_trust_anchor_digest_enable (yes)\fR"
Enable support for RFC 6698 (DANE TLSA) DNS records that contain
digests of trust\-anchors with certificate usage "2".
.PP
Available in Postfix version 2.11 and later: Available in Postfix version 2.11 and later:
.IP "\fBsmtp_tls_trust_anchor_file (empty)\fR" .IP "\fBsmtp_tls_trust_anchor_file (empty)\fR"
Zero or more PEM\-format files with trust\-anchor certificates Zero or more PEM\-format files with trust\-anchor certificates

View File

@ -1157,7 +1157,8 @@ Use "\fBpostconf readme_directory\fR" or
.na .na
.nf .nf
ADDRESS_CLASS_README, blocking unknown hosted or relay recipients ADDRESS_CLASS_README, blocking unknown hosted or relay recipients
ADDRESS_REWRITING_README Postfix address manipulation ADDRESS_REWRITING_README, Postfix address manipulation
BDAT_README, Postfix CHUNKING support
FILTER_README, external after\-queue content filter FILTER_README, external after\-queue content filter
LOCAL_RECIPIENT_README, blocking unknown local recipients LOCAL_RECIPIENT_README, blocking unknown local recipients
MILTER_README, before\-queue mail filter applications MILTER_README, before\-queue mail filter applications

View File

@ -71,11 +71,93 @@ reload\fR" to speed up a change.
The text below provides only a parameter summary. See The text below provides only a parameter summary. See
\fBpostconf\fR(5) for more details including examples. \fBpostconf\fR(5) for more details including examples.
.SH "STARTTLS SUPPORT CONTROLS" .SH "STARTTLS GLOBAL CONTROLS"
.na .na
.nf .nf
.ad .ad
.fi .fi
The following settings are global and therefore cannot be
overruled by information specified in a \fBtlsproxy\fR(8)
client request.
.IP "\fBtls_append_default_CA (no)\fR"
Append the system\-supplied default Certification Authority
certificates to the ones specified with *_tls_CApath or *_tls_CAfile.
.IP "\fBtls_daemon_random_bytes (32)\fR"
The number of pseudo\-random bytes that an \fBsmtp\fR(8) or \fBsmtpd\fR(8)
process requests from the \fBtlsmgr\fR(8) server in order to seed its
internal pseudo random number generator (PRNG).
.IP "\fBtls_high_cipherlist (see 'postconf -d' output)\fR"
The OpenSSL cipherlist for "high" grade ciphers.
.IP "\fBtls_medium_cipherlist (see 'postconf -d' output)\fR"
The OpenSSL cipherlist for "medium" or higher grade ciphers.
.IP "\fBtls_low_cipherlist (see 'postconf -d' output)\fR"
The OpenSSL cipherlist for "low" or higher grade ciphers.
.IP "\fBtls_export_cipherlist (see 'postconf -d' output)\fR"
The OpenSSL cipherlist for "export" or higher grade ciphers.
.IP "\fBtls_null_cipherlist (eNULL:!aNULL)\fR"
The OpenSSL cipherlist for "NULL" grade ciphers that provide
authentication without encryption.
.IP "\fBtls_eecdh_strong_curve (prime256v1)\fR"
The elliptic curve used by the Postfix SMTP server for sensibly
strong
ephemeral ECDH key exchange.
.IP "\fBtls_eecdh_ultra_curve (secp384r1)\fR"
The elliptic curve used by the Postfix SMTP server for maximally
strong
ephemeral ECDH key exchange.
.IP "\fBtls_disable_workarounds (see 'postconf -d' output)\fR"
List or bit\-mask of OpenSSL bug work\-arounds to disable.
.IP "\fBtls_preempt_cipherlist (no)\fR"
With SSLv3 and later, use the Postfix SMTP server's cipher
preference order instead of the remote client's cipher preference
order.
.PP
Available in Postfix version 2.9 and later:
.IP "\fBtls_legacy_public_key_fingerprints (no)\fR"
A temporary migration aid for sites that use certificate
\fIpublic\-key\fR fingerprints with Postfix 2.9.0..2.9.5, which use
an incorrect algorithm.
.PP
Available in Postfix version 2.11\-3.1:
.IP "\fBtls_dane_digest_agility (on)\fR"
Configure RFC7671 DANE TLSA digest algorithm agility.
.IP "\fBtls_dane_trust_anchor_digest_enable (yes)\fR"
Enable support for RFC 6698 (DANE TLSA) DNS records that contain
digests of trust\-anchors with certificate usage "2".
.PP
Available in Postfix version 2.11 and later:
.IP "\fBtlsmgr_service_name (tlsmgr)\fR"
The name of the \fBtlsmgr\fR(8) service entry in master.cf.
.PP
Available in Postfix version 3.0 and later:
.IP "\fBtls_session_ticket_cipher (Postfix >= 3.0: aes\-256\-cbc, Postfix < 3.0: aes\-128\-cbc)\fR"
Algorithm used to encrypt RFC5077 TLS session tickets.
.IP "\fBopenssl_path (openssl)\fR"
The location of the OpenSSL command line program \fBopenssl\fR(1).
.PP
Available in Postfix version 3.2 and later:
.IP "\fBtls_eecdh_auto_curves (see 'postconf -d' output)\fR"
The prioritized list of elliptic curves supported by the Postfix
SMTP client and server.
.PP
Available in Postfix version 3.4 and later:
.IP "\fBtls_server_sni_maps (empty)\fR"
Optional lookup tables that map names received from remote SMTP
clients via the TLS Server Name Indication (SNI) extension to the
appropriate keys and certificate chains.
.SH "STARTTLS SERVER CONTROLS"
.na
.nf
.ad
.fi
These settings are clones of Postfix SMTP server settings.
They allow \fBtlsproxy\fR(8) to load the same certificate
and private key information as the Postfix SMTP server,
before dropping privileges, so that the key files can be
kept read\-only for root. These settings can currently not
be overruled by information in a \fBtlsproxy\fR(8) client
request, but that limitation may be removed in a future
version.
.IP "\fBtlsproxy_tls_CAfile ($smtpd_tls_CAfile)\fR" .IP "\fBtlsproxy_tls_CAfile ($smtpd_tls_CAfile)\fR"
A file containing (PEM format) CA certificates of root CAs A file containing (PEM format) CA certificates of root CAs
trusted to sign either remote SMTP client certificates or intermediate trusted to sign either remote SMTP client certificates or intermediate
@ -150,29 +232,20 @@ client certificate in order to allow TLS connections to proceed.
The SMTP TLS security level for the Postfix \fBtlsproxy\fR(8) server; The SMTP TLS security level for the Postfix \fBtlsproxy\fR(8) server;
when a non\-empty value is specified, this overrides the obsolete when a non\-empty value is specified, this overrides the obsolete
parameters smtpd_use_tls and smtpd_enforce_tls. parameters smtpd_use_tls and smtpd_enforce_tls.
.PP
Available in Postfix version 2.11 and later:
.IP "\fBtlsmgr_service_name (tlsmgr)\fR"
The name of the \fBtlsmgr\fR(8) service entry in master.cf.
.PP
Available in Postfix version 3.4 and later:
.IP "\fBtlsproxy_tls_chain_files ($smtpd_tls_chain_files)\fR" .IP "\fBtlsproxy_tls_chain_files ($smtpd_tls_chain_files)\fR"
Files with the Postfix \fBtlsproxy\fR(8) server keys and certificate Files with the Postfix \fBtlsproxy\fR(8) server keys and certificate
chains in PEM format. chains in PEM format.
.IP "\fBtls_server_sni_maps (empty)\fR" .SH "STARTTLS CLIENT CONTROLS"
Optional lookup tables that map names received from remote SMTP
clients via the TLS Server Name Indication (SNI) extension to the
appropriate keys and certificate chains.
.SH "TLS CLIENT CONTROLS"
.na .na
.nf .nf
.ad .ad
.fi .fi
These parameters are clones of SMTP client settings. They These settings are clones of Postfix SMTP client settings.
allow \fBtlsproxy\fR(8) to load the same certificate and They allow \fBtlsproxy\fR(8) to load the same certificate
private key information as the SMTP client, before dropping and private key information as the Postfix SMTP client,
privileges, so that the key files can be kept read\-only for before dropping privileges, so that the key files can be
root. kept read\-only for root. Some settings may be overruled by
information in a \fBtlsproxy\fR(8) client request.
.PP .PP
Available in Postfix version 3.4 and later: Available in Postfix version 3.4 and later:
.IP "\fBtlsproxy_client_CAfile ($smtp_tls_CAfile)\fR" .IP "\fBtlsproxy_client_CAfile ($smtp_tls_CAfile)\fR"

View File

@ -763,6 +763,8 @@ while (<>) {
s;\btls_session_ticket_cipher\b;<a href="postconf.5.html#tls_session_ticket_cipher">$&</a>;g; s;\btls_session_ticket_cipher\b;<a href="postconf.5.html#tls_session_ticket_cipher">$&</a>;g;
s;\btls_server_sni_maps\b;<a href="postconf.5.html#tls_server_sni_maps">$&</a>;g; s;\btls_server_sni_maps\b;<a href="postconf.5.html#tls_server_sni_maps">$&</a>;g;
s;\btls_ssl_options\b;<a href="postconf.5.html#tls_ssl_options">$&</a>;g; s;\btls_ssl_options\b;<a href="postconf.5.html#tls_ssl_options">$&</a>;g;
s;\btls_dane_digest_agility\b;<a href="postconf.5.html#tls_dane_digest_agility">$&</a>;g;
s;\btls_dane_trust_anchor_digest_enable\b;<a href="postconf.5.html#tls_dane_trust_anchor_digest_enable">$&</a>;g;
s;\bfrozen_delivered_to\b;<a href="postconf.5.html#frozen_delivered_to">$&</a>;g; s;\bfrozen_delivered_to\b;<a href="postconf.5.html#frozen_delivered_to">$&</a>;g;
s;\breset_owner_alias\b;<a href="postconf.5.html#reset_owner_alias">$&</a>;g; s;\breset_owner_alias\b;<a href="postconf.5.html#reset_owner_alias">$&</a>;g;

View File

@ -0,0 +1,178 @@
<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Postfix BDAT (CHUNKING) support</title>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body>
<h1><img src="postfix-logo.jpg" width="203" height="98" ALT="">Postfix
BDAT (CHUNKING) support</h1>
<hr>
<h2>Overview </h2>
<p> Postfix SMTP server supports RFC 3030 CHUNKING (the BDAT command)
without BINARYMIME, in both smtpd(8) and postscreen(8). It is enabled
by default. </p>
<p> Topics covered in this document: </p>
<ul>
<li><a href="#disable"> Disabling BDAT support</a>
<li><a href="#impact"> Impact on existing configurations</a>
<li><a href="#example"> Example SMTP session</a>
<li> <a href="#benefits">Benefits of CHUNKING (BDAT) support without BINARYMIME</a>
<li> <a href="#downsides">Downsides of CHUNKING (BDAT) support</a>
</ul>
<h2> <a name="disable"> Disabling BDAT support </a> </h2>
<p> BDAT support is enabled by default. To disable BDAT support
globally: </p>
<blockquote>
<pre>
/etc/postfix/main.cf:
# The logging alternative:
smtpd_discard_ehlo_keywords = chunking
# The non-logging alternative:
smtpd_discard_ehlo_keywords = chunking, silent_discard
</pre>
</blockquote>
<p> Specify '-o smtpd_discard_ehlo_keywords=' in master.cf
for the submission and smtps services, if you have clients
that benefit from CHUNKING support. </p>
<h2> <a name="impact"> Impact on existing configurations </a> </h2>
<ul>
<li> <p> There are no changes for smtpd_mumble_restrictions,
smtpd_proxy_filter, smtpd_milters, or for postscreen settings,
except for the above mentioned option to suppress the SMTP server's
CHUNKING service announcement. </p>
<li> <p> There are no changes in the Postfix queue file content,
no changes for down-stream SMTP servers or after-queue content
filters, and no changes in the envelope or message content that
Milters will receive. </p>
</ul>
<h2> <a name="example"> Example SMTP session</a> </h2>
<p> The main differences are that the Postfix SMTP server announces
"CHUNKING" support in the EHLO response, and that instead of sending
one DATA request, the remote SMTP client may send one or more BDAT
requests. In the example below, "S:" indicates server responses,
and "C:" indicates client requests (bold font). </p>
<blockquote>
<pre>
S: 220 server.example.com
C: <b>EHLO client.example.com</b>
S: 250-server.example.com
S: 250-PIPELINING
S: 250-SIZE 153600000
S: 250-VRFY
S: 250-ETRN
S: 250-STARTTLS
S: 250-AUTH PLAIN LOGIN
S: 250-ENHANCEDSTATUSCODES
S: 250-8BITMIME
S: 250-DSN
S: 250-SMTPUTF8
S: 250 CHUNKING
C: <b>MAIL FROM:&lt;sender@example.com&gt;</b>
S: 250 2.1.0 Ok
C: <b>RCPT TO:&lt;recipient@example.com&gt;</b>
S: 250 2.1.5 Ok
C: <b>BDAT 10000</b>
C: <b>..followed by 10000 bytes...</b>
S: 250 2.0.0 Ok: 10000 bytes
C: <b>BDAT 123</b>
C: <b>..followed by 123 bytes...</b>
S: 250 2.0.0 Ok: 123 bytes
C: <b>BDAT 0 LAST</b>
S: 250 2.0.0 Ok: 10123 bytes queued as 41yYhh41qmznjbD
C: <b>QUIT</b>
S: 221 2.0.0 Bye
</pre>
</blockquote>
<p> Internally in Postfix, there is no difference between mail that
was received with BDAT or with DATA. Postfix smtpd_mumble_restrictions,
policy delegation queries, smtpd_proxy_filter and Milters all behave
as if Postfix received (MAIL + RCPT + DATA + end-of-data). However,
Postfix will log BDAT-related failures as "xxx after BDAT" to avoid
complicating troubleshooting (xxx = 'lost connection' or 'timeout'),
and will log a warning when a client sends a malformed BDAT command.
</p>
<h2> <a name="benefits">Benefits of CHUNKING (BDAT) support without
BINARYMIME</a> </h2>
<p> Support for CHUNKING (BDAT) was added to improve interoperability
with some clients, a benefit that would reportedly exist even without
Postfix support for BINARYMIME. Since June 2018, Wietse's mail
server has received BDAT commands from a variety of systems. </p>
<p> Postfix does not support BINARYMIME at this time because: </p>
<ul>
<li> <p> BINARYMIME support would require moderately invasive
changes to Postfix, to support email content that is not line-oriented.
With BINARYMIME, the Content-Length: message header specifies the
length of content that may or may not have line boundaries. Without
BINARYMIME support, email RFCs require that binary content is
base64-encoded, and formatted as lines of text. </p>
<li> <p> For delivery to non-BINARYMIME systems including UNIX mbox,
the available options are to convert binary content into 8bit text,
one of the 7bit forms (base64 or quoted-printable), or to return
email as undeliverable. Any conversion would obviously break digital
signatures, so conversion would have to happen before signing. </p>
</ul>
<h2> <a name="downsides">Downsides of CHUNKING (BDAT) support</a>
</h2>
<p> The RFC 3030 authors did not specify any limitations on how
clients may pipeline commands (i.e. send commands without waiting
for a server response). If a server announces PIPELINING support,
like Postfix does, then a remote SMTP client can pipeline all
commands following EHLO, for example, MAIL/RCPT/BDAT/BDAT/MAIL/RCPT/BDAT,
without ever having to wait for a server response. This means that
with BDAT, the Postfix SMTP server cannot distinguish between a
well-behaved client and a spambot, based on their command pipelining
behavior. If you require "reject_unauth_pipelining" to block spambots,
then turn off Postfix's CHUNKING announcement as described above.
</p>
<p> In RFC 4468, the authors write that a client may pipeline
commands, and that after sending BURL LAST or BDAT LAST, a client
must wait for the server's response. But as this text does not
appear in RFC 3030 which defines BDAT, is it a useless restriction
that Postfix will not enforce. </p>
</body>
</html>

View File

@ -11,6 +11,7 @@ HTML = ../html/ADDRESS_CLASS_README.html \
../html/ADDRESS_VERIFICATION_README.html \ ../html/ADDRESS_VERIFICATION_README.html \
../html/BACKSCATTER_README.html \ ../html/BACKSCATTER_README.html \
../html/BASIC_CONFIGURATION_README.html \ ../html/BASIC_CONFIGURATION_README.html \
../html/BDAT_README.html \
../html/BUILTIN_FILTER_README.html \ ../html/BUILTIN_FILTER_README.html \
../html/CDB_README.html \ ../html/CDB_README.html \
../html/COMPATIBILITY_README.html \ ../html/COMPATIBILITY_README.html \
@ -57,6 +58,7 @@ README = ../README_FILES/ADDRESS_CLASS_README \
../README_FILES/ADDRESS_VERIFICATION_README \ ../README_FILES/ADDRESS_VERIFICATION_README \
../README_FILES/BACKSCATTER_README \ ../README_FILES/BACKSCATTER_README \
../README_FILES/BASIC_CONFIGURATION_README \ ../README_FILES/BASIC_CONFIGURATION_README \
../README_FILES/BDAT_README \
../README_FILES/BUILTIN_FILTER_README \ ../README_FILES/BUILTIN_FILTER_README \
../README_FILES/CDB_README \ ../README_FILES/CDB_README \
../README_FILES/COMPATIBILITY_README \ ../README_FILES/COMPATIBILITY_README \
@ -179,6 +181,9 @@ clobber:
../html/BASIC_CONFIGURATION_README.html: BASIC_CONFIGURATION_README.html ../html/BASIC_CONFIGURATION_README.html: BASIC_CONFIGURATION_README.html
$(DETAB) $? | $(POSTLINK) >$@ $(DETAB) $? | $(POSTLINK) >$@
../html/BDAT_README.html: BDAT_README.html
$(DETAB) $? | $(POSTLINK) >$@
../html/BUILTIN_FILTER_README.html: BUILTIN_FILTER_README.html ../html/BUILTIN_FILTER_README.html: BUILTIN_FILTER_README.html
$(DETAB) $? | $(POSTLINK) >$@ $(DETAB) $? | $(POSTLINK) >$@
@ -338,6 +343,9 @@ clobber:
../README_FILES/BASIC_CONFIGURATION_README: BASIC_CONFIGURATION_README.html ../README_FILES/BASIC_CONFIGURATION_README: BASIC_CONFIGURATION_README.html
$(DETAB) $? | $(HT2READ) >$@ $(DETAB) $? | $(HT2READ) >$@
../README_FILES/BDAT_README: BDAT_README.html
$(DETAB) $? | $(HT2READ) >$@
../README_FILES/BUILTIN_FILTER_README: BUILTIN_FILTER_README.html ../README_FILES/BUILTIN_FILTER_README: BUILTIN_FILTER_README.html
$(DETAB) $? | $(HT2READ) >$@ $(DETAB) $? | $(HT2READ) >$@

View File

@ -20,8 +20,8 @@
* Patches change both the patchlevel and the release date. Snapshots have no * Patches change both the patchlevel and the release date. Snapshots have no
* patchlevel; they change the release date only. * patchlevel; they change the release date only.
*/ */
#define MAIL_RELEASE_DATE "20190209" #define MAIL_RELEASE_DATE "20190210"
#define MAIL_VERSION_NUMBER "3.4" #define MAIL_VERSION_NUMBER "3.5"
#ifdef SNAPSHOT #ifdef SNAPSHOT
#define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE #define MAIL_VERSION_DATE "-" MAIL_RELEASE_DATE

View File

@ -30,6 +30,11 @@
/* IBM T.J. Watson Research /* IBM T.J. Watson Research
/* P.O. Box 704 /* P.O. Box 704
/* Yorktown Heights, NY 10598, USA /* Yorktown Heights, NY 10598, USA
/*
/* Wietse Venema
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*--*/ /*--*/
/* System libraries. */ /* System libraries. */

View File

@ -26,7 +26,7 @@
/* with the operation of some of these programs). These programs /* with the operation of some of these programs). These programs
/* can log to \fBpostlogd\fR(8) if they are run by the super-user, /* can log to \fBpostlogd\fR(8) if they are run by the super-user,
/* or if their executable file has set-gid permission. Do not /* or if their executable file has set-gid permission. Do not
/* set this permision on programs other than \fBpostdrop\fR(1) /* set this permission on programs other than \fBpostdrop\fR(1)
/* and \fBpostqueue\fR(1). /* and \fBpostqueue\fR(1).
/* CONFIGURATION PARAMETERS /* CONFIGURATION PARAMETERS
/* .ad /* .ad

View File

@ -459,6 +459,13 @@
/* .IP "\fBtls_disable_workarounds (see 'postconf -d' output)\fR" /* .IP "\fBtls_disable_workarounds (see 'postconf -d' output)\fR"
/* List or bit-mask of OpenSSL bug work-arounds to disable. /* List or bit-mask of OpenSSL bug work-arounds to disable.
/* .PP /* .PP
/* Available in Postfix version 2.11-3.1:
/* .IP "\fBtls_dane_digest_agility (on)\fR"
/* Configure RFC7671 DANE TLSA digest algorithm agility.
/* .IP "\fBtls_dane_trust_anchor_digest_enable (yes)\fR"
/* Enable support for RFC 6698 (DANE TLSA) DNS records that contain
/* digests of trust-anchors with certificate usage "2".
/* .PP
/* Available in Postfix version 2.11 and later: /* Available in Postfix version 2.11 and later:
/* .IP "\fBsmtp_tls_trust_anchor_file (empty)\fR" /* .IP "\fBsmtp_tls_trust_anchor_file (empty)\fR"
/* Zero or more PEM-format files with trust-anchor certificates /* Zero or more PEM-format files with trust-anchor certificates

View File

@ -1095,7 +1095,8 @@
/* .na /* .na
/* .nf /* .nf
/* ADDRESS_CLASS_README, blocking unknown hosted or relay recipients /* ADDRESS_CLASS_README, blocking unknown hosted or relay recipients
/* ADDRESS_REWRITING_README Postfix address manipulation /* ADDRESS_REWRITING_README, Postfix address manipulation
/* BDAT_README, Postfix CHUNKING support
/* FILTER_README, external after-queue content filter /* FILTER_README, external after-queue content filter
/* LOCAL_RECIPIENT_README, blocking unknown local recipients /* LOCAL_RECIPIENT_README, blocking unknown local recipients
/* MILTER_README, before-queue mail filter applications /* MILTER_README, before-queue mail filter applications

View File

@ -123,6 +123,7 @@ extern int tls_proxy_client_init_print(ATTR_PRINT_MASTER_FN, VSTREAM *, int, voi
extern int tls_proxy_client_init_scan(ATTR_SCAN_MASTER_FN, VSTREAM *, int, void *); extern int tls_proxy_client_init_scan(ATTR_SCAN_MASTER_FN, VSTREAM *, int, void *);
extern void tls_proxy_client_init_free(TLS_CLIENT_INIT_PROPS *); extern void tls_proxy_client_init_free(TLS_CLIENT_INIT_PROPS *);
extern char *tls_proxy_client_init_to_string(VSTRING *, TLS_CLIENT_INIT_PROPS *); extern char *tls_proxy_client_init_to_string(VSTRING *, TLS_CLIENT_INIT_PROPS *);
extern char *tls_proxy_client_init_with_names_to_string(VSTRING *, TLS_CLIENT_INIT_PROPS *);
extern int tls_proxy_client_start_print(ATTR_PRINT_MASTER_FN, VSTREAM *, int, void *); extern int tls_proxy_client_start_print(ATTR_PRINT_MASTER_FN, VSTREAM *, int, void *);
extern int tls_proxy_client_start_scan(ATTR_SCAN_MASTER_FN, VSTREAM *, int, void *); extern int tls_proxy_client_start_scan(ATTR_SCAN_MASTER_FN, VSTREAM *, int, void *);

View File

@ -16,6 +16,10 @@
/* char *tls_proxy_client_param_with_names_to_string(buf, params) /* char *tls_proxy_client_param_with_names_to_string(buf, params)
/* VSTRING *buf; /* VSTRING *buf;
/* TLS_CLIENT_PARAMS *params; /* TLS_CLIENT_PARAMS *params;
/*
/* char *tls_proxy_client_init_to_string(buf, init_props)
/* VSTRING *buf;
/* TLS_CLIENT_INIT_PROPS *init_props;
/* DESCRIPTION /* DESCRIPTION
/* tls_proxy_client_param_from_config() initializes a TLS_CLIENT_PARAMS /* tls_proxy_client_param_from_config() initializes a TLS_CLIENT_PARAMS
/* structure from configuration parameters and returns its /* structure from configuration parameters and returns its
@ -25,10 +29,19 @@
/* tls_proxy_client_param_to_string() produces a lookup key /* tls_proxy_client_param_to_string() produces a lookup key
/* that is unique for the TLS_CLIENT_PARAMS member values. /* that is unique for the TLS_CLIENT_PARAMS member values.
/* /*
/* tls_proxy_client_param_with_names_to_string() TODO produces a /* tls_proxy_client_param_with_names_to_string() produces a
/* string with "name = value\n" for each TLS_CLIENT_PARAMS member. /* string with "name = value\n" for each TLS_CLIENT_PARAMS
/* This may be useful for reporting differences between /* member. This may be useful for reporting differences between
/* TLS_CLIENT_PARAMS instances. /* TLS_CLIENT_PARAMS instances.
/*
/* tls_proxy_client_init_to_string() produces a lookup key
/* that is unique for the properties received by
/* tls_proxy_client_init_scan().
/*
/* tls_proxy_client_init_with_names_to_string() produces a
/* string with "name = value\n" for each TLS_CLIENT_INIT_PROPS
/* member. This may be useful for reporting differences between
/* TLS_CLIENT_INIT_PROPS instances.
/* LICENSE /* LICENSE
/* .ad /* .ad
/* .fi /* .fi
@ -141,4 +154,45 @@ char *tls_proxy_client_param_with_names_to_string(VSTRING *buf, TLS_CLIENT_PAR
return (vstring_str(buf)); return (vstring_str(buf));
} }
/* tls_proxy_client_init_to_string - serialize to string */
char *tls_proxy_client_init_to_string(VSTRING *buf,
TLS_CLIENT_INIT_PROPS *props)
{
vstring_sprintf(buf, "%s\n%s\n%d\n%s\n%s\n%s\n%s\n%s\n%s\n"
"%s\n%s\n%s\n%s\n%s\n", props->log_param,
props->log_level, props->verifydepth,
props->cache_type, props->chain_files,
props->cert_file, props->key_file,
props->dcert_file, props->dkey_file,
props->eccert_file, props->eckey_file,
props->CAfile, props->CApath, props->mdalg);
return (vstring_str(buf));
}
/* tls_proxy_client_init_with_names_to_string - serialize to string */
char *tls_proxy_client_init_with_names_to_string(VSTRING *buf,
TLS_CLIENT_INIT_PROPS *props)
{
vstring_sprintf(buf, "%s = %s\n%s = %s\n%s = %d\n%s = %s\n%s = %s\n"
"%s = %s\n%s = %s\n%s = %s\n%s = %s\n%s = %s\n"
"%s = %s\n%s = %s\n%s = %s\n%s = %s\n",
TLS_ATTR_LOG_PARAM, props->log_param,
TLS_ATTR_LOG_LEVEL, props->log_level,
TLS_ATTR_VERIFYDEPTH, props->verifydepth,
TLS_ATTR_CACHE_TYPE, props->cache_type,
TLS_ATTR_CHAIN_FILES, props->chain_files,
TLS_ATTR_CERT_FILE, props->cert_file,
TLS_ATTR_KEY_FILE, props->key_file,
TLS_ATTR_DCERT_FILE, props->dcert_file,
TLS_ATTR_DKEY_FILE, props->dkey_file,
TLS_ATTR_ECCERT_FILE, props->eccert_file,
TLS_ATTR_ECKEY_FILE, props->eckey_file,
TLS_ATTR_CAFILE, props->CAfile,
TLS_ATTR_CAPATH, props->CApath,
TLS_ATTR_MDALG, props->mdalg);
return (vstring_str(buf));
}
#endif #endif

View File

@ -21,10 +21,6 @@
/* int flags; /* int flags;
/* void *ptr; /* void *ptr;
/* /*
/* char *tls_proxy_client_init_to_string(buf, init_props)
/* VSTRING *buf;
/* TLS_CLIENT_INIT_PROPS *init_props;
/*
/* void tls_proxy_client_init_free(init_props) /* void tls_proxy_client_init_free(init_props)
/* TLS_CLIENT_INIT_PROPS *init_props; /* TLS_CLIENT_INIT_PROPS *init_props;
/* /*
@ -57,10 +53,6 @@
/* scan routine. tls_proxy_client_init_scan() is meant to be passed /* scan routine. tls_proxy_client_init_scan() is meant to be passed
/* as a call-back function to attr_scan(), as shown below. /* as a call-back function to attr_scan(), as shown below.
/* /*
/* tls_proxy_client_init_to_string() produces a lookup key
/* that is unique for the properties received by
/* tls_proxy_client_init_scan().
/*
/* tls_proxy_client_init_free() destroys a TLS_CLIENT_INIT_PROPS /* tls_proxy_client_init_free() destroys a TLS_CLIENT_INIT_PROPS
/* structure that was created by tls_proxy_client_init_scan(). /* structure that was created by tls_proxy_client_init_scan().
/* /*
@ -324,22 +316,6 @@ int tls_proxy_client_init_scan(ATTR_SCAN_MASTER_FN scan_fn, VSTREAM *fp,
return (ret); return (ret);
} }
/* tls_proxy_client_init_to_string - serialize to string */
char *tls_proxy_client_init_to_string(VSTRING *buf,
TLS_CLIENT_INIT_PROPS *props)
{
vstring_sprintf(buf, "%s\n%s\n%d\n%s\n%s\n%s\n%s\n%s\n%s\n"
"%s\n%s\n%s\n%s\n%s\n", props->log_param,
props->log_level, props->verifydepth,
props->cache_type, props->chain_files,
props->cert_file, props->key_file,
props->dcert_file, props->dkey_file,
props->eccert_file, props->eckey_file,
props->CAfile, props->CApath, props->mdalg);
return (vstring_str(buf));
}
/* tls_proxy_client_certs_free - destroy TLS_PKEYS from stream */ /* tls_proxy_client_certs_free - destroy TLS_PKEYS from stream */
static void tls_proxy_client_certs_free(TLS_CERTS *tp) static void tls_proxy_client_certs_free(TLS_CERTS *tp)

View File

@ -57,9 +57,89 @@
/* /*
/* The text below provides only a parameter summary. See /* The text below provides only a parameter summary. See
/* \fBpostconf\fR(5) for more details including examples. /* \fBpostconf\fR(5) for more details including examples.
/* STARTTLS SUPPORT CONTROLS /* STARTTLS GLOBAL CONTROLS
/* .ad /* .ad
/* .fi /* .fi
/* The following settings are global and therefore cannot be
/* overruled by information specified in a \fBtlsproxy\fR(8)
/* client request.
/* .IP "\fBtls_append_default_CA (no)\fR"
/* Append the system-supplied default Certification Authority
/* certificates to the ones specified with *_tls_CApath or *_tls_CAfile.
/* .IP "\fBtls_daemon_random_bytes (32)\fR"
/* The number of pseudo-random bytes that an \fBsmtp\fR(8) or \fBsmtpd\fR(8)
/* process requests from the \fBtlsmgr\fR(8) server in order to seed its
/* internal pseudo random number generator (PRNG).
/* .IP "\fBtls_high_cipherlist (see 'postconf -d' output)\fR"
/* The OpenSSL cipherlist for "high" grade ciphers.
/* .IP "\fBtls_medium_cipherlist (see 'postconf -d' output)\fR"
/* The OpenSSL cipherlist for "medium" or higher grade ciphers.
/* .IP "\fBtls_low_cipherlist (see 'postconf -d' output)\fR"
/* The OpenSSL cipherlist for "low" or higher grade ciphers.
/* .IP "\fBtls_export_cipherlist (see 'postconf -d' output)\fR"
/* The OpenSSL cipherlist for "export" or higher grade ciphers.
/* .IP "\fBtls_null_cipherlist (eNULL:!aNULL)\fR"
/* The OpenSSL cipherlist for "NULL" grade ciphers that provide
/* authentication without encryption.
/* .IP "\fBtls_eecdh_strong_curve (prime256v1)\fR"
/* The elliptic curve used by the Postfix SMTP server for sensibly
/* strong
/* ephemeral ECDH key exchange.
/* .IP "\fBtls_eecdh_ultra_curve (secp384r1)\fR"
/* The elliptic curve used by the Postfix SMTP server for maximally
/* strong
/* ephemeral ECDH key exchange.
/* .IP "\fBtls_disable_workarounds (see 'postconf -d' output)\fR"
/* List or bit-mask of OpenSSL bug work-arounds to disable.
/* .IP "\fBtls_preempt_cipherlist (no)\fR"
/* With SSLv3 and later, use the Postfix SMTP server's cipher
/* preference order instead of the remote client's cipher preference
/* order.
/* .PP
/* Available in Postfix version 2.9 and later:
/* .IP "\fBtls_legacy_public_key_fingerprints (no)\fR"
/* A temporary migration aid for sites that use certificate
/* \fIpublic-key\fR fingerprints with Postfix 2.9.0..2.9.5, which use
/* an incorrect algorithm.
/* .PP
/* Available in Postfix version 2.11-3.1:
/* .IP "\fBtls_dane_digest_agility (on)\fR"
/* Configure RFC7671 DANE TLSA digest algorithm agility.
/* .IP "\fBtls_dane_trust_anchor_digest_enable (yes)\fR"
/* Enable support for RFC 6698 (DANE TLSA) DNS records that contain
/* digests of trust-anchors with certificate usage "2".
/* .PP
/* Available in Postfix version 2.11 and later:
/* .IP "\fBtlsmgr_service_name (tlsmgr)\fR"
/* The name of the \fBtlsmgr\fR(8) service entry in master.cf.
/* .PP
/* Available in Postfix version 3.0 and later:
/* .IP "\fBtls_session_ticket_cipher (Postfix >= 3.0: aes-256-cbc, Postfix < 3.0: aes-128-cbc)\fR"
/* Algorithm used to encrypt RFC5077 TLS session tickets.
/* .IP "\fBopenssl_path (openssl)\fR"
/* The location of the OpenSSL command line program \fBopenssl\fR(1).
/* .PP
/* Available in Postfix version 3.2 and later:
/* .IP "\fBtls_eecdh_auto_curves (see 'postconf -d' output)\fR"
/* The prioritized list of elliptic curves supported by the Postfix
/* SMTP client and server.
/* .PP
/* Available in Postfix version 3.4 and later:
/* .IP "\fBtls_server_sni_maps (empty)\fR"
/* Optional lookup tables that map names received from remote SMTP
/* clients via the TLS Server Name Indication (SNI) extension to the
/* appropriate keys and certificate chains.
/* STARTTLS SERVER CONTROLS
/* .ad
/* .fi
/* These settings are clones of Postfix SMTP server settings.
/* They allow \fBtlsproxy\fR(8) to load the same certificate
/* and private key information as the Postfix SMTP server,
/* before dropping privileges, so that the key files can be
/* kept read-only for root. These settings can currently not
/* be overruled by information in a \fBtlsproxy\fR(8) client
/* request, but that limitation may be removed in a future
/* version.
/* .IP "\fBtlsproxy_tls_CAfile ($smtpd_tls_CAfile)\fR" /* .IP "\fBtlsproxy_tls_CAfile ($smtpd_tls_CAfile)\fR"
/* A file containing (PEM format) CA certificates of root CAs /* A file containing (PEM format) CA certificates of root CAs
/* trusted to sign either remote SMTP client certificates or intermediate /* trusted to sign either remote SMTP client certificates or intermediate
@ -134,27 +214,18 @@
/* The SMTP TLS security level for the Postfix \fBtlsproxy\fR(8) server; /* The SMTP TLS security level for the Postfix \fBtlsproxy\fR(8) server;
/* when a non-empty value is specified, this overrides the obsolete /* when a non-empty value is specified, this overrides the obsolete
/* parameters smtpd_use_tls and smtpd_enforce_tls. /* parameters smtpd_use_tls and smtpd_enforce_tls.
/* .PP
/* Available in Postfix version 2.11 and later:
/* .IP "\fBtlsmgr_service_name (tlsmgr)\fR"
/* The name of the \fBtlsmgr\fR(8) service entry in master.cf.
/* .PP
/* Available in Postfix version 3.4 and later:
/* .IP "\fBtlsproxy_tls_chain_files ($smtpd_tls_chain_files)\fR" /* .IP "\fBtlsproxy_tls_chain_files ($smtpd_tls_chain_files)\fR"
/* Files with the Postfix \fBtlsproxy\fR(8) server keys and certificate /* Files with the Postfix \fBtlsproxy\fR(8) server keys and certificate
/* chains in PEM format. /* chains in PEM format.
/* .IP "\fBtls_server_sni_maps (empty)\fR" /* STARTTLS CLIENT CONTROLS
/* Optional lookup tables that map names received from remote SMTP
/* clients via the TLS Server Name Indication (SNI) extension to the
/* appropriate keys and certificate chains.
/* TLS CLIENT CONTROLS
/* .ad /* .ad
/* .fi /* .fi
/* These parameters are clones of SMTP client settings. They /* These settings are clones of Postfix SMTP client settings.
/* allow \fBtlsproxy\fR(8) to load the same certificate and /* They allow \fBtlsproxy\fR(8) to load the same certificate
/* private key information as the SMTP client, before dropping /* and private key information as the Postfix SMTP client,
/* privileges, so that the key files can be kept read-only for /* before dropping privileges, so that the key files can be
/* root. /* kept read-only for root. Some settings may be overruled by
/* information in a \fBtlsproxy\fR(8) client request.
/* .PP /* .PP
/* Available in Postfix version 3.4 and later: /* Available in Postfix version 3.4 and later:
/* .IP "\fBtlsproxy_client_CAfile ($smtp_tls_CAfile)\fR" /* .IP "\fBtlsproxy_client_CAfile ($smtp_tls_CAfile)\fR"
@ -430,14 +501,14 @@ static TLS_APPL_STATE *tlsp_server_ctx;
static TLS_APPL_STATE *tlsp_client_ctx; static TLS_APPL_STATE *tlsp_client_ctx;
static bool tlsp_pre_jail_done; static bool tlsp_pre_jail_done;
static int ask_client_cert; static int ask_client_cert;
static char *tlsp_pre_jail_client_param_key; /* pre-jail global params */
static char *tlsp_pre_jail_client_init_key; /* pre-jail init props */
/* /*
* TLS per-client status. * TLS per-client status.
*/ */
static HTABLE *tlsp_client_app_cache; static HTABLE *tlsp_client_app_cache; /* per-client init props */
static BH_TABLE *tlsp_params_mismatch_filter; static BH_TABLE *tlsp_params_mismatch_filter; /* per-client nag filter */
static char *tlsp_pre_jail_client_param_key;
static char *tlsp_pre_jail_client_init_key;
/* /*
* Error handling: if a function detects an error, then that function is * Error handling: if a function detects an error, then that function is
@ -1088,16 +1159,19 @@ static TLS_APPL_STATE *tlsp_client_init(TLS_CLIENT_PARAMS *tls_params,
/* /*
* Use one TLS_APPL_STATE object for all requests that specify the same * Use one TLS_APPL_STATE object for all requests that specify the same
* TLS_CLIENT_INIT_PROPS. Each TLS_APPL_STATE owns an SSL_CTX, which is * TLS_CLIENT_INIT_PROPS. Each TLS_APPL_STATE owns an SSL_CTX, which is
* expensive to create. * expensive to create. Bug: TLS_CLIENT_PARAMS are not used when creating
* a TLS_APPL_STATE instance.
* *
* First, compute the TLS_APPL_STATE cache lookup key. Save a copy of the * First, compute the TLS_APPL_STATE cache lookup key. Save a copy of the
* TLS_CLIENT_PARAMS and TLSPROXY_CLIENT_INIT_PROPS settings from the * pre-jail request TLS_CLIENT_PARAMS and TLSPROXY_CLIENT_INIT_PROPS
* pre-jail internal request. * settings, so that we can detect post-jail requests that do not match.
*/ */
param_buf = vstring_alloc(100); param_buf = vstring_alloc(100);
param_key = tls_proxy_client_param_to_string(param_buf, tls_params); param_key = tls_proxy_client_param_with_names_to_string(
param_buf, tls_params);
init_buf = vstring_alloc(100); init_buf = vstring_alloc(100);
init_key = tls_proxy_client_init_to_string(init_buf, init_props); init_key = tls_proxy_client_init_with_names_to_string(
init_buf, init_props);
if (tlsp_pre_jail_done == 0) { if (tlsp_pre_jail_done == 0) {
if (tlsp_pre_jail_client_param_key != 0 if (tlsp_pre_jail_client_param_key != 0
|| tlsp_pre_jail_client_init_key != 0) || tlsp_pre_jail_client_init_key != 0)
@ -1108,9 +1182,9 @@ static TLS_APPL_STATE *tlsp_client_init(TLS_CLIENT_PARAMS *tls_params,
/* /*
* Log a warning if a post-jail request uses unexpected TLS_CLIENT_PARAMS * Log a warning if a post-jail request uses unexpected TLS_CLIENT_PARAMS
* settings. These differences are problematic because TLS_CLIENT_PARAMS * settings. Bug: TLS_CLIENT_PARAMS settings are not used when creating a
* settings are unfortunately not passed to tls_client_init(). Only the * TLS_APPL_STATE instance; this makes a mismatch of TLS_CLIENT_PARAMS
* init_props settings are used. * settings problematic.
*/ */
if (tlsp_pre_jail_done if (tlsp_pre_jail_done
&& !been_here_fixed(tlsp_params_mismatch_filter, param_key) && !been_here_fixed(tlsp_params_mismatch_filter, param_key)
@ -1129,10 +1203,12 @@ static TLS_APPL_STATE *tlsp_client_init(TLS_CLIENT_PARAMS *tls_params,
/* /*
* Before creating a TLS_APPL_STATE instance, log a warning if a * Before creating a TLS_APPL_STATE instance, log a warning if a
* post-jail request differs from the saved pre-jail request AND the * post-jail request differs from the saved pre-jail request AND the
* request specifies file/directory pathname arguments. Requests * post-jail request specifies file/directory pathname arguments.
* containing pathnames are problematic after chroot (pathname * Unexpected requests containing pathnames are problematic after
* resolution) and after dropping privileges (key files must be root * chroot (pathname resolution) and after dropping privileges (key
* read-only). * files must be root read-only). Unexpected requests are not a
* problem as long as they contain no pathnames (for example a
* tls_loglevel change).
* *
* We could eliminate some of this complication by adding code that * We could eliminate some of this complication by adding code that
* opens a cert/key lookup table at pre-jail time, and by reading * opens a cert/key lookup table at pre-jail time, and by reading
@ -1607,9 +1683,8 @@ static void pre_jail_init(char *unused_name, char **unused_argv)
tlsp_pre_jail_done = 1; tlsp_pre_jail_done = 1;
/* /*
* Unfortunately TLS_CLIENT_PARAMS attributes correspond to global state * Bug: TLS_CLIENT_PARAMS attributes are not used when creating a
* and can therefore not be used when creating TLS_APPL_STATE instances, * TLS_APPL_STATE instance; we can only warn about attribute mismatches.
* but we can warn about attribute mismatches.
*/ */
tlsp_params_mismatch_filter = been_here_init(BH_BOUND_NONE, BH_FLAG_NONE); tlsp_params_mismatch_filter = been_here_init(BH_BOUND_NONE, BH_FLAG_NONE);
} }