> Postscreen is a single Postfix 2.8 daemon that keeps spambots away
> from Postfix SMTP server processes, so that more Postfix server
> resources remain available for handling mail. It will hopefully
> become part of the next stable Postfix release.
> 
> Below is a quote from the release notes about new filter and weight
> support for postscreen DNSBL lookup results. This was released
> earlier as non-production snapshot. It has held up well, and after
> some polishing of documentation and comments, it should be ready.
> 
> Next steps are a) support for different expiration times for
> different tests, b) a dummy SMTP engine (similar to the smtp-sink
> test program) to log the client/helo/sender/recipient for blocked
> mail, and c) a simple form of greylisting if time permits.

I have implemented the above except greylisting. After a major code
rewrite, the code looks pretty solid, and the user interface looks
usable. In fact, managing user interface complexity was almost half
the work. The user interface changed less than the code underneath.

Below is a the current manpage.  After the code has run for 24
hours I'll roll it out as a non-production snapshot.

The new content is in the "enforce" actions and in "tests after
the 220 SMTP server greeting".

        Wietse

POSTSCREEN(8)                                                    POSTSCREEN(8)

NAME
       postscreen - Postfix SMTP triage server

SYNOPSIS
       postscreen [generic Postfix daemon options]

DESCRIPTION
       The  Postfix  postscreen(8)  server performs triage on multiple inbound
       SMTP connections in parallel. While  postscreen(8)  keeps  zombies  and
       other bogus clients away from Postfix SMTP server processes, more Post-
       fix SMTP server processes remain available for legitimate clients.

GENERAL OPERATION
       The triage process  involves  a  number  of  tests,  in  the  order  as
       described  below.  Some tests introduce a delay of a few seconds.  Once
       a client passes all tests, its IP address is temporarily excluded  from
       any  tests,  typically  for 24 hours.  This minimizes the impact of the
       tests on legitimate mail clients.

       After logging the result of its tests, postscreen(8)  by  default  for-
       wards  all connections to a real SMTP server process. This mode is use-
       ful for non-destructive testing.

       In a typical production setting, postscreen(8) is configured to discon-
       nect  clients that fail one or more tests, after logging the sender and
       recipient information.

       Note: postscreen(8) is not an SMTP proxy; this is intentional. The pur-
       pose  is  to  prioritize  legitimate clients with as little overhead as
       possible.

1. PERMANENT WHITELIST TEST
       The  postscreen_whitelist_networks  parameter  (default:   $mynetworks)
       specifies a permanent whitelist for SMTP client IP addresses.

       When  the  SMTP client address matches the permanent whitelist, this is
       logged as:

       WHITELISTED address

       The action is not configurable: immediately forward the connection to a
       real SMTP server process.

2. PERMANENT BLACKLIST TEST
       The  postscreen_blacklist_networks parameter (default: empty) specifies
       a permanent blacklist for SMTP client IP addresses.  The address syntax
       is as with mynetworks.

       When  the  SMTP client address matches the permanent blacklist, this is
       logged as:

       BLACKLISTED address

       The postscreen_blacklist_action parameter specifies the action that  is
       taken next:

       ignore (default)
              Ignore  the failure of this test. Allow other tests to complete.
              Repeat this test the next time the client connects.

       enforce
              Allow other tests to complete.  Log and reject all RCPT TO  com-
              mands with a 550 SMTP reply.  Repeat this test the next time the
              client connects.

       drop   Drop the connection immediately with a 521 SMTP  reply.   Repeat
              this test the next time the client connects.

3. TEMPORARY WHITELIST TEST
       The  postscreen(8)  daemon  maintains  a  temporary  whitelist for SMTP
       client IP addresses that have passed all the tests described below. The
       postscreen_cache_map  parameter specifies the location of the temporary
       whitelist.  The  temporary  whitelist  is  not  used  for  SMTP  client
       addresses that appear on the permanent blacklist or whitelist.

       When  the  SMTP client address appears on the temporary whitelist, this
       is logged as:

       PASS OLD address

       The action is not configurable: immediately forward the connection to a
       real  SMTP  server  process.  The client is excluded from further tests
       until its temporary whitelist entry expires,  as  controlled  with  the
       postscreen_*_ttl  parameters.   Expired entries are silently renewed if
       possible.

4. TESTS BEFORE THE 220 SMTP SERVER GREETING
       The postscreen_greet_wait parameter specifies a  time  interval  before
       the "220 text..." server greeting, where postscreen(8) can run a number
       of tests in parallel.

4A. PREGREET TEST
       The postscreen_pregreet_banner parameter specifies the text portion  of
       a  "220-text..." teaser banner (default: $smtpd_banner). Note that this
       becomes  the  first  part  of  a  multi-line  server   greeting.    The
       postscreen(8)  daemon sends this before the postscreen_greet_wait timer
       is started.  The purpose of the teaser banner is to confuse spambots so
       that  they  speak  before  their turn. It has no effect on SMTP clients
       that correctly implement the protocol.

       To avoid problems with  broken  SMTP  engines  in  network  appliances,
       either  exclude  them from all tests with the postscreen_whitelist_net-
       works  feature  or  else  specify   an   empty   teaser   banner   with
       "postscreen_pregreet_banner = ".

       When  an  SMTP  client sends a command before the postscreen_greet_wait
       time has elapsed, this is logged as:

       PREGREET count after time from address text...

       Translation: the client at address sent count bytes before its turn  to
       speak. This happened time seconds after the postscreen_greet_wait timer
       was started.  The text is what the client sent (truncated to 100 bytes,
       and with non-printable characters replaced with "?").

       The  postscreen_pregreet_action  parameter specifies the action that is
       taken next:

       ignore (default)
              Ignore the failure of this test. Allow other tests to  complete.
              Repeat this test the next time the client connects.

       enforce
              Allow  other tests to complete.  Log and reject all RCPT TO com-
              mands with a 550 SMTP reply.  Repeat this test the next time the
              client connects.

       drop   Drop  the  connection immediately with a 521 SMTP reply.  Repeat
              this test the next time the client connects.

4B. DNS BLOCKLIST TEST
       The postscreen_dnsbl_sites parameter (default: empty) specifies a  list
       of  DNS  blocklist  servers  with  optional filters and weight factors.
       These servers will be queried in parallel with the  reverse  client  IP
       address.

       When the postscreen_greet_wait time has elapsed, and the combined DNSBL
       score is equal to or greater than the postscreen_dnsbl_threshold param-
       eter value, this is logged as:

       DNSBL rank count for address

       Translation:  the  SMTP client at address has a combined DNSBL score of
       count.

       The postscreen_dnsbl_action parameter  specifies  the  action  that  is
       taken  when  the  combined  DNSBL score is equal to or greater than the
       threshold:

       ignore (default)
              Ignore the failure of this test. Allow other tests to  complete.
              Repeat this test the next time the client connects.

       enforce
              Allow  other tests to complete.  Log and reject all RCPT TO com-
              mands with a 550 SMTP reply.  Repeat this test the next time the
              client connects.

       drop   Drop  the  connection immediately with a 521 SMTP reply.  Repeat
              this test the next time the client connects.

5. TESTS AFTER THE 220 SMTP SERVER GREETING
       The tests in this phase use a dummy SMTP protocol engine that is  built
       into the postscreen(8) server.

       Important notes:

       o      When  these  tests  are enabled, postscreen(8) does not hand the
              "live" session to a Postfix SMTP server upon successful  comple-
              tion  of  all tests.  Instead, postscreen(8) logs and defers all
              RCPT TO commands with a 450 reply and waits for  the  client  to
              disconnect.

              The  next time the client connects it will be allowed to talk to
              a real SMTP server process to deliver its mail.

       o      postscreen(8) does not implement the  AUTH,  STARTTLS,  XCLIENT,
              and  XFORWARD  features.   STARTTLS  support  may  be added in a
              future version.

       End-user client systems should connect directly to the submission  ser-
       vice.  Other  systems  that  require the above features should directly
       connect to a Postfix SMTP server, or  they  should  be  placed  on  the
       postscreen(8) whitelist.

5A. COMMAND PIPELINING TEST
       SMTP  is  a half-duplex protocol: the sender and receiver send one com-
       mand and one response at a time.

       With "postscreen_pipelining_enable =  yes",  the  postscreen(8)  daemon
       detects  spambots  that  send multiple commands, instead of sending one
       command and waiting for the server to reply.

       This test  is  also  enabled  when  some  other  test  fails,  to  make
       postscreen(8) logging more informative.

       When a client sends multiple commands, this is logged as:

       COMMAND PIPELINING after time from address

       Translation:  the  SMTP  client at address sent multiple SMTP commands,
       instead of sending one command and  then  waiting  for  the  server  to
       reply.  This happened time seconds after the "220 " server greeting was
       sent.

       The postscreen_pipelining_action parameter specifies the action that is
       taken:

       ignore Ignore  the failure of this test. Allow other tests to complete.
              Do NOT repeat this test the next time the client connects.

       enforce
              Allow other tests to complete.  Log and reject all RCPT TO  com-
              mands with a 550 SMTP reply.  Repeat this test the next time the
              client connects.

       drop   Drop the connection immediately with a 521 SMTP  reply.   Repeat
              this test the next time the client connects.

OTHER ERRORS
       When  an  SMTP  client  hangs up unexpectedly during any tests, this is
       logged as:

       HANGUP after time from address in test name

       Translation: the SMTP client at address disconnected unexpectedly, time
       seconds after the start of the test named test name.

       Other  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.

       COMMAND TIME LIMIT time from address

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

       COMMAND COUNT LIMIT from address

       Translation: the SMTP client at address reached the per-session command
       count limit as specified with the postscreen_command_count_limit param-
       eter.  The session is terminated immediately.

       COMMAND LENGTH LIMIT from address

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

WHEN ALL TESTS SUCCEED
       When the SMTP client passes all tests, this is logged as:

       PASS NEW address

       The  action  is to create a temporary whitelist entry that excludes the
       client IP address from further  tests  until  the  temporary  whitelist
       entry  expires,  as  controlled with the postscreen_cache_*_ttl parame-
       ters.

       If any tests were handled by postscreen's built-in dummy SMTP  protocol
       engine,  postscreen(8)  waits  for  the client to disconnect.  The next
       time the client connects it will be allowed to  talk  to  a  real  SMTP
       server process.

SECURITY
       The postscreen(8) server is moderately security-sensitive.  It talks to
       untrusted clients on the network. The process can be  run  chrooted  at
       fixed low privilege.

STANDARDS
       RFC 5321 (SMTP, including multi-line 220 greetings)
       RFC 2920 (SMTP Pipelining)

DIAGNOSTICS
       Problems and transactions are logged to syslogd(8).

CONFIGURATION PARAMETERS
       Changes  to  main.cf  are not picked up automatically, as postscreen(8)
       processes may run for several hours.  Use the command "postfix  reload"
       after a configuration change.

       The  text  below provides only a parameter summary. See postconf(5) for
       more details including examples.

TRIAGE PARAMETERS
       postscreen_blacklist_action (ignore)
              The action that postscreen(8) takes when an SMTP client is  per-
              manently   blacklisted  with  the  postscreen_blacklist_networks
              parameter.

       postscreen_blacklist_networks (empty)
              Network addresses that  are  permanently  blacklisted;  see  the
              postscreen_blacklist_action parameter for possible actions.

       postscreen_dnsbl_action (ignore)
              The  action  that postscreen(8) takes when an SMTP client's com-
              bined DNSBL score is equal to or greater than  a  threshold  (as
              defined       with      the      postscreen_dnsbl_sites      and
              postscreen_dnsbl_threshold parameters).

       postscreen_dnsbl_sites (empty)
              Optional list of DNS blocklist domains, filters and weight  fac-
              tors.

       postscreen_dnsbl_threshold (1)
              The  inclusive lower bound for blocking an SMTP client, based on
              its   combined    DNSBL    score    as    defined    with    the
              postscreen_dnsbl_sites parameter.

       postscreen_greet_wait (6s)
              The  amount  of  time  that  postscreen(8) will wait for an SMTP
              client to send a command before its turn, and for DNS  blocklist
              lookup results to arrive.

       postscreen_pipelining_action (ignore)
              The  action  that  postscreen(8) takes when an SMTP client sends
              multiple commands instead of sending one command and waiting for
              the server to respond.

       postscreen_pipelining_enable (no)
              Enable "pipelining" tests in the postscreen(8) server.

       postscreen_pregreet_action (ignore)
              The  action  that postscreen(8) takes when an SMTP client speaks
              before  its  turn   within   the   time   specified   with   the
              postscreen_greet_wait parameter.

       postscreen_pregreet_banner ($smtpd_banner)
              The  text  in  the  optional  "220-text..." server response that
              postscreen(8) sends ahead of the real Postfix SMTP server's "220
              text..."  response, in an attempt to confuse bad SMTP clients so
              that they speak before their turn (pre-greet).

       postscreen_whitelist_networks ($mynetworks)
              Network addresses that are  permanently  whitelisted,  and  that
              will not be subjected to postscreen(8) checks.

       smtpd_service (smtpd)
              The internal service that postscreen(8) forwards allowed connec-
              tions to.

CACHE CONTROLS
       postscreen_cache_cleanup_interval (12h)
              The amount of time between postscreen(8) cache cleanup runs.

       postscreen_cache_map (btree:$data_directory/ps_cache)
              Persistent storage for the postscreen(8) server decisions.

       postscreen_cache_retention_time (1d)
              The amount of time that postscreen(8) will cache an expired tem-
              porary whitelist entry before it is removed.

       postscreen_dnsbl_ttl (1d)
              The  amount of time that postscreen(8) will cache results from a
              successful DNS blocklist test.

       postscreen_pipelining_ttl (30d)
              The amount of time that postscreen(8) will cache results from  a
              successful "pipelining" SMTP protocol test.

       postscreen_pregreet_ttl (1d)
              The  amount of time that postscreen(8) will cache results from a
              successful PREGREET test.

RESOURCE LIMITS
       line_length_limit (2048)
              Upon input, long lines are chopped up into  pieces  of  at  most
              this length; upon delivery, long lines are reconstructed.

       postscreen_command_count_limit (20)
              The  limit  on the total number of commands per SMTP session for
              postscreen(8)'s built-in SMTP protocol engine.

       postscreen_command_time_limit (100s)
              The over-all time limit per  SMTP  session  for  postscreen(8)'s
              built-in SMTP protocol engine.

       postscreen_post_queue_limit ($default_process_limit)
              The  number  of  clients  that can be waiting for service from a
              real SMTP server process.

       postscreen_pre_queue_limit ($default_process_limit)
              The number of non-whitelisted clients that can be waiting for  a
              decision  whether  they  will  receive  service from a real SMTP
              server process.

MISCELLANEOUS CONTROLS
       config_directory (see 'postconf -d' output)
              The default location of the Postfix main.cf and  master.cf  con-
              figuration files.

       daemon_timeout (18000s)
              How  much  time  a  Postfix  daemon process may take to handle a
              request before it is terminated by a built-in watchdog timer.

       delay_logging_resolution_limit (2)
              The maximal number of digits after the decimal point  when  log-
              ging sub-second delay values.

       command_directory (see 'postconf -d' output)
              The location of all postfix administrative commands.

       ipc_timeout (3600s)
              The  time  limit  for  sending  or receiving information over an
              internal communication channel.

       max_idle (100s)
              The maximum amount of time that an idle Postfix  daemon  process
              waits for an incoming connection before terminating voluntarily.

       process_id (read-only)
              The process ID of a Postfix command or daemon process.

       process_name (read-only)
              The process name of a Postfix command or daemon process.

       syslog_facility (mail)
              The syslog facility of Postfix logging.

       syslog_name (see 'postconf -d' output)
              The mail system name that is prepended to the  process  name  in
              syslog  records,  so  that  "smtpd" becomes, for example, "post-
              fix/smtpd".

SEE ALSO
       smtpd(8), Postfix SMTP server
       dnsblog(8), temporary DNS helper
       syslogd(8), system logging

LICENSE
       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

                                                                 POSTSCREEN(8)

Reply via email to