Последната седмица ходих по някакви курсове. Нямах време (но за това пък си имам IBM Tivoli Workload Scheduler for z/OS 8.6.0 for Schedulers, но това е една друга бира) и желание за да пиша. За това и си починах тази седмица и малко. Нищо. Сега съм тук.
Днес смятам да ви занимая с малко geek time неща. А именно – Как да модифицираме qmail scenner-а за да не проверява писмата от потребители, които са минали през SMTP AUTH. Няма да ви дам готово решение, а ще ви покажа как да намерите пътя си. Предупреждавам, това ми е първия сблъсък с perl за това и хака, може да не е един от най-елегантните, но върши работа.
Тъй като имам собствен mail сървър, който използвам активно, бях много учуден, когато писмата, които се опитвах да изпращам от телефона ми, бяха маркирани като спам и сървъра ги карантинираше. Странно и неприятно. Нещо, което не мога да оставя така. Вярно е, че мога да ползвам gmail, къде е кефа в това.
Аз съм old school човек и за мен принципа „ако върви не го сменяй“ е винаги валиден. За това и сървъра ми върви под Slackware Current. Самият mail server е Qmail 1.03 инсталиран и пачнат според ръководството в www.qmailrocks.org/ с малко промени и update-и на отделни елементи от големия download пакет. Да, знам че повечето хора са мигрирали на Postfix или друг MTA, но аз съм човек с навици, а Qmail-a работи.
За да проверява писмата за Spam и вируси, се използва Qmail Scanner. Лично аз, а и в Qmil ръководството използват st patch-а. Той дава много по-добра възможност за настройка на отделните функции …
След като забелязах този малък проблем с скенирането на SMTP AUTH-натата поща, реших да се разровя из Интернет и да видя, дали няма да намеря някакво решение, което да ми спести работа и мислене. Но нямаше такова. Единственото, което намерих, не искаше да сработи. Но от там научих за TCPREMOTEINFO – глобална променлива, която се поставя когато изпращача на пощата е минал през някаква форма на SMTP authentication – тоест процеса SMTP AUTH е бил извършен. Само да ви кажа, че загубих 3 дни в опит да използвам информацията от онзи сайт. И не свърши никаква работа.
Какво ще ви трябва за този малък хак?
Всички опции стъпки е добре да се извършват под root или под потребителя, който има достъп до файловете, за които става дума. Аз лично предпочитам да работя като root.
Първата ви стъпка е да си отворите Qmail Scanner-a (st patch-a има много повече debug опции):
root@serv:# nano /var/qmail/bin/qmail-scanner-queue.pl
Открийте реда в който се дефинира променливата DEBUG (изглежда нещо от сорта на my $DEBUG=’1′; ) и сложете стойността на 5. Активирайте и $sa_alt (от 0 на 1), после ако искате можете да го махнете. Не е лошо да промените и $sa_debug (намира се малко по на горе в кода) и да го промените от 0 на 1, но не е задължително.
Сега си отворете още една конзола и отворете лога на qmail-scanner-а.
root@serv:# tail -f /var/spool/qscan/qmail-queue.log
Изпратете едно писмо от мрежа, която не е в листата на мрежите от които може да се прави realay … за тая цел аз си ползвам телефона. Следете изхода на qmail-scanner.log-а. От целия разбит и много богат лог нас ни интересуват само 2 неща, а именно:
incoming SMTP connection from via SMTP from 82.137.72.37 using auth (lucifer@f-bg.org@82.137.72.37)[...]SA: REPORT hits = (някакво число)/(друго число)
Сега се връщаме в конзолата в която имаме отворен qmail-scenner-a. Ще видите в един момент дефиниране на множество променливи. Добавете след тях една ваша. Аз лично използвам $qs_is_auth (Qmail-Scenner Is Authenticated). После търсим (с ctrl+w в nano) „using auth“. И ни праща в парче от код:
if ($ENV{'TCPREMOTEINFO'}) { $remote_smtp_auth=" (".$ENV{'TCPREMOTEINFO'}."\@$remote_smtp_host)"; $smtp_sender="via SMTP from $remote_smtp_host using auth $remote_smtp_auth"; }else{ $smtp_sender="via SMTP from $remote_smtp_host"; }
Помните, че си говорихме за TCPREMOTEINFO, нали? Този if проверява дали потребителя е минал през SMTP AUTH. Това е много добре. Аз лично съм добавил следните 2 реда код:
$qs_is_auth=1; &debug("User have SMTP AUTH");
Тоест – дефинирай $qs_is_auth да е 1 и изведи информация, че потребителя е идентифициран.
Сега намерете SA: REPORT. Това е мястото където контрола се връща от SpamAssasin към qmail-scenner. Значи, тук трябва да се погрижим миналите SMTP AUTH да не бъдат сканирани повече. Точно под SA REPORT добавяме:
if ($qs_is_auth == 1) { &debug("Lucifer: we are with SMTP AUTH and we set sa_score to 0"); $sa_score = 0; }
Иначе казано, ако вече имаме дефиниран $qs_is_auth (потребителя е минал през SMTP AUTH), независимо какво е върнал SpamAssasin-a върни debug, че правиш force на спам резултата и направи спам резултата да е равен на 0, независимо от всичко.
Знам, че това не е красиво и изобщо не е елегантно, и предполагам, че някъде там в някакъв момент, ще се появи проблем, но – ами аз не намерих по-добро решение. Целта на този материал, не е да ви даде готовото решение, а да ви покаже как да намерите някакво. Надявам се да съм ви бил полезен.
Ваш,
Lucifer
Вашият коментар