Донецкий техникум промышленной автоматики

Postfix як поштовий шлюз для MS Exchange 2003

  1. Частина перша, підготовка Postfix
  2. Чась друга: Налаштування Win2k3
  3. Частина третя -заключітельная.
  4. Що ми отримали

Як відфільтрувати спам з потоку електронних листів надходять на поштовий сервер, з одного боку-складне завдання, з іншого, є певні ознаки за якими можна визначити що хост відправник, бере участь в розсилці небажаної кореспонденції.

Схема роботи:
Схема роботи:

Розглянемо схему докладніше:
Є Linux сервер, який відкритий для прийому кореспонденції з інтернет, є сервер Windows 2003 / 2008- версія не важлива, з встановленої роллю Active Directory і поштовий сервер Exchange. Exchange може жити як на одному сервері з AD (таке зазвичай буває в невеликих організаціях) або на виділеному сервері (тут все залежить від IT-інфраструктури)
Значить, саме вивантаження даних про одержувачів, тобто список поштових скриньок користувачів відбуватиметься з AD, благо, коли в системі з AD встановлено Exchange, інформація про e-mail адресу користувача, додається автоматично в властивості облікового запису Active Directory.

Для прикладу ми будимо використовувати ім'я домену example.com
Передбачається, що сервер Ubuntu вже встановлений і оновлений до останньої актуальної версії.

Частина перша, підготовка Postfix

Для початку, встановлюємо необхідні пакети

sudo apt-get install postfix

редагуємо основний конфігураційний файл postfix, попередньо залягання як супер-користувач

sudo su nano /etc/postfix/main.cf

Нас цікавлять такі рядки (знаходимо їх і редагуємо, так як вказано нижче, адреса example.com міняємо на свій)

myhostname = mail.example.com # повне ім'я хоста mydomain = example.com # ім'я домену, від імені якого приходить пошта mydestination = mail.example.com, localhost, example.com mynetworks = 127.0.0.0/8, 192.168.0.20 [ :: ffff: 127.0.0.0] / 104 [:: 1] / 128

список довірених мереж з яких дозволена неавторизованих відправка, сервер win2k3 має адресу 192.168.0.20, цією директивою ми дозволяємо відправку пошти назовні через postfix тільки безпосередньо сервера з Exchange на борту, навіть клієнти локальної мережі повинні відправляти пошту тільки через Exhcange.

virtual_mailbox_domains = example.com transport_maps = hash: / etc / postfix / transport virtual_transport = hash: / etc / postfix / transport

Ці пункти відповідають за те, куди буде передаватися прийнята пошта.

В кінці конфіга додаємо

bounce_queue_lifetime = 1d maximal_queue_lifetime = 1d minimal_backoff_time = 180s maximal_backoff_time = 12h strict_rfc821_envelopes = yes disable_vrfy_command = yes smtpd_delay_reject = yes smtpd_helo_required = yes anvil_rate_time_unit = 60s smtp_always_send_ehlo = yes smtpd_hard_error_limit = 1 smtpd_recipient_limit = 1 smtpd_sasl_security_options = noanonymous anvil_rate_time_unit = 60s smtpd_client_connection_count_limit = 5 smtpd_client_connection_rate_limit = 6 smtpd_client_message_rate_limit = 6 smtpd_client_recipient_rate_limit = 1 smtpd_client_restrictions = reject_unauth_pipelining, permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp: / etc / postfix / helo, reject_unknown_client_hostname, check_client_access regexp: / etc / postfix / dul_checks, permit smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_client, # перевіряємо IP на присутність в спам -Лист reject_rbl_client cbl.abuseat.org, reject_rbl _client sbl-xbl.spamhaus.org, reject_rbl_client sbl.spamhaus.org, reject_rbl_client dnsbl.njabl.org, check_helo_access regexp: / etc / postfix / helo, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, reject_unknown_helo_hostname, check_sender_access hash: / etc / postfix / access, check_recipient_access hash: / etc / postfix / recipients, permit smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_non_fqdn_sender, reject_unknown_sender_domain, permit smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_invalid_hostname, reject_non_fqdn_recipient, reject_unknown_recipient_domain, permit

зберігаємо конфіг і виходимо в консоль.
Детально на всіх пунктах зупинятися не буду, їх призначення легко знайти в гуглі,
Весь вміст можна просто скопіювати як є.
Далі нам необхідно створити такі файли:

nano / etc / postfix / transport

що містить

example.com smtp: [192.168.0.20]

відповідає за те, куди потрібно передавати прийняту пошту.
де: smtp: серер одержувач, IP в [] говорить про те, що не потрібно перевіряти його ДНС зону, а передавати пошту на цю адресу як є, а там розберуться!

nano / etc / postfix / recipients

Це наш список одержувачів, який експортується з Exchange
Містить записи виду:

[email protected] OK

де: username -ім'я користувача в AD c mailbox, example.com -домен одержувача, OK -діректіва, яке надійшло з листом, в нашому випадку - пропустити.
Відомості про одержувачів будуть міститися саме в цьому файлі, можна звичайно зробити опитування exchange в реальному часі і у мене навіть десь був скрипт, але все руки не доходили, тут ще з'являється непотрібна навантаження на контролер домену, а воно вам треба ?! Причому якщо одночасно довбати кілька сот тис. Відправників, всі ці запити посипляться і на AD. Це і втрачений час на очікування відповіді, від вінди і навантаження на процесор вже 2х серверів. На моє глибоке думку, простіше запустити скрипт в заданий час, вигрузінт список одержувачів, і перекине їх в файл, як часто його запускати-вирішувати вам, у мене він запускається 2 рази в день 12 і 15 годин - частіше не потрібно.

Їдемо далі:

nano / etc / postfix / helo /([0-9]{1,3}(\.|-)){3}[0-9]{1,3}/i REJECT IP-able helo SPAM! / Localhost / i REJECT you are SPAM! /example.com/i REJECT you are not in my local networks-SPAM!

У цьому файлі використовуються регулярні вирази, для фільтрації команди helo
Якщо відправник представився IP адресою-то це порушення і пошту від нього, не приймають, те ж саме з другим пунктом localhost -Нормально сервер не може представлятися так, або там адмін криворукий (нехай налаштовує нормально) або на іншому кінці просто сильно запаршівевшій комп'ютер, який є частиною ботнету, що розсилає спам. Ну і останнє якщо відправник представляється - example.com, ну не може на іншому кінці бути наш сервер, це на 100% спам- можна сміливо загортати лист. Команда REJECT вказує на те, що зробити при виконанні умов.
Так до речі, після йде відповідь сервера, із зазначенням причини відмови в прийнятті пошти, туди можна вписати щось образливе 😉 і це повідомлення побачать на тому кінці. Але це справа виховання конкретного індивідуума.

nano / etc / postfix / access

зміст даного файлу схоже з попереднім, але тут вже використовуються явні покажчики, цим файлом можна, наприклад, блокувати окремі ящики користувачів.

[email protected] REJECT user is note available example.com REJECT you are not in my local networks Зовнішній IP нашого сервера REJECT you are not in my local networks localhost REJECT you are SPAM! nano / etc / postfix / dul_checks

Перевірка на приналежність до різних мереж.
Містить регулярні вирази різних мереж і як наслідок, ознак що це не поштові сервера, а заражені комп'ютери клієнтів, а якщо там дійсно працюють нормальні сервера, то пошту можна відправляти і через релей провайдера або на худий кінець звернутися в тих підтримку щоб прописали зворотний DNS зону .

/([0-9]*-){3}[0-9]*(\..*){2,}/i REJECT 553 SPAM_ip-add-rr-ess_networks / ([0-9] * \. ) {4} (. * \.) {3}. * / i REJECT 553 SPAM_ip-add-rr-ess_networks /.*\.broadband\.hu/i REJECT 553 SPAM_broadband-hu / client. * \ .. * \ .. * / i REJECT 553 SPAM_CLIENT /cable.*\..*\..*/i REJECT 553 SPAM_CABLE /pool.*\..*\..*/i REJECT 553 SPAM_POOL / dial. * \. . * \ .. * / i REJECT 553 SPAM_DIAL /ppp.*\..*\..*/i REJECT 553 SPAM_PPP /dslam.*\..*\..*/i REJECT 553 SPAM_DSLAM / dhcp. * \ .. * \ .. * / i REJECT 553 SPAM_DHCP /[\.-]dsl.*\..*\..*/i REJECT 553 SPAM_DSL /[ax]dsl.*\..*\..*/ i REJECT 553 SPAM_XDSL /.*([0-9]*\.){4}cableonline\.com\.mx/i REJECT 553 SPAM_IP-cableonline-com-mx /.*\.([0-9]* \.) {4} ip \ .holtonks \ .net / i REJECT 553 SPAM_ip-holtonks-net /([0-9]*-){3}[0-9]*\.fibertel\.com\.ar / i REJECT 553 SPAM_IP-fibertel-com-ar /.*[0-9]*-[0-9]*\.fibertel\.com\.ar/i REJECT 553 SPAM_IP-fibertel-com-ar / [0 -9] * \. user \ .veloxzone \ .com \ .br / i REJECT 553 SPAM_user-veloxzone-com-br /[0-9]*\.customer\.alfanett\.no/i REJECT 553 SPAM_customer-alfanett -no /.*([0- 9] * -) {3} [0-9] * \. Telecom \ .net \ .ar / i REJECT 553 SPAM_host-telecom-net-ar /.* (- [0-9] *) {2} \ .telpol \ .net \ .pl / i REJECT 553 SPAM_host-telpol-net-pl /(.*\.){2}maxonline\.com\.sg/i REJECT 553 SPAM_host-maxonline-com-sg / (. * -) {2}. * \. fairgamemail \ .us / i REJECT 553 SPAM_host-fairgamemail-us /[0-9]*[0-9]*-\.wispnet\.net/i REJECT 553 SPAM_host-wispnet -net /.*-.*(\..*){2}\.ne\.jp/i REJECT 553 SPAM_host-ne-jp /[0-9]*\..*\.ne\.jp/ i REJECT 553 SPAM_h09t-ne-jp /(.*\.){3}ad\.jp/i REJECT 553 SPAM_host-ad-jp / (. * \.) {4} revip \ .asianet \ .co \. th / i REJECT 553 SPAM_revip-asianet-co-th /[0-9]*\..*\.virtua\.com\.br/i REJECT 553 SPAM_host-virtua-com-br / ([0-9] * -) {3} [0-9] * \. exatt \ .net / i REJECT 553 SPAM_host-exatt-net /([0-9]*\.){4}ip\.alltel\.net/i REJECT 553 SPAM_host-ip-alltel-net /[0-9]{6,}\.chello\.../i REJECT 553 SPAM_host-chello /.* [0-9] * \ .. * \. chello \ ... / i REJECT 553 SPAM_host-chello-xx /.*\..*\.t-dialin\.net/i REJECT 553 SPAM_t-dialin-net /.* \ .. * \. t-ipconnect \. de / i REJECT 553 SPAM_t-ipconnect-de / ([0-9] * -) {2,3} [ 0-9] * \ .. * \. Cgocable \ .net / i REJECT 553 SPAM_host-cgocable-net /.*\..*\.shawcable\.net/i REJECT 553 SPAM_host-shawcable-net / p [0 -9] * \. mp [0-9] * \. aaanet \ .ru / i REJECT 553 SPAM_aaa_modem_pool / ([0-9] * -) {2} [0-9] * \. ip \ .adsl \ .hu / i REJECT 553 SPAM_ip-adsl-hu /([0-9]{1,3}\.){2}broadband4\.iol\.cz/i REJECT 553 SPAM_broadband-iol-cz

В результаті у нас повинно вийти 5 файлів,
їх необхідно переконвертувати в фали бази даних використовуються posfix.

postmap / etc / postfix / transport postmap / etc / postfix / recipients postmap / etc / postfix / helo postmap / etc / postfix / access postmap / etc / postfix / dul_checks

якщо все проходить без помилок, рухаємося далі.
Це що стосується ubuntu ...

Чась друга: Налаштування Win2k3

На мою думку, глибокому думку, не має сенсу пускати сервер з передової, в тил нашої оборони, з цієї ж причини ми не будемо давати лазити в системі і опитувати її, а дозволимо їй бачити тільки те, що їй необхідно для роботи, не більше.
Як це можна реалізувати на практиці ?! Postfix буде бачити тільки той список одержувачів який ми йому самі дамо -вже готовий!
На сервері Windows, через планувальник завдань, ми будемо запускати скрипт який буде експортувати список користувачів в файл recipients.

Схема роботи системи Win:
В AD заводиться користувач з мінімальними правами (без поштової скриньки), з правом доступу, лише в одну папку. Назвемо його, для прикладу, postfix з паролем 1234567.
Через планувальник завдань створюється нове завдання з частотою виконання потрібної вам.
На просторах мережі був знайдений скрипт, який в повному обсязі відповідав нашим завданням, я його злегка допив і тепер він робить на 100% те, що потрібно.
Сам скрипт написаний на VBS, назвемо його mail.vbs - такого змісту:
(Прошу переглянути його дуже уважно, конкретно "objOutputFileName.Writeline (objADobject.Mail &" там є коментарі)

Option Explicit Dim StartTime, EndTime: StartTime = Now 'For seeing how long the script takes to run Dim objShell Dim objFSO Const ScriptVersion = "1.01" Set objShell = WScript.CreateObject ( "WScript.Shell") Set objFSO = CreateObject ( "Scripting .FileSystemObject ") Wscript.Echo" StartTime = "& StartTime '************************************ ***************************** 'Const ForReading = 1, ForWriting = 2, ForAppending = 8 Dim objRootDSE Dim objDomain Dim objContainer Dim objOrganizationalUnit Dim strOutputFileName, objOutputFileName, GarbageRC Dim intUserObjectCountAll, intUserObjectCountSelected strOutputFileName = "c: \ шлях \ к расшаренной папці \ для користувача postfix \ recipients" Set objOutputFileName = objFSO.OpenTextFile (strOutputFileName, ForWriting, True) intUserObjectCountAll = 0 intUserObjectCountSelected = 0 Set objRootDSE = GetObject ( "LDAP: // RootDSE") Set objDomain = GetObject ( "LDAP: //" & objRootDSE.Get ( "DefaultNamingContext")) Call Sub_ EnumOUs (objDomain.ADsPath) Sub Sub_EnumOUs (sADsPath) Set objContainer = GetObject (sADsPath) objContainer.Filter = Array ( "OrganizationalUnit") For Each objOrganizationalUnit in objContainer WScript.Echo "Checking OU:" & objOrganizationalUnit.ADsPath Wscript.Echo "User Object Count: "& intUserObjectCountAll Sub_EnumUsers (objOrganizationalUnit.ADsPath) Sub_EnumOUs (objOrganizationalUnit.ADsPath) Next End Sub Sub Sub_EnumUsers (sADsPath) Dim objADobject Set objContainer = GetObject (sADsPath) objContainer.Filter = Array (" User ") For Each objADobject in objContainer If objADobject.Class = "user" Then intUserObjectCountAll = intUserObjectCountAll + 1 If objADobject.Mail "" Then objOutputFileName.Writeline (objADobject.Mail & "OK") '*** "[TAB] OK" - поділ за допомогою табуляції ** ** 'intUserObjectCountSelected = intUserObjectCountSelected + 1 End If End If Next End Sub objOutputFileName.Close' ******************************* ********************************** '

Щоб створити завдання в планувальнику, в рядок ініціалізації нашого скрипта пишемо:

c: \ windows \ system32 \ cscript.exe c: \ шлях до папки зі скриптом \ mail.vbs

ВСЕ це одним рядком!
Ну і виставляємо час, коли він буде виконуватися і як часто.
Далі створюємо директорію і відкриваємо в неї доступ через мережу користувачеві postfix.

Частина третя -заключітельная.

Тепер завдання, щоб наш linux сервер міг побачити вміст мережевий папки з файлом recipients.
Я вважав за краще монтувати розшарений директорію при старті системи, з цього, запхав команду монтування в файл /etc/rc.local.
Також необхідно створити в директорії media директорію win. Чому саме win- щоб, через кілька місяців, можна було зрозуміти, що це таке і звідки воно взялося.
Спочатку ставимо пакет smbfs -без нього наша директор не прімонтіруется.

sudo apt-get install smbfs

Редагуємо файл rc.local

nano /etc/rc.local

І перед рядком exit0 вписуємо команду монтування кулі:

mount -t smbfs //192.168.0.20/antispam / media / win / -o iocharset = utf8, user = postfix, pass = 1234567

де: 192.168.0.20 -ip сервера з exchange.
antispam -директор в якій лежить файл recipients.
/ media / win /-куди повинна примонтировать віндового кулі.
iocharset = utf8 -кодіровака, якщо випадково в ній з'являться папки з російськими назвами, то вони будуть читані, а не ???????????, та й гірше від цього не буде, в загальному робимо відразу як треба і спимо спокійно.

user = postfix, pass = 1234567

-ім'я користувача і пароль для доступу до кулі.

Перезавантажуємо Ubuntu ліземо в / media / win / бачимо її вміст віндового шари- значить все відмінно.

Далі створимо невеликий скрипт який буде переписувати файл recipients
в директорію / etc / postfix, а потім буде експортувати його в базу даних postfix і перезавантажувати поштовик.

#! / Bin / bash cp / media / win / recipients / etc / postfix / postmap / etc / postfix / recipients /etc/init.d/postfix restart

Створюємо завдання в CRON яке буде виконуватися через 3 хв після виконання завдання на Win2k3-на всякий випадок. (Наприклад 12:03 і о 15:03)

От і все!

Що ми отримали

Аніспам фільтр, з високим ступенем ефективності-до його установки я щоранку розгрібав по 240-260 листів зараз спостерігаю, тільки потрібну пошту.
Єдиний ящик в який спам, все таки доходить, це ящик на який приходять заявки для нашої контори, але їх число не перевищує 3-4 шт.
Безпека - в разі компрометації сервера Linux шлюз легко відновлюється, Та й зловмисник не отримає доступу до кореспонденції, т.к її на ньому просто немає, вона відразу передається Exchange-якщо проходить всі перевірки.
Кросплатформеність-немає сенсу збирати модулі з підтримкою всяких екзотичних функцій.

Час на розгортання-1 годину з умовою того, що Інтернет спритний, та й якщо все скопіювати як є. Система протестована протягом року-працює без збоїв.
А що ще можна прикрутити до нього-вирішувати вам. Там можна зробити і грейлистинг і встановити spamassassin в загальному немає меж фантазії, але потрібно знати міру.
Ну і на останок, судячи з коментарів настройка викликала складності, з цього викладаю копію конфігов з бойового сервера, всі домени в ньому замінені на example.org від вас потрібно-замінити тільки IP адреси власне архів
Є що додати ?! Прошу в коментарі ...

джерело http://howitmake.ru/blog/ubuntu/12.html

Як це можна реалізувати на практиці ?