On Tue, 2015-09-22 at 12:37 +0200, Markus Benning wrote:
> On Mon, Sep 21, 2015 at 07:25:53AM +0100, Kianoosh Kashefi wrote:
> > I use Postfix with Postfwd as policy service. and I want to limit all 
> > outgoing messages with exceptions for several SASL users with HOLD verdict. 
> > I'm new to postfwd so I need configuration example for rate-limiting with 
> > HOLD verdict (for instance limit all users outgoing messages to 10 messages 
> > per minute and HOLD messages exceeding that limit) also I need the same 
> > configuration to apply only to certain SASL users again with HOLD verdict 
> > (for example limit a certain user's outgoing messages to 100 message per 
> > minute and HOLD messages exceeding that limit). I appreciate if you reply 
> > with full configuration examples for these two cases. 
> 
> It can be done with the Accounting/Quota support of mtpolicyd:
> 
> https://www.mtpolicyd.org/getting-started.html#Mail::MtPolicyd::Cookbook::HowtoAccountingQuota
> 
> First you'll have to setup an SQL database and configure it in mtpolicyd:
> 
>   db_dsn="dbi:mysql:mail"
>   db_user=mtpolicyd
>   db_password=secret
> 
> Then configure the a VirtualHost with the accounting plugin to record mails 
> sent based on
> sasl_username:
> 
> <VirtualHost 12345>
>   name="rate-limit"
>   <Plugin AcctUser>
>     module = "Accounting"
>     fields = "sasl_username"
>     time_pattern = "%Y-%m-%d %H:%M"
>   </Plugin>
>   # more plugins come here later...
> </VirtualHost>
> 
> Then add a query to this policyd vhost in your postfix configuration:
> 
>   smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:12345
> 
> At this point mtpolicyd will create a table acct_sasl_username with the
> first recieved mail and record accounting data in it.
> 
> To limit the rate add the following Quota plugin configuration:
> 
>   <Plugin QuotaIP>
>     module = "Quota"
>     field = "sasl_username"
>     metric = "count"
>     threshold = 10
>     action = "hold"
>     time_pattern = "%Y-%m-%d %H:%M"
>   </Plugin>
> 
> This should limit the message count per sasl_username.
> 
> To add different limits per user you can use the per user configuration
> features of mtpolicyd.
> 
> Create a database schema for it:
> 
>   CREATE TABLE `user_policy` (
>     `id` int(11) NOT NULL auto_increment,
>     `desc` VARCHAR(64) NOT NULL,
>     `config` TEXT NOT NULL,
>     PRIMARY KEY  (`id`)
>   ) ENGINE=InnoDB;
> 
>   // configuration is expected as JSON format hash
>   INSERT INTO user_policy VALUES(1, 'privileged user', 
> '{"rate-limit":"100"}');
> 
>   CREATE TABLE `users` (
>     `id` int(11) NOT NULL auto_increment,
>     `sasl_username` VARCHAR(64) NOT NULL,
>     `user_policy` int(11) NOT NULL,
>     PRIMARY KEY  (`id`),
>     KEY `user_policy` (`user_policy`),
>     CONSTRAINT `users_ibfk_1` FOREIGN KEY (`user_policy`) REFERENCES 
> `user_policy` (`id`)
>   ) ENGINE=InnoDB;
> 
>   INSERT INTO users VALUES(NULL, 'kianoosh@saslauth', 1);
> 
> Add a query to retrieve the user configuration _before_ the Quota plugin:
> 
>   <Plugin UserConfiguration>
>     module = "SqlUserConfig"
>     sql_query = "SELECT p.config FROM user_policy p JOIN users u ON 
> (u.relay_policy = p.id) WHERE u.sasl_username=?"
>     field = "sasl_username"
>   </Plugin>
> 
> That will retrieve the user configuration by the sasl_username.
> 
> Then edit the Quota plugin and add uc_threshold parameter:
> 
>   uc_threshold="rate-limit"
> 
> This will overwrite the threshold option if there is a value for
> "rate-limit" defined in the current session.
> 
> 
> In my option the time slice is a little bit small with 1 minute.
> I would use a per hour or per day limit.
> 
>  Markus
> 

Dear Markus

Thank you for your help on mtpolicyd. but I need to know how this can be
done using postfwd.I appreciate any help on postfwd configuration.

Kianoosh Kashefi



Reply via email to