diff --git a/postfix/HISTORY b/postfix/HISTORY index abae11cae..485b4298f 100644 --- a/postfix/HISTORY +++ b/postfix/HISTORY @@ -18079,3 +18079,44 @@ Apologies for any names omitted. Bugfix: smtpd_relay_restrictions compatibility shim did not detect "empty" value. Sahil Tandon. The same problem existed with the inet_protocols shim. File: conf/post-install. + +20121105 + + Cleanup: the postscreen(8) "deep protocol" tests now log + the SMTP command that precedes a protocol violation. Files: + postscreen/postscreen_smtpd.c, proto/POSTSCREEN_README.html. + + Bugfix (introduced: Postfix 1.1): wrong string termination + when handling a MBOX From_ line at the start of a message. + File: qmqpd/qmqpd.c. + +20121110 + + Cleanup: specify $(WARN) on the MacOS X compiler command + line to suppress "nested comment" and possibly other unwanted + warnings. Problem reported by Jim Reid. File: makedefs, + Makefile.in. + +20121119 + + Documentation: added a note that key_format is required + when postscreen(8) and verify(8) share the same memcache + (with different persistent backup databases, or course) + otherwise automatic cache cleanup breaks due to a name + collision for the "last cache cleanup" database record. + File: proto/memcache. + +20121122 + + Cleanup: the safety-check for smtpd_recipient_restrictions + and smtpd_relay_restrictions now detects permit before + reject. File: smtpd/smtpd_check.c. + + Cleanup: the safety-check for smtpd_recipient_restrictions + and smtpd_relay_restrictions is no longer case-sensitive. + File: smtpd/smtpd_check.c. + +20121123 + + Cleanup: consistent escaping of commands in postscreen deep + protocol test logging. File: postscreen/postscreen_smtpd.c. diff --git a/postfix/Makefile.in b/postfix/Makefile.in index e45ba73a0..a16c89fdf 100644 --- a/postfix/Makefile.in +++ b/postfix/Makefile.in @@ -1,5 +1,5 @@ SHELL = /bin/sh -WARN = -Wmissing-prototypes -Wformat +WARN = -Wmissing-prototypes -Wformat -Wno-comment OPTS = 'CC=$(CC)' DIRS = src/util src/global src/dns src/tls src/xsasl src/milter src/master \ src/postfix src/fsstone src/smtpstone \ diff --git a/postfix/README_FILES/POSTSCREEN_README b/postfix/README_FILES/POSTSCREEN_README index 4a1d66498..6c59a5d14 100644 --- a/postfix/README_FILES/POSTSCREEN_README +++ b/postfix/README_FILES/POSTSCREEN_README @@ -18,17 +18,17 @@ by allowing whitelisted clients to skip tests, postscreen(8) minimizes its impact on legitimate email traffic. postscreen(8) should not be used on SMTP ports that receive mail from end-user -clients (MUAs). In a typical deployment, postscreen(8) is used on the "port 25" -service, while MUA clients submit mail via the submission service (port 587) -which normally requires client authentication, or via a "port 25" server that -provides no MX service (i.e. a dedicated server that provides submission -service on port 25). +clients (MUAs). In a typical deployment, postscreen(8) handles the MX service +on TCP port 25, while MUA clients submit mail via the submission service on TCP +port 587 which requires client authentication. Alternatively, a site could set +up a dedicated, non-postscreen, "port 25" server that provides submission +service and client authentication, but no MX service. postscreen(8) is part of a multi-layer defense. * As the first layer, postscreen(8) blocks connections from zombies and other spambots that are responsible for about 90% of all spam. It is implemented - as a single process to make this defense as cheap as possible. + as a single process to make this defense as inexpensive as possible. * The second layer implements more complex SMTP-level access checks with Postfix SMTP servers, policy daemons, and Milter applications. @@ -415,11 +415,12 @@ in SMTP engine anyway. This is to make postscreen(8) logging more informative. When a client sends non-SMTP commands, postscreen(8) logs this as: - NNOONN--SSMMTTPP CCOOMMMMAANNDD ffrroomm [address]:port command + NNOONN--SSMMTTPP CCOOMMMMAANNDD ffrroomm [address]:port aafftteerr command: text Translation: the SMTP client at [address]:port sent a command that matches the postscreen_forbidden_commands parameter, or that has the syntax of a message -header label. +header label (text followed by optional space and ":"). The "aafftteerr command" +portion is logged with Postfix 2.10 and later. The postscreen_non_smtp_command_action parameter specifies the action that is taken next. See "When tests fail after the 220 SMTP server greeting" below. @@ -439,10 +440,11 @@ in SMTP engine anyway. This is to make postscreen(8) logging more informative. When a client sends bare newline characters, postscreen(8) logs this as: - BBAARREE NNEEWWLLIINNEE ffrroomm [address]:port + BBAARREE NNEEWWLLIINNEE ffrroomm [address]:port aafftteerr command Translation: the SMTP client at [address]:port sent a bare newline character, -that is newline not preceded by carriage return. +that is newline not preceded by carriage return. The "aafftteerr command" portion is +logged with Postfix 2.10 and later. The postscreen_bare_newline_action parameter specifies the action that is taken next. See "When tests fail after the 220 SMTP server greeting" below. @@ -484,23 +486,26 @@ The following errors are reported by the built-in SMTP engine. This engine never accepts mail, therefore it has per-session limits on the number of commands and on the session length. - CCOOMMMMAANNDD TTIIMMEE LLIIMMIITT ffrroomm [address]:port + CCOOMMMMAANNDD TTIIMMEE LLIIMMIITT ffrroomm [address]:port aafftteerr command Translation: the SMTP client at [address]:port reached the per-command time limit as specified with the postscreen_command_time_limit parameter. The -session is terminated immediately. +session is terminated immediately. The "aafftteerr command" portion is logged with +Postfix 2.10 and later. - CCOOMMMMAANNDD CCOOUUNNTT LLIIMMIITT ffrroomm [address]:port + CCOOMMMMAANNDD CCOOUUNNTT LLIIMMIITT ffrroomm [address]:port aafftteerr command Translation: the SMTP client at [address]:port reached the per-session command count limit as specified with the postscreen_command_count_limit parameter. The -session is terminated immediately. +session is terminated immediately. The "aafftteerr command" portion is logged with +Postfix 2.10 and later. - CCOOMMMMAANNDD LLEENNGGTTHH LLIIMMIITT ffrroomm [address]:port + CCOOMMMMAANNDD LLEENNGGTTHH LLIIMMIITT ffrroomm [address]:port aafftteerr command Translation: the SMTP client at [address]:port reached the per-command length limit, as specified with the line_length_limit parameter. The session is -terminated immediately. +terminated immediately. The "aafftteerr command" portion is logged with Postfix 2.10 +and later. When an SMTP client makes too many connections at the same time, or when all postscreen(8) ports are busy, postscreen(8) rejects the connection with a 421 diff --git a/postfix/README_FILES/SASL_README b/postfix/README_FILES/SASL_README index 5d8bbaa6b..c35481991 100644 --- a/postfix/README_FILES/SASL_README +++ b/postfix/README_FILES/SASL_README @@ -55,7 +55,8 @@ different steps: addresses the client may use. Successful authentication in the Postfix SMTP server requires a functional SASL -framework. Configuring SASL should therefore always be the first step. +framework. Configuring SASL should therefore always be the first step, before +configuring Postfix. You can read more about the following topics: diff --git a/postfix/README_FILES/TLS_README b/postfix/README_FILES/TLS_README index c716989ea..4694f931f 100644 --- a/postfix/README_FILES/TLS_README +++ b/postfix/README_FILES/TLS_README @@ -147,7 +147,7 @@ Their DSA counterparts: smtpd_tls_dcert_file = /etc/postfix/server-dsa.pem smtpd_tls_dkey_file = $smtpd_tls_dcert_file -Their ECDSA counterparts (Postfix >= 2.6 + OpenSSL >= 0.9.9): +Their ECDSA counterparts (Postfix >= 2.6 + OpenSSL >= 1.0.0): /etc/postfix/main.cf: # Most clients will not be ECDSA capable, so you will likely also need @@ -540,7 +540,7 @@ To generate your own set of DH parameters, use: % ooppeennssssll ggeennddhh --oouutt //eettcc//ppoossttffiixx//ddhh__11002244..ppeemm --22 11002244 Support for elliptic curve cryptography is available with Postfix 2.6 and -OpenSSL 0.9.9 or later. To enable ephemeral elliptic curve Diffie-Hellman +OpenSSL 1.0.0 or later. To enable ephemeral elliptic curve Diffie-Hellman (EECDH) key-exchange, set "smtpd_tls_eecdh_grade = strong" or "smtpd_tls_eecdh_grade = ultra". The "ultra" setting is substantially more CPU intensive, and "strong" is sufficiently secure for most situations. @@ -1085,7 +1085,7 @@ Their DSA counterparts: smtp_tls_dcert_file = /etc/postfix/client-dsa.pem smtp_tls_dkey_file = $smtp_tls_dcert_file -Their ECDSA counterparts (Postfix >= 2.6 + OpenSSL >= 0.9.9): +Their ECDSA counterparts (Postfix >= 2.6 + OpenSSL >= 1.0.0): /etc/postfix/main.cf: smtp_tls_eccert_file = /etc/postfix/client-ecdsa.pem diff --git a/postfix/RELEASE_NOTES b/postfix/RELEASE_NOTES index 117af91e9..dfb95f1f2 100644 --- a/postfix/RELEASE_NOTES +++ b/postfix/RELEASE_NOTES @@ -14,6 +14,20 @@ specifies the release date of a stable release or snapshot release. If you upgrade from Postfix 2.8 or earlier, read RELEASE_NOTES-2.9 before proceeding. +Incompatible changes with snapshot 20121123 +=========================================== + +The postscreen deep protocol tests now log the last command before +a protocol error ("UNIMPLEMENTED" when the last command is not +implemented, "CONNECT" when there was no prior command). The +changed logfile messages are: + +NON-SMTP COMMAND from [address]:port after command: text +BARE NEWLINE from [address]:port after command +COMMAND TIME LIMIT from [address]:port after command +COMMAND COUNT LIMIT from [address]:port after command +COMMAND LENGTH LIMIT from [address]:port after command + Incompatible changes with snapshot 20121007 =========================================== diff --git a/postfix/WISHLIST b/postfix/WISHLIST index 8a5399412..b9dd0be81 100644 --- a/postfix/WISHLIST +++ b/postfix/WISHLIST @@ -11,6 +11,10 @@ Wish list: Don't forget Apple's code donation for fetching mail from IMAP server. + smtpd_muble_restrictions rule names are case-insensitive. + restriction_classes values are case-sensitive but should + be case-insensitive for consistency with smtpd_muble_restrictions. + Make "rename" the default when postmapping a DB file (later: use copy+rename for postmap -i, postmap -d). diff --git a/postfix/html/POSTSCREEN_README.html b/postfix/html/POSTSCREEN_README.html index f2ded3c7c..ba47369e9 100644 --- a/postfix/html/POSTSCREEN_README.html +++ b/postfix/html/POSTSCREEN_README.html @@ -35,11 +35,11 @@ pass its tests; by allowing whitelisted clients to skip tests,

postscreen(8) should not be used on SMTP ports that receive mail from end-user clients (MUAs). In a typical deployment, -postscreen(8) is used on the "port 25" service, while MUA clients -submit mail via the submission service (port 587) which normally -requires client authentication, or via a "port 25" server that -provides no MX service (i.e. a dedicated server that provides -submission service on port 25).

+postscreen(8) handles the MX service on TCP port 25, while MUA +clients submit mail via the submission service on TCP port 587 which +requires client authentication. Alternatively, a site could set up +a dedicated, non-postscreen, "port 25" server that provides submission +service and client authentication, but no MX service.

postscreen(8) is part of a multi-layer defense.

@@ -48,11 +48,12 @@ submission service on port 25).

  • As the first layer, postscreen(8) blocks connections from zombies and other spambots that are responsible for about 90% of all spam. It is implemented as a single process to make this defense -as cheap as possible.

    +as inexpensive as possible.

  • The second layer implements more complex SMTP-level access -checks with Postfix SMTP servers, policy daemons, and Milter -applications.

    +checks with Postfix SMTP servers, +policy daemons, and +Milter applications.

  • The third layer performs light-weight content inspection with the Postfix built-in header_checks and body_checks. This can @@ -60,8 +61,10 @@ block unacceptable attachments such as executable programs, and worms or viruses with easy-to-recognize signatures.

  • The fourth layer provides heavy-weight content inspection -with external content filters. Typical examples are Amavisd-new, -SpamAssassin, and Milter applications.

    +with external content filters. Typical examples are Amavisd-new, SpamAssassin, and Milter applications.

    @@ -562,12 +565,15 @@ logging more informative.

    as:

    -    NON-SMTP COMMAND from [address]:port command
    +    NON-SMTP COMMAND from [address]:port after command: text
     

    Translation: the SMTP client at [address]:port sent a -command that matches the postscreen_forbidden_commands -parameter, or that has the syntax of a message header label.

    +command that matches the postscreen_forbidden_commands +parameter, or that has the syntax of a message header label (text +followed by optional space and ":"). +The "after command" portion is logged with +Postfix 2.10 and later.

    The postscreen_non_smtp_command_action parameter specifies the action that is taken next. See "When @@ -594,12 +600,14 @@ this as:

    -    BARE NEWLINE from [address]:port
    +    BARE NEWLINE from [address]:port after command
     

    Translation: the SMTP client at [address]:port sent a bare newline character, that is newline not preceded by carriage -return.

    +return. +The "after command" portion is logged with +Postfix 2.10 and later.

    The postscreen_bare_newline_action parameter specifies the action that is taken next. See "When @@ -676,29 +684,35 @@ This engine never accepts mail, therefore it has per-session limits on the number of commands and on the session length.

    -    COMMAND TIME LIMIT from [address]:port
    +    COMMAND TIME LIMIT from [address]:port after command
     

    Translation: the SMTP client at [address]:port reached the per-command time limit as specified with the postscreen_command_time_limit -parameter. The session is terminated immediately.

    +parameter. The session is terminated immediately. +The "after command" portion is logged with +Postfix 2.10 and later.

    -    COMMAND COUNT LIMIT from [address]:port
    +    COMMAND COUNT LIMIT from [address]:port after command
     

    Translation: the SMTP client at [address]:port reached the per-session command count limit as specified with the postscreen_command_count_limit parameter. The session is terminated -immediately.

    +immediately. +The "after command" portion is logged with +Postfix 2.10 and later.

    -    COMMAND LENGTH LIMIT from [address]:port
    +    COMMAND LENGTH LIMIT from [address]:port after command
     

    Translation: the SMTP client at [address]:port reached the per-command length limit, as specified with the line_length_limit -parameter. The session is terminated immediately.

    +parameter. The session is terminated immediately. +The "after command" portion is logged with +Postfix 2.10 and later.

    When an SMTP client makes too many connections at the same time, or when all postscreen(8) ports are busy, postscreen(8) rejects the diff --git a/postfix/html/SASL_README.html b/postfix/html/SASL_README.html index 18ed0cf01..f39feefcd 100644 --- a/postfix/html/SASL_README.html +++ b/postfix/html/SASL_README.html @@ -87,7 +87,7 @@ what envelope sender addresses the client may use.

  • Successful authentication in the Postfix SMTP server requires a functional SASL framework. Configuring SASL should therefore -always be the first step.

    +always be the first step, before configuring Postfix.

    You can read more about the following topics:

    diff --git a/postfix/html/TLS_README.html b/postfix/html/TLS_README.html index 8459dc318..cea177f4a 100644 --- a/postfix/html/TLS_README.html +++ b/postfix/html/TLS_README.html @@ -245,7 +245,7 @@ $smtpd_tls_CAfile or install it i -

    Their ECDSA counterparts (Postfix ≥ 2.6 + OpenSSL ≥ 0.9.9):

    +

    Their ECDSA counterparts (Postfix ≥ 2.6 + OpenSSL ≥ 1.0.0):

    @@ -773,7 +773,7 @@ settings. 

    Support for elliptic curve cryptography is available with Postfix -2.6 and OpenSSL 0.9.9 or later. To enable ephemeral elliptic curve +2.6 and OpenSSL 1.0.0 or later. To enable ephemeral elliptic curve Diffie-Hellman (EECDH) key-exchange, set "smtpd_tls_eecdh_grade = strong" or "smtpd_tls_eecdh_grade = ultra". The "ultra" setting is substantially more CPU intensive, and "strong" is sufficiently @@ -1474,7 +1474,7 @@ $smtp_tls_CAfile or install it in -

    Their ECDSA counterparts (Postfix ≥ 2.6 + OpenSSL ≥ 0.9.9):

    +

    Their ECDSA counterparts (Postfix ≥ 2.6 + OpenSSL ≥ 1.0.0):

    diff --git a/postfix/html/memcache_table.5.html b/postfix/html/memcache_table.5.html
    index 36af14727..ce087b74f 100644
    --- a/postfix/html/memcache_table.5.html
    +++ b/postfix/html/memcache_table.5.html
    @@ -69,57 +69,68 @@ MEMCACHE_TABLE(5)                                            MEMCACHE_TABLE(5)
                   Access to remote proxymap servers is under develop-
                   ment.
     
    -              NOTE  1: When using memcache with persistent backup
    -              as postscreen(8) or verify(8) cache, disable  auto-
    -              matic  cache cleanup (*_cache_cleanup_interval = 0)
    -              in all Postfix instances except  for  one  instance
    -              that will be responsible for cache cleanup.
    +              NOTE  1: When sharing a persistent postscreen(8) or
    +              verify(8) cache, disable  automatic  cache  cleanup
    +              (set  *_cache_cleanup_interval = 0) except with one
    +              Postfix instance that will be responsible for cache
    +              cleanup.
     
    -              NOTE  2:  In the case of a proxied backup database,
    -              the  full  backup  database  name  (including   the
    -              "proxy:"  prefix) must be specified in the proxymap
    -              server's proxy_read_maps or  proxy_write_maps  set-
    -              ting  (depending on whether the access is read-only
    -              or read-write).
    +              NOTE  2:  When different tables share the same mem-
    +              cache database, each table should use the  key_for-
    +              mat  feature  (see below) to prepend its own unique
    +              string to the  lookup  key.   Otherwise,  automatic
    +              postscreen(8)  or  verify(8)  cache cleanup may not
    +              work.
    +
    +              NOTE 3: When the backup database is  accessed  with
    +              "proxy:"  lookups,  the  full  backup database name
    +              (including the "proxy:" prefix) must  be  specified
    +              in   the   proxymap   server's  proxy_read_maps  or
    +              proxy_write_maps setting (depending on whether  the
    +              access is read-only or read-write).
     
            flags (default: 0)
    -              Optional flags that should be stored along  with  a
    +              Optional  flags  that should be stored along with a
                   memcache update. The flags are ignored when looking
                   up information.
     
            ttl (default: 3600)
                   The expiration time in seconds of memcache updates.
     
    -              NOTE   1:   When   using   a   memcache   table  as
    +              NOTE  1:   When   using   a   memcache   table   as
                   postscreen(8) or verify(8) cache without persistent
                   backup,  specify  a  zero  *_cache_cleanup_interval
    -              value with all Postfix instances that use the  mem-
    -              cache,  and specify the largest postscreen(8) *_ttl
    -              value or verify(8) *_expire_time value as the  mem-
    +              value  with all Postfix instances that use the mem-
    +              cache, and specify the largest postscreen(8)  *_ttl
    +              value  or verify(8) *_expire_time value as the mem-
                   cache table's ttl value.
     
    -              NOTE  2:  According to memcache protocol documenta-
    -              tion, a value greater than 30  days  (2592000  sec-
    -              onds)  specifies absolute UNIX time. Smaller values
    +              NOTE 2: According to memcache  protocol  documenta-
    +              tion,  a  value  greater than 30 days (2592000 sec-
    +              onds) specifies absolute UNIX time. Smaller  values
                   are relative to the time of the update.
     
     MEMCACHE KEY PARAMETERS
            key_format (default: %s)
    -              Format of the lookup and update  keys  in  memcache
    -              requests.   By  default,  these are the same as the
    -              lookup and update keys that are given to the  Post-
    +              Format  of  the  lookup and update keys in memcache
    +              requests.  By default, these are the  same  as  the
    +              lookup  and update keys that are given to the Post-
                   fix memcache client.
     
    -              NOTE: The key_format feature is not used for backup
    -              database requests.
    +              NOTE 1: The key_format  feature  is  not  used  for
    +              backup database requests.
     
    -              When the same memcache database is  used  to  cache
    -              information  from  multiple tables, you can use the
    -              key_format feature  to  avoid  name  collisions  by
    -              prepending a fixed string.  Examples:
    +              NOTE  2:  When different tables share the same mem-
    +              cache database, each table should prepend  its  own
    +              unique  string to the lookup key.  Otherwise, auto-
    +              matic postscreen(8) or verify(8) cache cleanup  may
    +              not work.
    +
    +              Examples:
     
                       key_format = aliases:%s
    -                  key_format = access:%s
    +                  key_format = verify:%s
    +                  key_format = postscreen:%s
     
                   The key_format parameter supports the following '%'
                   expansions:
    diff --git a/postfix/makedefs b/postfix/makedefs
    index 050c87878..f0151f35d 100644
    --- a/postfix/makedefs
    +++ b/postfix/makedefs
    @@ -454,6 +454,7 @@ ReliantUNIX-?.5.43) SYSTYPE=ReliantUnix543
         Darwin.*)   SYSTYPE=MACOSX
     		# Use the native compiler by default
     		: ${CC=cc}
    +		CCARGS="$CCARGS \$(WARN)"
     		# Darwin > 1.3 uses awk and flat_namespace
     		case $RELEASE in
     		 1.[0-3]) AWK=gawk;;
    diff --git a/postfix/man/man5/memcache_table.5 b/postfix/man/man5/memcache_table.5
    index 692cc8d34..9809420e3 100644
    --- a/postfix/man/man5/memcache_table.5
    +++ b/postfix/man/man5/memcache_table.5
    @@ -74,18 +74,22 @@ information in the persistent database. Specify a Postfix
     
     Access to remote proxymap servers is under development.
     
    -NOTE 1: When using memcache with persistent backup as
    -\fBpostscreen\fR(8) or \fBverify\fR(8) cache, disable
    -automatic cache cleanup (*_cache_cleanup_interval = 0) in
    -all Postfix instances except for one instance that will be
    -responsible for cache cleanup.
    +NOTE 1: When sharing a persistent \fBpostscreen\fR(8) or
    +\fBverify\fR(8) cache, disable automatic cache cleanup (set
    +*_cache_cleanup_interval = 0) except with one Postfix
    +instance that will be responsible for cache cleanup.
     
    -NOTE 2: In the case of a proxied backup database, the full
    -backup database
    -name (including the "proxy:" prefix) must be specified in
    -the proxymap server's proxy_read_maps or proxy_write_maps
    -setting (depending on whether the access is read-only or
    -read-write).
    +NOTE 2: When different tables share the same memcache
    +database, each table should use the \fBkey_format\fR feature
    +(see below) to prepend its own unique string to the lookup
    +key.  Otherwise, automatic \fBpostscreen\fR(8) or \fBverify\fR(8)
    +cache cleanup may not work.
    +
    +NOTE 3: When the backup database is accessed with "proxy:"
    +lookups, the full backup database name (including the
    +"proxy:" prefix) must be specified in the proxymap server's
    +proxy_read_maps or proxy_write_maps setting (depending on
    +whether the access is read-only or read-write).
     .IP "\fBflags (default: 0)\fR"
     Optional flags that should be stored along with a memcache
     update. The flags are ignored when looking up information.
    @@ -113,17 +117,20 @@ Format of the lookup and update keys in memcache requests.
     By default, these are the same as the lookup and update
     keys that are given to the Postfix memcache client.
     
    -NOTE: The \fBkey_format\fR feature is not used for \fBbackup\fR
    +NOTE 1: The \fBkey_format\fR feature is not used for \fBbackup\fR
     database requests.
     
    -When the same memcache database is used to cache information
    -from multiple tables, you can use the \fBkey_format\fR
    -feature to avoid name collisions by prepending a fixed
    -string.  Examples:
    +NOTE 2: When different tables share the same memcache
    +database, each table should prepend its own unique string
    +to the lookup key.  Otherwise, automatic \fBpostscreen\fR(8)
    +or \fBverify\fR(8) cache cleanup may not work.
    +
    +Examples:
     
     .nf
         key_format = aliases:%s
    -    key_format = access:%s
    +    key_format = verify:%s
    +    key_format = postscreen:%s
     .fi
     
     The \fBkey_format\fR parameter supports the following '%'
    diff --git a/postfix/proto/POSTSCREEN_README.html b/postfix/proto/POSTSCREEN_README.html
    index fb10721af..c7a4f020e 100644
    --- a/postfix/proto/POSTSCREEN_README.html
    +++ b/postfix/proto/POSTSCREEN_README.html
    @@ -35,11 +35,11 @@ postscreen(8) minimizes its impact on legitimate email traffic.
     
     

    postscreen(8) should not be used on SMTP ports that receive mail from end-user clients (MUAs). In a typical deployment, -postscreen(8) is used on the "port 25" service, while MUA clients -submit mail via the submission service (port 587) which normally -requires client authentication, or via a "port 25" server that -provides no MX service (i.e. a dedicated server that provides -submission service on port 25).

    +postscreen(8) handles the MX service on TCP port 25, while MUA +clients submit mail via the submission service on TCP port 587 which +requires client authentication. Alternatively, a site could set up +a dedicated, non-postscreen, "port 25" server that provides submission +service and client authentication, but no MX service.

    postscreen(8) is part of a multi-layer defense.

    @@ -48,11 +48,12 @@ submission service on port 25).

  • As the first layer, postscreen(8) blocks connections from zombies and other spambots that are responsible for about 90% of all spam. It is implemented as a single process to make this defense -as cheap as possible.

    +as inexpensive as possible.

  • The second layer implements more complex SMTP-level access -checks with Postfix SMTP servers, policy daemons, and Milter -applications.

    +checks with Postfix SMTP servers, +policy daemons, and +Milter applications.

  • The third layer performs light-weight content inspection with the Postfix built-in header_checks and body_checks. This can @@ -60,8 +61,10 @@ block unacceptable attachments such as executable programs, and worms or viruses with easy-to-recognize signatures.

  • The fourth layer provides heavy-weight content inspection -with external content filters. Typical examples are Amavisd-new, -SpamAssassin, and Milter applications.

    +with external content filters. Typical examples are Amavisd-new, SpamAssassin, and Milter applications.

    @@ -562,12 +565,15 @@ logging more informative.

    as:

    -    NON-SMTP COMMAND from [address]:port command
    +    NON-SMTP COMMAND from [address]:port after command: text
     

    Translation: the SMTP client at [address]:port sent a -command that matches the postscreen_forbidden_commands -parameter, or that has the syntax of a message header label.

    +command that matches the postscreen_forbidden_commands +parameter, or that has the syntax of a message header label (text +followed by optional space and ":"). +The "after command" portion is logged with +Postfix 2.10 and later.

    The postscreen_non_smtp_command_action parameter specifies the action that is taken next. See "When @@ -594,12 +600,14 @@ this as:

    -    BARE NEWLINE from [address]:port
    +    BARE NEWLINE from [address]:port after command
     

    Translation: the SMTP client at [address]:port sent a bare newline character, that is newline not preceded by carriage -return.

    +return. +The "after command" portion is logged with +Postfix 2.10 and later.

    The postscreen_bare_newline_action parameter specifies the action that is taken next. See "When @@ -676,29 +684,35 @@ This engine never accepts mail, therefore it has per-session limits on the number of commands and on the session length.

    -    COMMAND TIME LIMIT from [address]:port
    +    COMMAND TIME LIMIT from [address]:port after command
     

    Translation: the SMTP client at [address]:port reached the per-command time limit as specified with the postscreen_command_time_limit -parameter. The session is terminated immediately.

    +parameter. The session is terminated immediately. +The "after command" portion is logged with +Postfix 2.10 and later.

    -    COMMAND COUNT LIMIT from [address]:port
    +    COMMAND COUNT LIMIT from [address]:port after command
     

    Translation: the SMTP client at [address]:port reached the per-session command count limit as specified with the postscreen_command_count_limit parameter. The session is terminated -immediately.

    +immediately. +The "after command" portion is logged with +Postfix 2.10 and later.

    -    COMMAND LENGTH LIMIT from [address]:port
    +    COMMAND LENGTH LIMIT from [address]:port after command
     

    Translation: the SMTP client at [address]:port reached the per-command length limit, as specified with the line_length_limit -parameter. The session is terminated immediately.

    +parameter. The session is terminated immediately. +The "after command" portion is logged with +Postfix 2.10 and later.

    When an SMTP client makes too many connections at the same time, or when all postscreen(8) ports are busy, postscreen(8) rejects the diff --git a/postfix/proto/SASL_README.html b/postfix/proto/SASL_README.html index 1581b5efb..1146a36a1 100644 --- a/postfix/proto/SASL_README.html +++ b/postfix/proto/SASL_README.html @@ -87,7 +87,7 @@ what envelope sender addresses the client may use.

  • Successful authentication in the Postfix SMTP server requires a functional SASL framework. Configuring SASL should therefore -always be the first step.

    +always be the first step, before configuring Postfix.

    You can read more about the following topics:

    diff --git a/postfix/proto/TLS_README.html b/postfix/proto/TLS_README.html index 960f7d299..f0b2f94f5 100644 --- a/postfix/proto/TLS_README.html +++ b/postfix/proto/TLS_README.html @@ -245,7 +245,7 @@ $smtpd_tls_CAfile or install it in the $smtpd_tls_CApath directory.

    -

    Their ECDSA counterparts (Postfix ≥ 2.6 + OpenSSL ≥ 0.9.9):

    +

    Their ECDSA counterparts (Postfix ≥ 2.6 + OpenSSL ≥ 1.0.0):

    @@ -773,7 +773,7 @@ settings. 

    Support for elliptic curve cryptography is available with Postfix -2.6 and OpenSSL 0.9.9 or later. To enable ephemeral elliptic curve +2.6 and OpenSSL 1.0.0 or later. To enable ephemeral elliptic curve Diffie-Hellman (EECDH) key-exchange, set "smtpd_tls_eecdh_grade = strong" or "smtpd_tls_eecdh_grade = ultra". The "ultra" setting is substantially more CPU intensive, and "strong" is sufficiently @@ -1474,7 +1474,7 @@ $smtp_tls_CAfile or install it in the $smtp_tls_CApath directory.

    -

    Their ECDSA counterparts (Postfix ≥ 2.6 + OpenSSL ≥ 0.9.9):

    +

    Their ECDSA counterparts (Postfix ≥ 2.6 + OpenSSL ≥ 1.0.0):

    diff --git a/postfix/proto/memcache_table b/postfix/proto/memcache_table
    index c065e65da..de9e2fd91 100644
    --- a/postfix/proto/memcache_table
    +++ b/postfix/proto/memcache_table
    @@ -66,18 +66,22 @@
     #
     #	Access to remote proxymap servers is under development.
     #
    -#	NOTE 1: When using memcache with persistent backup as
    -#	\fBpostscreen\fR(8) or \fBverify\fR(8) cache, disable
    -#	automatic cache cleanup (*_cache_cleanup_interval = 0) in
    -#	all Postfix instances except for one instance that will be
    -#	responsible for cache cleanup.
    +#	NOTE 1: When sharing a persistent \fBpostscreen\fR(8) or
    +#	\fBverify\fR(8) cache, disable automatic cache cleanup (set
    +#	*_cache_cleanup_interval = 0) except with one Postfix
    +#	instance that will be responsible for cache cleanup.
     #
    -#	NOTE 2: In the case of a proxied backup database, the full
    -#	backup database
    -#	name (including the "proxy:" prefix) must be specified in
    -#	the proxymap server's proxy_read_maps or proxy_write_maps
    -#	setting (depending on whether the access is read-only or
    -#	read-write).
    +#	NOTE 2: When different tables share the same memcache
    +#	database, each table should use the \fBkey_format\fR feature
    +#	(see below) to prepend its own unique string to the lookup
    +#	key.  Otherwise, automatic \fBpostscreen\fR(8) or \fBverify\fR(8)
    +#	cache cleanup may not work.
    +#
    +#	NOTE 3: When the backup database is accessed with "proxy:"
    +#	lookups, the full backup database name (including the
    +#	"proxy:" prefix) must be specified in the proxymap server's
    +#	proxy_read_maps or proxy_write_maps setting (depending on
    +#	whether the access is read-only or read-write).
     # .IP "\fBflags (default: 0)\fR"
     #	Optional flags that should be stored along with a memcache
     #	update. The flags are ignored when looking up information.
    @@ -103,17 +107,20 @@
     #	By default, these are the same as the lookup and update
     #	keys that are given to the Postfix memcache client.
     #
    -#	NOTE: The \fBkey_format\fR feature is not used for \fBbackup\fR
    +#	NOTE 1: The \fBkey_format\fR feature is not used for \fBbackup\fR
     #	database requests.
     #
    -#	When the same memcache database is used to cache information
    -#	from multiple tables, you can use the \fBkey_format\fR
    -#	feature to avoid name collisions by prepending a fixed
    -#	string.  Examples:
    +#	NOTE 2: When different tables share the same memcache
    +#	database, each table should prepend its own unique string
    +#	to the lookup key.  Otherwise, automatic \fBpostscreen\fR(8)
    +#	or \fBverify\fR(8) cache cleanup may not work.
    +#
    +#	Examples:
     #
     # .nf
     #	    key_format = aliases:%s
    -#	    key_format = access:%s
    +#	    key_format = verify:%s
    +#	    key_format = postscreen:%s
     # .fi
     #
     #	The \fBkey_format\fR parameter supports the following '%'
    diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h
    index d8b20a616..09466a4dd 100644
    --- a/postfix/src/global/mail_version.h
    +++ b/postfix/src/global/mail_version.h
    @@ -20,7 +20,7 @@
       * Patches change both the patchlevel and the release date. Snapshots have no
       * patchlevel; they change the release date only.
       */
    -#define MAIL_RELEASE_DATE	"20121031"
    +#define MAIL_RELEASE_DATE	"20121123"
     #define MAIL_VERSION_NUMBER	"2.10"
     
     #ifdef SNAPSHOT
    diff --git a/postfix/src/postscreen/postscreen.h b/postfix/src/postscreen/postscreen.h
    index 860a134b6..3fe0a9b6b 100644
    --- a/postfix/src/postscreen/postscreen.h
    +++ b/postfix/src/postscreen/postscreen.h
    @@ -73,6 +73,7 @@ typedef struct {
         /* smtpd(8) compatibility */
         int     ehlo_discard_mask;		/* EHLO filter */
         VSTRING *expand_buf;		/* macro expansion */
    +    const char *where;			/* SMTP protocol state */
     } PSC_STATE;
     
     #define PSC_TIME_STAMP_NEW		(0)	/* test was never passed */
    @@ -210,6 +211,13 @@ typedef struct {
     #define PSC_STATE_MASK_ANY_UPDATE \
     	(PSC_STATE_MASK_ANY_PASS | PSC_STATE_FLAG_PENAL_UPDATE)
     
    + /*
    +  * Meta-commands for state->where that reflect the initial command processor
    +  * state and commands that aren't implemented.
    +  */
    +#define PSC_SMTPD_CMD_CONNECT		"CONNECT"
    +#define PSC_SMTPD_CMD_UNIMPL		"UNIMPLEMENTED"
    +
      /*
       * See log_adhoc.c for discussion.
       */
    diff --git a/postfix/src/postscreen/postscreen_smtpd.c b/postfix/src/postscreen/postscreen_smtpd.c
    index 7e319f713..77bb8f475 100644
    --- a/postfix/src/postscreen/postscreen_smtpd.c
    +++ b/postfix/src/postscreen/postscreen_smtpd.c
    @@ -224,6 +224,15 @@ static void psc_smtpd_read_event(int, char *);
         PSC_CLEAR_EVENT_REQUEST(vstream_fileno((state)->smtp_client_stream), \
     			   psc_smtpd_time_event, (char *) (state));
     
    + /*
    +  * Make control characters and other non-text visible.
    +  */
    +#define PSC_SMTPD_ESCAPE_TEXT(dest, src, src_len, max_len) do { \
    +	ssize_t _s_len = (src_len); \
    +	ssize_t _m_len = (max_len); \
    +	(void) escape((dest), (src), _s_len < _m_len ? _s_len : _m_len); \
    +    } while (0)
    +
      /*
       * Command parser support.
       */
    @@ -664,7 +673,8 @@ static void psc_smtpd_time_event(int event, char *context)
     		 state->smtp_client_addr, state->smtp_client_port,
     		 psc_print_state_flags(state->flags, myname));
     
    -    msg_info("COMMAND TIME LIMIT from [%s]:%s", PSC_CLIENT_ADDR_PORT(state));
    +    msg_info("COMMAND TIME LIMIT from [%s]:%s after %s",
    +	     PSC_CLIENT_ADDR_PORT(state), state->where);
         PSC_CLEAR_EVENT_DROP_SESSION_STATE(state, psc_smtpd_time_event,
     				       psc_smtpd_timeout_reply);
     }
    @@ -715,6 +725,7 @@ static void psc_smtpd_read_event(int event, char *context)
     	int     want;
     	int     next_state;
         };
    +    const char *saved_where;
     
     #define PSC_SMTPD_CMD_ST_ANY		0
     #define PSC_SMTPD_CMD_ST_CR		1
    @@ -778,8 +789,8 @@ static void psc_smtpd_read_event(int event, char *context)
     	     */
     	    if (state->read_state == PSC_SMTPD_CMD_ST_ANY
     		&& VSTRING_LEN(state->cmd_buffer) >= var_line_limit) {
    -		msg_info("COMMAND LENGTH LIMIT from [%s]:%s",
    -			 PSC_CLIENT_ADDR_PORT(state));
    +		msg_info("COMMAND LENGTH LIMIT from [%s]:%s after %s",
    +			 PSC_CLIENT_ADDR_PORT(state), state->where);
     		PSC_CLEAR_EVENT_DROP_SESSION_STATE(state, psc_smtpd_time_event,
     						   psc_smtpd_421_reply);
     		return;
    @@ -815,8 +826,10 @@ static void psc_smtpd_read_event(int event, char *context)
     	    if (ch == '\n') {
     		if ((state->flags & PSC_STATE_MASK_BARLF_TODO_SKIP)
     		    == PSC_STATE_FLAG_BARLF_TODO) {
    -		    msg_info("BARE NEWLINE from [%s]:%s",
    -			     PSC_CLIENT_ADDR_PORT(state));
    +		    PSC_SMTPD_ESCAPE_TEXT(psc_temp, STR(state->cmd_buffer),
    +				   VSTRING_LEN(state->cmd_buffer) - 1, 100);
    +		    msg_info("BARE NEWLINE from [%s]:%s after %s",
    +			     PSC_CLIENT_ADDR_PORT(state), STR(psc_temp));
     		    PSC_FAIL_SESSION_STATE(state, PSC_STATE_FLAG_BARLF_FAIL);
     		    PSC_UNPASS_SESSION_STATE(state, PSC_STATE_FLAG_BARLF_PASS);
     		    state->barlf_stamp = PSC_TIME_STAMP_DISABLED;	/* XXX */
    @@ -914,9 +927,14 @@ static void psc_smtpd_read_event(int event, char *context)
     	 * 
     	 * Caution: cmdp->name and cmdp->action may be null on loop exit.
     	 */
    -	for (cmdp = command_table; cmdp->name != 0; cmdp++)
    -	    if (strcasecmp(command, cmdp->name) == 0)
    +	saved_where = state->where;
    +	state->where = PSC_SMTPD_CMD_UNIMPL;
    +	for (cmdp = command_table; cmdp->name != 0; cmdp++) {
    +	    if (strcasecmp(command, cmdp->name) == 0) {
    +		state->where = cmdp->name;
     		break;
    +	    }
    +	}
     
     	if ((state->flags & PSC_STATE_FLAG_SMTPD_X21)
     	    && cmdp->action != psc_quit_cmd) {
    @@ -932,8 +950,11 @@ static void psc_smtpd_read_event(int event, char *context)
     		|| (*var_psc_forbid_cmds
     		    && string_list_match(psc_forbid_cmds, command)))) {
     	    printable(command, '?');
    -	    msg_info("NON-SMTP COMMAND from [%s]:%s %.100s %.100s",
    -		     PSC_CLIENT_ADDR_PORT(state), command, cmd_buffer_ptr);
    +	    PSC_SMTPD_ESCAPE_TEXT(psc_temp, cmd_buffer_ptr,
    +				  strlen(cmd_buffer_ptr), 100);
    +	    msg_info("NON-SMTP COMMAND from [%s]:%s after %s: %.100s %s",
    +		     PSC_CLIENT_ADDR_PORT(state), saved_where,
    +		     command, STR(psc_temp));
     	    PSC_FAIL_SESSION_STATE(state, PSC_STATE_FLAG_NSMTP_FAIL);
     	    PSC_UNPASS_SESSION_STATE(state, PSC_STATE_FLAG_NSMTP_PASS);
     	    state->nsmtp_stamp = PSC_TIME_STAMP_DISABLED;	/* XXX */
    @@ -967,9 +988,8 @@ static void psc_smtpd_read_event(int event, char *context)
     	if ((state->flags & PSC_STATE_MASK_PIPEL_TODO_SKIP)
     	    == PSC_STATE_FLAG_PIPEL_TODO && !PSC_SMTPD_BUFFER_EMPTY(state)) {
     	    printable(command, '?');
    -	    escape(psc_temp, PSC_SMTPD_PEEK_DATA(state),
    -		   PSC_SMTPD_PEEK_LEN(state) < 100 ?
    -		   PSC_SMTPD_PEEK_LEN(state) : 100);
    +	    PSC_SMTPD_ESCAPE_TEXT(psc_temp, PSC_SMTPD_PEEK_DATA(state),
    +				  PSC_SMTPD_PEEK_LEN(state), 100);
     	    msg_info("COMMAND PIPELINING from [%s]:%s after %.100s: %s",
     		     PSC_CLIENT_ADDR_PORT(state), command, STR(psc_temp));
     	    PSC_FAIL_SESSION_STATE(state, PSC_STATE_FLAG_PIPEL_FAIL);
    @@ -1033,8 +1053,8 @@ static void psc_smtpd_read_event(int event, char *context)
     	/* Command COUNT limit test. */
     	if (++state->command_count > var_psc_cmd_count
     	    && cmdp->action != psc_quit_cmd) {
    -	    msg_info("COMMAND COUNT LIMIT from [%s]:%s",
    -		     PSC_CLIENT_ADDR_PORT(state));
    +	    msg_info("COMMAND COUNT LIMIT from [%s]:%s after %s",
    +		     PSC_CLIENT_ADDR_PORT(state), saved_where);
     	    PSC_CLEAR_EVENT_DROP_SESSION_STATE(state, psc_smtpd_time_event,
     					       psc_smtpd_421_reply);
     	    return;
    diff --git a/postfix/src/postscreen/postscreen_state.c b/postfix/src/postscreen/postscreen_state.c
    index e199eb885..5b97ce032 100644
    --- a/postfix/src/postscreen/postscreen_state.c
    +++ b/postfix/src/postscreen/postscreen_state.c
    @@ -173,6 +173,7 @@ PSC_STATE *psc_new_session_state(VSTREAM *stream,
         state->read_state = 0;
         state->ehlo_discard_mask = 0;		/* XXX Should be ~0 */
         state->expand_buf = 0;
    +    state->where = PSC_SMTPD_CMD_CONNECT;
     
         /*
          * Update the stress level.
    diff --git a/postfix/src/qmqpd/qmqpd.c b/postfix/src/qmqpd/qmqpd.c
    index 559c2e099..c720704f2 100644
    --- a/postfix/src/qmqpd/qmqpd.c
    +++ b/postfix/src/qmqpd/qmqpd.c
    @@ -473,7 +473,7 @@ static void qmqpd_write_content(QMQPD_STATE *state)
     	if (first) {
     	    if (strncmp(start + strspn(start, ">"), "From ", 5) == 0) {
     		rec_fprintf(state->cleanup, rec_type,
    -			    "X-Mailbox-Line: %*s", len, start);
    +			    "X-Mailbox-Line: %.*s", len, start);
     		continue;
     	    }
     	    first = 0;
    diff --git a/postfix/src/smtpd/smtpd_check.c b/postfix/src/smtpd/smtpd_check.c
    index 09ea4bf96..52ebc66c1 100644
    --- a/postfix/src/smtpd/smtpd_check.c
    +++ b/postfix/src/smtpd/smtpd_check.c
    @@ -518,13 +518,20 @@ static int has_required(ARGV *restrictions, const char **required)
          * Recursively check list membership.
          */
         for (rest = restrictions->argv; *rest; rest++) {
    -	if (strcmp(*rest, WARN_IF_REJECT) == 0 && rest[1] != 0) {
    +	if (strcasecmp(*rest, WARN_IF_REJECT) == 0 && rest[1] != 0) {
     	    rest += 1;
     	    continue;
     	}
    +	if (strcasecmp(*rest, PERMIT_ALL) == 0) {
    +	    if (rest[1] != 0)
    +		msg_warn("restriction `%s' after `%s' is ignored",
    +			 rest[1], rest[0]);
    +	    return (0);
    +	}
     	for (reqd = required; *reqd; reqd++)
    -	    if (strcmp(*rest, *reqd) == 0)
    +	    if (strcasecmp(*rest, *reqd) == 0)
     		return (1);
    +	/* XXX This lookup operation should not be case-sensitive. */
     	if ((expansion = (ARGV *) htable_find(smtpd_rest_classes, *rest)) != 0)
     	    if (has_required(expansion, required))
     		return (1);
    @@ -684,6 +691,7 @@ void    smtpd_check_init(void)
     	while ((name = mystrtok(&cp, RESTRICTION_SEPARATORS)) != 0) {
     	    if ((value = mail_conf_lookup_eval(name)) == 0 || *value == 0)
     		msg_fatal("restriction class `%s' needs a definition", name);
    +	    /* XXX This store operation should not be case-sensitive. */
     	    htable_enter(smtpd_rest_classes, name,
     			 (char *) smtpd_check_parse(SMTPD_CHECK_PARSE_ALL,
     						    value));