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


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

Lua помощь


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

#81 amorozov

amorozov

    Member

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

Отправлено 11 Июнь 2022 - 01:28

Можно попробовать вот такую обёртку использовать:
function do_belongs(ip, mask)
    local status, result = pcall(function()
        return ip.belongs(mask)
    end)
    return status and result
end
........
do_belongs(ctx.sender.ip, local_only)


#82 Ivan Kuznetsov

Ivan Kuznetsov

    Member

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

Отправлено 14 Июнь 2022 - 11:34

 

Причина в IPv6 адресе ::1 ?

Причина в том, что belongs хочет адрес и маску одного типа. Либо оба v4, либо оба v6.

 

Спасибо, уже разобрался. Сделал примерно так:

if not ctx.to.all_match (mail_domains) and
     ctx.sender.family == "4" and
     ctx.sender.ip.belongs (local_only) and
     not ctx.sender.ip.belongs (local_exclude) then
    drweb.notice ("Host " .. ctx.sender.ip .. " is local-only mail sender")
    return {action = "reject", message = "Sending to non-local addresses from this host is prohibited. Please contact system administrator"}
  end

Просьба документировать этот момент для IpAddress. В современных ОС двойной стек IPv4/IPv6 - норма жизни, и что здесь в скрипте нужно разделять обработку IPv4 и IPv6 адресов, несколько неочевидно :)


С уважением, Иван Кузнецов
ООО "СОЛВО"

#83 Ivan Kuznetsov

Ivan Kuznetsov

    Member

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

Отправлено 14 Июнь 2022 - 11:41

Еще вот такой фрагмент, может кому пригодится. Проверка на спам с учетом двух белых списков по адресам и сетям:

-- Белый список адресов-отправителей (нет реакции на спам, остальные проверки проводятся)
local ip_lan = drweb.load_array ("/etc/drweb/white_ipv4.list") -- список ip-адресов/сетей, ipv4
local whitelist = drweb.load_array ("/etc/drweb/white_email.list") -- список E-Mail адресов (regex)

function milter_hook(ctx)

   if not ( (ctx.sender.family == "6" and ctx.sender.ip == "::1") or
             (ctx.sender.family == "4" and ctx.sender.ip.belongs (ip_lan)) or
             ctx.sender.family == "L" or
             drweb_regex.match (whitelist, ctx.from, drweb_regex.ignore_case) ) then
    if ctx.message.spam.type == "spam" or..
       ctx.message.spam.type == "phishing" or
       ctx.message.spam.type == "scam" then  -- безусловный спам, выбрасываем
      ctx.modifier.change_header_field ("Subject", "[SPAM] " .. (ctx.message.subject or ""))
      return {action = "discard", message="Spam message rejected"}
    elseif ctx.message.spam.score >= 101 or.
           ctx.message.spam.type == "dce" then -- возможный спам, помечаем
      ctx.modifier.change_header_field ("Subject", "[Probable SPAM] " .. (ctx.message.subject or ""))
    end
    -- добавление заголовков проверки.
    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

end

 


С уважением, Иван Кузнецов
ООО "СОЛВО"

#84 amorozov

amorozov

    Member

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

Отправлено 14 Июнь 2022 - 18:11

Просьба документировать этот момент для IpAddress. В современных ОС двойной стек IPv4/IPv6 - норма жизни, и что здесь в скрипте нужно разделять обработку IPv4 и IPv6 адресов, несколько неочевидно :)

Пока мысли скорее поменять поведение, чтобы просто false возвращалось в таких случаях


Сообщение было изменено amorozov: 14 Июнь 2022 - 18:11


#85 Ivan Kuznetsov

Ivan Kuznetsov

    Member

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

Отправлено 12 Сентябрь 2022 - 13:13

Позволю себе поднять тему. Конструкция вида

if not ( (ctx.sender.family == "6" and ctx.sender.ip == "::1") or
             (ctx.sender.family == "4" and ctx.sender.ip.belongs (ip_lan)) or
             ctx.sender.family == "L" or
             drweb_regex.match (whitelist, ctx.from, drweb_regex.ignore_case) ) then
-- обработка результатов проверки на спам
...
end

почему-то иногда не срабатывает на локально сгенерированных письмах, т.е. когда отправитель localhost

 

Тест:

drweb.info ("family=" .. ctx.sender.family .. " ip=" .. ctx.sender.ip .. ' condition=' .. tostring(ctx.sender.family == "6" and ctx.sender
.ip == "::1"))

В логе:

2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Accepted (TCP 127.0.0.1:52672)
2022-Sep-12 12:50:45 [1541788] Debug: Milter client 5618-ec7d-af4e: Message will be dumped to: "/tmp/com.drweb.maild/5618-ec7d-af4e-e679.e
ml"
2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Scan /1/1/
2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Scan /1/1/: clean
2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Scan /1/2/
2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Scan /1/2/: clean
2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Scan /2/
2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Scan /2/: clean
2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Lua: family=6 ip=::1 condition=false
2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Spam check
2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Spam check: gained score of 300
2022-Sep-12 12:50:45 [1541788] Notice: Milter client 5618-ec7d-af4e: DISCARD message ID <77c00983-ebb3-3a45-f5ad-74b30862b087@solvo.ru> fr
om адрес-отправителя@домен1 to адрес-получателя1@домен2, адрес-получателя2@домен2 (and 10 others) gained spam score
 of 300; scanned 3/3 parts (3 clean)

Два вопроса:

1) Почему ip-адрес smtp-отправителя из ipv4 127.0.0.1 стал ipv6 ::1?

2) Почему проверка ctx.sender.family == "6" and ctx.sender.ip == "::1" дает false?
 

 


С уважением, Иван Кузнецов
ООО "СОЛВО"

#86 Ivan Kuznetsov

Ivan Kuznetsov

    Member

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

Отправлено 12 Сентябрь 2022 - 13:21

Первый вопрос (почему ip-адрес smtp-отправителя из ipv4 127.0.0.1 стал ipv6 ::1) снят - это коннект из мильтера к maild


С уважением, Иван Кузнецов
ООО "СОЛВО"

#87 Ivan Kuznetsov

Ivan Kuznetsov

    Member

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

Отправлено 12 Сентябрь 2022 - 14:16

Такое ощущение, что не работает приведение типов при сравнении ip: ctx.sender.ip == "::1". Вроде как ctx.sender.ip при сравнении со строкой должно быть автоматически приведено к типу string...

 

2.2. Таблица IpAddress описывает IP-адрес. Содержит следующие поля:

 

 

Переопределенные метаметоды:

__tostring — функция, преобразовывающая IpAddress в строку, например: "127.0.0.1" (IPv4) или "::1" (IPv6)

Или я не прав?


С уважением, Иван Кузнецов
ООО "СОЛВО"

#88 Afalin

Afalin

    Guru

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

Отправлено 12 Сентябрь 2022 - 19:02

Судя по мурзилке – не совсем правы, при сравнении оно не должно позваться.

Зато позовётся в

tostring(ctx.sender.ip) == "::1"

Семь раз отрежь – один раз проверь

#89 Ivan Kuznetsov

Ivan Kuznetsov

    Member

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

Отправлено 12 Сентябрь 2022 - 19:54

tostring(ctx.sender.ip) == "::1"

Да, так работает, спасибо!
Сделал чуть по другому, чтобы избежать вызова __tostring на каждом письме:

local localhost6 = drweb.ip ("::1")
local localhost4 = drweb.ip ("127.0.0.1")
...

 if not ( (ctx.sender.family == "6" and ctx.sender.ip == localhost6) or
             (ctx.sender.family == "4" and ctx.sender.ip == localhost4) or
             ctx.sender.family == "L" or ...

 


С уважением, Иван Кузнецов
ООО "СОЛВО"

#90 maximka777

maximka777

    Newbie

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

Отправлено 11 Февраль 2023 - 15:50

Добрый день.

 

Подскажите пожалуйста как правильно заполнить конфигурацию drweb.ini, когда DrWeb для почтовых серверов подключен к Центру управления?

 

Если я вношу изменения через web в параметр MilterHook, 

 

Прикрепленный файл  MilterHookWeb.png   87,69К   0 Скачано раз

то ничего не сохраняется, а если копирую оттуда lua-скрипт и вставляю в конфигурацию агента в Центре управления, то все перестает работать.

 

Прикрепленный файл  MilterHookAgent.png   128,74К   0 Скачано раз

 



#91 dmitrii.s

dmitrii.s

    Member

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

Отправлено 13 Февраль 2023 - 09:48

maximka777, добрый день.

Вы можете сохранить хук в файл и указать путь к файлу в параметре MilterHook настроек агента в центре управления.

К примеру:

[MailD]

MilterHook = /etc/opt/drweb.com/test.hook

 

Либо Вы можете установить вместо обычной двойной кавычки (в начале описания хука и в конце) одинарную в настройке MilterHook агента в центре управления. Так же, как у Вас на втором скриншоте, только использовать одинарные кавычки.

Однако в таком случае необходимо будет изменить кавычки в предпоследней строке: return {action = 'accept'} привести к виду return {action = "accept"}


Сообщение было изменено dmitrii.s: 13 Февраль 2023 - 09:55


#92 maximka777

maximka777

    Newbie

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

Отправлено 14 Февраль 2023 - 09:46

dmitrii.s, Спасибо огромное! Оба варианта работают отлично!



#93 maximka777

maximka777

    Newbie

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

Отправлено 31 Январь 2024 - 12:44

Добрый день.

 

Есть такой хук

MilterHook = '
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)

-- 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
    local x_antivirus = ctx.gen.x_antivirus_header_field()
    if x_antivirus then
        ctx.modifier.add_header_field(x_antivirus.name, x_antivirus.value)
    end
	
	 -- Stop checks if mail_from matchs one of the patterns loaded from file
    for _, pattern in ipairs(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 ipairs(blacklist) do
        if regex.match(pattern, ctx.from, regex.ignore_case) then
            return {action = "reject", code="541", message="Message rejected as BLACKLIST"}
        end
    end
	

		-- Изменить значение заголовка Subject, если сообщение
    -- набрало более 70 баллов оценки спама
	 if ctx.message.spam.score > 70 then
 	 local old_value = ctx.message.header.value("Subject") or ""
 	 local new_value = "[SPAM] " .. old_value
 	  ctx.modifier.change_header_field("Subject", new_value)
	 end
    -- Reject the message if it is likely spam
    if ctx.message.spam.score > 299 then
        dw.notice("Spam score: " .. ctx.message.spam.score)
        return {action = "reject", code="541", message="Message rejected as SPAM"}
    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
    
    -- Accept the message with all scheduled transformations applied
    return {action = "accept"}
end
'

Подскажите пожалуйста, можно ли в нем сделать так, чтобы для почтового ящика postmaster@mydomain.ru не производилась проверка на спам?

Ну то есть разрешить на этот ящик принимать спам?



#94 Kirill Polubelov

Kirill Polubelov

    Hr. Schreibikus

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

Отправлено 31 Январь 2024 - 16:18

Если предполагается, что получатель письма всегда один, попробуйте выше строки

-- Изменить значение заголовка Subject, если сообщение

добавить:

if ( #ctx.to == 1 and ctx.to[1] == 'postmaster@mydomain.ru' ) then
 return { action = "accept" }
end

Если получателей больше одного, то код:

for _, rcpt in ipairs(ctx.to) do
    if rcpt == 'postmaster@mydomain.ru' then
        return { action = "accept" }
    end
end

тоже пропустит письмо, но всем получателям.

При этом, письмо будет по-прежнему проверяться на вирусы и не придёт, если окажется в черном списке.

Если нужно пропустить его раньше, соответственно, это блоки надо поднять выше этих проверок.

Все сказанное выше придумано на основе лишь https://github.com/DoctorWebLtd/drweb-lua-examples/blob/master/maild/milter/api_example.lua  и вашего примера, если что )


Сообщение было изменено Kirill Polubelov: 31 Январь 2024 - 16:20

(exit 0)

#95 maximka777

maximka777

    Newbie

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

Отправлено 31 Январь 2024 - 17:22

Kirill Polubelov, спасибо огромное!!!

 

Сделал по первому способу, все работает, только пришлось адрес в двойные кавычки взять, иначе валились ошибки.

 

 HTTPD [1303639] Error: bind: Cannot assign requested address
 HTTPD [1303639] Notice: Exit with status 102 (Invalid configuration)
 ESAgent [2552] Error: Cannot parse drweb.ini: ini-file syntax error: line 12
 ESAgent [2552] Error: drweb.ini rejected


#96 Kirill Polubelov

Kirill Polubelov

    Hr. Schreibikus

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

Отправлено 31 Январь 2024 - 17:27

Да, потому что MilterHook = 'тельце хука'


(exit 0)

#97 Tuxzer92

Tuxzer92

    Newbie

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

Отправлено 15 Февраль 2024 - 08:50

Скажите, пожалуйста, а не реализованы еще черные и белые списки непосредственно в веб-интерфейсе, чтобы не писать LUA-скрипт самому?

Используется Milter.


Сообщение было изменено Tuxzer92: 15 Февраль 2024 - 08:50


#98 e.zaichenko

e.zaichenko

    Newbie

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

Отправлено 15 Февраль 2024 - 12:13

В данный момент такой реализации нет




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

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