看看这个
和这个
iRedMail_tut_Policyd_v1
安装、配置 Policyd v1.
文档信息
本文是 基于 RHEL/CentOS 5.x 的邮件服务器解决方案 的一部分。
作者:张煌彬。
联系方式:
Mail/GTalk: michaelbibby
gmail.com
MSN: michaelbibby hotmail.com
Policyd v1
Policyd 简介
为什么选择 Policyd v1
Policyd 提供的功能
Policyd 依赖的条件
安装、配置 Policyd v1
导入 Policyd 数据库模板
配置 Policyd
收件控制
针对单个用户的收件限制
Spamtrap 钓鱼机制
Policyd Introduction
Why Policyd v1
Q: Policyd v1 已经停止开发,那 iRedMail 为什么还选择 Policyd v1 呢?
A: 以下是我为什么选择 Policyd v1 的几个原因:
性能优异,稳定可靠。
来自 Postfix 邮件列表里的用户反馈。
已有许多成功案例。
很多人在邮件列表里反应他们在自己的邮件服务器方案中使用 policyd v1,并且对性能和效果很满意。其有一些是 ISP 服务提供商。
在 Postfix 邮件列表里很多人推荐用它来实现某些功能。
例如:邮件频率控制,greylist,单用户的单封邮件大小限制等。而这些功能也正是 iRedMail 的用户提出的需求。
安装、配置都很简单。
Policyd Features
这里仅列出一些您可能感兴趣的功能,完整的功能列表请参看官方网站:Features。
Blacklist
Blacklist HELO
凡是使用你的主机的主机名作为 helo 来进行验证的远程主机都将被列入黑名单。 因为正规的主机必须以它自己的主机名作为 helo 的主机名。
HELO Randomization Prevention (HRP)
同一个 IP 发出多个 helo 主机名将会被认为是 spammer
发件人
DNS 主机名
Whitelist
可以通过以下几种信息来设定 whitelist:
IP 地址、网段
发件人
DNS 主机名
greylist(灰名单技术)
灰名单技术至少可以为你挡掉 20%-90% 的垃圾邮件。
spamtrap(垃圾邮件陷阱技术)
spamtrap 是通过设置一个实际不存在的本域地址,所有发送邮件给这 个地址的客户端都将被认为是垃圾邮件发送者,将被列入黑名单几个 小时。这样可以有效抵挡垃圾邮件,并且为您的服务器节省一下后期 处理该垃圾邮件的时间和系统资源。
针对单个用户设置单封邮件的大小
可以告诉你的老板,只有他可以单封邮件 20/30/50/100M(虽然他不一定用得到),而其它人却只有 10M。让他有一点优越感。
邮件发送、接收频率限制,以及收发邮件的总大小限制
发送限制:
设置你的用户在 1 分钟内只能发送总大小为 10M 的邮件;
设置你的用户在 1 分钟内只能发送 5 封邮件;
接收限制:
设置别人在 1 分钟内(时间由你定)只能给你的主机发送 5 封邮件;
设置别人在 5 分钟内只能给你的主机发送总大小为 10M 的邮件;
可以根据以下三种来做限制:
邮件地址或域名;
SASL 验证的登录名;
IP 地址或网段;
注:要使这些设置生效,必须开启邮箱容量限制。
iRedMail 中使用的 policyd-1.82 额外增加了一个补丁,用于实现以下功能:
更灵活的收发限制
用户可以屏蔽 @hotmail.com 的所有邮件,但是单单允许 bill@hotmail.com 给自己发邮件;
类似地,你也可以针对网段进行设置。例如,屏蔽 192.168.0.0/24 这个网段,但是允许 192.168.0.1 这台主机给你发邮件
您可以从以下地址下载 iRedMail 使用的 policyd-1.82 的源码(SRPM)及补丁:
Installation Requirement
Policyd v1 使用 C 语言编写,将所有数据存储于 MySQL 数据库中。
注:
Policyd v2 正在开发中,改用 Perl 语言编写,支持 MySQL, PostgreSQL, SQLite 存储。 目前还处于开发、测试状态。更多信息请浏览官方网站: v2/
编译 Policyd 要求您的系统已经安装 MySQL 的开发包,包的名字通常是:mysql-devel。 安装 Policyd 要求您的系统已经安装 MySQL 客户端工具,包的名字通常是:mysql 或 mysql-client 或 mysql-clients。
Policyd Installation
从 iRedMail 的 svn 仓库下载用于 RHEL/CentOS 5.x 版本的 policyd:
RedHatfeng 发表于 2008-9-16 11:21:56
接下来的
注:请选择适用您的平台(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 表是否多了一条记录。如果确实增加了,那说明这个功能已经正常工作了。
阅读(3221) | 评论(1) | 转发(0) |