接下来的
http://iredmail.googlecode.com/svn/trunk/extra/RPMS/注:请选择适用您的平台(i386, x86_64)的版本。
下载后执行安装:
# rpm -ivh policyd-x.y.z.rpmPolicyd 可以指定已某个用户、某个组的身份来运行,本着最低权限的原则,我们将创建一个普通组和普通用户来作为运行 policyd 的用户:
#
# 创建组:policyd
#
# groupadd policyd
#
# 创建用户:policyd。并将 policyd 用户归为 policyd 组的成员。
# -M: 不创建 HOME 目录。
# -s: 用户的 login shell。
#
# useradd -s /sbin/nologin -g policyd policydPolicyd Configuration
Postfix main.cf
需要在 Postfix 中添加以下参数:
policy_time_limit = 3600Initialize Import Database
首先需要导入 Policyd 的 MySQL 数据库:
#
# 先找到 Policyd 提供的 MySQL 模板文件
#
# rpm -ql policyd | grep 'DATABASE.mysql'
/usr/share/doc/policyd-1.82/DATABASE.mysql
#
# 以 MySQL 管理员的身份进入命令行,导入 Policyd 的模板数据库。
# 该模板里的 SQL 语句会创建一个新的数据库:policyd
#
# mysql -uroot -p
mysql> SOURCE /usr/share/doc/policyd-1.82/DATABASE.mysql;
#
# 新建一个 MySQL 用户:policyd.
# 这个用户将用于管理 Policyd 的数据库。
#
mysql> GRANT ALL ON policyd.* TO policyd@localhost IDENTIFIED BY 'passwd_of_policyd_user'
#
# 刷新数据库权限;
#
mysql> FLUSH PRIVILEGES;Configure Policyd
Policyd 的主配置文件是:
/etc/policyd.confPolicyd 的配置很简单,基本上就是设置某个功能是否开启或禁用。
# ---- DATABASE CONFIG ----
MYSQLHOST='127.0.0.1'
MYSQLDBASE='policyd'
MYSQLUSER='policyd'
MYSQLPASS='passwd_of_policyd_user'
FAILSAFE=1
# ---- DAEMON CONFIG ----
DEBUG=0
DAEMON=1
BINDHOST='127.0.0.1'
BINDPORT='10031'
# ---- CHROOT ----
# 如果要将 policyd 服务进行 chroot,必须指定对应的用户和组的 UID/GID。
# UID,GID 可以通过 'id' 命令得到。
# shell> id policyd
UID=2001
GID=2001
# ---- WHITELISTING ----
WHITELISTING=1
WHITELISTNULL=0
WHITELISTSENDER=0
AUTO_WHITE_LISTING=1
AUTO_WHITELIST_NUMBER=10
# ---- BLACKLISTING ----
BLACKLISTING=1
AUTO_BLACK_LISTING=1
AUTO_WHITELIST_NUMBER=10
# ---- BLACKLISTING HELO ----
BLACKLIST_HELO=1
# ---- BLACKLIST SENDER ----
BLACKLISTSENDER=1
# ---- HELO_CHECK ----
HELO_CHECK=1
# ---- SPAMTRAP ----
SPAMTRAPPING=1
# ---- GREYLISTING ----
GREYLISTING=1
TRAINING_MODE=0
TRIPLET_TIME=5m
# ---- SENDER THROTTLE ----
SENDERTHROTTLE=1
SENDER_THROTTLE_SASL=1
SENDER_THROTTLE_HOST=0
SENDERMSGSIZE=15728640
# ---- RECIPIENT THROTTLE ----
RECIPIENTTHROTTLE=1
# ---- RCPT ACL ----
# 注:如果使用官方 policyd 版本,将没有这个参数。
RCPT_ACL=1另外,还需要为 policyd 设置一个 crontabs 任务,用于清除过期的数据。 这样可以保持数据库条目尽可能的少,查询速度更快一些:
# crontab -e -u policyd
0 * * * * /usr/sbin/policyd-cleanup -c /etc/policyd.conf如何添加黑名单
mysql> USE policyd;
# 单个主机
mysql> INSERT INTO blacklist (_blacklist) VALUES ('192.168.0.1');
# 整个网段。用 '%' 表示
mysql> INSERT INTO blacklist (_blacklist) VALUES ('192.168.0.%');
mysql> INSERT INTO blacklist (_blacklist) VALUES ('192.168.%.%');
# 将单个用户列入黑名单
mysql> INSERT INTO blacklist_sender (_blacklist,_description) \
VALUES ('camis@mweb.co.za','# blacklist single address');
# 将整个域列入黑名单。
# 注意: @domain.ltd 并不会将它的子域名也列入黑名单,例如: @sub.domain.ltd。
mysql> INSERT INTO blacklist_sender (_blacklist,_description) \
VALUES ('@mweb.co.za','# blacklist entire domain');Recipient Throttle
收件控制。
每次 Postfix 收到一封外部 MTA 发来的邮件,policyd 都会在 policyd.throttle_rcpt 表里生成或更新对应的记录,例如:
rcpt count_max count_cur date time_limit count_tot abuse_cur abuse_tot log_warn log_panic
www@example.com 3 3 1216362410 3600 1 1 0 0 0
注意这里的 'count_max' 字段,它就是用于限制邮件的数量的,表示这个用户 在指定的时间段里,最多能接收多少封邮件。超过限制的邮件,将以 5xx 的 错误代码拒绝对方。
count_max:最多能接收的邮件数量;
count_cur:当前已经接收了多少封邮件;
time_limit:表示时间周期,以秒为单位。3600s => 1h。
RCPT ACL
针对单个用户的收件限制
iRedMail 中使用的 policyd-1.82 加了一个补丁:rcpt_acl.patch。 打了补丁之后,可以在 policyd 里针对收件的单个域,单个用户(Per-User)做限制。
例如,不允许所有 hotmail.com 的用户给本域的 'www@a.cn' 发邮件,但是允许
www@hotmail.com 这个用户。可以这样实现:
开启 RCPT ACL 功能,并重启 policyd 服务:
#
# Part of file: /etc/policyd.conf
#
RCPT_ACL=1在 SQL 表中加入这两个限制:
mysql> USE policyd;
# rcpt_acl 表结构
mysql> desc rcpt_acl;
+-----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| _sender | char(60) | NO | PRI | | |
| _rcpt | char(60) | NO | PRI | | |
| _wblist | char(60) | NO | | | |
| _priority | int(10) unsigned | NO | | 0 | |
+-----------+------------------+------+-----+---------+-------+
# 限制整个域。
# 注意:表示整个域需要加 '@' 符号。如:'@domain.ltd'。
mysql> INSERT INTO rcpt_acl (_sender, _rcpt, _wblist, _priority) VALUES ('@hotmail.com', 'www@a.cn', 'b', 0);
# 允许单个用户
mysql> INSERT INTO rcpt_acl (_sender, _rcpt, _wblist, _priority) VALUES ('www@hotmail.com', 'www@a.cn', 'w', 10);这里的 wblist 字段表示是 whitelist 还是 blacklist,分别用 w, b 来表示。
这里的 priority 字段表示优先级。数字越高,表示优先级别越高。
Spamtrap
spamtrap,是 Policyd 里设计的钓鱼机制。它的设计是基于这样一个简单的原理:
如果您从未公布过某个邮件地址,例如,
admin@domain.ltd,并且您和您的 同事从未告知客户发送邮件到这个地址,或者 admin@ 这个邮件地址根本就不 存在,但是对方还是尝试将邮件投递到 admin@,那么对方有 99.9999% 的 可能是垃圾邮件发送者。
目前有大量的垃圾邮件都是猜测和遍历的方式,将常用的用户名来作为收件人, 例如:admin@, postmaster@, administrator@, hr@, job@, zhaopin@, chengdu@, anhui@, guangzhou@ 等,然后尝试将广告、垃圾邮件发送到您的邮箱。
在 Policyd v1 中的 spamtrap 机制,会将这样的发送人的 IP 地址直接放入黑名单中, 默认要 7 天后这个黑名单才会过期。
实现方法:
在 policyd 数据库的 spamtrap 表中插入这个鱼饵的信息:
# mysql -uroot -p
mysql> USE policyd;
mysql> INSERT INTO spamtrap (_rcpt, _active) VALUES ('admin@example.com', 1);在 Policyd 的配置文件(/etc/policyd.conf)里再次确认是否开启了 Spamtrap 功能:
#
# Part of file: /etc/policyd.conf
#
SPAMTRAPPING=1如果没有启用,需要将 SPAMTRAPPING 的值设置为 ‘1’,然后重启 policyd 服务。如果已经启用,则不需要重启 policyd。
为了便于调试,可以在 /etc/policyd.conf 中将 spamtrap 的拒信信息修改一下:
#
# Part of file: /etc/policyd.conf
#
SPAMTRAP_REJECTION='Spamtrap, go away.'然后在 Postfix 的日志文件 /var/log/maillog 中跟踪是否出现类似的信息:
Jul 9 16:06:49 mailServer policyd: rcpt=4, spamtrap=new, host=209.85.142.184 (unknown),
from=xxx@gmail.com, to=admin@example.com, size=0, expire=1216195609假如出现了这样的信息,再检查一下数据库 policyd 中的 blacklist 表是否多了一条记录。如果确实增加了,那说明这个功能已经正常工作了。