от 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 за намаляване на спама. Научете как се обработват данните ви за коментари.