كيفية إعداد خادوم بريد باستخدام Postfix، Dovecot، MySQL و SpamAssasin


محمد هاني صباغ

سنقوم في هذا الدرس بإعداد خادوم بريد باستخدام Postfix، Dovecot، MySQL و SpamAssasin على توزيعة Ubuntu.

بعد اتّباع هذا الدرس، ستكون قادرًا على إضافة نطاقات افتراضية (virtual domains)، المستخدمين والاختصارات إلى خادوم بريدك الإلكتروني، وليس هذا فقط، بل سيكون خادومك محميًا من هجمات السبام (Spam).

المتطلّبات

قبل البدء بإعداد خادوم البريد الخاصّ بك، من المهم أن يمتلك خادومك الافتراضي الخاص الأمور التالية:

  • توجيه النطاق الرئيسي إلى عنوان الآي بي الخاصّ بخادومك.
  • تثبيت وإعداد MySQL على الخادوم.
  • مستخدم بصلاحيات الجذر (root privileges).
  • إعداد وضبط اسم النطاق المؤهّل الكامل (FQDN). (إعداد FQDN).
  • إضافي: شهادة SSL (إعداد شهادة SSL مجانية موقّعة).
  • إضافي: تسجيل الدخول إلى المستخدم الجذر.

سيكون من المفيد تثبيت الحزم باستخدام المستخدم الجذر حيث أنّك ستمتلك جميع الصلاحيات:

sudo -i

قم بكتابة كلمة المرور الخاصّة بالمستخدم. بمجرد نجاح العملية، سترى أنّ رمز $ قد تغيّر إلى #.

الخطوة الأولى: تثبيت الحزم

apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql

عندما يتم سؤالك عن إعدادات Postfix، اختر "Internet Site":

001.thumb.png.e50295eb21cdcc8385051e9d62

سيقوم Postfix بسؤالك عن اسم بريد النظام الإلكتروني - يمكنك استخدام FQDN أو نطاقك الرئيسي إن أردت:

002_(1).thumb.png.ea9e6eefc77759686f3d8b

الخطوة الثانية: إنشاء قاعدة بيانات MySQL، نطاقات افتراضية، المستخدمين والاختصارات

بعد أن انتهى التثبيت، سنقوم الآن بإنشاء قاعدة بيانات MySQL لإعداد 3 جداول مختلفة: واحدٌ للنطاقات، واحدٌ للمستخدمين والأخير سيكون للاختصارات (aliases).

سنقوم بتسمية قاعدة البيانات بـ"servermail"، ولكن يمكنك استخدام أيّ اسمٍ تريده.

لإنشاء قاعدة البيانات servermail:

mysqladmin -p create servermail

لتسجيل الدخول كالمستخدم الجذر في MySQL:

mysql -u root -p

قم بإدخال كلمة مرور MySQL الخاصّة بالمستخدم الجذر; إذا نجحت العملية فسترى:

mysql >

يجب علينا أولًا إنشاء مستخدمٍ جديد، حيث يكون مخصصًا لعملية الاستيثاق (authentication) الخاصّة بالبريد الإلكتروني، وسنقوم بإعطائه صلاحية SELECT:

mysql > GRANT SELECT ON servermail.* TO 'usermail'@'127.0.0.1' IDENTIFIED BY 'mailpassword';

نحتاج بعدها إلى إعادة تحميل صلاحيات MySQL لضمان تطبيقها بشكلٍ صحيح:

mysql > FLUSH PRIVILEGES;

وأخيرًا، يجب علينا استخدام قاعدة البيانات الجديدة لإنشاء الجداول وحفظ بياناتنا:

mysql> USE servermail;

سنقوم بإنشاء جدول خاصّ بالنطاقات التي نعرفها على أنّها نطاقات موثوقة:

CREATE TABLE `virtual_domains` (
`id`  INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

سنقوم الآن بإنشاء جدول لحفظ المستخدمين فيه. ستقوم هنا بإضافة عناوين البريد الإلكتروني وكلمات المرور. من المهم جدًا أن تقوم بربط كلّ مستخدمٍ متوفّر بنطاقٍ ما:

CREATE TABLE `virtual_users` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`password` VARCHAR(106) NOT NULL,
`email` VARCHAR(120) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

وأخيرًا، سنقوم بإنشاء جدول اختصاراتٍ افتراضي لتحديد جميع عناوين البريد الإلكتروني التي تريد توجيهها إلى عناوين بريدية أخرى:

CREATE TABLE `virtual_aliases` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`source` varchar(100) NOT NULL,
`destination` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

لقد قمنا بإنشاء الجداول الثلاثة بنجاح. الآن سنقوم بإدخال البيانات.

النطاقات الافتراضية

سنقوم هنا بإدخال النطاقات الخاصّة بك إلى جدول virtual_domains. يمكنك إضافة جميع النطاقات التي ترغب بها، ولكننا سنقوم في هذا الدليل بإضافة النطاق الرئيسي فقط (example.com) و اسم نطاقك المؤهّل الكامل (FQDN) والذي هو على شاكلة (hostname.example.com).

INSERT INTO `servermail`.`virtual_domains`
(`id` ,`name`)
VALUES
('1', 'example.com'),
('2', 'hostname.example.com');

عناوين البريد الإلكتروني الافتراصية

والآن، سنقوم بإدخال عناوين البريد الإلكتروني وكلمات المرور المرتبطة بها إلى كلّ نطاقٍ على حدا. تأكّد من أنّك غيّرت جميع البيانات والمعلومات الموجودة بالشفرة أدناه لتناسب احتياجاتك قبل تطبيقها:

INSERT INTO `servermail`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('firstpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email1@example.com'),
('2', '1', ENCRYPT('secondpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email2@example.com');

الاختصارات الوهمية:

سنُدخِل عنوان البريد الإلكتروني (المصدر) الذي سنقوم بتوجيهه إلى عنوان البريد الإلكتروني الآخر (الوجهة):

INSERT INTO `servermail`.`virtual_aliases`
(`id`, `domain_id`, `source`, `destination`)
VALUES
('1', '1', 'alias@example.com', 'email1@example.com');

للخروج من MySQL:

mysql > exit

الخطوة الثالثة: إعداد Postfix

سنقوم بإعداد Postfix ليستلم معالجة اتصالات SMTP وإرسال الرسائل إلى كلّ مستخدمٍ موجود في قاعدة بيانات MySQL.

أولًا، يجب علينا إنشاء نسخة من الملفّ الافتراضي، في حال أردنا استرجاع الإعدادات الافتراضي إذا حصلت مشكلةٌ ما:

cp /etc/postfix/main.cf /etc/postfix/main.cf.orig

افتح ملف main.cf لتعديله:

nano /etc/postfix/main.cf

أولًا سنحتاج إلى القيام بوضع إشارة تعليق (#) على مُعامِلات TLS وإضافة مُعامِلات جديدة من هذا الدرس، سنقوم باستخدام شهادات SSL المجانية والمسارات التي تم اقتراحها في هذا الدليل (رابط)، ولكن يمكنك تعديل الأمور بناءً على احتياجاتك الشخصية:

# TLS parameters
#smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
#smtpd_use_tls=yes
#smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
#smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache 
smtpd_tls_cert_file=/etc/ssl/certs/dovecot.pem
smtpd_tls_key_file=/etc/ssl/private/dovecot.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes

ثم سنقوم بإضافة المُعامِلات التالية إلى أسفل إعدادات TLS التي قمنا بتغييرها بالخطوة السابقة:

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination

نحتاج الآن إلى القيام بوضع إشارة تعليق (#) قبل سطر mydestination واستبداله بـlocalhost. سيسمح هذا التغيير لخادومك الافتراضي الخاصّ باستخدام النطاق الافتراضي الموجود داخل جدول قاعدة MySQL.

#mydestination = example.com, hostname.example.com, localhost.example.com, localhost
mydestination = localhost

تأكّد أنّ مُعامِل myhostname مضبوط على الـFQDN الخاصّ بك:

myhostname = hostname.example.com

قم بإضافة السطر التالي ليتم إرسال الرسائل إلى جميع النطاقات الافتراضية الموجودة داخل جدول MySQL:

virtual_transport = lmtp:unix:private/dovecot-lmtp

وأخيرًا، نحتاج إلى إضافة هذه المُعامِلات الثلاثة لنخبر Postfix أن يقوم بإعداد النطاقات الافتراضية، المستخدمين والاختصارات:

virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

ملاحظة: قارن هذه التغييرات مع هذا الملف لتتأكد من عدم وجود أخطاء:

https://www.dropbox.com/s/x9fpm9v1dr86gkw/etc-postfix-main.cf.txt

سنقوم بإنشاء الملفّات الثلاثة الأخيرة التي قمنا بإدراجها في ملف main.cf لنخبر Postfix كيف يتصل بـMySQL.

أولًا، نحتاج إلى إنشاء ملف mysql-virtual-mailbox-domains.cf . إنّه ضروري لتغيير قِيَم الإعدادات بناءً على احتياجاتك الخاصّة:

nano /etc/postfix/mysql-virtual-mailbox-domains.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_domains WHERE name='%s'

ثم نحتاج إلى إعادة تشغيل Postfix:

service postfix restart

يجب علينا أن نضمن قيام Postfix بإيجاد النطاق الخاصّ بك، لذا نحتاج اختباره باستخدام الأمر التالي، إذا نجح الأمر فسيتم طباعة رقم 1:

postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

والآن، يجب علينا إنشاء ملف mysql-virtual-mailbox-maps.cf:

nano /etc/postfix/mysql-virtual-mailbox-maps.cf 

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_users WHERE email='%s'

ثم يجب علينا إعادة تشغيل Postfix مجددًا:

service postfix restart

في هذه النقطة، سنتأكّد من أنّ Postfix سيجد عنوان البريد الإلكتروني الأول الخاصّ بك باستخدام الأمر التالي، يجب أن يتم إرجاع الرقم 1 في حال نجحت العملية:

postmap -q email1@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

وأخيرًا، سنقوم بإنشاء آخر ملفّ لإعداد الاتصال بين Postfix و MySQL:

nano /etc/postfix/mysql-virtual-alias-maps.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT destination FROM virtual_aliases WHERE source='%s'

قم بإعادة تشغيل Postfix:

service postfix restart

يجب أن نضمن أيضًا أنّ Postfix سيعثر على الاختصارات الخاصّة بك. قم بإدخال الأمر التالي ويجب أن يتم طباعة البريد الإلكتروني الذي يتم توجيهه إلى الاختصار:

postmap -q alias@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf

إذا أردت تفعيل المنفذ 587 للاتصال بشكلٍ آمن باستخدام برامج البريد الإلكتروني (email clients)، فمن الضروري أن تقوم بتعديل ملفّ /etc/postfix/master.cf:

nano /etc/postfix/master.cf

نحتاج إلى إلغاء تعليق السطور التالية وإضافة سطور أخرى:

submission inet n       -       -       -       -       smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject

في بعض الحالات، نحتاج إلى إعادة تشغيل Postfix لكي يتم فتح المنفذ 587:

service postfix restart

ملاحظة: يمكنك استخدام هذه الأداة لفحص منافذ نطاقك والتأكّد من أنّ المنفذين 25 و 587 مفتوحان (http://mxtoolbox.com/SuperTool.aspx)

الخطوة الرابعة: إعداد Dovecot

سنقوم بنسخ الـ7 ملفّات التي سنقوم بتعديلها هنا، لكي نكون قادرين على استرجاعها في حال ما إذا حصلت مشكلة. أدخل الأوامر التالية الواحد تلو الآخر:

cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig
cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig

ثمّ لتعديل ملفّ الإعدادات من Dovecot:

nano /etc/dovecot/dovecot.conf

وتأكّد أنّ هذا الخيار ليس مُعلّقًا (لا يوجد إشارة # قبله):

chown -R vmail:vmail /var/mail

ثمّ سنحتاج إلى تعديل ملفّ /etc/dovecot/conf.d/10-auth.conf:

nano /etc/dovecot/conf.d/10-auth.conf

قم بإلغاء تعليق سطر استيثاق النصّ الصرف (plain text authentication) وأضف هذا السطر:

disable_plaintext_auth = yes

قم بتعديل مُعامِل auth_mechanisms:

auth_mechanisms = plain login

وقم بتعليق هذا السطر:

auth_mechanisms = plain login

الآن، قم بتفعيل استيثاق MySQL عبر إلغاء تعليق هذا السطر:

!include auth-sql.conf.ext

ملاحظة: قارن تغييراتك بهذا الملفّ:

https://www.dropbox.com/s/4h472nqrj700pqk/etc.dovecot.conf.d.10-auth.conf.txt

نحتاج إنشاء ملفّ /etc/dovecot/dovecot-sql.conf.ext والذي سيحتوي على معلومات الاستيثاق الخاصّة بك:

nano /etc/dovecot/conf.d/auth-sql.conf.ext

قم بإدخال الشفرة التالية في الملفّ:

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}

نحتاج تعديل ملفّ /etc/dovecot/dovecot-sql.conf.ext وإضافة معلومات MySQL الخاصّة بنا:

nano /etc/dovecot/dovecot-sql.conf.ext

قم بإلغاء تعليق مُعامِل driver وقم بتعيين mysql فيه:

driver = mysql

قم بإلغاء تعليق مُعامِل connect وأضف البيانات الخاصّة بإعدادات MySQL لديك:

connect = host=127.0.0.1 dbname=servermail user=usermail password=mailpassword

قم بإلغاء تعليق سطر defaultpassscheme وغيّره إلى SHA-512:

default_pass_scheme = SHA512-CRYPT

قم بإلغاء تعليق سطر password_query وأضف هذه المعلومات:

password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

ملاحظة: قارن تغييراتك مع هذا الملفّ:

https://www.dropbox.com/s/48a5r0mtgdz25cz/etc.dovecot.dovecot-sql.conf.ext.txt

الآن، قم بتغيير المالك ومجموعة مجلّد dovecot إلى المستخدم vmail:

chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot

افتح وعدّل ملفّ /etc/dovecot/conf.d/10-master.conf (وكن حذرًا، لأنّه هناك أكثر من مُعامِل يجب تغييره):

nano /etc/dovecot/conf.d/10-master.conf

##Uncomment inet_listener_imap and modify to port 0
service imap-login {
  inet_listener imap {
    port = 0
}

#Create LMTP socket and this configurations
service lmtp {
   unix_listener /var/spool/postfix/private/dovecot-lmtp {
       mode = 0600
       user = postfix
       group = postfix
   }
  #inet_listener lmtp {
    # Avoid making LMTP visible for the entire internet
    #address =
    #port =
  #}
}

قم بتعديل مُعامِل unixlistener إلى serviceauth كالتالي:

service auth {

  unix_listener /var/spool/postfix/private/auth {
  mode = 0666
  user = postfix
  group = postfix
  }

  unix_listener auth-userdb {
  mode = 0600
  user = vmail
  #group =
  }

  #unix_listener /var/spool/postfix/private/auth {
  # mode = 0666
  #}

  user = dovecot
}

عدّل service auth-worker كالتالي:

service auth-worker {
  # Auth worker process is run as root by default, so that it can access
  # /etc/shadow. If this isn't necessary, the user should be changed to
  # $default_internal_user.
  user = vmail
}

ملاحظة: قارن تغييراتك بهذا الملفّ:

https://www.dropbox.com/s/g0vnt233obh6v2h/etc.dovecot.conf.d.10-master.conf.txt

وأخيرًا، سنقوم بتعديل ملفّ إعدادات SSL من Dovecot (تخطّى هذه الخطوة في حال كنتَ تريد استخدام الإعدادات الافتراضية):

nano /etc/dovecot/conf.d/10-ssl.conf

غيّر مُعامَل SSL إلى required:

ssl = required

عدّل المسار لـsslcert و sslkey:

ssl_cert = </etc/ssl/certs/dovecot.pem

ssl_key = </etc/ssl/private/dovecot.pem

وقم بإعادة تشغيل Dovecot:

service dovecot restart

يجب أن تتأكّد أنّ المنفذ 993 يعمل ومفتوح:

telnet example.com 993

تهانينا!، لقد قمتَ بنجاح بإعداد خادوم بريدك الأول ويمكنك اختبار الإعدادات التالية باستخدام أحد برامج إدارة البريد الإلكتروني:

- Username: email1@example.com
- Password: email1's password
- IMAP: example.com
- SMTP: example.com

ملاحظة: استخدام المنفذ 993 لـIMAP المؤمّن و 587 أو 25 لـSMTP.

الخطوة الخامسة: إعداد SpamAssassin

نحتاج أولًا إلى تثبيت SpamAssassin:

apt-get install spamassassin spamc

ثمّ يجب علينا إنشاء مستخدمٍ خاص بـSpamAssassin:

adduser spamd --disabled-login

لإعداد SpamAssassin بنجاح، من الضروري أن تفتح وتعدّل ملفّ الإعدادات:

nano /etc/default/spamassassin

يجب علينا تغيير مُعامِل ENABLED لتفعيل SpamAssasin:

ENABLED=1

كما ونحتاج إلى تغيير مُعامِلات مجلّد المنزل والخيارات:

SPAMD_HOME="/home/spamd/"
OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir ${SPAMD_HOME} -s ${SPAMD_HOME}spamd.log"

ثمّ نحتاج إلى تعديل مُعامِل PID_FILE بالشكل التالي:

PIDFILE="${SPAMD_HOME}spamd.pid"

وأخيرًا، نحتاج إلى تحديد أنّ قواعد SpamAssasins يجب أن يتم تحديثها تلقائيًا:

CRON=1

ملاحظة: قارن تغييراتك بهذا الملفّ:

PIDFILE="${SPAMD_HOME}spamd.pid"

نحتاج الآن إلى فتح /etc/spamassassin/local.cf لإعداد القواعد التي ستحدّ من هجمات السبام (Spam):

nano /etc/spamassassin/local.cf

سيقوم SpamAssasin بتسجيل كلّ بريدٍ إلكتروني ويفحص ما إذا كان هذا البريد الإلكتروني يمتلك 5 نقط أو أعلى في اختبار فحص السبام، وإن كان كذلك فسيقوم تلقائيًا باعتباره سبام. يمكنك استخدام المُعامِلات التالية لإعداد القواعد المُضادة للسبام:

rewrite_header Subject ***** SPAM _SCORE_ *****
report_safe             0
required_score          5.0
use_bayes               1
use_bayes_rules         1
bayes_auto_learn        1
skip_rbl_checks         0
use_razor2              0
use_dcc                 0
use_pyzor               0

نحتاج إلى تغيير ملفّ /etc/postfix/master.cf لنخبره أنّه سوف يتم التحقق من كلّ بريدٍ إلكترونيٍ وارد بواسطة SpamAssasin:

nano /etc/postfix/master.cf

ثمّ نحتاج إلى العثور على السطر التالي وإضافة مرشّح spamassasin:

smtp      inet  n       -       -       -       -       smtpd
-o content_filter=spamassassin

وأخيرًا نحتاج إلى إضافة المُعامِلات التالية:

spamassassin unix -     n       n       -       -       pipe
user=spamd argv=/usr/bin/spamc -f -e  
/usr/sbin/sendmail -oi -f ${sender} ${recipient}

يجب الآن إعادة تشغيل كلٍّ من Postfix و SpamAssasin لكي تأخذ التغييرات مكانها:

service spamassassin start
service postfix restart

*تهانينا! لقد قمتَ بنجاح بإعداد خادوم بريدٍ إلكتروني باستخدام Postfix و Dovecot مع استيثاق MySQL وحماية ضدّ هجمات السبام باستخدام SpamAssasin ! حظًا موفقًا يا صاح!

ترجمة -وبتصرّف- للمقال: How To Configure a Mail Server Using Postfix, Dovecot, MySQL, and SpamAssasin.





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن