]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-2.8-20100208
authorWietse Venema <wietse@porcupine.org>
Mon, 8 Feb 2010 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <viktor@dukhovni.org>
Tue, 5 Feb 2013 06:36:05 +0000 (06:36 +0000)
20 files changed:
postfix/HISTORY
postfix/README_FILES/SASL_README
postfix/README_FILES/SOHO_README
postfix/WISHLIST
postfix/conf/post-install
postfix/html/SASL_README.html
postfix/html/SOHO_README.html
postfix/html/postmulti.1.html
postfix/man/man1/postmulti.1
postfix/mantools/make-relnotes
postfix/proto/SASL_README.html
postfix/src/global/mail_version.h
postfix/src/local/Makefile.in
postfix/src/local/bounce_workaround.c [new file with mode: 0644]
postfix/src/local/command.c
postfix/src/local/file.c
postfix/src/local/local.h
postfix/src/local/recipient.c
postfix/src/postmulti/postmulti.c
postfix/src/xsasl/xsasl_cyrus_security.c

index 9522f47f1aae28980d9c0128f8e278f39d088edf..b4d0af9c3b0fd5d43f7ff15ea098ce8181408d21 100644 (file)
@@ -15709,3 +15709,17 @@ Apologies for any names omitted.
        Documentation: major revision of SASL_README with many
        details on how to configure Cyrus SASL internals. Patrick
        Koetter.  File: proto/SASL_README.html
+
+20100204
+
+       Feature: added "forward_secrecy" option for Cyrus SASL.
+       File: xsasl/xsasl_cyrus_security.c.
+
+20100206
+
+       Bugfix (from day zero): the local delivery agent returned
+       undeliverable mail to the envelope sender instead of the
+       owner- alias, when delivering to command or file. This
+       reuses the workaround that was implemented to report a
+       Delivered-To: loop. Files: local/file.c, local/command.c,
+       local/recipient.c, local/bounce_workaround.c.
index 9f7c4289d52369a32103a110e24c915c40a883f8..cfa810dce452b5f1da0f4a47aaea19bee12e5ea9 100644 (file)
@@ -12,19 +12,17 @@ may be worth considering.
 
 H\bHo\bow\bw P\bPo\bos\bst\btf\bfi\bix\bx u\bus\bse\bes\bs S\bSA\bAS\bSL\bL a\bau\but\bth\bhe\ben\bnt\bti\bic\bca\bat\bti\bio\bon\bn
 
-When an SMTP client connects to an SMTP server, the server needs to decide
-whether that client is authorized to send mail to remote destinations, or
-whether the client can send mail only to the destinations that the server
-itself is responsible for. Usually, the SMTP server will allow mail to remote
-destinations only if the client's IP address is in the "same network" as the
-server's IP address.
-
-Sometimes the SMTP client and server are in different networks, but the client
-still needs "same network" privileges. To address this problem, Postfix
-supports SASL authentication (RFC 4954, formerly RFC 2554). With this a remote
-SMTP client can authenticate to the Postfix SMTP server, and the Postfix SMTP
-client can authenticate to a remote SMTP server. Once the client is
-authenticated the server can give it "same network" privileges.
+SMTP servers need to decide whether an SMTP client is authorized to send mail
+to remote destinations, or only to destinations that the server itself is
+responsible for. Usually, SMTP servers allow mail to remote destinations when
+the client's IP address is in the "same network" as the server's IP address.
+
+Sometimes an SMTP client needs "same network" privileges when it connects from
+elsewhere. To address this problem, Postfix supports SASL authentication (RFC
+4954, formerly RFC 2554). With this a remote SMTP client can authenticate to
+the Postfix SMTP server, and the Postfix SMTP client can authenticate to a
+remote SMTP server. Once a client is authenticated, a server can give it "same
+network" privileges.
 
 Postfix does not implement SASL itself, but instead uses existing
 implementations as building blocks. This means that some SASL-related
@@ -76,7 +74,7 @@ You can read more about the following topics:
   * Enabling SASL authentication and authorization in the Postfix SMTP server
 
       o Enabling SASL authentication in the Postfix SMTP server
-      o Postfix SMTP Server Authentication Policy
+      o Postfix SMTP Server policy - SASL mechanism properties
       o Enabling SASL authorization in the Postfix SMTP server
       o Additional SMTP Server SASL options
 
@@ -367,9 +365,9 @@ plugins.
 
 T\bTh\bhe\be s\bsa\bas\bsl\bld\bdb\bb p\bpl\blu\bug\bgi\bin\bn
 
-The sasldb auxprop plugin authenticates credentials stored in a Berkeley DB
-database. The database schema is specific to Cyrus SASL. The database is
-usually located at /etc/sasldb2.
+The sasldb auxprop plugin authenticates SASL clients against credentials that
+are stored in a Berkeley DB database. The database schema is specific to Cyrus
+SASL. The database is usually located at /etc/sasldb2.
 
     N\bNo\bot\bte\be
 
@@ -422,17 +420,16 @@ Configure libsasl to use sasldb with the following instructions:
 T\bTh\bhe\be s\bsq\bql\bl p\bpl\blu\bug\bgi\bin\bn
 
 The sql auxprop plugin is a generic SQL plugin. It provides access to
-credentials stored in a MySQL, a PostgreSQL or a SQLite database.
-
-    N\bNo\bot\bte\be
-
-    The shared-secret mechanisms (CRAM-MD5, etc.) require that the SASL client
-    passwords are stored as plaintext.
+credentials stored in a MySQL, PostgreSQL or SQLite database. This plugin
+requires that SASL client passwords are stored as plaintext.
 
     T\bTi\bip\bp
 
-    Use "saslauthd > pam > (pam database module)" to verify encrypted passwords
-    in an SQL database.
+    If you must store encrypted passwords, see section "Using saslauthd with
+    PAM", and configure PAM to look up the encrypted passwords with, for
+    example, the pam_mysql module. You will not be able to use any of the
+    methods that require access to plaintext passwords, such as the shared-
+    secret methods CRAM-MD5 and DIGEST-MD5.
 
 The following example configures libsasl to use the sql plugin and connects it
 to a PostgreSQL server:
@@ -442,7 +439,8 @@ to a PostgreSQL server:
         auxprop_plugin: sql
         mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM
         sql_engine: pgsql
-        sql_hostnames: 127.0.0.1, 192.0.2.1 sql_user: username
+        sql_hostnames: 127.0.0.1, 192.0.2.1
+        sql_user: username
         sql_passwd: secret
         sql_database: dbname
         sql_select: SELECT password FROM users WHERE user = '%u'@'%r'
@@ -510,22 +508,32 @@ available:
 
 T\bTh\bhe\be l\bld\bda\bap\bpd\bdb\bb p\bpl\blu\bug\bgi\bin\bn
 
-The ldapdb auxprop plugin provides access to credentials stored in an OpenLDAP
-LDAP server. It is the only plugin that implements proxy authorization.
+The ldapdb auxprop plugin provides access to credentials stored in an LDAP
+server. This plugin requires that SASL client passwords are stored as
+plaintext.
+
+    T\bTi\bip\bp
 
-Proxy authorization in this context means: The ldapdb plugin must SASL
-authenticate with the OpenLDAP server. The server then decides if the ldapdb
-plugin should be authorized to read the authenticating user's password. Once
-the ldapdb plugin has gone through proxy authorization it may proceed and
-authenticate the remote SMTP client's credentials.
+    If you must store encrypted passwords, you can use "saslauthd -a ldap" to
+    query the LDAP database directly, with appropriate configuration in
+    saslauthd.conf. This may be documented in a later version of this document.
+    You will not be able to use any of the methods that require access to
+    plaintext passwords, such as the shared-secret methods CRAM-MD5 and DIGEST-
+    MD5.
+
+The ldapdb plugin implements proxy authorization. This means that the ldapdb
+plugin uses its own username and password to authenticate with the LDAP server,
+before it asks the LDAP server for the remote SMTP client's password. The LDAP
+server then decides if the ldapdb plugin is authorized to read the remote SMTP
+client's password.
 
 In a nutshell: Configuring ldapdb means authentication and authorization must
 be configured twice - once in the Postfix SMTP server to authenticate and
-authorize the remote SMTP client, and once in the OpenLDAP slapd server to
-authenticate and authorize the ldapdb plugin.
+authorize the remote SMTP client, and once in the LDAP server to authenticate
+and authorize the ldapdb plugin.
 
 This example configures libsasl to use the ldapdb plugin and the plugin to
-connect to an OpenLDAP server:
+connect to an LDAP server:
 
     /etc/sasl2/smtpd.conf:
         pwcheck_method: auxprop
@@ -565,13 +573,11 @@ The following is a summary of applicable smtpd.conf file entries:
         LDAP server (proxy authorization).
 
     ldapdb_mech
-        The mechanism to authenticate the ldapdb plugin to the OpenLDAP slapd
-        server.
+        The mechanism to authenticate the ldapdb plugin to the LDAP server.
 
             N\bNo\bot\bte\be
 
-            Specify a mechanism here that is supported by the OpenLDAP slapd
-            server.
+            Specify a mechanism here that is supported by the LDAP server.
 
     ldapdb_rc (optional)
         The path to a file containing individual configuration options for the
@@ -701,10 +707,30 @@ capability twice - once for compliant and once for broken clients:
     250-AUTH=DIGEST-MD5 PLAIN CRAM-MD5
     ...
 
-P\bPo\bos\bst\btf\bfi\bix\bx S\bSM\bMT\bTP\bP S\bSe\ber\brv\bve\ber\br A\bAu\but\bth\bhe\ben\bnt\bti\bic\bca\bat\bti\bio\bon\bn P\bPo\bol\bli\bic\bcy\by
-
-The Postfix SMTP server provides a way to specify the properties of SASL
-mechanisms that can be made available to the remote SMTP client.
+P\bPo\bos\bst\btf\bfi\bix\bx S\bSM\bMT\bTP\bP S\bSe\ber\brv\bve\ber\br p\bpo\bol\bli\bic\bcy\by -\b- S\bSA\bAS\bSL\bL m\bme\bec\bch\bha\ban\bni\bis\bsm\bm p\bpr\bro\bop\bpe\ber\brt\bti\bie\bes\bs
+
+The Postfix SMTP server supports policies that limit the SASL mechanisms that
+it makes available to clients, based on the properties of those mechanisms. The
+next two sections give examples of how these policies are used.
+
+     _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b 
+    |P\bPr\bro\bop\bpe\ber\brt\bty\by       |D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn                                              |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |noanonymous    |Don't use mechanisms that permit anonymous               |
+    |               |authentication.                                          |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |noplaintext    |Don't use mechanisms that transmit unencrypted username  |
+    |               |and password information.                                |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |nodictionary   |Don't use mechanisms that are vulnerable to dictionary   |
+    |               |attacks.                                                 |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |forward_secrecy|Require forward secrecy between sessions (breaking one   |
+    |               |session does not break earlier sessions).                |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |mutual_auth    |Use only mechanisms that authenticate both the client and|
+    |               |the server to each other.                                |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
 
 U\bUn\bne\ben\bnc\bcr\bry\byp\bpt\bte\bed\bd S\bSM\bMT\bTP\bP s\bse\bes\bss\bsi\bio\bon\bn
 
@@ -721,25 +747,6 @@ for those based on anonymous authentication:
     server can give strangers the same authorization as a properly-
     authenticated client.
 
-Postfix can enforce the following policies on SASL authentication mechanisms:
-
-    noanonymous
-        Don't use mechanisms that permit anonymous authentication.
-
-    noplaintext
-        Don't use mechanisms that transmit unencrypted username and password
-        information.
-
-    nodictionary
-        Don't use mechanisms that are vulnerable to dictionary attacks.
-
-    forward_secrecy
-        Use only mechanisms that support forward secrecy (Dovecot SASL only).
-
-    mutual_auth
-        Use only mechanisms that authenticate both the client and the server to
-        each other.
-
 E\bEn\bnc\bcr\bry\byp\bpt\bte\bed\bd S\bSM\bMT\bTP\bP s\bse\bes\bss\bsi\bio\bon\bn (\b(T\bTL\bLS\bS)\b)
 
 A separate parameter controls Postfix SASL mechanism policy during a TLS-
@@ -791,9 +798,9 @@ smtpd_recipient_restrictions as follows:
 E\bEn\bnv\bve\bel\blo\bop\bpe\be s\bse\ben\bnd\bde\ber\br a\bad\bdd\bdr\bre\bes\bss\bs a\bau\but\bth\bho\bor\bri\biz\bza\bat\bti\bio\bon\bn
 
 By default an SMTP client may specify any envelope sender address in the MAIL
-FROM command. That is because the Postfix SMTP server only knows the remte SMTP
-client hostname and IP address, but not the user who controls the remote SMTP
-client.
+FROM command. That is because the Postfix SMTP server only knows the remote
+SMTP client hostname and IP address, but not the user who controls the remote
+SMTP client.
 
 This changes the moment an SMTP client uses SASL authentication. Now, the
 Postfix SMTP server knows who the sender is. Given a table of envelope sender
@@ -811,8 +818,8 @@ authenticated client is allowed to use a particular envelope sender address:
             reject_unauth_destination
             ...
 
-The controlled_envelope_senders table specifies the binding between the sender
-envelope addresses and its their SASL login names:
+The controlled_envelope_senders table specifies the binding between a sender
+envelope address and the SASL login names that own that address:
 
     /etc/postfix/controlled_envelope_senders
         # envelope sender           owners (SASL login names)
@@ -935,14 +942,26 @@ You can read more about the following topics:
 
   * Enabling SASL authentication in the Postfix SMTP/LMTP client
   * Configuring sender-dependent SASL authentication
-  * Postfix SMTP/LMTP client authentication policy
-  * Filtering server mechanism names in the Postfix SMTP/LMTP client
+  * Postfix SMTP/LMTP client policy - SASL mechanism p\bpr\bro\bop\bpe\ber\brt\bti\bie\bes\bs
+  * Postfix SMTP/LMTP client policy - SASL mechanism n\bna\bam\bme\bes\bs
 
 E\bEn\bna\bab\bbl\bli\bin\bng\bg S\bSA\bAS\bSL\bL a\bau\but\bth\bhe\ben\bnt\bti\bic\bca\bat\bti\bio\bon\bn i\bin\bn t\bth\bhe\be P\bPo\bos\bst\btf\bfi\bix\bx S\bSM\bMT\bTP\bP/\b/L\bLM\bMT\bTP\bP c\bcl\bli\bie\ben\bnt\bt
 
 This section shows a typical scenario where the Postfix SMTP client sends all
-messages via a mail gateway server that requires SASL authentication. To make
-the example more readable we introduce it in two parts.
+messages via a mail gateway server that requires SASL authentication.
+
+    T\bTr\bro\bou\bub\bbl\ble\be s\bso\bol\blv\bvi\bin\bng\bg t\bti\bip\bps\bs:\b:
+
+      * If your SASL logins fail with "SASL authentication failure: No worthy
+        mechs found" in the mail logfile, then see the section "Postfix SMTP/
+        LMTP client policy - SASL mechanism p\bpr\bro\bop\bpe\ber\brt\bti\bie\bes\bs".
+
+      * For a solution to a more obscure class of SASL authentication failures,
+        see "Postfix SMTP/LMTP client policy - SASL mechanism n\bna\bam\bme\bes\bs".
+
+To make the example more readable we introduce it in two parts. The first part
+takes care of the basic configuration, while the second part sets up the
+username/password information.
 
     /etc/postfix/main.cf:
         smtp_sasl_auth_enable = yes
@@ -1057,10 +1076,26 @@ final resort.
   * Execute the command "postmap /etc/postfix/sender_relay" whenever you change
     the sender_relay table.
 
-P\bPo\bos\bst\btf\bfi\bix\bx S\bSM\bMT\bTP\bP/\b/L\bLM\bMT\bTP\bP c\bcl\bli\bie\ben\bnt\ba\bau\but\bth\bhe\ben\bnt\bti\bic\bca\bat\bti\bio\bon\bn p\bpo\bol\bli\bic\bcy\by
+P\bPo\bos\bst\btf\bfi\bix\bx S\bSM\bMT\bTP\bP/\b/L\bLM\bMT\bTP\bP c\bcl\bli\bie\ben\bnt\bp\bpo\bol\bli\bic\bcy\by -\b- S\bSA\bAS\bSL\bL m\bme\bec\bch\bha\ban\bni\bis\bsm\bm p\bpr\bro\bop\bpe\ber\brt\bti\bie\bes\bs
 
 Just like the Postfix SMTP server, the SMTP client has a policy that determines
-which SASL mechanisms are acceptable and which are not.
+which SASL mechanisms are acceptable, based on their properties. The next two
+sections give examples of how these policies are used.
+
+     _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b 
+    |P\bPr\bro\bop\bpe\ber\brt\bty\by    |D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn                                                |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |noanonymous |Don't use mechanisms that permit anonymous authentication. |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |noplaintext |Don't use mechanisms that transmit unencrypted username and|
+    |            |password information.                                      |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |nodictionary|Don't use mechanisms that are vulnerable to dictionary     |
+    |            |attacks.                                                   |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |mutual_auth |Use only mechanisms that authenticate both the client and  |
+    |            |the server to each other.                                  |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
 
 U\bUn\bne\ben\bnc\bcr\bry\byp\bpt\bte\bed\bd S\bSM\bMT\bTP\bP s\bse\bes\bss\bsi\bio\bon\bn
 
@@ -1070,38 +1105,18 @@ mechanisms are not allowed (nor is any anonymous mechanism):
     /etc/postfix/main.cf:
         smtp_sasl_security_options = noplaintext, noanonymous
 
-Postfix can enforce the following policies on SASL authentication mechanisms:
-
-    noanonymous
-        Don't use mechanisms that permit anonymous authentication.
-
-    noplaintext
-        Don't use mechanisms that transmit unencrypted username and password
-        information.
-
-    nodictionary
-        Don't use mechanisms that are vulnerable to dictionary attacks.
-
-    mutual_auth
-        Use only mechanisms that authenticate both the client and the server to
-        each other.
-
-With the default policy shown above, the Postfix SMTP client will not send its
-password over an unencrypted connection. This sometimes leads to authentication
-failures if the remote server only offers plaintext authentication mechanisms.
-In such cases the SMTP client will log the following error message:
+This default policy leads to authentication failures if the remote server only
+offers plaintext authentication mechanisms. In such cases the SMTP client will
+log the following error message:
 
     SASL authentication failure: No worthy mechs found
 
-The less secure approach to deal with this is to lower the security standards
-and permit plaintext authentication mechanisms:
+The less secure approach is to lower the security standards and permit
+plaintext authentication mechanisms:
 
     /etc/postfix/main.cf:
         smtp_sasl_security_options = noanonymous
 
-Needless to say, sending a username and password over an insecure channel is
-undesirable.
-
 If the remote server supports TLS, you can protect the plaintext username and
 password by turning on TLS in the Postfix SMTP client (see: TLS_README), and
 configuring the client as discussed next.
@@ -1122,16 +1137,18 @@ encrypted connection:
         smtpd_sasl_security_options = noanonymous, noplaintext
         smtpd_sasl_tls_security_options = noanonymous
 
-F\bFi\bil\blt\bte\ber\bri\bin\bng\bg s\bse\ber\brv\bve\ber\br m\bme\bec\bch\bha\ban\bni\bis\bsm\bm n\bna\bam\bme\bes\bs i\bin\bn t\bth\bhe\be P\bPo\bos\bst\btf\bfi\bix\bx S\bSM\bMT\bTP\bP/\b/L\bLM\bMT\bTP\bP c\bcl\bli\bie\ben\bnt\bt
+P\bPo\bos\bst\btf\bfi\bix\bx S\bSM\bMT\bTP\bP/\b/L\bLM\bMT\bTP\bP c\bcl\bli\bie\ben\bnt\bt p\bpo\bol\bli\bic\bcy\by -\b- S\bSA\bAS\bSL\bL m\bme\bec\bch\bha\ban\bni\bis\bsm\bm n\bna\bam\bme\bes\bs
 
-Cyrus SASL always attempts to use the most secure authentication mechanism that
-the remote SMTP server offers - even if the client side was not configured to
-handle it! In such cases authentication will definitely fail.
+Unfortunately, Postfix needs a second client policy for SASL mechanism
+selection. Reason: the Cyrus SASL library will choose the most secure
+authentication mechanism that both the SMTP client and server implement - even
+if one of the parties was not configured for that mechanism.
 
-To prevent this, the Postfix SMTP client can filter the list of authentication
-mechanism names from the remote SMTP server. Used correctly, the filter hides
-unwanted mechanisms from the Cyrus SASL library, forcing the library to choose
-from the mechanisms the Postfix filter passes through.
+To prevent this, the Postfix SMTP client can filter the names of the
+authentication mechanisms from the remote SMTP server. Used correctly, the
+filter hides unwanted mechanisms from the Cyrus SASL library, forcing the
+library to choose from the mechanisms the Postfix SMTP client filter passes
+through.
 
 The following example filters out everything but the mechanisms PLAIN and
 LOGIN:
index 3c40eb5600d9f63566f56e561b2d87841f3050fa..b18b44b38ce6b3858092d2c6df5c472471a18ca9 100644 (file)
@@ -152,8 +152,20 @@ virtual table.
 E\bEn\bna\bab\bbl\bli\bin\bng\bg S\bSA\bAS\bSL\bL a\bau\but\bth\bhe\ben\bnt\bti\bic\bca\bat\bti\bio\bon\bn i\bin\bn t\bth\bhe\be P\bPo\bos\bst\btf\bfi\bix\bx S\bSM\bMT\bTP\bP/\b/L\bLM\bMT\bTP\bP c\bcl\bli\bie\ben\bnt\bt
 
 This section shows a typical scenario where the Postfix SMTP client sends all
-messages via a mail gateway server that requires SASL authentication. To make
-the example more readable we introduce it in two parts.
+messages via a mail gateway server that requires SASL authentication.
+
+    T\bTr\bro\bou\bub\bbl\ble\be s\bso\bol\blv\bvi\bin\bng\bg t\bti\bip\bps\bs:\b:
+
+      * If your SASL logins fail with "SASL authentication failure: No worthy
+        mechs found" in the mail logfile, then see the section "Postfix SMTP/
+        LMTP client policy - SASL mechanism p\bpr\bro\bop\bpe\ber\brt\bti\bie\bes\bs".
+
+      * For a solution to a more obscure class of SASL authentication failures,
+        see "Postfix SMTP/LMTP client policy - SASL mechanism n\bna\bam\bme\bes\bs".
+
+To make the example more readable we introduce it in two parts. The first part
+takes care of the basic configuration, while the second part sets up the
+username/password information.
 
     /etc/postfix/main.cf:
         smtp_sasl_auth_enable = yes
index a1ac0ca5568ed6952cf2e0d78432d8806bdcdc35..e5d402ce5529086bb39676ae4a9cb31e8263caef 100644 (file)
@@ -2,6 +2,12 @@ Wish list:
 
        Remove this file from the stable release.
 
+       instead of ipc_idle, reduce ipc_ttl.
+
+       Add smtpd_sender_login_maps to proxy_read_maps. What other 
+       parameters are worthy of being whitelisted for proxy access?
+       Is there a way to automate this decision?
+
        The cleanup virtual alias expansion limit does not really
        deliver on its promises. 1) It promises to truncate the
        result without aborting delivery, which would be undesirable
@@ -47,21 +53,17 @@ Wish list:
        Find a place to document all the mail routing mechanisms
        in one place so people can figure out how Postfix works.
 
-       owner-listname does not work for shell commands.
-
        Investigate viability of Sendmail socket maps (the moral
        equivalent of tcp_table(5)), and dns maps.
 
-       The BCC action is marked "not stable", perhaps because
-       people would also expect BCC actions in header/body_checks.
+       The access map BCC action is marked "not stable", perhaps
+       because people would also expect BCC actions in header/body_checks.
        How much would it take to make the queue file editing code
        generally usable?
 
        Move smtpd_command_filter into smtpd_chat_query() and update
        the session transcript (see smtp_chat_reply() for an example).
 
-       Add smtpd_sender_login_maps to proxy_read_maps.
-
        SMTP connection caching without storing connections, to
        improve TLS mail delivery performance.
 
index 6e818671a8d82822800abf7852962c7cc1090250..ed9a4b57df73f0420535887a0770179966cc883a 100644 (file)
@@ -737,7 +737,7 @@ q
 EOF
     }
 
-    # Postfix 2.7.
+    # Postfix 2.8.
     # Add missing postscreen service to master.cf.
 
     grep '^#*smtp.*postscreen' $config_directory/master.cf >/dev/null || {
@@ -747,7 +747,7 @@ EOF
 EOF
     }
 
-    # Postfix 2.7.
+    # Postfix 2.8.
     # Add missing smtpd (unix-domain) service to master.cf.
 
     grep '^#*smtpd.*smtpd' $config_directory/master.cf >/dev/null || {
@@ -757,7 +757,7 @@ EOF
 EOF
     }
 
-    # Postfix 2.7.
+    # Postfix 2.8.
     # Add temporary dnsblog (unix-domain) service to master.cf.
 
     grep '^#*dnsblog.*dnsblog' $config_directory/master.cf >/dev/null || {
index b475ab3d7e5be233f8f70cad26302989442d29ce..454107e827a96fc48b7b5f6fb9dfe721f6108a30 100644 (file)
@@ -26,21 +26,19 @@ considering. </p>
 
 <h2><a name="intro">How Postfix uses SASL authentication</a></h2>
 
-<p> When an SMTP client connects to an SMTP server, the server needs
-to decide whether that client is authorized to send mail to remote
-destinations, or whether the client can send mail only to the
-destinations that the server itself is responsible for.  Usually,
-the SMTP server will allow mail to remote destinations only if the
-client's IP address is in the "same network" as the server's IP
-address.  </p>
-
-<p> Sometimes the SMTP client and server are in different networks,
-but the client still needs "same network" privileges.  To address
-this problem, Postfix supports SASL authentication (<a href="http://tools.ietf.org/html/rfc4954">RFC 4954</a>,
-formerly <a href="http://tools.ietf.org/html/rfc2554">RFC 2554</a>). With this a remote SMTP client can authenticate
-to the Postfix SMTP server, and the Postfix SMTP client can
-authenticate to a remote SMTP server.  Once the client is authenticated
-the server can give it "same network" privileges.  </p>
+<p> SMTP servers need to decide whether an SMTP client is authorized
+to send mail to remote destinations, or only to destinations that
+the server itself is responsible for.  Usually, SMTP servers allow
+mail to remote destinations when the client's IP address is in the
+"same network" as the server's IP address.  </p>
+
+<p> Sometimes an SMTP client needs "same network" privileges when
+it connects from elsewhere.  To address this problem, Postfix
+supports SASL authentication (<a href="http://tools.ietf.org/html/rfc4954">RFC 4954</a>, formerly RFC 2554).  With
+this a remote SMTP client can authenticate to the Postfix SMTP
+server, and the Postfix SMTP client can authenticate to a remote
+SMTP server.  Once a client is authenticated, a server can give it
+"same network" privileges.  </p>
 
 <p> Postfix does not implement SASL itself, but instead uses existing
 implementations as building blocks.  This means that some SASL-related
@@ -131,12 +129,13 @@ authorization in the Postfix SMTP server</a>
 the Postfix SMTP server</a></li>
 
 <li><a href="#smtpd_sasl_security_options">Postfix SMTP Server
-Authentication Policy</a></li>
+policy - SASL mechanism properties</a></li>
 
-<li><a href="#server_sasl_authz">Enabling SASL authorization in the Postfix
-SMTP server</a></li>
+<li><a href="#server_sasl_authz">Enabling SASL authorization in the
+Postfix SMTP server</a></li>
 
-<li><a href="#server_sasl_other">Additional SMTP Server SASL options</a></li>
+<li><a href="#server_sasl_other">Additional SMTP Server SASL
+options</a></li>
 
 </ul></li>
 
@@ -146,7 +145,8 @@ SMTP server</a></li>
 </ul>
 
 
-<h3><a name="server_which">Which SASL Implementations are supported?</a></h3>
+<h3><a name="server_which">Which SASL Implementations are
+supported?</a></h3>
 
 <p> Currently the Postfix SMTP server supports the Cyrus SASL and
 Dovecot SASL implementations. </p>
@@ -453,7 +453,7 @@ locations are <code>/etc/sysconfig/saslauthd</code> or
 
 </blockquote>
 
-<h4><a name="id395661">Using saslauthd with /etc/shadow</a></h4>
+<h4><a name="saslauthd_shadow">Using saslauthd with /etc/shadow</a></h4>
 
 <p> Access to the <code>/etc/shadow</code> system password file
 requires <code>root</code> privileges.  The Postfix SMTP server
@@ -480,7 +480,7 @@ authentication backend <code>/etc/shadow</code> if started like this: </p>
 <p> See section "<a href="#testing_saslauthd">Testing saslauthd
 authentication</a>" for test instructions. </p>
 
-<h4><a name="id395745">Using saslauthd with PAM</a></h4>
+<h4><a name="saslauthd_pam">Using saslauthd with PAM</a></h4>
 
 <p> Cyrus SASL can use the PAM framework to authenticate credentials.
 <code>saslauthd</code> uses the PAM framework when started like
@@ -505,7 +505,7 @@ document. </p>
 <p> See section "<a href="#testing_saslauthd">Testing saslauthd
 authentication</a>" for test instructions. </p>
 
-<h4><a name="id395792">Using saslauthd with an IMAP server</a></h4>
+<h4><a name="saslauthd_imap">Using saslauthd with an IMAP server</a></h4>
 
 <p> <code>saslauthd</code> can verify the SMTP client credentials
 by using them to log into an IMAP server.  If the login succeeds,
@@ -617,9 +617,10 @@ stored in encrypted form. </p>
 
 <h4><a name="auxprop_sasldb">The sasldb plugin</a></h4>
 
-<p> The sasldb auxprop plugin authenticates credentials stored in a Berkeley
-DB database. The database schema is specific to Cyrus SASL.  The
-database is usually located at <code>/etc/sasldb2</code>. </p>
+<p> The sasldb auxprop plugin authenticates SASL clients against
+credentials that are stored in a Berkeley DB database. The database
+schema is specific to Cyrus SASL.  The database is usually located
+at <code>/etc/sasldb2</code>. </p>
 
 <blockquote>
 
@@ -709,31 +710,25 @@ mechanisms that are applicable for your environment. </p>
 <h4><a name="auxprop_sql">The sql plugin</a></h4>
 
 <p> The sql auxprop plugin is a generic SQL plugin. It provides
-access to credentials stored in a MySQL, a PostgreSQL or a SQLite
-database. </p>
-
-<blockquote>
-
-<strong>Note</strong>
-
-<p> The shared-secret mechanisms (CRAM-MD5, etc.) require that the
-SASL client passwords are stored as plaintext.  </p>
-
-</blockquote>
+access to credentials stored in a MySQL, PostgreSQL or SQLite
+database. This plugin requires that SASL client passwords are
+stored as plaintext. </p>
 
 <blockquote>
 
 <strong>Tip</strong>
 
-<!-- XXX  -->
-
-<p> Use "saslauthd &gt; pam &gt; (pam database module)" to
-verify encrypted passwords in an SQL database. </p>
+<p> If you must store encrypted passwords, see section "<a
+href="#saslauthd_pam">Using saslauthd with PAM</a>", and configure
+PAM to look up the encrypted passwords with, for example, the
+<code>pam_mysql</code> module.  You will not be able to use any of
+the methods that require access to plaintext passwords, such as the
+shared-secret methods CRAM-MD5 and DIGEST-MD5.  </p>
 
 </blockquote>
 
-<p> The following example configures libsasl to use the sql plugin and connects
-it to a PostgreSQL server: </p>
+<p> The following example configures libsasl to use the sql plugin
+and connects it to a PostgreSQL server: </p>
 
 <blockquote>
 <pre>
@@ -742,7 +737,8 @@ it to a PostgreSQL server: </p>
     auxprop_plugin: sql
     mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM
     sql_engine: pgsql
-    sql_hostnames: 127.0.0.1, 192.0.2.1 sql_user: username
+    sql_hostnames: 127.0.0.1, 192.0.2.1
+    sql_user: username
     sql_passwd: secret
     sql_database: dbname
     sql_select: SELECT password FROM users WHERE user = '%u'@'%r'
@@ -893,24 +889,37 @@ username. </p>
 <h4><a name="auxprop_ldapdb">The ldapdb plugin</a></h4>
 
 <p> The ldapdb auxprop plugin provides access to credentials stored
-in an OpenLDAP LDAP server. It is the only plugin that implements
-proxy authorization. </p>
+in an LDAP server. This plugin requires that SASL client passwords are
+stored as plaintext. </p>
+
+<blockquote>
+
+<strong>Tip</strong>
 
-<p> Proxy authorization in this context means: The ldapdb plugin
-must SASL authenticate with the OpenLDAP server. The server then
-decides if the ldapdb plugin should be authorized to read the
-authenticating user's password.  Once the ldapdb plugin has gone
-through proxy authorization it may proceed and authenticate the
-remote SMTP client's credentials. </p>
+<p> If you must store encrypted passwords, you can use "<code>saslauthd
+-a ldap</code>" to query the LDAP database directly, with appropriate
+configuration in <code>saslauthd.conf</code>. This may be documented
+in a later version of this document.  You will not be able to use
+any of the methods that require access to plaintext passwords, such
+as the shared-secret methods CRAM-MD5 and DIGEST-MD5.  </p>
+
+</blockquote>
+
+<p> The ldapdb plugin implements proxy authorization. This means
+that the ldapdb plugin uses its own username and password to
+authenticate with the LDAP server, before it asks the LDAP server
+for the remote SMTP client's password.  The LDAP server then decides
+if the ldapdb plugin is authorized to read the remote SMTP client's
+password.  </p>
 
 <p> In a nutshell: Configuring ldapdb means authentication and
 authorization must be configured twice - once in the Postfix SMTP
 server to authenticate and authorize the remote SMTP client, and
-once in the OpenLDAP <code>slapd</code> server to authenticate and
-authorize the ldapdb plugin. </p>
+once in the LDAP server to authenticate and authorize the ldapdb
+plugin. </p>
 
 <p> This example configures libsasl to use the ldapdb plugin and
-the plugin to connect to an OpenLDAP server: </p>
+the plugin to connect to an LDAP server: </p>
 
 <blockquote>
 <pre>
@@ -975,14 +984,14 @@ plugin to the LDAP server (proxy authorization). </p> </dd>
 <dt>ldapdb_mech</dt>
 
 <dd> <p> The mechanism to authenticate the ldapdb plugin to the
-OpenLDAP slapd server. </p>
+LDAP server. </p>
 
 <blockquote>
 
 <strong>Note</strong>
 
-<p> Specify a mechanism here that is supported by the OpenLDAP slapd
-server. </p>
+<p> Specify a mechanism here that is supported by the LDAP server.
+</p>
 
 </blockquote>
 
@@ -1186,12 +1195,39 @@ clients: </p>
 </pre>
 </blockquote>
 
-<h4><a name="smtpd_sasl_security_options">Postfix SMTP Server
-Authentication Policy</a></h4>
+<h4><a name="smtpd_sasl_security_options">Postfix SMTP Server policy
+- SASL mechanism properties</a></h4>
+
+<p> The Postfix SMTP server supports policies that limit the SASL
+mechanisms that it makes available to clients, based on the properties
+of those mechanisms.  The next two sections give examples of how
+these policies are used. </p>
+
+<blockquote>
+
+<table border="1">
+
+<tr> <th>Property</th> <th>Description</th> </tr>
 
-<p> The Postfix SMTP server provides a way to specify the properties
-of SASL mechanisms that can be made available to the remote SMTP
-client.  </p>
+<tr> <td>noanonymous</td> <td> Don't use mechanisms that permit
+anonymous authentication.  </td> </tr>
+
+<tr> <td>noplaintext</td> <td> Don't use mechanisms that transmit
+unencrypted username and password information.  </td> </tr>
+
+<tr> <td>nodictionary</td> <td> Don't use mechanisms that are
+vulnerable to dictionary attacks. </td> </tr>
+
+<tr> <td>forward_secrecy</td> <td> Require forward secrecy between
+sessions (breaking one session does not break earlier sessions).
+</td> </tr>
+
+<tr> <td>mutual_auth</td> <td> Use only mechanisms that authenticate
+both the client and the server to each other. </td> </tr>
+
+</table>
+
+</blockquote>
 
 <h4><a name="id396877">Unencrypted SMTP session</a></h4>
 
@@ -1216,46 +1252,6 @@ authorization as a properly-authenticated client. </p>
 
 </blockquote>
 
-<p> Postfix can enforce the following policies on SASL authentication
-mechanisms: </p>
-
-<blockquote>
-
-<dl>
-
-<dt>noanonymous</dt>
-
-<dd> <p> Don't use mechanisms that permit anonymous authentication.
-</p> </dd>
-
-<dt>noplaintext</dt>
-
-<dd> <p> Don't use mechanisms that transmit unencrypted username
-and password information.  </p> </dd>
-
-<dt>nodictionary</dt>
-
-<dd> <p> Don't use mechanisms that are vulnerable to dictionary
-attacks. </p>
-
-</dd>
-
-<dt>forward_secrecy</dt>
-
-<dd> <p> Use only mechanisms that support forward secrecy (Dovecot
-SASL only).</p>
-
-</dd>
-
-<dt>mutual_auth</dt>
-
-<dd> <p> Use only mechanisms that authenticate both the client and
-the server to each other. </p> </dd>
-
-</dl>
-
-</blockquote>
-
 <h4><a name="id396969">Encrypted SMTP session (TLS)</a></h4>
 
 <p> A separate parameter controls Postfix SASL mechanism policy
@@ -1307,7 +1303,7 @@ for. Examples of possible SMTP clients authorizations are: </p>
 
 <p> These permissions are not enabled by default. </p>
 
-<h4><a name="id397041">Mail relay authorization</a></h4>
+<h4><a name="server_sasl_authz_relay">Mail relay authorization</a></h4>
 
 <p> The <code><a href="postconf.5.html#permit_sasl_authenticated">permit_sasl_authenticated</a></code> restriction allows
 SASL-authenticated SMTP clients to send mail to remote destinations.
@@ -1326,11 +1322,12 @@ follows: </p>
 </pre>
 </blockquote>
 
-<h4><a name="id397072">Envelope sender address authorization</a></h4>
+<h4><a name="server_sasl_authz_envelope">Envelope sender address
+authorization</a></h4>
 
 <p> By default an SMTP client may specify any envelope sender address
 in the MAIL FROM command.  That is because the Postfix SMTP server
-only knows the remte SMTP client hostname and IP address, but not
+only knows the remote SMTP client hostname and IP address, but not
 the user who controls the remote SMTP client.  </p>
 
 <p> This changes the moment an SMTP client uses SASL authentication.
@@ -1355,8 +1352,8 @@ use a particular envelope sender address: </p>
 </blockquote>
 
 <p> The <code>controlled_envelope_senders</code> table specifies
-the binding between the sender envelope addresses and its their
-SASL login names: </p>
+the binding between a sender envelope address and the SASL login
+names that own that address: </p>
 
 <blockquote>
 <pre>
@@ -1535,11 +1532,11 @@ the Postfix SMTP/LMTP client</a></li>
 <li><a href="#client_sasl_sender">Configuring sender-dependent SASL
 authentication</a></li>
 
-<li><a href="#client_sasl_policy">Postfix SMTP/LMTP client
-authentication policy</a></li>
+<li><a href="#client_sasl_policy">Postfix SMTP/LMTP client policy
+- SASL mechanism <em>properties</em></a></li>
 
-<li><a href="#client_sasl_filter">Filtering server mechanism names
-in the Postfix SMTP/LMTP client</a></li>
+<li><a href="#client_sasl_filter">Postfix SMTP/LMTP client policy
+- SASL mechanism <em>names</em></a></li>
 
 </ul>
 
@@ -1548,8 +1545,30 @@ Postfix SMTP/LMTP client</a></h3>
 
 <p> This section shows a typical scenario where the Postfix SMTP
 client sends all messages via a mail gateway server that requires
-SASL authentication. To make the example more readable we introduce
-it in two parts. </p>
+SASL authentication. </p>
+
+<blockquote>
+
+<strong> Trouble solving tips: </strong>
+
+<ul>
+
+<li> <p> If your SASL logins fail with "SASL authentication failure:
+No worthy mechs found" in the mail logfile, then see the section
+"<a href="SASL_README.html#client_sasl_policy">Postfix SMTP/LMTP
+client policy - SASL mechanism <em>properties</em></a>".
+
+<li> <p> For a solution to a more obscure class of SASL authentication
+failures, see "<a href="SASL_README.html#client_sasl_filter">Postfix
+SMTP/LMTP client policy - SASL mechanism <em>names</em></a>".
+
+</ul>
+
+</blockquote>
+
+<p> To make the example more readable we introduce it in two parts.
+The first part takes care of the basic configuration, while the
+second part sets up the username/password information.  </p>
 
 <blockquote>
 <pre>
@@ -1713,65 +1732,53 @@ whenever you change the sender_relay table. </p>
 
 </ul>
 
-<h3><a name="client_sasl_policy">Postfix SMTP/LMTP client authentication
-policy</a></h3>
+<h3><a name="client_sasl_policy">Postfix SMTP/LMTP client policy -
+SASL mechanism <em>properties</em></a></h3>
 
 <p> Just like the Postfix SMTP server, the SMTP client has a policy
-that determines which SASL mechanisms are acceptable and which are
-not. </p>
-
-<h4>Unencrypted SMTP session</h4>
-
-<p> The default policy is stricter than that of the Postfix SMTP
-server - plaintext mechanisms are not allowed (nor is any anonymous
-mechanism): </p>
-
-<blockquote>
-<pre>
-/etc/postfix/<a href="postconf.5.html">main.cf</a>:
-    <a href="postconf.5.html#smtp_sasl_security_options">smtp_sasl_security_options</a> = noplaintext, noanonymous
-</pre>
-</blockquote>
-
-<p> Postfix can enforce the following policies on SASL authentication
-mechanisms: </p>
+that determines which SASL mechanisms are acceptable, based on their 
+properties. The next two sections give examples of how these policies
+are used.  </p>
 
 <blockquote>
 
-<dl>
-
-<dt>noanonymous</dt>
+<table border="1">
 
-<dd> <p> Don't use mechanisms that permit anonymous authentication.
-</p> </dd>
+<tr> <th>Property</th> <th>Description</th> </tr>
 
-<dt>noplaintext</dt>
+<tr> <td>noanonymous</td> <td> Don't use mechanisms that permit
+anonymous authentication.  </td> </tr>
 
-<dd> <p> Don't use mechanisms that transmit unencrypted username
-and password information.  </p> </dd>
+<tr> <td>noplaintext</td> <td> Don't use mechanisms that transmit
+unencrypted username and password information.  </td> </tr>
 
-<dt>nodictionary</dt>
+<tr> <td>nodictionary</td> <td> Don't use mechanisms that are
+vulnerable to dictionary attacks. </td> </tr>
 
-<dd> <p> Don't use mechanisms that are vulnerable to dictionary
-attacks. </p>
+<tr> <td>mutual_auth</td> <td> Use only mechanisms that authenticate
+both the client and the server to each other. </td> </tr>
 
-</dd>
+</table>
 
-<dt>
-<dt>mutual_auth</dt>
+</blockquote>
 
-<dd> <p> Use only mechanisms that authenticate both the client and
-the server to each other. </p> </dd>
+<h4>Unencrypted SMTP session</h4>
 
-</dl>
+<p> The default policy is stricter than that of the Postfix SMTP
+server - plaintext mechanisms are not allowed (nor is any anonymous
+mechanism): </p>
 
+<blockquote>
+<pre>
+/etc/postfix/<a href="postconf.5.html">main.cf</a>:
+    <a href="postconf.5.html#smtp_sasl_security_options">smtp_sasl_security_options</a> = noplaintext, noanonymous
+</pre>
 </blockquote>
 
-<p> With the default policy shown above, the Postfix SMTP client
-will not send its password over an unencrypted connection.  This
-sometimes leads to authentication failures if the remote server
-only offers plaintext authentication mechanisms.  In such cases the
-SMTP client will log the following error message: </p>
+<p> This default policy leads to authentication failures if the
+remote server only offers plaintext authentication mechanisms.  In
+such cases the SMTP client will log the following error message:
+</p>
 
 <blockquote>
 <pre>
@@ -1779,9 +1786,8 @@ SASL authentication failure: No worthy mechs found
 </pre>
 </blockquote>
 
-<p> The less secure approach to deal with this is to lower the
-security standards and permit plaintext authentication mechanisms:
-</p>
+<p> The less secure approach is to lower the security standards and
+permit plaintext authentication mechanisms: </p>
 
 <blockquote>
 <pre>
@@ -1790,9 +1796,6 @@ security standards and permit plaintext authentication mechanisms:
 </pre>
 </blockquote>
 
-<p> Needless to say, sending a username and password over an insecure
-channel is undesirable. </p>
-
 <p> If the remote server supports TLS, you can protect the plaintext
 username and password by turning on TLS in the Postfix SMTP client
 (see: <a href="TLS_README.html">TLS_README</a>), and configuring the client as discussed next.
@@ -1821,19 +1824,20 @@ only over a TLS-encrypted connection: </p>
 </pre>
 </blockquote>
 
-<h3><a name="client_sasl_filter">Filtering server mechanism names in
-the Postfix SMTP/LMTP client</a></h3>
+<h3><a name="client_sasl_filter">Postfix SMTP/LMTP client policy -
+SASL mechanism <em>names</em></a></h3>
 
-<p> Cyrus SASL always attempts to use the most secure authentication
-mechanism that the remote SMTP server offers - even if the client
-side was not configured to handle it! In such cases authentication
-will definitely fail. </p>
+<p> Unfortunately, Postfix needs a second client policy for SASL
+mechanism selection.  Reason: the Cyrus SASL library will choose
+the most secure authentication mechanism that both the SMTP client
+and server implement - even if one of the parties was not configured
+for that mechanism. </p>
 
-<p> To prevent this, the Postfix SMTP client can filter the list
-of authentication mechanism names from the remote SMTP server.  Used
+<p> To prevent this, the Postfix SMTP client can filter the names
+of the authentication mechanisms from the remote SMTP server.  Used
 correctly, the filter hides unwanted mechanisms from the Cyrus SASL
 library, forcing the library to choose from the mechanisms the
-Postfix filter passes through.  </p>
+Postfix SMTP client filter passes through.  </p>
 
 <p> The following example filters out everything but the mechanisms
 <code>PLAIN</code> and <code>LOGIN</code>: </p>
index d4458aeeba71cfa734df79589a991200e0e044cf..83f290d01d363c2b632505eb55b622ddf6114acc 100644 (file)
@@ -219,8 +219,30 @@ Postfix SMTP/LMTP client</a></h2>
 
 <p> This section shows a typical scenario where the Postfix SMTP
 client sends all messages via a mail gateway server that requires
-SASL authentication. To make the example more readable we introduce
-it in two parts. </p>
+SASL authentication. </p>
+
+<blockquote>
+
+<strong> Trouble solving tips: </strong>
+
+<ul>
+
+<li> <p> If your SASL logins fail with "SASL authentication failure:
+No worthy mechs found" in the mail logfile, then see the section
+"<a href="SASL_README.html#client_sasl_policy">Postfix SMTP/LMTP
+client policy - SASL mechanism <em>properties</em></a>".
+
+<li> <p> For a solution to a more obscure class of SASL authentication
+failures, see "<a href="SASL_README.html#client_sasl_filter">Postfix
+SMTP/LMTP client policy - SASL mechanism <em>names</em></a>".
+
+</ul>
+
+</blockquote>
+
+<p> To make the example more readable we introduce it in two parts.
+The first part takes care of the basic configuration, while the
+second part sets up the username/password information.  </p>
 
 <blockquote>
 <pre>
index 645238e248afd17b3abc3543261edf5ccbb3c8c2..465ec1fabe153c538166a23ceb69bb5389cfb138 100644 (file)
@@ -10,13 +10,19 @@ POSTMULTI(1)                                                      POSTMULTI(1)
        postmulti - Postfix multi-instance manager
 
 <b>SYNOPSIS</b>
+       <b>ENABLING MULTI-INSTANCE MANAGEMENT:</b>
+
+       <b>postmulti -e init</b> [<b>-v</b>]
+
+       <b>ITERATOR MODE:</b>
+
        <b>postmulti -l</b> [<b>-aRv</b>] [<b>-g</b> <i>group</i>] [<b>-i</b> <i>name</i>]
 
        <b>postmulti -p</b> [<b>-av</b>] [<b>-g</b> <i>group</i>] [<b>-i</b> <i>name</i>] <i>command...</i>
 
        <b>postmulti -x</b> [<b>-aRv</b>] [<b>-g</b> <i>group</i>] [<b>-i</b> <i>name</i>] <i>command...</i>
 
-       <b>postmulti -e init</b> [<b>-v</b>]
+       <b>LIFE-CYCLE MANAGEMENT:</b>
 
        <b>postmulti -e create</b> [<b>-av</b>] [<b>-g</b> <i>group</i>] [<b>-i</b> <i>name</i>] [<b>-G</b> <i>group</i>]
        [<b>-I</b> <i>name</i>] [<i>param=value</i> ...]
index 9d7c8b399252ee3631705ca91669950da5dad8d6..8bafd70d6e40f4ff5b7b8debe25632d69131dca7 100644 (file)
@@ -9,6 +9,12 @@ Postfix multi-instance manager
 .na
 .nf
 .fi
+\fBENABLING MULTI-INSTANCE MANAGEMENT:\fR
+
+\fBpostmulti\fR \fB-e init\fR [\fB-v\fR]
+
+\fBITERATOR MODE:\fR
+
 \fBpostmulti\fR \fB-l\fR [\fB-aRv\fR] [\fB-g \fIgroup\fR]
 [\fB-i \fIname\fR]
 
@@ -18,7 +24,7 @@ Postfix multi-instance manager
 \fBpostmulti\fR \fB-x\fR [\fB-aRv\fR] [\fB-g \fIgroup\fR]
 [\fB-i \fIname\fR] \fIcommand...\fR
 
-\fBpostmulti\fR \fB-e init\fR [\fB-v\fR]
+\fBLIFE-CYCLE MANAGEMENT:\fR
 
 \fBpostmulti\fR \fB-e create\fR [\fB-av\fR]
 [\fB-g \fIgroup\fR] [\fB-i \fIname\fR] [\fB-G \fIgroup\fR]
index 2cc5b4fe3f4eb7580d777b3cf992945ff011ba0b..4d07e66329c122d2bcf1da4269a5c7b73eba2f82 100755 (executable)
@@ -18,7 +18,7 @@ $append_to = \%leader;
 
 while (<>) {
 
-    if (/^Incompatible changes with/) {
+    if (/^(Incompatible changes|Incompatibility) with/) {
        die "No date found: $_" unless /(\d\d\d\d\d\d\d\d)/;
        $append_to = \%body;
        $prefix = "[Incompat $1] ";
index 3c6e558e9c0875c8984fce006e309d4b10b2d8f2..25efe1d74458971e91c7106b991059a503fd7650 100644 (file)
@@ -26,21 +26,19 @@ considering. </p>
 
 <h2><a name="intro">How Postfix uses SASL authentication</a></h2>
 
-<p> When an SMTP client connects to an SMTP server, the server needs
-to decide whether that client is authorized to send mail to remote
-destinations, or whether the client can send mail only to the
-destinations that the server itself is responsible for.  Usually,
-the SMTP server will allow mail to remote destinations only if the
-client's IP address is in the "same network" as the server's IP
-address.  </p>
-
-<p> Sometimes the SMTP client and server are in different networks,
-but the client still needs "same network" privileges.  To address
-this problem, Postfix supports SASL authentication (RFC 4954,
-formerly RFC 2554). With this a remote SMTP client can authenticate
-to the Postfix SMTP server, and the Postfix SMTP client can
-authenticate to a remote SMTP server.  Once the client is authenticated
-the server can give it "same network" privileges.  </p>
+<p> SMTP servers need to decide whether an SMTP client is authorized
+to send mail to remote destinations, or only to destinations that
+the server itself is responsible for.  Usually, SMTP servers allow
+mail to remote destinations when the client's IP address is in the
+"same network" as the server's IP address.  </p>
+
+<p> Sometimes an SMTP client needs "same network" privileges when
+it connects from elsewhere.  To address this problem, Postfix
+supports SASL authentication (RFC 4954, formerly RFC 2554).  With
+this a remote SMTP client can authenticate to the Postfix SMTP
+server, and the Postfix SMTP client can authenticate to a remote
+SMTP server.  Once a client is authenticated, a server can give it
+"same network" privileges.  </p>
 
 <p> Postfix does not implement SASL itself, but instead uses existing
 implementations as building blocks.  This means that some SASL-related
@@ -131,12 +129,13 @@ authorization in the Postfix SMTP server</a>
 the Postfix SMTP server</a></li>
 
 <li><a href="#smtpd_sasl_security_options">Postfix SMTP Server
-Authentication Policy</a></li>
+policy - SASL mechanism properties</a></li>
 
-<li><a href="#server_sasl_authz">Enabling SASL authorization in the Postfix
-SMTP server</a></li>
+<li><a href="#server_sasl_authz">Enabling SASL authorization in the
+Postfix SMTP server</a></li>
 
-<li><a href="#server_sasl_other">Additional SMTP Server SASL options</a></li>
+<li><a href="#server_sasl_other">Additional SMTP Server SASL
+options</a></li>
 
 </ul></li>
 
@@ -146,7 +145,8 @@ SMTP server</a></li>
 </ul>
 
 
-<h3><a name="server_which">Which SASL Implementations are supported?</a></h3>
+<h3><a name="server_which">Which SASL Implementations are
+supported?</a></h3>
 
 <p> Currently the Postfix SMTP server supports the Cyrus SASL and
 Dovecot SASL implementations. </p>
@@ -453,7 +453,7 @@ locations are <code>/etc/sysconfig/saslauthd</code> or
 
 </blockquote>
 
-<h4><a name="id395661">Using saslauthd with /etc/shadow</a></h4>
+<h4><a name="saslauthd_shadow">Using saslauthd with /etc/shadow</a></h4>
 
 <p> Access to the <code>/etc/shadow</code> system password file
 requires <code>root</code> privileges.  The Postfix SMTP server
@@ -480,7 +480,7 @@ authentication backend <code>/etc/shadow</code> if started like this: </p>
 <p> See section "<a href="#testing_saslauthd">Testing saslauthd
 authentication</a>" for test instructions. </p>
 
-<h4><a name="id395745">Using saslauthd with PAM</a></h4>
+<h4><a name="saslauthd_pam">Using saslauthd with PAM</a></h4>
 
 <p> Cyrus SASL can use the PAM framework to authenticate credentials.
 <code>saslauthd</code> uses the PAM framework when started like
@@ -505,7 +505,7 @@ document. </p>
 <p> See section "<a href="#testing_saslauthd">Testing saslauthd
 authentication</a>" for test instructions. </p>
 
-<h4><a name="id395792">Using saslauthd with an IMAP server</a></h4>
+<h4><a name="saslauthd_imap">Using saslauthd with an IMAP server</a></h4>
 
 <p> <code>saslauthd</code> can verify the SMTP client credentials
 by using them to log into an IMAP server.  If the login succeeds,
@@ -617,9 +617,10 @@ stored in encrypted form. </p>
 
 <h4><a name="auxprop_sasldb">The sasldb plugin</a></h4>
 
-<p> The sasldb auxprop plugin authenticates credentials stored in a Berkeley
-DB database. The database schema is specific to Cyrus SASL.  The
-database is usually located at <code>/etc/sasldb2</code>. </p>
+<p> The sasldb auxprop plugin authenticates SASL clients against
+credentials that are stored in a Berkeley DB database. The database
+schema is specific to Cyrus SASL.  The database is usually located
+at <code>/etc/sasldb2</code>. </p>
 
 <blockquote>
 
@@ -709,31 +710,25 @@ mechanisms that are applicable for your environment. </p>
 <h4><a name="auxprop_sql">The sql plugin</a></h4>
 
 <p> The sql auxprop plugin is a generic SQL plugin. It provides
-access to credentials stored in a MySQL, a PostgreSQL or a SQLite
-database. </p>
-
-<blockquote>
-
-<strong>Note</strong>
-
-<p> The shared-secret mechanisms (CRAM-MD5, etc.) require that the
-SASL client passwords are stored as plaintext.  </p>
-
-</blockquote>
+access to credentials stored in a MySQL, PostgreSQL or SQLite
+database. This plugin requires that SASL client passwords are
+stored as plaintext. </p>
 
 <blockquote>
 
 <strong>Tip</strong>
 
-<!-- XXX  -->
-
-<p> Use "saslauthd &gt; pam &gt; (pam database module)" to
-verify encrypted passwords in an SQL database. </p>
+<p> If you must store encrypted passwords, see section "<a
+href="#saslauthd_pam">Using saslauthd with PAM</a>", and configure
+PAM to look up the encrypted passwords with, for example, the
+<code>pam_mysql</code> module.  You will not be able to use any of
+the methods that require access to plaintext passwords, such as the
+shared-secret methods CRAM-MD5 and DIGEST-MD5.  </p>
 
 </blockquote>
 
-<p> The following example configures libsasl to use the sql plugin and connects
-it to a PostgreSQL server: </p>
+<p> The following example configures libsasl to use the sql plugin
+and connects it to a PostgreSQL server: </p>
 
 <blockquote>
 <pre>
@@ -742,7 +737,8 @@ it to a PostgreSQL server: </p>
     auxprop_plugin: sql
     mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM
     sql_engine: pgsql
-    sql_hostnames: 127.0.0.1, 192.0.2.1 sql_user: username
+    sql_hostnames: 127.0.0.1, 192.0.2.1
+    sql_user: username
     sql_passwd: secret
     sql_database: dbname
     sql_select: SELECT password FROM users WHERE user = '%u'@'%r'
@@ -893,24 +889,37 @@ username. </p>
 <h4><a name="auxprop_ldapdb">The ldapdb plugin</a></h4>
 
 <p> The ldapdb auxprop plugin provides access to credentials stored
-in an OpenLDAP LDAP server. It is the only plugin that implements
-proxy authorization. </p>
+in an LDAP server. This plugin requires that SASL client passwords are
+stored as plaintext. </p>
+
+<blockquote>
+
+<strong>Tip</strong>
 
-<p> Proxy authorization in this context means: The ldapdb plugin
-must SASL authenticate with the OpenLDAP server. The server then
-decides if the ldapdb plugin should be authorized to read the
-authenticating user's password.  Once the ldapdb plugin has gone
-through proxy authorization it may proceed and authenticate the
-remote SMTP client's credentials. </p>
+<p> If you must store encrypted passwords, you can use "<code>saslauthd
+-a ldap</code>" to query the LDAP database directly, with appropriate
+configuration in <code>saslauthd.conf</code>. This may be documented
+in a later version of this document.  You will not be able to use
+any of the methods that require access to plaintext passwords, such
+as the shared-secret methods CRAM-MD5 and DIGEST-MD5.  </p>
+
+</blockquote>
+
+<p> The ldapdb plugin implements proxy authorization. This means
+that the ldapdb plugin uses its own username and password to
+authenticate with the LDAP server, before it asks the LDAP server
+for the remote SMTP client's password.  The LDAP server then decides
+if the ldapdb plugin is authorized to read the remote SMTP client's
+password.  </p>
 
 <p> In a nutshell: Configuring ldapdb means authentication and
 authorization must be configured twice - once in the Postfix SMTP
 server to authenticate and authorize the remote SMTP client, and
-once in the OpenLDAP <code>slapd</code> server to authenticate and
-authorize the ldapdb plugin. </p>
+once in the LDAP server to authenticate and authorize the ldapdb
+plugin. </p>
 
 <p> This example configures libsasl to use the ldapdb plugin and
-the plugin to connect to an OpenLDAP server: </p>
+the plugin to connect to an LDAP server: </p>
 
 <blockquote>
 <pre>
@@ -975,14 +984,14 @@ plugin to the LDAP server (proxy authorization). </p> </dd>
 <dt>ldapdb_mech</dt>
 
 <dd> <p> The mechanism to authenticate the ldapdb plugin to the
-OpenLDAP slapd server. </p>
+LDAP server. </p>
 
 <blockquote>
 
 <strong>Note</strong>
 
-<p> Specify a mechanism here that is supported by the OpenLDAP slapd
-server. </p>
+<p> Specify a mechanism here that is supported by the LDAP server.
+</p>
 
 </blockquote>
 
@@ -1186,12 +1195,39 @@ clients: </p>
 </pre>
 </blockquote>
 
-<h4><a name="smtpd_sasl_security_options">Postfix SMTP Server
-Authentication Policy</a></h4>
+<h4><a name="smtpd_sasl_security_options">Postfix SMTP Server policy
+- SASL mechanism properties</a></h4>
+
+<p> The Postfix SMTP server supports policies that limit the SASL
+mechanisms that it makes available to clients, based on the properties
+of those mechanisms.  The next two sections give examples of how
+these policies are used. </p>
+
+<blockquote>
+
+<table border="1">
+
+<tr> <th>Property</th> <th>Description</th> </tr>
 
-<p> The Postfix SMTP server provides a way to specify the properties
-of SASL mechanisms that can be made available to the remote SMTP
-client.  </p>
+<tr> <td>noanonymous</td> <td> Don't use mechanisms that permit
+anonymous authentication.  </td> </tr>
+
+<tr> <td>noplaintext</td> <td> Don't use mechanisms that transmit
+unencrypted username and password information.  </td> </tr>
+
+<tr> <td>nodictionary</td> <td> Don't use mechanisms that are
+vulnerable to dictionary attacks. </td> </tr>
+
+<tr> <td>forward_secrecy</td> <td> Require forward secrecy between
+sessions (breaking one session does not break earlier sessions).
+</td> </tr>
+
+<tr> <td>mutual_auth</td> <td> Use only mechanisms that authenticate
+both the client and the server to each other. </td> </tr>
+
+</table>
+
+</blockquote>
 
 <h4><a name="id396877">Unencrypted SMTP session</a></h4>
 
@@ -1216,46 +1252,6 @@ authorization as a properly-authenticated client. </p>
 
 </blockquote>
 
-<p> Postfix can enforce the following policies on SASL authentication
-mechanisms: </p>
-
-<blockquote>
-
-<dl>
-
-<dt>noanonymous</dt>
-
-<dd> <p> Don't use mechanisms that permit anonymous authentication.
-</p> </dd>
-
-<dt>noplaintext</dt>
-
-<dd> <p> Don't use mechanisms that transmit unencrypted username
-and password information.  </p> </dd>
-
-<dt>nodictionary</dt>
-
-<dd> <p> Don't use mechanisms that are vulnerable to dictionary
-attacks. </p>
-
-</dd>
-
-<dt>forward_secrecy</dt>
-
-<dd> <p> Use only mechanisms that support forward secrecy (Dovecot
-SASL only).</p>
-
-</dd>
-
-<dt>mutual_auth</dt>
-
-<dd> <p> Use only mechanisms that authenticate both the client and
-the server to each other. </p> </dd>
-
-</dl>
-
-</blockquote>
-
 <h4><a name="id396969">Encrypted SMTP session (TLS)</a></h4>
 
 <p> A separate parameter controls Postfix SASL mechanism policy
@@ -1307,7 +1303,7 @@ for. Examples of possible SMTP clients authorizations are: </p>
 
 <p> These permissions are not enabled by default. </p>
 
-<h4><a name="id397041">Mail relay authorization</a></h4>
+<h4><a name="server_sasl_authz_relay">Mail relay authorization</a></h4>
 
 <p> The <code>permit_sasl_authenticated</code> restriction allows
 SASL-authenticated SMTP clients to send mail to remote destinations.
@@ -1326,11 +1322,12 @@ follows: </p>
 </pre>
 </blockquote>
 
-<h4><a name="id397072">Envelope sender address authorization</a></h4>
+<h4><a name="server_sasl_authz_envelope">Envelope sender address
+authorization</a></h4>
 
 <p> By default an SMTP client may specify any envelope sender address
 in the MAIL FROM command.  That is because the Postfix SMTP server
-only knows the remte SMTP client hostname and IP address, but not
+only knows the remote SMTP client hostname and IP address, but not
 the user who controls the remote SMTP client.  </p>
 
 <p> This changes the moment an SMTP client uses SASL authentication.
@@ -1355,8 +1352,8 @@ use a particular envelope sender address: </p>
 </blockquote>
 
 <p> The <code>controlled_envelope_senders</code> table specifies
-the binding between the sender envelope addresses and its their
-SASL login names: </p>
+the binding between a sender envelope address and the SASL login
+names that own that address: </p>
 
 <blockquote>
 <pre>
@@ -1535,11 +1532,11 @@ the Postfix SMTP/LMTP client</a></li>
 <li><a href="#client_sasl_sender">Configuring sender-dependent SASL
 authentication</a></li>
 
-<li><a href="#client_sasl_policy">Postfix SMTP/LMTP client
-authentication policy</a></li>
+<li><a href="#client_sasl_policy">Postfix SMTP/LMTP client policy
+- SASL mechanism <em>properties</em></a></li>
 
-<li><a href="#client_sasl_filter">Filtering server mechanism names
-in the Postfix SMTP/LMTP client</a></li>
+<li><a href="#client_sasl_filter">Postfix SMTP/LMTP client policy
+- SASL mechanism <em>names</em></a></li>
 
 </ul>
 
@@ -1548,8 +1545,30 @@ Postfix SMTP/LMTP client</a></h3>
 
 <p> This section shows a typical scenario where the Postfix SMTP
 client sends all messages via a mail gateway server that requires
-SASL authentication. To make the example more readable we introduce
-it in two parts. </p>
+SASL authentication. </p>
+
+<blockquote>
+
+<strong> Trouble solving tips: </strong>
+
+<ul>
+
+<li> <p> If your SASL logins fail with "SASL authentication failure:
+No worthy mechs found" in the mail logfile, then see the section
+"<a href="SASL_README.html#client_sasl_policy">Postfix SMTP/LMTP
+client policy - SASL mechanism <em>properties</em></a>".
+
+<li> <p> For a solution to a more obscure class of SASL authentication
+failures, see "<a href="SASL_README.html#client_sasl_filter">Postfix
+SMTP/LMTP client policy - SASL mechanism <em>names</em></a>".
+
+</ul>
+
+</blockquote>
+
+<p> To make the example more readable we introduce it in two parts.
+The first part takes care of the basic configuration, while the
+second part sets up the username/password information.  </p>
 
 <blockquote>
 <pre>
@@ -1713,65 +1732,53 @@ whenever you change the sender_relay table. </p>
 
 </ul>
 
-<h3><a name="client_sasl_policy">Postfix SMTP/LMTP client authentication
-policy</a></h3>
+<h3><a name="client_sasl_policy">Postfix SMTP/LMTP client policy -
+SASL mechanism <em>properties</em></a></h3>
 
 <p> Just like the Postfix SMTP server, the SMTP client has a policy
-that determines which SASL mechanisms are acceptable and which are
-not. </p>
-
-<h4>Unencrypted SMTP session</h4>
-
-<p> The default policy is stricter than that of the Postfix SMTP
-server - plaintext mechanisms are not allowed (nor is any anonymous
-mechanism): </p>
-
-<blockquote>
-<pre>
-/etc/postfix/main.cf:
-    smtp_sasl_security_options = noplaintext, noanonymous
-</pre>
-</blockquote>
-
-<p> Postfix can enforce the following policies on SASL authentication
-mechanisms: </p>
+that determines which SASL mechanisms are acceptable, based on their 
+properties. The next two sections give examples of how these policies
+are used.  </p>
 
 <blockquote>
 
-<dl>
-
-<dt>noanonymous</dt>
+<table border="1">
 
-<dd> <p> Don't use mechanisms that permit anonymous authentication.
-</p> </dd>
+<tr> <th>Property</th> <th>Description</th> </tr>
 
-<dt>noplaintext</dt>
+<tr> <td>noanonymous</td> <td> Don't use mechanisms that permit
+anonymous authentication.  </td> </tr>
 
-<dd> <p> Don't use mechanisms that transmit unencrypted username
-and password information.  </p> </dd>
+<tr> <td>noplaintext</td> <td> Don't use mechanisms that transmit
+unencrypted username and password information.  </td> </tr>
 
-<dt>nodictionary</dt>
+<tr> <td>nodictionary</td> <td> Don't use mechanisms that are
+vulnerable to dictionary attacks. </td> </tr>
 
-<dd> <p> Don't use mechanisms that are vulnerable to dictionary
-attacks. </p>
+<tr> <td>mutual_auth</td> <td> Use only mechanisms that authenticate
+both the client and the server to each other. </td> </tr>
 
-</dd>
+</table>
 
-<dt>
-<dt>mutual_auth</dt>
+</blockquote>
 
-<dd> <p> Use only mechanisms that authenticate both the client and
-the server to each other. </p> </dd>
+<h4>Unencrypted SMTP session</h4>
 
-</dl>
+<p> The default policy is stricter than that of the Postfix SMTP
+server - plaintext mechanisms are not allowed (nor is any anonymous
+mechanism): </p>
 
+<blockquote>
+<pre>
+/etc/postfix/main.cf:
+    smtp_sasl_security_options = noplaintext, noanonymous
+</pre>
 </blockquote>
 
-<p> With the default policy shown above, the Postfix SMTP client
-will not send its password over an unencrypted connection.  This
-sometimes leads to authentication failures if the remote server
-only offers plaintext authentication mechanisms.  In such cases the
-SMTP client will log the following error message: </p>
+<p> This default policy leads to authentication failures if the
+remote server only offers plaintext authentication mechanisms.  In
+such cases the SMTP client will log the following error message:
+</p>
 
 <blockquote>
 <pre>
@@ -1779,9 +1786,8 @@ SASL authentication failure: No worthy mechs found
 </pre>
 </blockquote>
 
-<p> The less secure approach to deal with this is to lower the
-security standards and permit plaintext authentication mechanisms:
-</p>
+<p> The less secure approach is to lower the security standards and
+permit plaintext authentication mechanisms: </p>
 
 <blockquote>
 <pre>
@@ -1790,9 +1796,6 @@ security standards and permit plaintext authentication mechanisms:
 </pre>
 </blockquote>
 
-<p> Needless to say, sending a username and password over an insecure
-channel is undesirable. </p>
-
 <p> If the remote server supports TLS, you can protect the plaintext
 username and password by turning on TLS in the Postfix SMTP client
 (see: TLS_README), and configuring the client as discussed next.
@@ -1821,19 +1824,20 @@ only over a TLS-encrypted connection: </p>
 </pre>
 </blockquote>
 
-<h3><a name="client_sasl_filter">Filtering server mechanism names in
-the Postfix SMTP/LMTP client</a></h3>
+<h3><a name="client_sasl_filter">Postfix SMTP/LMTP client policy -
+SASL mechanism <em>names</em></a></h3>
 
-<p> Cyrus SASL always attempts to use the most secure authentication
-mechanism that the remote SMTP server offers - even if the client
-side was not configured to handle it! In such cases authentication
-will definitely fail. </p>
+<p> Unfortunately, Postfix needs a second client policy for SASL
+mechanism selection.  Reason: the Cyrus SASL library will choose
+the most secure authentication mechanism that both the SMTP client
+and server implement - even if one of the parties was not configured
+for that mechanism. </p>
 
-<p> To prevent this, the Postfix SMTP client can filter the list
-of authentication mechanism names from the remote SMTP server.  Used
+<p> To prevent this, the Postfix SMTP client can filter the names
+of the authentication mechanisms from the remote SMTP server.  Used
 correctly, the filter hides unwanted mechanisms from the Cyrus SASL
 library, forcing the library to choose from the mechanisms the
-Postfix filter passes through.  </p>
+Postfix SMTP client filter passes through.  </p>
 
 <p> The following example filters out everything but the mechanisms
 <code>PLAIN</code> and <code>LOGIN</code>: </p>
index 73890d837ddc5cfcbb82d0e3b643ed0899d3618b..ff112740f664593691984330209b39f650a7b24c 100644 (file)
@@ -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      "20100203"
+#define MAIL_RELEASE_DATE      "20100208"
 #define MAIL_VERSION_NUMBER    "2.8"
 
 #ifdef SNAPSHOT
index 13a2788a1199052c49deb2638d7af47fddcedde9..544993de52dc4390b00a7324cb2c6c83f94b2414 100644 (file)
@@ -2,11 +2,11 @@ SHELL = /bin/sh
 SRCS   = alias.c command.c dotforward.c file.c forward.c \
        include.c indirect.c local.c mailbox.c recipient.c resolve.c token.c \
        deliver_attr.c maildir.c biff_notify.c unknown.c \
-       local_expand.c
+       local_expand.c bounce_workaround.c
 OBJS   = alias.o command.o dotforward.o file.o forward.o \
        include.o indirect.o local.o mailbox.o recipient.o resolve.o token.o \
        deliver_attr.o maildir.o biff_notify.o unknown.o \
-       local_expand.o
+       local_expand.o bounce_workaround.c
 HDRS   = local.h
 TESTSRC        =
 DEFS   = -I. -I$(INC_DIR) -D$(SYSTYPE)
@@ -101,6 +101,37 @@ biff_notify.o: ../../include/msg.h
 biff_notify.o: ../../include/sys_defs.h
 biff_notify.o: biff_notify.c
 biff_notify.o: biff_notify.h
+bounce_workaround.o: ../../include/argv.h
+bounce_workaround.o: ../../include/attr.h
+bounce_workaround.o: ../../include/been_here.h
+bounce_workaround.o: ../../include/bounce.h
+bounce_workaround.o: ../../include/canon_addr.h
+bounce_workaround.o: ../../include/deliver_request.h
+bounce_workaround.o: ../../include/delivered_hdr.h
+bounce_workaround.o: ../../include/dict.h
+bounce_workaround.o: ../../include/dsn.h
+bounce_workaround.o: ../../include/dsn_buf.h
+bounce_workaround.o: ../../include/fold_addr.h
+bounce_workaround.o: ../../include/htable.h
+bounce_workaround.o: ../../include/mail_params.h
+bounce_workaround.o: ../../include/maps.h
+bounce_workaround.o: ../../include/mbox_conf.h
+bounce_workaround.o: ../../include/msg.h
+bounce_workaround.o: ../../include/msg_stats.h
+bounce_workaround.o: ../../include/mymalloc.h
+bounce_workaround.o: ../../include/recipient_list.h
+bounce_workaround.o: ../../include/resolve_clnt.h
+bounce_workaround.o: ../../include/split_addr.h
+bounce_workaround.o: ../../include/split_at.h
+bounce_workaround.o: ../../include/stringops.h
+bounce_workaround.o: ../../include/strip_addr.h
+bounce_workaround.o: ../../include/sys_defs.h
+bounce_workaround.o: ../../include/tok822.h
+bounce_workaround.o: ../../include/vbuf.h
+bounce_workaround.o: ../../include/vstream.h
+bounce_workaround.o: ../../include/vstring.h
+bounce_workaround.o: bounce_workaround.c
+bounce_workaround.o: local.h
 command.o: ../../include/argv.h
 command.o: ../../include/attr.h
 command.o: ../../include/been_here.h
diff --git a/postfix/src/local/bounce_workaround.c b/postfix/src/local/bounce_workaround.c
new file mode 100644 (file)
index 0000000..b09df7d
--- /dev/null
@@ -0,0 +1,143 @@
+/*++
+/* NAME
+/*     bounce_workaround 3
+/* SUMMARY
+/*     Send non-delivery notification with sender override
+/* SYNOPSIS
+/*     #include "local.h"
+/*
+/*     int     bounce_workaround(state)
+/*     LOCAL_STATE state;
+/* DESCRIPTION
+/*     This module works around a limitation in the bounce daemon
+/*     protocol, namely, the assumption that the envelope sender
+/*     address in a queue file is the delivery status notification
+/*     address for all recipients in that queue file. The assumption
+/*     is not valid when the local(8) delivery agent overrides the
+/*     envelope sender address by an owner- alias, for one or more
+/*     recipients in the queue file.
+/*
+/*     Sender address override is a problem only when delivering
+/*     to command or file, or when breaking a Delivered-To loop.
+/*     The local(8) delivery agent saves other recipients to a new
+/*     queue file, together with the replacement envelope sender
+/*     address; delivery then proceeds from that new queue file.
+/*
+/*     The workaround sends one non-delivery notification for each
+/*     failed delivery that has a replacement sender address.  The
+/*     notifications are not aggregated, unlike notifications to
+/*     non-replaced sender addresses). In practice, a local alias
+/*     rarely has more than one file or command destination (if
+/*     only because soft error handling is problematic).
+/*
+/*     Arguments:
+/* .IP state
+/*     The attributes that specify the message, recipient and more.
+/*     Attributes describing alias, include or forward expansion.
+/*     A table with the results from expanding aliases or lists.
+/*     A table with delivered-to: addresses taken from the message.
+/* DIAGNOSTICS
+/*     Fatal errors: out of memory. The result is non-zero when
+/*     the operation should be tried again. Warnings: malformed
+/*     address.
+/* BUGS
+/*     The proper fix is to record in the bounce logfile an error
+/*     return address for each individual recipient. This would
+/*     eliminate the need for VERP-specific bounce protocol code,
+/*     and would move complexity from the bounce client side to
+/*     the bounce server side where it more likely belongs.
+/* LICENSE
+/* .ad
+/* .fi
+/*     The Secure Mailer license must be distributed with this
+/*     software.
+/* AUTHOR(S)
+/*     Wietse Venema
+/*     IBM T.J. Watson Research
+/*     P.O. Box 704
+/*     Yorktown Heights, NY 10598, USA
+/*--*/
+
+/* System library. */
+
+#include <sys_defs.h>
+#include <strings.h>
+
+/* Utility library. */
+
+#include <msg.h>
+#include <mymalloc.h>
+#include <vstring.h>
+#include <split_at.h>
+
+/* Global library. */
+
+#include <mail_params.h>
+#include <strip_addr.h>
+#include <stringops.h>
+#include <bounce.h>
+#include <split_addr.h>
+#include <canon_addr.h>
+
+/* Application-specific. */
+
+#include "local.h"
+
+int     bounce_workaround(LOCAL_STATE state)
+{
+    const char *myname = "bounce_workaround";
+    VSTRING *canon_owner = 0;
+    int     rcpt_stat;
+
+    /*
+     * Look up the substitute sender address.
+     */
+    if (var_ownreq_special) {
+       char   *stripped_recipient;
+       char   *owner_alias;
+       const char *owner_expansion;
+
+#define FIND_OWNER(lhs, rhs, addr) { \
+       lhs = concatenate("owner-", addr, (char *) 0); \
+       (void) split_at_right(lhs, '@'); \
+       rhs = maps_find(alias_maps, lhs, DICT_FLAG_NONE); \
+    }
+
+       FIND_OWNER(owner_alias, owner_expansion, state.msg_attr.rcpt.address);
+       if (owner_expansion == 0
+           && (stripped_recipient = strip_addr(state.msg_attr.rcpt.address,
+                                               (char **) 0,
+                                               *var_rcpt_delim)) != 0) {
+           myfree(owner_alias);
+           FIND_OWNER(owner_alias, owner_expansion, stripped_recipient);
+           myfree(stripped_recipient);
+       }
+       if (owner_expansion != 0) {
+           canon_owner = canon_addr_internal(vstring_alloc(10),
+                                             var_exp_own_alias ?
+                                             owner_expansion : owner_alias);
+           SET_OWNER_ATTR(state.msg_attr, STR(canon_owner), state.level);
+       }
+       myfree(owner_alias);
+    }
+
+    /*
+     * Send a delivery status notification with a single recipient to the
+     * substitute sender address, before completion of the delivery request.
+     */
+    if (canon_owner) {
+       rcpt_stat = bounce_one(BOUNCE_FLAGS(state.request),
+                              BOUNCE_ONE_ATTR(state.msg_attr));
+       vstring_free(canon_owner);
+    }
+
+    /*
+     * Send a regular delivery status notification, after completion of the
+     * delivery request.
+     */
+    else {
+       rcpt_stat = bounce_append(BOUNCE_FLAGS(state.request),
+                                 BOUNCE_ATTR(state.msg_attr));
+    }
+    return (rcpt_stat);
+}
index 7952583c246c4c0f6436ca1cb54e424d61392b54..707cec6c9f0205b9640dda38798800b9019c660a 100644 (file)
@@ -235,11 +235,13 @@ int     deliver_command(LOCAL_STATE state, USER_ATTR usr_attr, const char *comma
        break;
     case PIPE_STAT_BOUNCE:
     case PIPE_STAT_DEFER:
-       deliver_status =
-           (STR(why->status)[0] == '4' ?
-            defer_append : bounce_append)
-           (BOUNCE_FLAGS(state.request),
-            BOUNCE_ATTR(state.msg_attr));
+       if (STR(why->status)[0] == '4')
+           deliver_status =
+               defer_append(BOUNCE_FLAGS(state.request),
+                            BOUNCE_ATTR(state.msg_attr));
+       else
+           /* Account for possible owner- sender address override. */
+           deliver_status = bounce_workaround(state);
        break;
     case PIPE_STAT_CORRUPT:
        deliver_status = DEL_STAT_DEFER;
index d93ae90b0555e9166e64e10a40b2910ce05c3f0e..4adfdf819fd5e0d574747e81aba980404804340d 100644 (file)
@@ -111,8 +111,8 @@ int     deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
      */
     if ((local_file_deliver_mask & state.msg_attr.exp_type) == 0) {
        dsb_simple(why, "5.7.1", "mail to file is restricted");
-       return (bounce_append(BOUNCE_FLAGS(state.request),
-                             BOUNCE_ATTR(state.msg_attr)));
+       /* Account for possible owner- sender address override. */
+       return (bounce_workaround(state));
     }
 
     /*
@@ -184,11 +184,13 @@ int     deliver_file(LOCAL_STATE state, USER_ATTR usr_attr, char *path)
     } else if (mail_copy_status != 0) {
        vstring_sprintf_prepend(why->reason,
                                "cannot append message to file %s: ", path);
-       deliver_status =
-           (STR(why->status)[0] == '4' ?
-            defer_append : bounce_append)
-           (BOUNCE_FLAGS(state.request),
-            BOUNCE_ATTR(state.msg_attr));
+       if (STR(why->status)[0] == '4')
+           deliver_status =
+               defer_append(BOUNCE_FLAGS(state.request),
+                            BOUNCE_ATTR(state.msg_attr));
+       else
+           /* Account for possible owner- sender address override. */
+           deliver_status = bounce_workaround(state);
     } else {
        dsb_simple(why, "2.0.0", "delivered to file: %s", path);
        deliver_status = sent(BOUNCE_FLAGS(state.request),
index d63c99a65f5dbd2f750366f4393fa2650228ca7b..0e9656de4f0427a4ef8e547ca7c01c46bf6b22e4 100644 (file)
@@ -233,6 +233,11 @@ extern MAPS *alias_maps;
   */
 #define STR(s) vstring_str(s)
 
+ /*
+  * bounce_workaround.c
+  */
+int     bounce_workaround(LOCAL_STATE);
+
 /* LICENSE
 /* .ad
 /* .fi
index e279eef0e2b8ec43d6d8dd9798f911cea0ca6949..f36d210233f3ded612fd29edc761cf0f9f978c9e 100644 (file)
@@ -230,47 +230,10 @@ int     deliver_recipient(LOCAL_STATE state, USER_ATTR usr_attr)
      * normal bounce sending procedure, but would simplify the code below.
      */
     if (delivered_hdr_find(state.loop_info, state.msg_attr.rcpt.address)) {
-       VSTRING *canon_owner = 0;
-
-       if (var_ownreq_special) {
-           char   *stripped_recipient;
-           char   *owner_alias;
-           const char *owner_expansion;
-
-#define FIND_OWNER(lhs, rhs, addr) { \
-       lhs = concatenate("owner-", addr, (char *) 0); \
-       (void) split_at_right(lhs, '@'); \
-       rhs = maps_find(alias_maps, lhs, DICT_FLAG_NONE); \
-    }
-
-           FIND_OWNER(owner_alias, owner_expansion, state.msg_attr.rcpt.address);
-           if (owner_expansion == 0
-           && (stripped_recipient = strip_addr(state.msg_attr.rcpt.address,
-                                               (char **) 0,
-                                               *var_rcpt_delim)) != 0) {
-               myfree(owner_alias);
-               FIND_OWNER(owner_alias, owner_expansion, stripped_recipient);
-               myfree(stripped_recipient);
-           }
-           if (owner_expansion != 0) {
-               canon_owner = canon_addr_internal(vstring_alloc(10),
-                                                 var_exp_own_alias ?
-                                            owner_expansion : owner_alias);
-               SET_OWNER_ATTR(state.msg_attr, STR(canon_owner), state.level);
-           }
-           myfree(owner_alias);
-       }
-       dsb_simple(state.msg_attr.why, "5.4.6", "mail forwarding loop for %s",
+       dsb_simple(state.msg_attr.why, "5.4.6", "mail forwarding loop for %s",
                   state.msg_attr.rcpt.address);
-       if (canon_owner) {
-           rcpt_stat = bounce_one(BOUNCE_FLAGS(state.request),
-                                  BOUNCE_ONE_ATTR(state.msg_attr));
-           vstring_free(canon_owner);
-       } else {
-           rcpt_stat = bounce_append(BOUNCE_FLAGS(state.request),
-                                     BOUNCE_ATTR(state.msg_attr));
-       }
-       return (rcpt_stat);
+       /* Account for possible owner- sender address override. */
+       return (bounce_workaround(state));
     }
 
     /*
index d8f12e1a04eaf7e741201e8a1148f35644174c6c..30633ae262eaa2c065027674872ad73394a8fd0e 100644 (file)
@@ -5,6 +5,12 @@
 /*     Postfix multi-instance manager
 /* SYNOPSIS
 /* .fi
+/*     \fBENABLING MULTI-INSTANCE MANAGEMENT:\fR
+/*
+/*     \fBpostmulti\fR \fB-e init\fR [\fB-v\fR]
+/*
+/*     \fBITERATOR MODE:\fR
+/*
 /*     \fBpostmulti\fR \fB-l\fR [\fB-aRv\fR] [\fB-g \fIgroup\fR]
 /*     [\fB-i \fIname\fR]
 /*
@@ -14,7 +20,7 @@
 /*     \fBpostmulti\fR \fB-x\fR [\fB-aRv\fR] [\fB-g \fIgroup\fR]
 /*     [\fB-i \fIname\fR] \fIcommand...\fR
 /*
-/*     \fBpostmulti\fR \fB-e init\fR [\fB-v\fR]
+/*     \fBLIFE-CYCLE MANAGEMENT:\fR
 /*
 /*     \fBpostmulti\fR \fB-e create\fR [\fB-av\fR]
 /*     [\fB-g \fIgroup\fR] [\fB-i \fIname\fR] [\fB-G \fIgroup\fR]
index 617ff2fd98711b5bb43355d4131ecc1e8bb02400..7ca721653d660cbf266a14b7f5330b7ea4c252d1 100644 (file)
@@ -25,6 +25,8 @@
 /* .IP nodictionary
 /*     Disallow authentication methods that are vulnerable to
 /*     passive dictionary attack.
+/* .IP forward_secrecy
+/*     Require forward secrecy between sessions.
 /* .IP noanonymous
 /*     Disallow anonymous logins.
 /* .RE
@@ -64,6 +66,9 @@ static const NAME_MASK xsasl_cyrus_sec_mask[] = {
     "noplaintext", SASL_SEC_NOPLAINTEXT,
     "noactive", SASL_SEC_NOACTIVE,
     "nodictionary", SASL_SEC_NODICTIONARY,
+#ifdef SASL_SEC_FORWARD_SECRECY
+    "forward_secrecy", SASL_SEC_FORWARD_SECRECY,
+#endif
     "noanonymous", SASL_SEC_NOANONYMOUS,
 #if SASL_VERSION_MAJOR >= 2
     "mutual_auth", SASL_SEC_MUTUAL_AUTH,