Previous | Contents | Index |
SPF and SRS are not available for PMDF on Windows. |
For OpenVMS sites running MultiNet, the ECO UCX_LIBRARY_EMULATION-090_A052 or later is required for SPF/SRS to function. For sites running TCPware, the ECO DRIVERS_V582P020 or later is required. For sites running TCP/IP Services, you need version 5.3 or later. |
Sender Policy Framework (SPF) can be used to combat the problem of sender address forgery. It is a method of using special DNS records to say which systems are allowed to send mail for a given domain. PMDF's SPF implemention can be used to check the IP address of the system that PMDF is receiving a message from, against the domain name in the SMTP MAIL FROM:
address to make sure the message is coming from an authorized sending
system. The message can be accepted, rejected, or marked based on the
results of the SPF checks.
Sender Rewriting Scheme (SRS) is an adjunct to SPF that is used by mail forwarders. SPF breaks mail forwarding because it rejects the forwarder as an unauthorized sender of the mail. If the forwarder uses SRS to rewrite the MAIL FROM:
address, this problem is avoided.
For more information about SPF and SRS, see http://www.openspf.org/
.
Using SPF/SRS is similar to DNS_VERIFY in that both are used to combat the problem of forged sender e-mail addresses. The same drawbacks and warnings apply (see Section 16.1.8).
As with DNS_VERIFY, SPF and SRS are supplied as a sharable images on OpenVMS (PMDF_EXE:LIBSPFSHR.EXE
and PMDF_EXE:LIBSRS2SHR.EXE
), and as sharable object libraries on Unix (/pmdf/lib/libspf.so
and /pmdf/lib/libsrs2.so
).
SPF can be called from the FROM_ACCESS
, ORIG_MAIL_ACCESS
, or MAIL_ACCESS
mapping table. However, we recommend using the FROM_ACCESS mapping table for greatest efficiency since it is called only once, after the MAIL FROM:
SMTP command instead of after every RCPT TO:
SMTP command.
SRS is called from the REVERSE
mapping table to encode the MAIL FROM:
address when mail is forwarded. A different SRS routine is called from the FORWARD
mapping table to decode RCPT TO:
addresses when needed, as for example when an error response is sent back to an MAIL FROM:
address that has been SRS-encoded. SPF and SRS are invoked using the
routine callout described in Section 2.2.6.7, Customer-supplied Routine Substitutions, $[...].
Note that internal or trusted systems (such as mail gateways) should be excluded from SPF checks and SRS encoding by adding mapping table entries before the SPF or SRS entries in the mapping tables.
On Unix platforms, the symbols PMDF_SPF_LIBRARY and PMDF_SRS_LIBRARY are defined in /etc/pmdf_tailor
to point to the SPF and SRS sharable object libraries, respectively. Similarly, on OpenVMS, the logical names PMDF_SPF_LIBRARY and PMDF_SRS_LIBRARY are defined in PMDF_STARTUP.COM
to point to the sharable images. We also recommend that you install the SPF and SRS sharable images for efficiency. The following commands to do this may be put in your PMDF_COM:PMDF_SITE_STARTUP.COM
file:
$ INSTALL ADD PMDF_SPF_LIBRARY/OPEN/HEAD/SHARE $ INSTALL ADD PMDF_SRS_LIBRARY/OPEN/HEAD/SHARE |
LIBSPFSHR has three routines that can be called:
spf_lookup
spf_lookup_reject_fail
spf_lookup_reject_softfail
These are each described in the sections below.
Note that your mapping tables with SPF callouts can be tested by using the pmdf test -mapping
utility (pmdf test/mapping
on OpenVMS).
16.1.9.1.1 spf_lookup Routine
This routine does the SPF lookup and adds a Received-SPF:
header upon successful completion, or a header of your choice upon
error (such as if there are no SPF records).
The spf_lookup
routine has four arguments, separated by commas. The callout would look
like this:
$[PMDF_SPF_LIBRARY,spf_lookup,sending-ip,from-address,domain-name,header]$ |
The parameters are as follows:
sending-ip
is the sending IP address
from-address
is the MAIL FROM:
address
domain-name
is the domain name to display in the Received-SPF:
headers; this is expected to be the name of the local system that is
doing the SPF lookup
header
is the type of header to add upon error
The following example adds a Received-SPF:
header, or in the case where there is no SPF record, a X-PMDF-SPF:
header:
FROM_ACCESS TCP|*|25|*|*|SMTP*|*|tcp_*|*|* $C$[PMDF_SPF_LIBRARY,\ spf_lookup,$1,$6,example.com,X-PMDF-SPF]$E |
Example Received-SPF:
and X-PMDF-SPF:
headers would be:
Received-SPF: pass (example.com: domain of remotesys.com designates 10.0.0.1 as permitted sender) client-ip=192.168.0.1; envelope-from=joe@remotesys.com; X-PMDF-SPF: (recv=mail.example.com, send-ip=10.0.0.2) Could not find a valid SPF record |
Both of these routines do the SPF lookup and then reject the message if it gets a fail result. The spf_lookup_reject_softfail
also rejects the message if it gets a softfail result. They both add a Received-SPF:
header upon successful completion.
These routines have four arguments, separated by commas. The callouts would look like this (for example on Unix):
$[/pmdf/lib/libspf.so,spf_lookup_reject_fail,sending-ip,from-address,domain-name,header]$ $[/pmdf/lib/libspf.so,spf_lookup_reject_softfail,sending-ip,from-address,domain-name,text]$ |
The parameters are as follows:
sending-ip
is the sending IP address
from-address
is the MAIL FROM:
address
domain-name
is the domain name to display in the Received-SPF:
headers; this is expected to be the name of the local system that is
doing the SPF lookup
text
is the rejection text to use
The following example rejects mail that fails the SPF lookup:
FROM_ACCESS TCP|*|25|*|*|SMTP*|*|tcp_*|*|* $C$[/pmdf/lib/libspf.so,\ spf_lookup_reject_softfail,$1,$6,example.com,Rejected$ by$ SPF$ lookup]$E |
To configure PMDF to use SRS, changes are required to the PMDF option file pmdf_table:option.dat
, configuration file pmdf_table:pmdf.cnf
, and mapping file pmdf_table:mappings
.
16.1.9.2.1 Option File Changes
Two options need to be added to the PMDF option file: REVERSE_ENVELOPE
, and USE_REVERSE_DATABASE
.
The REVERSE_ENVELOPE
option needs to be set to 1 to tell PMDF to apply the REVERSE mapping table to envelope from
addresses (by default the REVERSE mapping table is only applied to header addresses). The USE_REVERSE_DATABASE
option should be set to a value of 266. This value turns on address
reversal processing (the REVERSE mapping table in this case), as well
as specifying that the destination channel be prepended to the address
when probing the REVERSE mapping table.
REVERSE_ENVELOPE=1 USE_REVERSE_DATABASE=266 |
By default, the REVERSE mapping table is checked for every destination channel. For SRS, normally you'd only want to encode the envelope from
address for messages that are being forwarded to the internet, for example, being sent out the tcp_local
channel.
To avoid unnecessary processing, the checking of the REVERSE mapping table can be restricted to when tcp_local
is the destination channel. This is done by using the noreverse
and reverse
channel keywords in the pmdf.cnf
file.
Place the noreverse
channel keyword on the defaults
line in pmdf.cnf
to turn off checking of the REVERSE mapping table by default. To turn the checking on for the tcp_local
channel, add the reverse
channel keyword to the tcp_local
channel definition. If there are any other channels you use that you wish to use SRS on, put the reverse
channel keyword on those channel definitions as well.
16.1.9.2.3 Mapping File Changes
The SRS library has two routines that can be called:
pmdf_srs_forward
pmdf_srs_reverse
The pmdf_srs_forward
routine is called from the REVERSE mapping table to encode the envelope from
address. The pmdf_srs_reverse
routine is called from the FORWARD mapping table to decode any SRS-encoded envelope to
addresses. These routines are further described in the sections below.
Notice that the name of the routine is opposite from the name of the mapping table that it is used in. |
Note that your mapping tables with SRS callouts can be tested by using the pmdf test -mapping
utility (pmdf test/mapping
on OpenVMS).
16.1.9.2.3.1 pmdf_srs_forward Routine And The REVERSE Mapping Table
The pmdf_srs_forward
routine takes an address and encodes it as defined by the SRS rules. It
returns the SRS-encoded address.
This routine has three arguments, separated by commas. The callout would look like this:
$[PMDF_SRS_LIBRARY,pmdf_srs_forward,from-address,secret,domain-name]$ |
The parameters are as follows:
from-address
is the MAIL FROM:
address to encode.
secret
is a secret word you must specify for use by the encoding process.
domain-name
is the local domain to use.
When adding the pmdf_srs_foward
callout to the REVERSE mapping table, you must specify the $:E flag on the entry. The option.dat option REVERSE_ENVELOPE (as described above) causes PMDF to apply the REVERSE mapping table to the envelope from
address as well as to header addresses. However, SRS should be applied
only to the envelope address and not to header
addresses. Specifying the $:E flag on your REVERSE mapping table entry
achieves this.
For best efficiency, SRS should only be applied to messages going out via the tcp_local channel (or other external channel). The option.dat option USE_REVERSE_DATABASE (as described above) specified with a value of 266 causes PMDF to prepend the destination channel to the address when the REVERSE mapping table is probed. To apply the mapping table entry to only tcp_local, specify "tcp_local|" at the front of your reverse mapping table entries.
Note that if you are already using the REVERSE mapping table for something else, this setting of USE_REVERSE_DATABASE causes the destination channel to be prepended for all REVERSE mapping table entries. |
Also, SRS should only be applied to messages that are being forwarded, and not to locally-generated messages. To do this, add additional entries to the REVERSE mapping table that exempts messages that have a local envelope from
address.
The following example encodes mail being forwarded by example.com:
REVERSE tcp_local|*@*example.com $N tcp_local|*@* $:E$[PMDF_SRS_LIBRARY,\ pmdf_srs_forward,$0@$1,mysecret,example.com]$E |
The pmdf_srs_reverse
routine takes an SRS-encoded address and decodes it back into the
original address.
This routine has three arguments, separated by commas. The callout would look like this:
$[PMDF_SRS_LIBRARY,pmdf_srs_reverse,to-address,secret,domain-name]$ |
The parameters are as follows:
to-address
the SRS-encoded RCPT TO:
address to decode.
secret
is the secret word that was used during the encoding process.
domain-name
is the local domain that was used during the encoding process.
Adding a callout to the pmdf_srs_reverse
routine from the FORWARD mapping table is required to decode any SRS-encoded envelope to
addresses. For example, to handle responses to mail that you sent with an SRS-encoded envelope from
address. Note that when you add the callout, you must also specify the
$D flag on the entry, to tell PMDF to send the resulting address back
through the rewrite process. This is so the mail can be forwarded on
successfully to the real original sender.
Since SRS decoding should only be applied to SRS-encoded addresses, you can select for this by checking for addresses that have two equal signs in the username part.
The following example decodes SRS-encoded addresses received by example.com:
FORWARD *=*=*@example.com $[PMDF_SRS_LIBRARY,\ pmdf_srs_reverse,$0=$1=$2@example.com,mysecret,example.com]$D |
The secret word specified in the mapping table callouts is used by the SRS encoding and decoding to make sure that the SRS-encoded address is not forged. You do not have to change your secret word at all, but if you wish to do so, the decoding routine needs to know all of the secret words ever used so that it can properly decode messages that were encoded using a previous secret word.
The SRS decoding routine will check for the file pmdf_table:srs_secret.dat
for a list of previous secret words. Whenever you change your secret
word, add the old secret word to this file (one word per line).
Previous | Next | Contents | Index |