Previous | Contents | Index |
Access to each type of mail server functionality is controlled using the MAILSERV_ACCESS
mapping table in the PMDF mapping file. Use of this mapping is
optional; reasonable defaults are assumed for each sort of access if no
mapping is specified.
Access control is necessarily based on addressing information. Since it is in practice possible to forge any sort of address, simple From:
address information access checks offer only marginal protection at
best. Although they can make it difficult for unsophisticated users to
unintentionally cause damage they offer no protection at all against
malicious attack.
So for greater protection, MAILSERV
can be configured to generate a challenge-response double-check; see
Section 4.3.7.4.
4.3.7.1 Access Check Strings
Each command presented to the mail server is used to compose one or
more access query strings. The MAILSERV_ACCESS mapping is then applied
to each of these strings. The result of the mapping is examined and
determines whether or not the requested operation is allowed. If the
operation is not allowed the mail server returns an indication to the
requestor indicating that an access failure has occurred.
The access query strings are always in one of the following two formats:
command-keyword|command-parameter|address command-keyword|command-parameter|address1|address2 |
command-keyword
is derived from the name of the command being checked. It will be DIRECTORY
for the DIRECTORY command, DIRECTLIST
for the DIRECTORY/LIST command, PURGELIST
for the PURGE/LIST command, SEND
for the SEND command, SENDLIST
for the SEND/LIST command, SUBSCRIBE
for the SUBSCRIBE command, and UNSUBSCRIBE
for the UNSUBSCRIBE command. Although commands can be abbreviated, abbreviations do not carry over into the command-keyword
strings.
ERRORHELP
is a special command-keyword
used to construct entries specifying an error message file to send back
to users in response to any errors processing the users' commands.
The command-parameter
depends on the command. In the case of the file commands, DIRECTORY and SEND, the parameter is the name of the particular file being accessed. The file name string consists of the directory specification, if any, (that is, the subdirectory, if any, under PMDF_MAILSERV_MAIL_DIR), the file name, and the file type. Wildcards don't carry over into access strings; the wildcard expansion process is done first and then each resultant file generates a separate access check. In the case of list commands, DIRECTORY/LIST, PURGE/LIST, SEND/LIST, SUBSCRIBE, and UNSUBSCRIBE, the command-parameter
is the name of the list; more precisely, it is the filename of the list, without the .dis
extension. Wildcards are once again expanded prior to doing any access
checks.
When a mail server request involves only one address, the single-address form of access query string is built, and address
is the address of the originator (envelope From: address) for the request. In some cases, notably the SUBSCRIBE and UNSUBSCRIBE commands, two addresses can be involved --- the address responsible for the request and the address on whose behalf the request is presented, (i.e., the address for which the request is being made). In these cases the two-address form of access query string is used, where the request is made by address1
for address2
.
Note that a user's own subaddress is not considered to be a second address in that the one address form of access query string is constructed for the case of a user subscribing or unsubscribing one of their own subaddresses, i.e., a user user
subscribing or unsubscribing an address of the form user+string
.
These rules are summarized in Table 4-2.
MAILSERV command | MAILSERV_ACCESS check string format | Default access |
---|---|---|
DIRECTORY file-spec |
DIRECTORY|
file-spec|
from-address
|
Allowed |
DIRECTORY/LIST list-name |
DIRECTLIST|
file-spec|
from-address
|
Allowed |
DIRECTORY/LIST |
DIRECTLIST|
file-spec|
from-address
|
Allowed |
HELP |
HELP|HELP.TXT|
from-address
|
Allowed |
INDEX |
INDEX|INDEX.TXT|
from-address
|
Allowed |
LISTS |
LISTS|LISTS.TXT|
from-address
|
Allowed |
PURGE/LIST list-name |
PURGELIST|
list-name|
from-address
|
Disallowed |
SEND file-spec |
SEND|
file-spec|
from-address
|
Allowed |
SEND/LIST list-name |
SENDLIST|
list-name|
from-address
|
Disallowed |
SET MAIL list-name |
SETMAIL|
list-name|
from-address
|
Disallowed |
SET MAIL list-name other-address |
SETMAIL|
list-name|
from-address|
other-address
|
Disallowed |
SET NOMAIL list-name |
SETMAIL|
list-name|
from-address
|
Disallowed |
SET NOMAIL list-name other-address |
SETMAIL|
list-name|
from-address|
other-address
|
Disallowed |
SUBSCRIBE list-name |
SUBSCRIBE|
list-name|
from-address
|
Allowed |
SUBSCRIBE list-name subaddress |
SUBSCRIBE|
list-name|
from-address
|
Allowed |
SUBSCRIBE list-name other-address |
SUBSCRIBE|
list-name|
from-address|
other-address
|
Allowed |
UNSUBSCRIBE list-name |
UNSUBSCRIBE|
list-name|
from-address
|
Allowed |
UNSUBSCRIBE list-name subaddress |
UNSUBSCRIBE|
list-name|
from-address
|
Allowed |
UNSUBSCRIBE list-name other-address |
UNSUBSCRIBE|
list-name|
from-address|
other-address
|
Disallowed |
invalid command |
ERRORHELP|
from-address|
from-address
|
Allowed |
As always for PMDF mapping tables, if using entries that contain wildcards, e.g., * or %
, it is important to put more specific entries before less specific entries. And keep in mind that wildcard matches can include the vertical bar character, |
; or in other words, a wildcard such as an asterisk can match
across a vertical bar. In particular, for MAILSERV_ACCESS
mapping SUBSCRIBE and UNSUBSCRIBE checks note that one should put two
address checks before wildcarded one address checks.
|
4.3.7.2 Access Check Mapping Results
Access check mapping entries set flags to indicate whether or not the
request should be honored. A $Y or $T specifies that the request should
be honored. A $N or $F indicates that the request should be rejected.
A $< specifies that the entry has returned a file name. The file name should be specified as a full absolute path. This file is opened and read as a series of addresses. The request is rejected if the requestor's address does not appear in the list. A $> does the same thing except that rejection occurs if the requestor's address is in the list. $< and $> cannot be used in the same entry; if they are the result is unpredictable.
For an entry that would otherwise succeed, a $* specifies that the entry has returned a referral address. Instead of honoring the request directly the mail server forwards the request to the specified referral address. The request is rejected if the referral address is bogus. A message is also sent to the requestor indicating that his or her request has been referred elsewhere. This message can be suppressed by appending $S to the mapping's result. The first line in the example below allows user@a.b.c.d to subscribe others to the info-boink
list; all others who try to subscribe to the list will get referred to
user@a.b.c.d.
MAILSERV_ACCESS SUBSCRIBE|info-boink|user@a.b.c.d|* $Y SUBSCRIBE|info-boink|* $*user@a.b.c.d |
To specify referral for a command that would normally fail, such as by default third party UNSUBSCRIBES, note that one must specify $Y as well as $*, e.g.,
MAILSERV_ACCESS UNSUBSCRIBE|info-boink|user@a.b.c.d|* $Y UNSUBSCRIBE|info-boink|*|* $Y$*user@a.b.c.d |
If both $* and $< or $> are used simultaneously the string returned by the mapping entry should consist of the file name, a comma, and then the referral address.
For SUBSCRIBE, UNSUBSCRIBE, and SENDLIST access check mapping entries, a $K specifies that, rather than immediately performing the requested action, MAILSERV should send a message to the address in question (the [un]subscribee address or the address apparently making the SEND/LIST request) asking the user to confirm the requested action. This MAILSERV message will contain a cookie---a string that the user must include in a confirmation message, if they want the action to be performed. See Section 4.3.7.4 for further details.
For a SENDLIST
access check mapping entry, a $X
specifies that by default, any RFC 822 comment fields should be stripped from the distribution list sent back to the user. A user who is allowed to get a copy of the list (note that SEND/LIST
is disabled by default) can override this default with the optional /COMMENTS
qualifier of the SEND/LIST
command.
Normally, a successful SUBSCRIBE
or UNSUBSCRIBE
causes a "You have been [un]subscribed to/from the list ..." message to be sent to the [un]subscribee address. In a SUBSCRIBE
or UNSUBSCRIBE
access check mapping entry, a $D alters that behavior. When $D is specified, the usual notification message to the [un]subscribee address in the case of a third party [un]subscribe can be blocked by specifying /NONOTIFY
; a notification message back to the [un]subscriber will still be sent.
The available flags are summarized in Table 4-3.
Flag | Description |
---|---|
$Y | Honor the request |
$T | Honor the request |
$N | Do not honor the request |
$F | Do not honor the request |
$* | If honoring, refer request to the specified address |
$K | If honoring, send a cookie response back to the address in question; see Section 4.3.7.4 |
$S | Suppress "Your request has been referred to..." messages |
$D | Honor /[NO]NOTIFY requests on [UN]SUBSCRIBE commands |
$< | Honor requests from senders in the specified file |
$> | Do not honor requests from senders in the specified file |
$V | When performing a third party command where $K is set, send the "please confirm" message to the address issuing the command, rather than the address on whose behalf the command was issued |
$X |
When checking a
SEND/LIST command, default to not including comments in
returned list
|
Flag comparisons | Description |
$:K
|
Match only when processing the confirmation (response to $K) of a command |
4.3.7.3 Access Defaults
The DIRECTORY
, DIRECTORY/LIST
, SEND
, and SUBSCRIBE
commands all allow full access if no access mapping is provided or the access check string does not match any mapping entry. The SEND/LIST
and PURGE/LIST
commands refuse all access and the UNSUBSCRIBE
command only allows users to unsubscribe themselves from lists and no
one else. See Table 4-2 for a summary of these defaults.
4.3.7.4 Access Confirmation via a Challenge-Response Cycle
Given the nature of contemporary messaging protocols, it is fairly easy to forge an e-mail address. Thus the security offered by regular mail server access checks, which are primarily e-mail envelope From:
address based, is rather fragile; it can protect against naive users, but is not sufficient to protect against a malicious attacker who forges his envelope From:
address.
Greater security for some commands can be obtained by having MAILSERV
engage in a challenge-response cycle, by setting the $K
flag in appropriate MAILSERV_ACCESS
access check entries.
When a successful MAILSERV_ACCESS SUBSCRIBE
, UNSUBSCRIBE
, or SENDLIST
access check entry returns the $K
flag, then rather than immediately performing the requested operation, MAILSERV
instead sends a challenge message to the purported address to be affected by the command. (This would be the purported From: address for most commands, or the subscribee or unsubscribee address for third party SUBSCRIBE
or UNSUBSCRIBE
commands.) The challenge message from MAILSERV
will contain a cookie string---the user will have to confirm the
request via a response including that exact cookie string.
For instance, suppose a site example.com wants to allow any users in the example.com domain to subscribe themselves, or any other address, to the list, but does not want to allow any non-example.com addresses to perform any subscriptions to the list. Then a MAILSERV_ACCESS
mapping such as the following could be used:
MAILSERV_ACCESS SUBSCRIBE|example-list|*@example.com|* $Y$K SUBSCRIBE|example-list|*|* $N SUBSCRIBE|example-list|*@example.com $Y$K SUBSCRIBE|example-list|* $N |
forger@somewhere.edu
sends a message to MAILSERV
. For this message they forge the envelope From:
address to appear to be John.Doe@example.com
---an address apparently within example.com
. Suppose this forged message is a third-party subscribe request--- the apparent (forged) John.Doe@example.com
From:
address requesting that the malicious user's true address forger@somewhere.edu
be subscribed. But because of the $K
on the first entry in this sample MAILSERV_ACCESS
table, MAILSERV
does not directly subscribe the malicious outside user to example-list; instead, MAILSERV
sends a message to John.Doe@example.com
including a challenge (cookie) string. Unless John.Doe@example.com
sends back a confirmation message including the cookie, the subscribe of forger@somewhere.edu
will not be performed. In particular, forger@somewhere.edu
would have to guess or otherwise obtain the cookie string in order to
achieve their attempted subscribe.
On an implementation note, any initial messages awaiting cookie confirmation are stored in the directory PMDF_QUEUE:[mailserv.spool]
(OpenVMS) or
/pmdf/queue/mailserv/spool/
(UNIX); if no cookie confirmation is received, such messages will time out after seven days and be returned to the sender (envelope From:
address).
4.3.7.5 Access Example
The following mapping controls access to the info-boink
list. It specifies that user@a.b.c.d
has full access to the list and handles subscription requests by referral. Users in domain f.g.h.i
cannot access the list in any way. It also specifies that anyone not in the domain f.g.h.i
can retrieve a copy of the list membership.
MAILSERV_ACCESS *|info-boink|user@a.b.c.d|* $Y *|info-boink|user@a.b.c.d $Y *|info-boink|*@f.g.h.i|* $N *|info-boink|*@f.g.h.i $N SUBSCRIBE|info-boink|user@a.b.c.d|* $Y SUBSCRIBE|info-boink|* $*user@a.b.c.d SENDLIST|info-boink|* $Y |
Previous | Next | Contents | Index |