文档章节

rspamd 里面通过lua脚本实现每用户黑白名单

 超级超级管理员
发布于 2017/01/24 17:19
字数 552
阅读 17
收藏 0

在/usr/share/rspamd/rules/regexp/headers.lua 里面通过下面lua代码实现

具体的domain或者user列表可以通过mysql 或者文件读取出来,这暂时省略,仅作记录

rspamd_config.USER_WHITELIST = {
  score = -200,
  description = 'in user whitelist',
  group = 'header',
  callback = function(task)
    local addr = task:get_from(1)[1]['addr']
    local domain = task:get_from(1)[1]['domain']    
    if (domain == "oschina.net") then
      return true
    end
    return false
  end
}

刚开始使用的时候可以用

local rspamd_logger = require "rspamd_logger"
rspamd_logger.infox(task, "check for domain ".. addr .."  ".. domain)

把相应的参数结果打印在日志里面方便调试

经过调试,可以以模块的方式比较方便,先通过获取收件人地址,在mysql中取得收件人maildir,得到黑白名单文件路径,再进行判断,后期可以改成使用redis缓存maildir,效率应该会好很多

white_black.lua 源码

-- 将str以split_char进行分割
function string_split(str, split_char)
    local sub_str_tab = {}
    while (true) do
        local pos = string.find(str, split_char)
        if (not pos) then
            sub_str_tab[#sub_str_tab + 1] = str
            break
        end
        local sub_str = string.sub(str, 1, pos - 1)
        sub_str_tab[#sub_str_tab + 1] = sub_str
        str = string.sub(str, pos + 1, #str)
    end
    return sub_str_tab;
end

-- 判断str是否在array中
function in_list(str, array)
    for i=1,table.getn(array) do
        if (str == array[i]) then
            return true           
        end
    end
end

function w_b_list(str,to_addr)
    luasql = require "luasql.mysql"
    env = luasql.mysql()
    conn = env:connect("test","root","password")
    sql = "select dir from mailbox where CONCAT(name,'@',domain) = '" .. to_addr .. "'"
    result,errorstr = conn:execute(sql);
    row = result:fetch({},"a")
    while row do
        dir = string.format("%s",row.dir)
        row = result:fetch({},"a")
    end
    conn:close()
    env:close()
    list_arr = {}
    if(str == "whitelist") then
        file = dir.."/.whitelist"
    elseif(str == "blacklist") then
        file= dir.."/.blacklist"
    end

    handle,err = io.open(file,"r")
    if(handle) then
        list_arr = string_split(handle:read("*a"),"\n")
        return list_arr
    end
    handle:close()
end

header.lua 里面调用

require "white_black"

rspamd_config.USER_WHITELIST = {
  score = -1000,
  description = 'in user whitelist',
  group = 'header',
  callback = function(task)
    local from_addr = task:get_from(1)[1]['addr']
    local from_domain = task:get_from(1)[1]['domain']
    local to_addr = task:get_recipients(1)[1]['addr']
    local list = w_b_list("whitelist",to_addr)       
    if in_list(from_addr,list) or in_list(from_domain,list) then
      task:set_pre_result('no action', 'in user whitelist')
      return true
    end
    return false
  end
}

rspamd_config.USER_BLACKLIST = {
  score = 1000,
  description = 'in user blacklist',
  group = 'header',
  callback = function(task)
    local from_addr = task:get_from(1)[1]['addr']
    local from_domain = task:get_from(1)[1]['domain']
    local to_addr = task:get_recipients(1)[1]['addr']
    local list = w_b_list("blacklist",to_addr)       
    if in_list(from_addr,list) or in_list(from_domain,list) then
      task:set_pre_result('reject', 'in user blacklist')
      --task:set_metric_action('default', 'reject')
      return true
    end
    return false
  end
}

黑名单同理。这里面白名单格式为 user@domain @domain

判断 @domain 在白名单里面即判断为命中,也可以自己调整

© 著作权归作者所有

粉丝 2
博文 191
码字总数 80765
作品 0
成都
运维
私信 提问
rspamd 一些常见配置记录

这里面记录一些常见的配置 https://www.rspamd.com/doc/modules/multimap.html 通过multimap 来设置全局的黑白名单,读取/etc/rspamd/whitelist 里面的domain或者user,以DWL(在metrics.con...

超级超级管理员
2015/08/28
152
0
Rspamd 2.0 发布,高级垃圾邮件过滤系统

Rspamd 是一个高级垃圾邮件过滤系统,允许通过一些规则来评估邮件,包括正则表达式、统计分析和自定义服务。2.0 版本如下: libev 替代 LibeVENT Lua Torch 被 Kann 库代替,它对嵌入更加友好...

afterer
10/14
651
1
基于cookie在nginx实现业务灰度发布

基于cookie在nginx实现业务灰度发布 背景 灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。 灰度发布可以保证整体系统的稳定, 在初始灰度的时候就可以发现、调整问题,以保证其影响...

双鱼座小龙
2017/05/14
0
0
Winform开发框架之权限管理系统改进的经验总结(3)-系统登录黑白名单的实现

在一般的权限系统里面,可能经常会看到系统的黑名单或者白名单的拦截功能。在一般权限系统里面,常见的黑名单就是禁止用户在某些IP上登录系统,白名单就是允许用户只在某些IP上登录系统。本随...

walb呀
2017/12/04
0
0
APISIX 发布 0.7 版本,增加 gPRC 协议转换、serverless 等多项功能

这个版本带来很多新的特性,比如 IP 黑白名单、gPRC 协议转换、支持 IPv6、对接 IdP(身份认证提供商)服务、serverless、radix tree 路由等。 Core :sunrise: gRPC 协议转换: 支持 gRPC 协议...

wayne90
09/06
658
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 不要在领导修风扇的时候打开电扇

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《Whats Up》 主唱妹子 Lina Perry 的嗓音实在太有力了,收放自如的自信才能唱出这么优秀的歌吧!#今日歌曲推荐# 《Whats Up》-...

小小编辑
今天
11
0
SpringBoot集成Elasticsearch并进行增删改查操作

一、创建工程 使用IntelliJ创建SpringBoot工程 SpringBoot版本为2.0.4 ElasticSearch为5.6.10 删掉蓝框中的文件(如上) 最后我们的目录结构(如下) 下面pom文件主要修改的是把spring boot从Int...

一字见心
今天
5
0
x001-版本介绍

python版本介绍 目前有2 和 3 有很多企业用的代码是2版本,随着技术的发展,以后用3的会成为大趋势 python3的安装 yum -y install wget gcc zlib-devel bzip2-devel openssl-devel ncurses-d...

侠客行之石头
今天
5
0
聊聊rocketmq的TransientStorePool

序 本文主要研究一下rocketmq的TransientStorePool TransientStorePool rocketmq-all-4.6.0-source-release/store/src/main/java/org/apache/rocketmq/store/TransientStorePool.java publi......

go4it
昨天
6
0
笔记

场外借贷, 质押 ,托管, 永续合约. 场外借贷,n签合同. 新功能 证券交易组负责中信证券机构及个人投资交易相关系统,服务机构及个人投资客户, 涉及到两融、期权、 期货、做市等境内境外创新业...

MtrS
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部