d70a771566a0702ac42f08a55c41a9c19489824f
[apps/pfixtools.git] / example / postlicyd.conf
1 # POSTLICYD configuration
2 #
3 # Postlicyd configuration contains:
4 #  - a set of filter definition
5 #  - the entry point in the filters for each smtp states
6 #
7 # The configuration format use 2 types of data:
8 #   Token:  [[:alpha:]]([[:alnum:]_]*)
9 #   String: string format is a bit more complex. It can be one of the two following
10 #           format:
11 #       - C-like strings "[^\n\r]*". In this kind of string, the \ character is used to
12 #         escape any character \c = c (\n = n, \\ = \, ...). This format allow non-ascii
13 #         strings and string concatenation " abcd " "ef" = " abcd ef".
14 #       - ASCII-only strings can be written without double-quotes. They can be splitted
15 #         into several lines using shell-like escaping of EOL. A string begins and ends on
16 #         on a non-blank character. This king of string can not contain semi-colons.
17 # eg:
18 #  The following format are equivalent:
19 #   (1) this is a str\
20 #   (1)    ing
21 #
22 #   (2) "this is a string"
23 #
24 #   (3) "this " "is a "
25 #   (3) "string"
26 #
27 # Most of the configuration use a format:
28 #     Token = String ;
29 #
30 # When not in a string, spaces and line breaks are ignored. You can use comments
31 # everywhere out of a string. It starts with a '#' character and ends at the end of the
32 # line. Comments are strictly equivalents to white spaces.
33
34 # FILTER DEFINITION
35 #
36 # A definition of a filter contains:
37 #  - the name of the filter. This name MUST be uniq (non-uniq names can lead to undefined
38 #    behaviour)
39 #  - a type
40 #  - a list of type-specific parameters
41 #  - a list of hooks (on_hookname)
42 #
43 # Format:
44 #  A filter look likes that:
45 #
46 #  filter_name {
47 #    type = type_name;
48 #    param1 = parameter value 1;
49 #    ...
50 #    on_hook1 = action1;
51 #    on_hook2 = action2;
52 #    ...
53 #  }
54 #
55 # Hooks:
56 #   A filter can returns different values. Each return value is given a name. The
57 #   configuration associates an action to run to a return value name.
58 #
59 #   The action can be either a postfix access(5) value or a filter name. Postfix access
60 #   parameters must be prefixed by 'postfix:'.
61 #
62 # eg:
63 #   on_match = postfix:REJECT Blacklisted;
64 #
65 # Filter:
66 #   Current defined filter types are:
67 #     - iplist: match the client_address against one or more blacklist files from a rbl
68 #        Parameters:
69 #           - file: (no)?lock:weight:filename
70 #             declare a file to load. If lock is given, the klist is locked into the
71 #             RAM. The weight is a number giving the weight of this blaclist file in the
72 #             score of the IP
73 #           - soft_threshold: score (default: 1)
74 #             minimum score to match the soft_match return value
75 #           - hard_threshold: score (default: 1)
76 #             minimum score to match the hard_match return value
77 #        Return value:
78 #          The score of a query is the sum of the weight of the blacklist it matched.
79 #           - If the IP can not be parsed, returns error
80 #           - If the score is strictly greater >= than hard_threshold, returns hard_match
81 #           - If the score is strictly greater >= than soft_threshold, returns soft_match
82 #           - Else, returns fail
83
84 # Lookup in a rbl
85 spamhaus_and_abuseat {
86   type   = iplist;
87
88   # configuration
89   file   = lock:10:/var/spool/postlicyd/rbl.spamhaus.org;
90   file   = lock:1:/var/spool/postlicyd/cbl.abuseat.org;
91   soft_threshold = 1;
92   hard_threshold = 11;
93
94   # hooks
95   on_soft_match = greylist;
96   on_hard_match = postfix:REJECT optional text;
97   on_fail       = postfix:OK;
98   on_error      = postfix:DUNNO;
99 }
100
101
102 #     - strlist: match strings from the query against a list of list.
103 #        Parameters:
104 #           - file: (no)?lock:(pre|suf)fix:weight:filename
105 #             declare a file to load. If lock is given, the list is locked into the
106 #             RAM. Prefix/Suffix is a parameter to tell the matcher which is the most
107 #             efficient storage order. The strings are internally stored into a trie that
108 #             allow high compression if a lot of prefix are shared by several strings. If
109 #             you choose "prefix", string are stored in the natural order in memory and
110 #             prefix compression is performed. If you choose "suffix", strings are stored
111 #             in reverse order in memory and suffix compression is performed. The weight
112 #             is a number giving the weight of this list in the string score.
113 #           - soft_threshold: score (default: 1)
114 #             minimum score to match the soft_match return value
115 #           - hard_threshold: score (default: 1)
116 #             minimum score to match the hard_match return value
117 #           - fields: field_name(,field_name)*
118 #             list of field the match the string against.
119 #             currently only email OR hostname fields are supported. You MUST choose only
120 #             one of these types per strlist, and be carefull that the field you requested
121 #             are available in the protocol state you want to use this filter for.
122 #              * hostname fields: helo_name, client_name, reverse_client_name
123 #              * email fields: sender, recipient
124 #             No space is allowed in this parameter.
125 #        Return value:
126 #          The score of a query is the sum of the weight of the list it matched.
127 #           - If the score is strictly greater >= than hard_threshold, returns hard_match
128 #           - If the score is strictly greater >= than soft_threshold, returns soft_match
129 #           - Else, returns fail
130 #        State:
131 #           - to match helo_name, you must be on HELO state or later
132 #           (stmpd_helo_restrictions)
133 #           - to match sender, you must be on MAIL state or later
134 #           (smtpd_sender_restrictions)
135 #           - to match recipient, you must on RCPT state (stmpd_recipient_restrictions)
136 #           - client_name and reverse_client_name are always available
137
138 # Whitelist some clients
139 client_whitelist {
140   type  = strlist;
141
142   # configuration
143   file    = lock:1:/var/spool/postlicyd/client_whitelist;
144   fields  = client_name;
145
146   # hooks
147   on_hard_match = postfix:OK;
148   on_fail       = spamhaus_and_abuseat;
149 }
150
151
152 #     - greylist: greylister
153 #        Paramters:
154 #           - path: /my/path/ (required)
155 #             path where to store the greylist database
156 #           - prefix: name (default: "")
157 #             prefix to the name of the greylist database
158 #           - lookup_by_host: boolean (default: false)
159 #             perform lookup per host instead of domain.
160 #           - delay: number (default: 300)
161 #             number of seconds the client must wait before retrial.
162 #           - retry_window: (default: 2 * 24 * 3600)
163 #             number of seconds we wait for a retry.
164 #           - client_awl: number (default: 5)
165 #             number of successful greylisting before the client get whitelisted (0 means,
166 #             no-auto-whitelist).
167 #         Return value:
168 #           - if the client is whitelisted, returns whitelist
169 #           - if the client is greylisted, returns greylist
170 #           - if a error occured (not currently possible), returns error
171 #         State:
172 #           this filter is a recipient filter and works in RCPT state only
173 #           (smtpd_recipient_restrictions).
174
175 # Perform greylisting
176 greylist {
177   type   = greylist;
178
179   # configuration
180   path   = /var/spool/postlicyd/;
181   prefix = greylist_;
182
183   # hooks
184   on_greylist  = postfix:DEFER_IF_PERMIT optional text;
185   on_whitelist = postfix:OK;
186 }
187
188
189 #     - match: direct matching against the query fields
190 #        Parameters:
191 #           - match_all: boolean
192 #             if true, the filter won't match until all conditions
193 #             are verified. If false, the filter match on the first
194 #             verified condition.
195 #           - condition: field_name OP (value)
196 #             * the field_name is one of the field name of the query
197 #              emitted by postfix. This list with description of each
198 #              field is available at:
199 #               http://www.postfix.org/SMTPD_POLICY_README.html
200 #             * OP is an operator. Available operators are:
201 #                == field_name is strictly equal to value
202 #                =i field_name is case insensitively equal to value
203 #                != field_name is not equal to value
204 #                !i field_name is not case insensitively equal to value
205 #                >= field_name contains value
206 #                >i field_name contains case insensitively value
207 #                <= field_name is contained by value
208 #                <i field_name is contained case insensitively by value
209 #                #= field_name is empty or not set
210 #                #i field_name is not empty
211 #         Return value:
212 #           - if the conditions are verified (according to match_all strategy), return match
213 #           - if the conditions are not verified, return fail
214
215 # match one of the condition: "stress mode activated", "client_name contains debian.org" or
216 #                             "recipient is empty"
217 match {
218   type = match;
219
220   # configuration
221   match_all = false;
222   condition = stress == yes;
223   condition = client_name >= debian.org;
224   condition = recipient #=;
225
226   # hook
227   on_match = postfix:OK;
228   on_fail = greylist;
229 }
230
231
232 # ENTRY POINTS
233 #
234 # Access policy daemon can be used at several protocol states. For each of this states,
235 # you can define a different entry point in the filtering tree. This entry points have
236 # the following format:
237 #
238 #  state = filter_name;
239 #
240 # The filter_name MUST be one of the filter you previously defined.
241 #
242 # The available states are:
243 #  - client_filter: called on CONNECT state (smtpd_client_restrictions)
244 #  - helo_filter (or ehlo_filter): called on HELO/EHLO command (smtpd_helo_restrictions)
245 #  - sender_filter: called on the MAIL FROM command (stmpd_sender_restrictions)
246 #  - recipient_filter: called on the RCPT TO command (smtpd_recipient_restrictions)
247 #  - data_filter: called on the DATA command (smtpd_data_restrictions)
248 #  - end_of_data_filter: called on the END-OF-DATA command
249 #    (smtpd_end_of_data_restrictions)
250 #  - etrn_filter: called on the ETRN command (stmpd_etrn_restrictions)
251 #  - verify_filter: called on the VRFY command (no postfix hook ?)
252
253 recipient_filter = client_whitelist;
254
255
256 # SERVER PORT
257 #
258 # Port to which the server is bound. The default is 10000. If the port is specified as
259 # a command line parameter, the value specified on command line overides this value.
260 #
261 # You must RESTART the server to change the port (reload does not affect the port).
262
263 port = 10000;
264
265 # vim:set syntax=conf: