Перейти к содержимому


Фото
* * * * * 1 Голосов

Lua помощь


  • Please log in to reply
57 ответов в этой теме

#1 radionuk2

radionuk2

    Newbie

  • Posters
  • 22 Сообщений:

Отправлено 04 Март 2019 - 12:32

Уважаемые коллеги, буду очень Вам признателен, если наведете меня на мысль где я мог ошибиться.
Очень надеюсь на Вашу помощь!
 
Написал такую конструкцию и она работает -
 
------------ЭТО РАБОТАЕТ-----------
 
local dw = require "drweb"
 
function milter_hook(ctx)
    -- Reject the message if it is likely spam
    if ctx.message.spam.score >= 100 then
        dw.notice("Spam score: " .. ctx.message.spam.score)
        return {action = "reject"}
    else
        -- Assign X-Drweb-Spam headers in accordance with spam report
        ctx.modifier.add_header_field("X-DrWeb-SpamScore", ctx.message.spam.score)
        ctx.modifier.add_header_field("X-DrWeb-SpamState", ctx.message.spam.type)
        ctx.modifier.add_header_field("X-DrWeb-SpamDetail", ctx.message.spam.reason)
        ctx.modifier.add_header_field("X-DrWeb-SpamVersion", ctx.message.spam.version)
    end
    -- Check if the message contains viruses, repack if so
    for threat, path in ctx.message.threats{category = {"known_virus", "virus_modification", "unknown_virus", "adware", "dialer"}} do
        ctx.modifier.repack()
        dw.notice(threat.name .. " found in " .. (ctx.message.part_at(path).name or path))
    end
    -- Repack if unwanted URL has been found
    for url in ctx.message.urls{category = {"infection_source", "not_recommended", "owners_notice"}} do
        ctx.modifier.repack()
        dw.notice("URL found: " .. url .. "(" .. url.categories[1] .. ")")
    end
    -- Assign X-AntiVirus header
    ctx.modifier.add_header_field("X-AntiVirus", "Checked by Dr.Web [MailD version: ]")
    -- Accept the message with all scheduled transformations applied
    return {action = 'accept'}
end
 
Далее из примеров решил прикрутить к ней черный и белые листы, и все перестало работать, postfix и milterd валятся.
Где моя ошибка?
 
 

------------ЭТО НЕ РАБОТАЕТ-----------
 
local dw = require "drweb"
local regex = require "drweb.regex"
-- Load regexp patterns from files
local whitelist = drweb.load_set("/etc/postfix/whitemails.txt")
local blacklist = drweb.load_set("/etc/postfix/blackmails.txt")
 
function milter_hook(ctx)
    -- Stop checks if mail_from matchs one of the patterns loaded from file
for pattern, _ in pairs(whitelist) do
        if regex.match(pattern, ctx.from, regex.ignore_case) then
            return {action = "accept"}
        end
    end
    -- Stop checks if mail_from matchs one of the patterns loaded from file
    for pattern, _ in pairs(blacklist) do
        if regex.match(pattern, ctx.from, regex.ignore_case) then
            return {action = "reject", "Blacklist"}
        end
    end
-- Reject the message if it is likely spam
    if ctx.message.spam.score >= 100 then
        dw.notice("Spam score: " .. ctx.message.spam.score)
        return {action = "reject"}
    else
        -- Assign X-Drweb-Spam headers in accordance with spam report
        ctx.modifier.add_header_field("X-DrWeb-SpamScore", ctx.message.spam.score)
        ctx.modifier.add_header_field("X-DrWeb-SpamState", ctx.message.spam.type)
        ctx.modifier.add_header_field("X-DrWeb-SpamDetail", ctx.message.spam.reason)
        ctx.modifier.add_header_field("X-DrWeb-SpamVersion", ctx.message.spam.version)
    end
    -- Check if the message contains viruses, repack if so
    for threat, path in ctx.message.threats{category = {"known_virus", "virus_modification", "unknown_virus", "adware", "dialer"}} do
        ctx.modifier.repack()
        dw.notice(threat.name .. " found in " .. (ctx.message.part_at(path).name or path))
    end
    -- Repack if unwanted URL has been found
    for url in ctx.message.urls{category = {"infection_source", "not_recommended", "owners_notice"}} do
        ctx.modifier.repack()
        dw.notice("URL found: " .. url .. "(" .. url.categories[1] .. ")")
    end
    -- Assign X-AntiVirus header
    ctx.modifier.add_header_field("X-AntiVirus", "Checked by Dr.Web [MailD version: ]")
    -- Accept the message with all scheduled transformations applied
    return {action = 'accept'}
end

Сообщение было изменено Konstantin Yudin: 27 Март 2019 - 13:45


#2 Aleksandra K.

Aleksandra K.

    Newbie

  • Dr.Web Staff
  • 49 Сообщений:

Отправлено 04 Март 2019 - 13:12

Приветствую.

 

Попробуйте заменить :

-- Load regexp patterns from files
local whitelist = drweb.load_set("/etc/postfix/whitemails.txt")
local blacklist = drweb.load_set("/etc/postfix/blackmails.txt")

 

На:

-- Load regexp patterns from files
local whitelist = dw.load_array("/etc/postfix/whitemails.txt")
local blacklist = dw.load_array("/etc/postfix/whitemails.txt")
 



#3 ilff

ilff

    Newbie

  • Members
  • 1 Сообщений:

Отправлено 04 Март 2019 - 13:16

Как по мне

 

for pattern, _ in pairs(whitelist) do

Должно быть

 

for _,pattern in pairs(whitelist) do

Сначала индекс, потом значение



#4 radionuk2

radionuk2

    Newbie

  • Posters
  • 22 Сообщений:

Отправлено 04 Март 2019 - 13:35

Спасибо, сейчас буду пробовать, сообщу по результату.



#5 Denis G.

Denis G.

    Newbie

  • Dr.Web Staff
  • 27 Сообщений:

Отправлено 04 Март 2019 - 17:09

Добрый день. 

У вас ошибка в том, что вы используете переменную drweb, хотя загружали модуль в переменную dw. Исправить можно так:

local dw = require "drweb"
local regex = require "drweb.regex"
-- Load regexp patterns from files
local whitelist = dw.load_set("/etc/postfix/whitemails.txt")
local blacklist = dw.load_set("/etc/postfix/blackmails.txt")


#6 radionuk2

radionuk2

    Newbie

  • Posters
  • 22 Сообщений:

Отправлено 04 Март 2019 - 17:11

Вот такая конструкция работает - local dw = require "drweb"

local regex = require "drweb.regex"
local whitelist = dw.load_array("/opt/drweb.com/lists/whitemails.txt")
local blacklist = dw.load_array("/opt/drweb.com/lists/blackmails.txt")
function milter_hook(ctx)
    -- Stop checks if mail_from matchs one of the patterns loaded from file
    for _,pattern in pairs(blacklist) do
    if regex.match(pattern, ctx.from, regex.ignore_case) then
            return {action = "reject", "Blacklist"}
        end
    end
 
получается здесь какаято неправильная информация
 
Я ВАМ ОЧЕНЬ БЛАГОДАРЕН ЗА ПОМОЩЬ!


#7 watchman_max

watchman_max

    Newbie

  • Posters
  • 8 Сообщений:

Отправлено 05 Март 2019 - 17:56

Чтобы не создавать новую тему...

Есть необходимость настроить фильтрацию по словам в заголовке и в тексте письма. Список слов в файлах.

Попробовали две конструкции по аналогии с черными и белыми списками.

 
local badwordssubj = dw.load_set("/opt/drweb.com/lists/bad_words_subject.txt")
local badwordsbody = dw.load_set("/opt/drweb.com/lists/bad_words_body.txt")
 
-- Stop checks if Subject matchs one of the patterns loaded from file
    for pattern, _ in pairs(badwordssubj) do
        if rx.match(pattern, ctx.message.header.value('Subject'), rx.ignore_case) then
            return {action = "reject", "BAD subject"}
        end
end
 
-- Stop checks if Body matchs one of the patterns loaded from file
    for pattern, _ in pairs(badwordsbody) do
        if rx.match(pattern, ctx.message.body.raw, rx.ignore_case) then
            return {action = "reject", "BAD words in body"}
        end
end

 

Но в лог валятся ошибки такого вида:

Error while executing milter hook for message ID <006401d4d297$f8a1b970$e9e52c50$@мойдомен> from вхощий_емайл to мой_юзер@мойдомен.com: [string "..."]:32: bad argument #2 to 'match' (string expected, got table) 

 

Куда копать??? ткните плиз.

Или если можно пару рабочих примеров фильтрации по слова...



#8 Boris Savelev

Boris Savelev

    Member

  • Beta Tester
  • 153 Сообщений:

Отправлено 05 Март 2019 - 19:11

Это очень похоже на ошибку в maild


telegram: @bsavelev


#9 Denis G.

Denis G.

    Newbie

  • Dr.Web Staff
  • 27 Сообщений:

Отправлено 05 Март 2019 - 20:30

Если не вдаваться в подробности, то это можно сделать так:
 
local dw = require 'drweb'
local rx = require 'drweb.regex'

local subject_bad_words = dw.load_array('/opt/drweb.com/lists/bad_words_subject.txt')
local body_bad_words = dw.load_array('/opt/drweb.com/lists/bad_words_body.txt')

function milter_hook(ctx)
    -- поиск по заголовку Subject
    local subject = ctx.message.header.value('Subject') or ''
    if rx.search(subject_bad_words, tostring(subject), rx.ignore_case) then
        return {action = 'reject'}
    end

    -- поиск слов в текстовых частях сообщения
    for text_part in ctx.message.text_parts() do
        if text_part.search(body_bad_words) then
            return {action = 'reject'}
        end 
    end

    return {action = 'accept'}
end
Пояснения про поиск в заголовке Subject:
1. Ошибка возникает из-за того, что функция value возвращает таблицу HeaderFieldValue либо nil, а функция search принимает вторым аргументом строку, что и сообщает интерпретатор. 
2. Строка "local subject = ..." нужна, так как заголовок Subject может отсутствовать и тогда вернется nil.
3. "tostring(subject)" нужен, потому что rx.search принимает вторым аргументом строку -- это не очень удобно, постараемся исправить в следующей версии. 
 
Пояснения про поиск в тексте:
1. Поиск по raw не имеет особого смысла, так как очень часто даже текстовые части могут быть закодированы. 
2. В предложенном варианте, просматриваются все текстовые части и для каждой из них проверяется наличие 'плохих' слов.
 
PS. Пишите ещё, если будут вопросы или проблемы. 

Сообщение было изменено Denis G.: 05 Март 2019 - 20:32


#10 watchman_max

watchman_max

    Newbie

  • Posters
  • 8 Сообщений:

Отправлено 06 Март 2019 - 08:44

Спасибо за помощь!

Все взлетело без ошибок.

Пока вопросов вроде нет, но есть предложение

Может есть смысл в следующей версии добавить возможность визуального конструктора правил?

но оставив возможность использования LUA скриптов. это было бы удобно для тех, кто вроде понимает, что делает, но не совсем )))

хотя бы касаемо основных функций - черные\белые списки, отсев по словам и определенным доменам\ИП...

Это как задел на развитие... 



#11 Boris Savelev

Boris Savelev

    Member

  • Beta Tester
  • 153 Сообщений:

Отправлено 06 Март 2019 - 09:22

Спасибо! Конструктор планируется в веб-консоле


telegram: @bsavelev


#12 Denis G.

Denis G.

    Newbie

  • Dr.Web Staff
  • 27 Сообщений:

Отправлено 06 Март 2019 - 14:52

Кстати, поиск по сообщению можно еще короче записать так:

function milter_hook(ctx)
    -- поиск слов в текстовых частях сообщения
    if ctx.message.search(body_bad_words) then
        return {action = 'reject'}
    end

    return {action = 'accept'}
end


#13 radionuk2

radionuk2

    Newbie

  • Posters
  • 22 Сообщений:

Отправлено 07 Март 2019 - 15:31

Подскажите еще - а какой формат записи в этот файл, в случае если я хочу весь домен туда внести?

local blacklist = drweb.load_set("/etc/postfix/blackmails.txt")



#14 Denis G.

Denis G.

    Newbie

  • Dr.Web Staff
  • 27 Сообщений:

Отправлено 07 Март 2019 - 18:01

Добрый день.
 
Оказлось, что в документации не отражено, то как работает load_set и load_array. Поэтому пока не обновилась документация, я постараюсь здесь объяснить как их можно использовать. 
 
load_array и load_set работают довольно просто. Они загружают файл в таблицу, в котром каждая строка это отдельное значение. Функции отличаются только тем, как будет представлены эти значения в таблице:
-- load_array загружает файл в таблицу в виде массива
-- то есть результирующая таблица будет иметь вид:
-- t[1] = значение1
-- t[2] = значение2
-- ...
-- t[N] = значениеN
local array = dw.load_array(path)
-- такие массивы в Lua удобно просматривать следующим способом
for i, value in ipairs(array) do
    -- использовать value с индексом i
end

-- load_set загружает файл в таблицу в следующем виде:
-- t[значение1] = true
-- t[значение2] = true
-- ...
-- t[значениеN] = true
local set = dw.load_set(path)
-- такие таблицы в Lua удобно просматривать следующим способом
for value in pairs(path) do
    -- использовать value
end
 
Теперь про то как это можно использовать в связке с нашим API. 
local dw = require 'drweb'
local rx = require 'drweb.regex'

local blocklist = dw.load_array('/etc/postfix/blackmails.txt')

function milter_hook(ctx)
    -- функция rx.search принимает три аргумента
    --   первый это шаблон, которым может быть массив из шаблонов
    --   второй это текст
    --   третий это опциональные флаги
    if rx.search(blocklist, ctx.from, rx.ignore_case) then
        return {action='reject', code='541', text='Message rejected as spam'}
    end

    return {action='accept'}
end

Ваш blackmails.txt при таком хуке, должен содержать корректные regex паттерны. Например такие:

.*\.ru
.*\.spam\.com
foo\.bar\.com

Каждая строка этого файла загрузится в таблицу blocklist и она будет иметь следующее содержимое:

blocklist[1] = ".*\.ru"
blocklist[2] = ".*\.spam\.com"
blocklist[3] = "foo\.bar\.com"

Если вы хотите указать какой-то конкретный домен, то можеет дописать в файл blocklist.txt строчки вида:

yandex\.ru
mail\.ru
mail\.sendsay\.ru


#15 radionuk2

radionuk2

    Newbie

  • Posters
  • 22 Сообщений:

Отправлено 11 Март 2019 - 10:40

Спасибо, применил, тестирую.

 

Кстати хочу сказать что мне как НЕ программисту удалось установить новую версию, и антиспам вообще стал работать великолепно, по сравнению со старой версией, с которой я мигрировал.

На клиентской базе порядка 250 ящиков и достаточно плотный поток почты.

В общем большое Спасибо за продукт специалистам DRWEB.



#16 Aleksandra

Aleksandra

    VIP

  • Helpers
  • 2 338 Сообщений:

Отправлено 11 Март 2019 - 11:17

Спасибо, применил, тестирую.

А средствами postfix задача не решалась?
Версия Сервера Dr.Web 12.00.0 (15-10-2019 05:00:00)
Linux 4.18.0-80.11.2.el8_0.x86_64 x86_64; glibc 2.28

#17 radionuk2

radionuk2

    Newbie

  • Posters
  • 22 Сообщений:

Отправлено 11 Март 2019 - 11:46

Тут получается 2 момента,

 

есть милтер а есть постфикс обработка письма.

У меня естественно в рамках постфикса тоже антиспам натройки есть, тюнинг в соответсвии с рекомендациями.

И да, в постфиксе есть тоже список, в котором я могу это рулить, но по существу более правильно все рулить на уровне антиспам решения, и получается на уровне drweb-а.

Чтобы не вести 2-х списков, так как основные списки будут именно, по опыту, в антиспаме.

Тоесть ответ - удобнее в ходе эксплуатации.



#18 Aleksandra

Aleksandra

    VIP

  • Helpers
  • 2 338 Сообщений:

Отправлено 11 Март 2019 - 12:10

Тут получается 2 момента,
 
есть милтер а есть постфикс обработка письма.
У меня естественно в рамках постфикса тоже антиспам натройки есть, тюнинг в соответсвии с рекомендациями.
И да, в постфиксе есть тоже список, в котором я могу это рулить, но по существу более правильно все рулить на уровне антиспам решения, и получается на уровне drweb-а.
Чтобы не вести 2-х списков, так как основные списки будут именно, по опыту, в антиспаме.
Тоесть ответ - удобнее в ходе эксплуатации.

По-моему это только все усложняет. Я уже не говорю про то, что в случае если продления не будет Вам придется все перенастраивать.
Версия Сервера Dr.Web 12.00.0 (15-10-2019 05:00:00)
Linux 4.18.0-80.11.2.el8_0.x86_64 x86_64; glibc 2.28

#19 radionuk2

radionuk2

    Newbie

  • Posters
  • 22 Сообщений:

Отправлено 11 Март 2019 - 12:59

я собственно уже лет 5 пользуюсь решение антиспам-антивирус от дрвеба, продление будет.

переходил на новую версию сразу с заменой сендмейла на постфикс.

перешел на него когда яндекс перестало продавать спамооборону (на тот момент лучшее решение по моему мнению).

 

Я пробовал различные фриварные варианты безусловно - но качество сканирования заметно хуже.

У меня вообще реализована более сложная схема - по факту постфикс с дрвебом первая линия, далее вся почта улетает на экчендж, не поверите на нем тоже стоит антивирус, но уже другого производителя.

 

В основном в ходе эксплуатации приходится разбираться именно в ложных срабатываниях антиспама, и черные и белые списки я веду именно на уровне мильтера дрвеба.



#20 radionuk2

radionuk2

    Newbie

  • Posters
  • 22 Сообщений:

Отправлено 20 Март 2019 - 13:53

Вот такая конструкиця

 

local dw = require "drweb"
local regex = require "drweb.regex"
local whitelist = dw.load_array('/opt/drweb.com/lists/whitemails.txt')
local blacklist = dw.load_array('/opt/drweb.com/lists/blackmails.txt')
function milter_hook(ctx)
    -- Stop checks BLACKLIST
    if regex.search(blacklist, ctx.from, regex.ignore_case) then
        dw.notice("Blacklist")
return {action='reject', code='541', text='blacklist'}
    end
................
 
файл забит вот так -
 
noreply@sidex.ru
\mkgk\.ru
xpstsrostum\.ru
.*\.sidex\.ru
 
на домены не срабатывает
 
где я накосячил?
 



Читают тему: 0

0 пользователей, 0 гостей, 0 скрытых