от Lucifer

Последната седмица ходих по някакви курсове. Нямах време (но за това пък си имам 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 дни в опит да използвам информацията от онзи сайт. И не свърши никаква работа.

Инструментите.

Какво ще ви трябва за този малък хак?

  • nano или друг любим редактор.
  • tail
  • Android базиран телефон или пощенски клиент излизащ през мрежа, която не е в /etc/tcp.smtp

Нека се заемем, а?

Всички опции стъпки е добре да се извършват под 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

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

 

Този сайт използва Akismet за намаляване на спама. Научете как се обработват данните ви за коментари.