lek
Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Уважаемые гуру. Хочу перед SMTP авторизацией проверять наличие IP-адреса и email в таблице (которая заполняется при ошибках авторизации). Т.е. если слишком много ошибок - то не допускать к авторизации (чтобы не подбирали пароль). И если с проверкой IP всё получилось, то с проверкой email - нет. Проверяю IP следующим образом: Код: M2K_CHECK_SMTP_AUTH_IP_BLOCK = ${if eq{1}{${lookup mysql{SELECT eximCheckIPAuthBlackList('${quote_mysql:$sender_host_address}')}{$value}fail}}{yes}{no}} acl_smtp_auth = acl_m2k_auth acl_m2k_auth: deny message = SMTP AUTH for host $sender_host_address is blocked. You can get access only via web interface log_message = SMTP AUTH for host $sender_host_address is blocked. You can get access only via web interface: as=$authenticated_sender, ai=$authenticated_id, 1 = $1, 2 = $2, 3 = $3 condition = M2K_CHECK_SMTP_AUTH_IP_BLOCK accept | Ну и написал функцию для проверки, имеется ли адрес отправителя в списке: Код: DELIMITER |; DROP FUNCTION IF EXISTS eximCheckIPAuthBlackList;\g CREATE DEFINER=`m2k_smtp`@'%' FUNCTION eximCheckIPAuthBlackList ( ipaddr VARCHAR(255)) RETURNS INT(1) NOT DETERMINISTIC READS SQL DATA COMMENT 'Check IP blacklist for smtp auth' BEGIN DECLARE cnt INT DEFAULT 0; DECLARE ts INT DEFAULT 0; -- get current timestamp SELECT UNIX_TIMESTAMP() INTO ts; -- delete stale records DELETE FROM SMTP_AUTH_BLACKLIST WHERE ts - CR_TIME > 3600; -- chech if ip is blocked -- 40 more auth failures in 60 seconds SELECT COUNT(*) INTO cnt FROM SMTP_AUTH_BLACKLIST WHERE IP = ipaddr AND ts - CR_TIME < 60; IF cnt > 40 THEN RETURN 1; END IF; END\g DELIMITER ; | Т.е. если более 40 раз в минуту неправильно произвёл аутентификаци - то login и IP-адрес попадают в таблицу SMTP_AUTH_BLACKLIST, записи старше часа - удаляются. Это отлажено и работает. Теперь следующая проблема - не допустить к авторизации тот логин, который подбирает пароль. Попробовал вывести разные переменные на этапе работы acl_smtp_auth - ни одна не содержит логина Код: log_message = SMTP AUTH for host $sender_host_address is blocked. You can get access only via web interface: as=$authenticated_sender, ai=$authenticated_id, 1 = $1, 2 = $2, 3 = $3 | Есть какие-нибудь соображения, как проверить login до авторизации? Во время авторизации проверить - не проблема (пока так и сделал костылём), однако сообщение получается одинаковое, независимо от того - заблокирован ли пользователь за множество попыток авторизации или же ввёл просто неправильный пароль (или логин) - 535 Incorrect authentication data Тогда как, если пользователь заблокирован за ввод неправильных данных с одного IP - выдаётся - SMTP AUTH for host 95.25.230.28 is blocked. You can get access only via web interface: as=, ai=, 1 = , 2 = , 3 = |