Product SiteDocumentation Site

فصل 11. سرویس‌های شبکه: Postfix، Apache، NFS، Samba، Squid، LDAP، SIP، XMPP، Turn

11.1. سرور ایمیل
11.1.1. نصب Postfix
11.1.2. پیکربندی دامنه‌های مجازی
11.1.3. محدودیت برای ارسال و دریافت
11.1.4. برپایی فهرست خاکستری
11.1.5. سفارشی‌سازی فیلترها مبتنی بر گیرنده
11.1.6. یکپارچه‌سازی آنتی‌ویروس
11.1.7. SMTP احرازهویت شده
11.2. سرور وب (HTTP)
11.2.1. نصب آپاچی
11.2.2. پیکربندی گروه‌های مجازی
11.2.3. عبارت‌های متداول
11.2.4. تحلیلگرهای گزارش
11.3. سرور فایل FTP
11.4. سرور فایل NFS
11.4.1. ایمن‌سازی NFS
11.4.2. سرور NFS
11.4.3. برنامه NFS
11.5. راه‌اندازی اشتراک‌های ویندوز با Samba
11.5.1. سرور سامبا
11.5.2. برنامه سامبا
11.6. پروکسی HTTP/FTP
11.6.1. نصب
11.6.2. پیکربندی یک حافظه نهان
11.6.3. پیکربندی یک فیلتر
11.7. دایرکتوی LDAP
11.7.1. نصب
11.7.2. پرکردن دایرکتوری
11.7.3. مدیریت حساب‌ها با LDAP
11.8. سرویس‌های ارتباطی بلادرنگ
11.8.1. تنظیمات DNS برای سرویس‌های RTC
11.8.2. سرور TURN
11.8.3. سرور پروکسی SIP
11.8.4. سرور XMPP
11.8.5. اجرای سرویس‌ها روی درگاه ۴۴۳
11.8.6. افزودن WebRTC
سرویس‌های شبکه برنامه‌هایی هستند که کاربران به صورت روزانه با آن‌ها سر و کار دارند. این ابزارها بخش عظیمی از دنیای فناوری را شامل می‌شوند که در این فصل به بررسی آن‌ها خواهیم پرداخت؛ قسمت پنهانی که این ابزارها روی آن قرار می‌گیرند همان زیرساختی است که تاکنون بررسی کرده‌ایم.
بسیاری سرویس‌های نوین شبکه به منظور عملکرد صحیح و امن نیازمند فناوری رمزنگاری هستند، بخصوص زمانی که در شبکه عمومی اینترنت مورد استفاده باشند. گواهینامه‌های X.509 (که به نام گواهینامه‌های SSL یا TLS نیز شناخته می‌شوند) اغلب به این منظور استفاده می‌شوند. یک گواهینامه برای دامنه‌ای بخصوص می‌تواند برای تعداد بیشتری از سرویس‌های مورد بحث در این فصل استفاده شود.

11.1. سرور ایمیل

مدیرسیستم‌های شرکت فالکوت Postfix را، با توجه به قابلیت اطمینان بالا و سادگی در پیکربندی برای سرور ایمیل خود انتخاب کرده‌اند. در حقیقت، طراحی آن بگونه‌ای است که هر وظیفه با حداقل تعداد مجوزهای مورد نیاز پیاده‌سازی شود، که این روش یک عامل کاهنده در رابطه با مشکلات امنیتی است.

11.1.1. نصب Postfix

بسته postfix شامل فرآیند پس‌زمینه اصلی SMTP است. سایر بسته‌ها از جمله postfix-ldap و postfix-pgsql قابلیت‌های بیشتری را به آن اضافه می‌کنند از جمله دسترسی به پایگاه‌داده‌های نگاشت شده. تنها زمانی که به آن‌ها نیاز دارید باید نصبشان کنید.
هنگام نصب بسته، چندین پرسش از طرف Debconf مطرح می‌شود. پاسخ‌های داده شده برای تولید اولین فایل پیکربندی /etc/postfix/main.cf بکار می‌روند.
پرسش اول درباره نوع راه‌اندازی است. تنها دو تا از پاسخ‌های پیشنهادی در مورد یک سرور متصل به اینترنت مناسب هستند، “Internet site” و “Internet with smarthost”. اولی برای سروری مناسب است که ایمیل ورودی را دریافت کرده و پاسخ را مستقیم به گیرنده می‌فرستد، که به همین دلیل برای شرکت فالکوت مناسب است. دومی برای سروری مناسب است که ایمیل ورودی را دریافت کرده، اما پاسخ را از طریق یک سرور SMTP میانی - یا همان “smarthost” - به گیرنده می‌فرستد. این گزینه اغلب برای افرادی مناسب است که از نشانی IP پویا استفاده می‌کنند، چرا که بسیاری سرورهای ایمیل از دریافت پیام‌های ارسالی از طرف چنین نشانی‌هایی خودداری می‌کنند. در این مورد، smarthost معمولا سرور SMTP شرکت ارائه دهنده خدمات اینترنتی است، که معمولا طوری پیکربندی می‌شود تا ایمیل‌های دریافتی از مشتریان خود را به درستی مسیریابی کند. این راه‌اندازی (با یک smarthost) برای سرورهایی که دائم به اینترنت متصل نیستند نیز مناسب است، چرا که از مدیریت صف پیام‌های غیرقابل ارسال که نیاز به حذف شدن در زمان دیگری را دارند، جلوگیری می‌کند.
پرسش دوم درباره نام کامل رایانه‌ای است که نشانی‌های ایمیل را از یک کاربر محلی تولید می‌کند؛ نام کامل پس از قسمت جلوی “@” می‌آید. در مورد فالکوت، پاسخ برابر است با mail.falcot.com. این تنها پرسشی است که به صورت پیشفرض مطرح می‌شود، اما پیکربندی که در پی دارد نیازهای شرکت فالکوت را تامین نمی‌کند، به همین دلیل مدیرسیستم‌های آن اقدام به اجرای dpkg-reconfigure postfix می‌کنند تا بتوانند گزینه‌های بیشتری را پیکربندی نمایند.
یکی از پرسش‌های اضافی که پرسیده می‌شود درباره تمام دامنه‌های مرتبط با این رایانه است. فهرست پیشفرض شامل نام کامل آن به همراه برخی نام‌های مترادف برای localhost است، اما دامنه اصلی falcot.com باید به صورت دستی اضافه شود. به صورت کلی، این پرسش باید با تمام نام‌های دامنه که برای آن‌ها این رایانه به عنوان یک سروی MX عمل می‌کند پاسخ داده شود؛ به عبارت دیگر، تمام دامنه‌هایی که DNS می‌گوید برای این رایانه ایمیل دریافت می‌کنند. این اطلاعات در متغیر mydestination واقع در فایل پیکربندی اصلی Postfix - /etc/postfix/main.cf - قرار می‌گیرند.
نقش رکورد MX در DNS هنگام ارسال ایمیل

شكل 11.1. نقش رکورد MX در DNS هنگام ارسال ایمیل

در برخی موارد، فرآیند نصب می‌تواند شبکه‌ای را که مجاز به ارسال ایمیل است درخواست کند. در پیکربندی پیشفرض، Postfix فقط ایمیل‌های ارسالی از خود رایانه را قبول می‌کند؛ شبکه محلی نیز معمولا اضافه می‌شود. مدیرسیستم‌های فالکوت 192.168.0.0/16 را به پاسخ پیشفرض اضافه کرده‌اند. اگر این پرسش مطرح نشود، متغیر مربوطه در فایل پیکربندی عبارت است از mynetworks، که در نمونه زیر نیز مشاهده می‌شود.
ایمیل محلی می‌تواند از طریق procmail تحویل داده شود. این ابزار به کاربران امکان می‌دهد که ایمیل دریافتی خود را با توجه به قوانین ذخیره شده در فایل ~/.procmailrc مرتب‌سازی کنند.
پس از این گام اولیه، فایل پیکربندی مقابل در اختیار مدیرسیستم‌ها قرار گرفته است؛ از این فایل به عنوان نقطه شروعی برای افزودن قابلیت‌های بیشتر در قسمت‌های بعدی استفاده می‌شود.

مثال 11.1. فایل اولیه /etc/postfix/main.cf

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# 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

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = mail.falcot.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = mail.falcot.com, falcot.com, localhost.localdomain, localhost
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/16
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

11.1.2. پیکربندی دامنه‌های مجازی

سرور ایمیل می‌تواند ایمیل‌هایی که به سایر دامنه‌ها در کنار دامنه اصلی ارسال شده‌اند را دریافت کند؛ این دامنه‌ها بنام دامنه‌های مجازی شناخته می‌شوند. در اکثر مواردی که این اتفاق می‌افتد، ایمیل‌ها الزاما به کاربران محلی مورد نظر خود ارجاع داده نمی‌شوند. Postfix دو ویژگی جالب فراهم می‌کند که برای دامنه‌های مجازی بکار می‌روند.

11.1.2.1. دامنه‌های مستعار مجازی

یک دامنه مستعار مجازی تنها شامل نام‌های مستعار است، نشانی‌هایی که ایمیل‌ها را به سایر نشانی‌ها فوروارد می‌کنند.
چنین دامنه‌ای با افزودن نامش به متغیر virtual_alias_domains و ارجاع دادن به یک فایل نگاشت نشانی در متغیر virtual_alias_maps، فعال می‌شود.

مثال 11.2. دستوراتی برای افزودن به فایل /etc/postfix/main.cf

virtual_alias_domains = falcotsbrand.com
virtual_alias_maps = hash:/etc/postfix/virtual
فایل /etc/postfix/virtual یک نگاشت با شیوه‌ای ساده را توضیح می‌دهد: هر خط شامل دو فیلد است که با فاصله از یکدیگر جدا شده‌اند؛ فیلد اول نام مستعار و فیلد دوم فهرستی از نشانی‌های ایمیل است که به آن ارسال می‌شود. شیوه نگارشی بخصوص @domain.com تمام نام‌های مستعار در یک دامنه را پوشش می‌دهد.

مثال 11.3. نمونه فایل /etc/postfix/virtual

webmaster@falcotsbrand.com  jean@falcot.com
contact@falcotsbrand.com    laure@falcot.com, sophie@falcot.com
# The alias below is generic and covers all addresses within 
# the falcotsbrand.com domain not otherwise covered by this file.
# These addresses forward email to the same user name in the
# falcot.com domain.
@falcotsbrand.com           @falcot.com

11.1.2.2. دامنه‌های صندوق‌پستی مجازی

پیام‌هایی که به یک دامنه صندوق‌پستی مجازی ارسال می‌شوند در صندوق‌پستی‌هایی ذخیره می‌گردد که در اختیار کاربر محلی سیستم نیست.
فعال‌سازی یک دامنه صندوق‌پستی مجازی نیازمند نام بردن از این دامنه در متغیر virtual_mailbox_domains و ارجاع به یک فایل نگاشت صندوق‌پستی در virtual_mailbox_maps است. پارامتر virtual_mailbox_base شامل دایرکتوری است که در آن صندوق‌های پستی ذخیره می‌شوند.
پارامتر virtual_uid_maps (به همین ترتیب پارامتر virtual_gid_maps) به فایلی ارجاع می‌دهد که شامل نگاشت بین نشانی ایمیل و کاربر سیستم است که "مالک" صندوق‌پستی مربوطه می‌باشد (به همین ترتیب برای گروه). برای دریافت تمام صندوق‌پستی‌هایی که توسط مالک/گروه یکسانی اداره می‌شوند، عبارت static:5000 یک شناسه‌کاربر/شناسه‌گروه ثابت را به آن اختصاص می‌دهد (در اینجا مقدار ۵۰۰۰).

مثال 11.4. دستوراتی برای افزودن به فایل /etc/postfix/main.cf

virtual_mailbox_domains = falcot.org
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_mailbox_base = /var/mail/vhosts
مجدد، شیوه نگارش فایل /etc/postfix/vmailbox کاملا واضح است: دو فیلد که با فاصله از یکدیگر جدا شده‌اند. فیلد اول نشانی ایمیل یکی از دامنه‌های مجازی است و فیلد دوم مکان صندوق‌پستی مورد نظر است (نسبت به دایرکتوری مشخص شده در virtual_mailbox_base). اگر نام صندوق‌پستی با یک اسلش (/) تمام شود، ایمیل‌ها در قالب maildir ذخیره‌سازی می‌شوند؛ در غیر اینصورت از قالب سنتی mbox استفاده می‌گردد. قالب maildir از یک دایکتوری کامل برای ذخیره‌سازی یک صندوق‌پستی استفاده می‌کند، که هر پیام آن در یک فایل جداگانه قرار می‌گیرد. از طرف دیگر، در قالب mbox تمام صندوق‌پستی در یک فایل بزرگ ذخیره می‌شود و هر خطی که با From  (به همراه یک فاصله) آغاز گردد، نشانگر ابتدای یک پیام است.

مثال 11.5. فایل /etc/postfix/vmailbox

# Jean's email is stored as maildir, with
# one file per email in a dedicated directory
jean@falcot.org falcot.org/jean/
# Sophie's email is stored in a traditional "mbox" file,
# with all mails concatenated into one single file
sophie@falcot.org falcot.org/sophie

11.1.3. محدودیت برای ارسال و دریافت

تعداد رو به افزایش ایمیل‌های انبوه ناخواسته (spam) تصمیم‌گیری درباره اینکه سرور چه ایمیل‌هایی را دریافت کند، دشوار می‌سازد. این قسمت به بررسی برخی راهبردهای موجود در Postfix می‌پردازد.

11.1.3.1. محدودیت‌های دسترسی مبتنی بر IP

عبارت smtpd_client_restrictions کنترل می‌کند که چه رایانه‌هایی مجاز به برقراری ارتباط با سرور ایمیل هستند.

مثال 11.6. محدودیت‌های مبتنی بر نشانی میزبان

smtpd_client_restrictions = permit_mynetworks,
    warn_if_reject reject_unknown_client,
    check_client_access hash:/etc/postfix/access_clientip,
    reject_rbl_client sbl-xbl.spamhaus.org,
    reject_rbl_client list.dsbl.org
زمانی که یک متغیر شامل فهرستی از قوانین باشد، مانند نمونه بالا، این قوانین به ترتیب از ابتدا تا انتها ارزیابی می‌گردند. هر قانون می‌تواند پیام را دریافت، رد یا تصمیم‌گیری درباره آن را به قانون بعدی بسپارد. به همین دلیل، ترتیب قرارگیری آن‌ها مهم است و تعویض دو گزینه می‌تواند نتایج متفاوتی به همراه داشته باشد.
عبارت permit_mynetworks، که به عنوان قانون اول استفاده شد، تمام ایمیل‌های ارسالی از یک رایانه شبکه محلی را قبول می‌کند (به ترتیبی که در متغیر پیکربندی mynetworks بیان شده است).
عبارت دوم ایمیل‌هایی را که از یک رایانه با پیکربندی DNS نامعتبر آمده باشند، نادیده می‌گیرد. چنین پیکربندی معتبری به این معنی است که نشانی IP بتواند به یک نام تبدیل شود و عکس آن نیز اتفاق بیفتد. این محدودیت‌ها اغلب سخت‌گیرانه هستند، چرا که بسیاری سرورهای ایمیل شامل DNS معکوس برای نشانی‌های IP خود نیستند. به همین دلیل است که مدیرسیستم‌های فالکوت از عملگر warn_if_reject قبل از عبارت reject_unknown_client استفاده می‌کنند: این عملگر منجر به تبدیل عملیات به یک پیام ساده اخطار در فایل‌های گزارش می‌گردد. سپس مدیرسیستم‌ها می‌توانند نگاهی به تعداد پیام‌های احتمالی برای نادیده گرفتن شدن بیندازند اگر این قانون در عمل اجرایی می‌شد، و در آینده تصمیم بگیرند که به چنین قابلیتی نیاز دارند یا خیر.
عبارت سوم به مدیرسیستم اجازه می‌دهد که فهرست سیاه و سفیدی از سرورهای ایمیل، که در فایل /etc/postfix/access_clientip ذخیره می‌شوند، ایجاد کند. سرورهای موجود در فهرست سفید قابل اعتماد در نظر گرفته می‌شوند و ایمیل‌های ارسالی از آن‌ها از قوانین فیلترینگ گفته شده عبور داده نمی‌شوند.
دو قانون آخر نیز تمام پیام‌های ارسالی از طرف یکی از سرورهای موجود در فهرست سیاه را رد می‌کنند. RBL مخفف عبارت Remote Black List است؛ چنین فهرست‌های موجود است اما تمام آن‌ها شامل سرورهایی هستند که به شیوه‌ای بد پیکربندی شده‌اند که اسپمرها از آن‌ها برای بازپخش ایمیل‌های خود استفاده می‌کنند، این رایانه‌ها اغلب توسط کرم‌ها یا ویروس‌ها آلوده گشته‌اند.

11.1.3.2. بررسی اعتبار دستورات EHLO یا HELO

هر تبادل SMTP با یک دستور HELO (یا EHLO) آغاز می‌شود، به همراه نام سرور ایمیل فرستنده؛ بررسی اعتبار این نام می‌تواند کار جالبی باشد.

مثال 11.7. محدودیت‌های نام اعلام شده در EHLO

smtpd_helo_restrictions = permit_mynetworks,
    reject_invalid_hostname,
    check_helo_access hash:/etc/postfix/access_helo,
    reject_non_fqdn_hostname,
    warn_if_reject reject_unknown_hostname
عبارت ابتدایی permit_mynetworks به تمام رایانه‌های شبکه محلی اجازه می‌دهد که خود را آزادانه معرفی کنند. این مهم است چرا که برخی برنامه‌های ایمیل برای این بخش از پروتکل SMTP به اندازه کافی احترام قائل نیستند و آن‌ها می‌توانند خود را با نام‌های مهمل معرفی کنند.
قانون reject_invalid_hostname ایمیل‌هایی را که شامل غلط نگارشی در EHLO باشند رد می‌کند. قانون reject_non_fqdn_hostname پیام‌هایی را رد می‌کند که نام میزبان آن‌ها یک نام دامنه تمام-عیار نباشد (شامل نام دامنه به همراه نام میزبان). قانون reject_unknown_hostname پیام‌هایی را رد می‌کند که نام میزبان آن‌ها درون DNS موجود نباشد. از آنجا که این قانون آخر منجر به رد بسیاری پیام‌ها می‌شود مدیرسیستم‌ها تصمیم گرفته‌اند که آن را با یک عملگر warn_if_reject به صورت پیام اخطار ساده‌ای تبدیل کنند؛ آن‌ها می‌توانند در مرحله دیگری این عملگر را حذف کنند، پس از اینکه از نتایج آن باخبر شوند.
استفاده از permit_mynetworks به عنوان قانون اول یک تاثیر جانبی جالب دارد: قوانین پیش رو تنها برای میزبان‌های خارج از شبکه محلی اعمال می‌شوند. اینکار امکان افزودن تمام میزبان‌هایی که قصد معرفی خود بجای falcot.com را دارند، به فهرست سیاه فراهم می‌آورد، برای نمونه، با افزودن یک خط گمشو بیرون، تو که تو شبکه ما نیستی! به فایل /etc/postfix/access_helo.

11.1.3.3. پذیرش یا رد مبتنی بر فرستنده اعلام شده

هر پیام شامل فرستنده است، که توسط دستور MAIL FROM از پروتکل SMTP اعلام می‌شود؛ مجدد، این اطلاعات می‌توانند به چندین روش ارزیابی گردند.

مثال 11.8. بررسی‌های فرستنده

smtpd_sender_restrictions = 
    check_sender_access hash:/etc/postfix/access_sender,
    reject_unknown_sender_domain, reject_unlisted_sender,
    reject_non_fqdn_sender
جدول /etc/postfix/access_sender با برخی فرستندگان به شیوه‌ای خاص برخورد می‌کند. این معمولا به معنی قراردادن برخی فرستندگان در فهرست سیاه و سفید است.
قانون reject_unknown_sender_domain نیازمند یک دامنه معتبر فرستنده است، چرا که برای یک نشانی معتبر لازم است. قانون reject_unlisted_sender کاربران محلی که نشانی آن‌ها موجود نباشد را رد می‌کند؛ اینکار از ارسال پیام‌هایی که از نشانی‌های نامعتبر وابسته به دامنه falcot.com می‌آیند، جلوگیری می‌کند. پیام‌هایی که به شکل joe.bloggs@falcot.com باشند تنها در شرایط وجود چنین نشانی پذیرفته می‌شوند.
در نهایت، قانون reject_non_fqdn_sender پیام‌هایی که از یک نشانی بدون نام دامنه تمام-عیار ارسال شوند را رد می‌کند. در عمل، یعنی پیام‌هایی که به صورت user@machine باشند: نشانی باید به صورت user@machine.example.com یا user@example.com اعلام گردد.

11.1.3.4. پذیرش یا رد مبتنی بر گیرنده

هر ایمیل حداقل یک گیرنده دارد، که توسط دستور RCPT TO از پروتکل SMTP معرفی می‌شود. این نشانی‌ها همچنین عملیات اعتبارسنجی را تضمین می‌کنند، حتی اگر از بررسی‌های انجام شده روی نشانی فرستنده مشخص نباشد.

مثال 11.9. بررسی‌های گیرنده

smtpd_recipient_restrictions = permit_mynetworks, 
    reject_unauth_destination, reject_unlisted_recipient, 
    reject_non_fqdn_recipient
reject_unauth_destination قانون پایه‌ای است که پیام‌های خارجی را ملزم می‌سازد نشانی ما را داشته باشند؛ پیام‌هایی که به نشانی خارج از محدوده پوشش این سرور فرستاده شوند رد می‌شوند. بدون این قانون، یک سرور به سیستم بازی تبدیل می‌شود که به اسپمرها اجازه می‌دهد پیام‌های ناخواسته خود را ارسال کنند؛ بنابراین این قانون الزامی است و بهتر است که در قسمت ابتدایی فهرست قرار گیرد، تا قبل از مشخص نشدن گیرنده یک پیام، هیچ قانون دیگری نتواند آن را بررسی کند.
قانون reject_unlisted_recipient پیام‌های ارسالی به کاربران غیرواقعی را رد می‌کند، که با عقل جور در می‌آید. در نهایت، قانون reject_non_fqdn_recipient نشانی‌هایی که تمام-عیار نباشند را رد می‌کند؛ این قانون منجر می‌شود که پیام به jean یا jean@machine ارسال نشود و نیازمند نشانی کامل می‌باشد از جمله jean@machine.falcot.com یا jean@falcot.com.

11.1.3.5. محدودیت‌های مرتبط با دستور DATA

دستور DATA از پروتکل SMTP قبل از محتوای پیام قرار می‌گیرد. با اینکه هیچ اطلاعات خاصی را فراهم نمی‌کند، بجز معرفی قسمت بعدی، می‌تواند مورد بررسی قرار گیرد.

مثال 11.10. بررسی‌های DATA

smtpd_data_restrictions = reject_unauth_pipelining
عبارت reject_unauth_pipelining زمانی منجر به رد پیام می‌شود که فرستنده آن دستوری را قبل از پاسخ به دستور قبلی فرستاده باشد. این عملکرد در مقابل شیوه کار ربات‌های اسپمر قرار می‌گیرد، چرا که آن‌ها اغلب اهمیتی به پاسخ‌ها نمی‌دهند و تمرکز خود را روی ارسال بیشترین پیام در کمترین زمان معطوف می‌سازند.

11.1.3.6. اعمال محدودیت‌ها

با اینکه دستورات بالا اطلاعات را در مرحله‌های گوناگونی از فرآیند تبادل SMTP بررسی می‌کنند، Postfix عملیات رد پیام را در پاسخ به دستور RCPT TO ارسال می‌کند.
یعنی حتی اگر پیام مبتنی بر یک دستور نامعتبر ... رد شده باشد، Postfix از فرستنده و گیرنده پیام هنگام اعلام رد آن آگاه است. در این مرحله است که می‌تواند پیام مرتبط‌تری را در فایل‌های گزارش قرار دهد تا اینکه همان ابتدای کار این فرآیند متوقف می‌شد. علاوه بر این، تعدادی از برنامه‌های SMTP انتظار شکست عملیات در همان دستورات ابتدایی SMTP را ندارند و این برنامه‌ها کمتر با این عملیات رد دیرموقع، مختل می‌‌شوند.
مزیت نهایی این انتخاب این است که قوانین می‌توانند طی مراحل مختلف تبادل SMTP اطلاعات زیادی کسب کنند؛ این باعث می‌شود مجوزهای بهتری را بتوان تعریف کرد، از جمله رد یک ارتباط غیر-محلی که خود را به عنوان یک فرستنده محلی معرفی کرده باشد.

11.1.3.7. فیلترکردن مبتنی بر محتوای پیام

سیستم ارزیابی و ایجاد محدودیت بدون ایجاد روشی برای بررسی متن پیام کامل نیست. Postfix بین بررسی‌های انجام گرفته روی سرآیند ایمیل و بدنه آن تفاوت قائل می‌شود.

مثال 11.11. فعال‌سازی فیلترهای محتوا-محور

header_checks = regexp:/etc/postfix/header_checks
body_checks = regexp:/etc/postfix/body_checks
هر دو فایل شامل فهرستی از عبارت‌های منظم (که به نام regexps یا regexes نیز شاخته می‌شوند) و اقدامات مربوط به هر کدام در صورت تطبیق سرآیند یا بدنه ایمیل با آن‌ها می‌باشند.

مثال 11.12. نمونه فایل /etc/postfix/header_checks

/^X-Mailer: GOTO Sarbacane/ REJECT I fight spam (GOTO Sarbacane)
/^Subject: *Your email contains VIRUSES/ DISCARD virus notification
اولی به بررسی سرآیند می‌پردازد که آیا شامل نرم‌افزار ایمیل هست یا خیر؛ اگر GOTO Sarbacane (یک نرم‌افزار ایمیل انبوه) پیدا شد، پیام رد می‌شود. عبارت دوم نیز به بررسی محتوای پیام می‌پردازد؛ اگر شامل یک اطلاعیه ویروس باشد، می‌توان تصمیم گرفت بجای رد ایمیل، آن را نادیده بگیریم.
استفاده از این فیلترها مانند راه رفتن روی لبه تیغ است، چرا که در صورت عمومی در نظر گرفتن این قوانین ممکن است بسیاری از ایمیل‌های معتبر و قانونی را از دست بدهیم. در این موارد، نه تنها پیام‌ها از دست می‌روند، بلکه برای فرستندگان آنان نیز پیام‌های خطای آزاردهنده ارسال می‌گردد.

11.1.4. برپایی فهرست خاکستری

"فهرست خاکستری" یک تکنیک فیلترکردن است به طوری که در ابتدا پیام به صورت موقت رد می‌شود و در صورت گذشت یک بازه زمانی و تلاش مجدد، مورد پذیرش قرار می‌گیرد. این تکنیک اغلب در مورد رایانه‌هایی که توسط کرم‌ها و ویروس‌ها آلوده شده‌اند به خوبی جواب می‌دهد، چرا که این گونه نرم‌افزارها به ندرت به عنوان یک برنامه کامل SMTP عمل می‌کنند (با بررسی کد خطا و تلاش مجدد برای ارسال پیام در زمان دیگر)، به خصوص که بسیاری از نشانی‌های برداشت شده برای اینکار در حقیقت نامعتبر هستند و تلاش مجدد برای ارسال فقط به معنی اتلاف زمان است.
Postfix به خودی خود شامل فهرست خاکستری نیست، اما گزینه‌ای وجود دارد که تصمیم‌گیری برای پذیرش یا رد یک پیام را می‌توان به یک برنامه خارجی سپرد. بسته postgrey شامل همین عملکرد است، که به منظور سیاست دسترسی به عنوان سرویس نماینده طراحی شده است.
زمانی که postgrey نصب شود، به عنوان یک فرآیند پس‌زمینه به درگاه ۱۰۰۲۳ گوش می‌کند. سپس می‌توان با تنظیم پارامتر check_policy_service در Postfix، آن را به این منظور پیکربندی کرد:
smtpd_recipient_restrictions = permit_mynetworks,
    [...]
    check_policy_service inet:127.0.0.1:10023
هر زمان که Postfix به این قانون می‌رسد، به فرآیند پس‌زمینه postgrey متصل شده و اطلاعات مرتبط با پیام را به آن ارسال می‌کند. Postgrey در سمت خود، سه‌گانه نشانی IP/فرستنده/گیرنده را برای وجود در پایگاه‌داده خود مورد بررسی قرار می‌دهد. اگر وجود داشت، Postgrey اطلاع می‌دهد که پیام باید پذیرفته شود؛ در غیر اینصورت، پاسخی که نشان‌دهنده رد موقتی پیام است به همراه سه‌گانه مذکور در پایگاه‌داده خود ذخیره‌سازی می‌کند.
اشکال اصلی فهرست خاکستری این است که پیام‌های قانونی با تاخیر مواجه می‌شوند، که برای همیشه قابل قبول نیست. همچنین بار سرورهایی که بسیاری ایمیل‌های قانونی را ارسال می‌کنند، افزایش می‌‌دهد.

11.1.5. سفارشی‌سازی فیلترها مبتنی بر گیرنده

قسمت‌های قسمت 11.1.3, “محدودیت برای ارسال و دریافت” و قسمت 11.1.4, “برپایی فهرست خاکستری بسیاری محدودیت‌های ممکن را بررسی کرده‌اند. همگی آن‌ها کاربرد خود برای محدودکردن بخشی از اسپم‌ها را دارند اما شامل نواقصی نیز هستند. بنابراین بسیار متداول است که مجموعه فیلترهای بکار رفته روی گیرنده را سفارشی‌سازی کرد. در شرکت فالکوت، استفاده از فهرست خاکستری در کار اغلب کاربران مشکلی بوجود نمی‌آورد اما برخی نیز نیاز به تاخیر بسیار کمی در کار خود دارند (از جمله واحد پشتیبانی فنی). به همین شکل، واحد تجاری گاهی اوقات مشکلاتی با برخی مشتریان آسیایی دارد که در فهرست سیاه قرار گرفته‌اند؛ این واحد درخواست یک نشانی بدون فیلتر به منظور مکاتبه با آن‌ها را دارد.
Postfix با استفاده از مفهوم “کلاس محدودیت” امکان سفارشی‌سازی فیلترها را فراهم می‌کند. کلاس‌ها در پارامتر smtpd_restriction_classes قرار گرفته و به شیوه مشابه smtpd_recipient_restrictions تعریف شده‌اند. عبارت check_recipient_access نگاشتی بین یک گیرنده و مجموعه‌ای از محدودیت‌های آن برقرار می‌کند.

مثال 11.13. تعریف کلاس‌های محدودیت در main.cf

smtpd_restriction_classes = greylisting, aggressive, permissive

greylisting = check_policy_service inet:127.0.0.1:10023
aggressive = reject_rbl_client sbl-xbl.spamhaus.org,
        check_policy_service inet:127.0.0.1:10023
permissive = permit

smtpd_recipient_restrictions = permit_mynetworks,
        reject_unauth_destination,
        check_recipient_access hash:/etc/postfix/recipient_access

مثال 11.14. فایل /etc/postfix/recipient_access

# Unfiltered addresses
postmaster@falcot.com  permissive
support@falcot.com     permissive
sales-asia@falcot.com  permissive

# Aggressive filtering for some privileged users
joe@falcot.com         aggressive

# Special rule for the mailing-list manager
sympa@falcot.com       reject_unverified_sender

# Greylisting by default
falcot.com             greylisting

11.1.6. یکپارچه‌سازی آنتی‌ویروس

طیف گسترده ویروس‌هایی که به عنوان فایل ضمیمه در ایمیل‌ها قرار می‌گیرند نیاز به استفاده از یک آنتی‌ویروس در نقطه ابتدایی شبکه شرکت را با اهمیت می‌سازد، چرا که با وجود آگاهی‌رسانی‌های بسیار، هنوز برخی کاربران اقدام به باز کردن فایل‌های ضمیمه پیام‌های ناخواسته می‌کنند.
مدیرسیستم‌های فالکوت clamav را به عنوان آنتی‌ویروس آزاد خود انتخاب کرده‌اند. بسته اصلی clamav نام دارد، اما آن‌ها اقدام به نصب بسته‌های اضافی از جمله arj، unzoo، unrar و lha نیز کرده‌اند چرا که استفاده از این بسته‌ها به منظور بررسی محتوای فایل‌های ضمیمه با قالب‌های مختلف مورد نیاز است.
وظیفه برقراری ارتباط بین آنتی‌ویروس و سرور ایمیل بر عهده clamav-milter است. یک milter (که مخفف mail filter است) یک برنامه فیلترکردن بخصوص است که برای تعامل با سرورهای ایمیل طراحی شده است. یک milter از یک رابط استاندارد برنامه‌نویسی یا API استفاده می‌کند که عملکرد بهتری در مقایسه با فیلترهای خارجی برای سرورهای ایمیل فراهم می‌کند. milterها در ابتدا توسط Sendmail معرفی شدند اما Postfix به زودی از آن‌ها پشتیبانی کرد.
زمانی که بسته clamav-milter نصب شود، فیلتر ایمیل باید به گونه‌ای پیکربندی شود که روی یک درگاه TCP جدا از مقدار پیشفرض سوکت نامگذاری شده قرار بگیرد. اینکار با استفاده از dpkg-reconfigure clamav-milter صورت می‌گیرد. زمانی که پرسش “Communication interface with Sendmail” مطرح می‌شود، “inet:10002@127.0.0.1” را پاسخ دهید.
پیکربندی استاندارد ClamAV برای اکثر موقعیت‌های مناسب است، اما برخی پارامترهای مهم هنوز می‌توانند با استفاده از دستور dpkg-reconfigure clamav-base سفارشی گردند.
گام آخر اطلاع‌رسانی به Postfix درباره فیلتر تازه-پیکربندی شده است که به سادگی افزودن عبارت زیر به /etc/postfix/main.cf است:
# Virus check with clamav-milter
smtpd_milters = inet:[127.0.0.1]:10002
اگر آنتی‌ویروس مشکلاتی را بوجود آورد، می‌توان این خط را حذف و با اجرای دستور service postfix reload تغییرات اعمال شده را تنظیم کرد.
اکنون تمام پیام‌های ارسالی به Postfix از طریق فیلتر آنتی‌ویروس عبور داده می‌شوند.

11.1.7. SMTP احرازهویت شده

به منظور امکان ارسال ایمیل ابتدا باید به سرور SMTP دسترسی داشت؛ همچنین نیازمند سرور SMTP گفته شده به منظور ارسال ایمیل از درون خود است. برای کاربران رومینگ، اینکار نیازمند تغییر مداوم پیکربندی برنامه SMTP است چرا که سرور SMTP فالکوت پیام‌هایی را که نشانی‌های IP خارج از شرکت را داشته باشند رد می‌کند. دو راه حل موجود است: یا کاربر رومینگ سرور SMTP را روی رایانه خود نصب کند یا کماکان به شیوه‌ای از سرور شرکت استفاده کنند که به عنوان یک کارمند احرازهویت شوند. راه اول توصیه نمی‌شود چرا که رایانه ممکن است همیشه متصل نباشد و در صورت بروز مشکل امکان ارسال مجدد پیام وجود نخواهد داشت؛ ما روی راه حل دوم تمرکز می‌کنیم.
احرازهویت SMTP در Postfix نیازمند SASL یا Simple Authentication and Security Layer است. اینکار نیازمند نصب بسته‌های libsasl2-modules و sasl2-bin، سپس ثبت گذرواژه در پایگاه‌داده SASL برای هر کاربری که نیازمند احرازهویت با استفاده از سرور SMTP است. اینکار با استفاده از دستور saslpasswd2 انجام می‌شود که چندین پارامتر را دریافت می‌کند. گزینه -u دامنه احرازهویت را تعریف می‌کند که باید با پارامتر smtpd_sasl_local_domain در پیکربندی Postfix یکسان باشد. گزینه -c اجازه تعریف یک کاربر جدید و -f اجازه تعریف فایل پیکربندی آن را می‌دهد در صورتی که نیاز باشد پایگاه‌داده SASL در مسیر دیگری بجز /etc/sasldb2 قرار بگیرد.
# saslpasswd2 -u `postconf -h myhostname` -f /var/spool/postfix/etc/sasldb2 -c jean
[... type jean's password twice ...]
نکته اینکه پایگاه‌داده SASL در دایرکتوی Postfix ایجاده شده است. به منظور حصوص اطمینان از یکپارچگی، فایل /etc/sasldb2 را با دستور ln -sf /var/spool/postfix/etc/sasldb2 /etc/sasldb2 به یک پیوند نمادین پایگاه‌داده مورد استفاده Postfix تبدیل کرده‌ایم.
اکنون نیازمند پیکربندی Postfix برای استفاده از SALS هستیم. ابتدا کاربر postfix باید به گروه sasl اضافه گردد تا بتواند به پایگاه‌داده SASL دسترسی داشته باشد. برای فعال‌سازی SASL به چندین پارامتر دیگر نیاز است و پارامتر smtpd_recipient_restrictions نیز به منظور اجازه به برنامه‌های احرازهویت شده با SASL برای ارسال ایمیل، مورد نیاز است.

مثال 11.15. فعال‌سازی SASL در /etc/postfix/main.cf

# Enable SASL authentication
smtpd_sasl_auth_enable = yes
# Define the SASL authentication domain to use
smtpd_sasl_local_domain = $myhostname
[...]
# Adding permit_sasl_authenticated before reject_unauth_destination
# allows relaying mail sent by SASL-authenticated users
smtpd_recipient_restrictions = permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
[...]