Когато някой праща писмо от интернет, примерно john@example.org писмото ще се достави по протокола SMTP до нашия сървър. Нашия сървър одобрява example.org и приема писмото. John се връзва към нашия сървър и чрез протоколите POP3 или IMAP си получава писмото.
Приемаме, че John някъде в интернет изпраща съобщение до lisa@example.org. Нашия сървър не носи отговорност за домейна example.org. Просто не може да се опишат всички домейни в сървъра ни, и така тя ще получи писмото. Но представете си че сме указали на нашия сървър John да използва forward услугата до всички (примерно е маркетинг и автоматично праща реклами до всички). Това ще накара lisa@example.org също да получи тези реклами. Това за нея обаче е спам. По този начин работят хакерите(спамъри). Изпращат милиони съобщения от името на John и когато не е удостоверен няма как да се докаже , че писмото не е от John.
С удостоверяване на SMTP, John може да докаже своята идентичност. Това е както в първия случай но тогава John праща потребителското си име и парола. Разбира се всичко това се случва след като се уверим, че минава през криптирана връзка.
В допънение към използването на SMTP, може да се укаже на Postfix, от кои мрежи да обработва електронната поща. Самата променлива се намира в /etc/postfix/main.cf и съдържа набор от IP адреси и мрежи на които има доверие сървъра. Обикновено тук се указва локалната мрежа ако се ползва пощенски клиент по клиентските компютри, и същите компютри работят в локалната мрежа. Ако потребителя ползва само WEB пощенски клиент , работещ на пощенския сървър (примерно RoundCube) то mynetworks трябва да изглежда така mynetworks = localhost.
Да се идентифицира SMTP с Postfix е малко остаряло понятие. Това се правеше, чрез SASL (Simple Authentication и Layer Security) библиотека, която е била част от Cyrus пощенски сървър. Така на практика е почти невъзможно да се проверяват грешки. В сегашно време Postfix иска от сървъра Dovecot за проверка на потребителското име и парола. Това просто трябва да се укаже в Postfix. В случая ще го изпълним с команди от конзолата, но може и да се редактира /etc/postfix/main.cf
# postconf smtpd_sasl_type=dovecot # postconf smtpd_sasl_path=private/auth # postconf smtpd_sasl_auth_enable=yes
Това позволява SMTP удостоверяване и задължава Postfix да ползва Dovecot, използвайки сокета /var/spool/postfix/private/auth. Трябва да си спомняте, че Postfix работеше в sandboxd chroot директория. Така дефинирахме Dovecot да сложи socket в директорията, за да може от там Postfix да комуникира.
Следните настройки позволяват криптиране (ключ и сертификат)
# postconf smtpd_tls_security_level=may # postconf smtpd_tls_auth_only=yes # postconf smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem # postconf smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
Последните два реда съществуват при инсталацията и няма смисъл да се правят. В по-предни версии бе необходимо да се ползва smtpd_recipient_restrictions за ограничение на нерегистрирани потребители. В новата версия на Postfix (Jessie 2.11) има по-добри настройки по подразбиране. Postfix предлага настройките smtpd_relay_restrictions. mtpd_tls_security_level е настроен в режим may (може), за да позволи криптирана комуникация, когато Postfix получава поща. Параметъра smtpd_tls_auth_only=yes следи да не би случайно или поради незнание потребителите да пратят паролите си по интернет не криптирано. Едно малко отклонение. В случая ползваме сертификат и ключ които се генерират с инсталацията на Debian. Продължителността им на валидация е малка, затова на по-късен етап ще генрираме нови и ще ги заменим.
За да проверим работата ще ползваме telnet, който трябва да го инсталираме
# apt-get install telnet
Сега и самата проба
# telnet localhost smtp Trying ::1... Connected to localhost. Escape character is '^]'. 220 home.tlan.net ESMTP Postfix (Debian/GNU) ehlo home.tlan.net 250-home.tlan.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN quit 221 2.0.0 Bye Connection closed by foreign host.
250-home.tlan.net
250-PIPELINING - Функция за ускоряване на SMTP комуникацията. Това позволява на отдалечените сървъри да изпращат заявки без да чакат отговор. Postfix просто ще съхрани тези команди и ще ги изпълни една по една. Тази функция се изключва предимно за защита от спам атаки.
250-SIZE 10240000 - Отдалечения сървър може да праща пощи максиму 10МБ.
250-VRFY - Позволява на отдалечени сървъри да проверят даден мейл адрес. Примерно отдалечения сървър запитва „VRFY tachko“ и нашия да отговори „250 John Doe
# telnet localhost smtp Trying ::1... Connected to localhost. Escape character is '^]'. 220 home.tlan.net ESMTP Postfix (Debian/GNU) ehlo home.tlan.net 250-home.tlan.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN starttls 220 2.0.0 Ready to start TLS quit Connection closed by foreign host.
На практика вече SMTP комуникира криптирано и ще трябва да пишем криптирани команди които ние не владеем. За целта използваме нова команда за тест
# openssl s_client -connect localhost:25 -starttls smtp Появяват се много символи и накрая въвеждаме: ehlo home.tlan.net Резултата е следния: 250-home.tlan.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN И сега трябва да се напише криптиран код AUTH PLAIN am9obkBleGFtcGxlLm9yZwBqb2huQGV4YW1wbGUub3JnAHN1bW1lcnN1bg == 501 5.5.4 Syntax: AUTH mechanism quit 221 2.0.0 Bye closed
Кода не е верен защото егенериран за домейна example.com а ние сме с home.tlan.net.
# perl -MMIME::Base64 -e 'print encode_base64("tachko\@home.tlan.net\0tachko\@home.tlan.net\0Iceman")'; dGFjaGtvQGhvbWUudGxhbi5uZXQAdGFjaGtvQGhvbWUudGxhbi5uZXQASWNlbWFu
И пак да пробваме
# openssl s_client -connect localhost:25 -starttls smtp ............................. 250 DSN ehlo home.tlan.net Резултата е следния: 250-home.tlan.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN atth 502 5.5.2 Error: command not recognized auth plain dGFjaGtvQGhvbWUudGxhbi5uZXQAdGFjaGtvQGhvbWUudGxhbi5uZXQASWNlbWFu 235 2.7.0 Authentication successful quit 221 2.0.0 Bye closed
Работи прекрасно, продължаваме
Тук идеята е да се ползва порт 25 за транспортиране на имейла (МТА) от сървър до сървър и порт 587 (MSA) за имейл от един потребител към сървъра за електронна поща. Тъй като много потребители все още ползват SMTP по подразбиране то ще трябва да са активни и двата порта. За целта ще редактираме файла
# vi /etc/postfix/master.cf # # Postfix master process configuration file. For details on the format # of the file, see the master(5) manual page (command: "man 5 master" or # on-line: http://www.postfix.org/master.5.html). # # Do not forget to execute "postfix reload" after editing this file. # # ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (no) (never) (100) # ========================================================================== smtp inet n - y - - smtpd #smtp inet n - y - 1 postscreen #smtpd pass - - y - - smtpd #dnsblog unix - - y - 0 dnsblog #tlsproxy unix - - y - 0 tlsproxy #submission inet n - y - - smtpd submission inet n - - - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth -o smtpd_sasl_security_options=noanonymous -o smtpd_sender_login_maps=mysql:/etc/postfix/mysql-email2email.cf -o smtpd_sender_restrictions=reject_sender_login_mismatch -o smtpd_sasl_local_domain=$myhostname -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject # -o syslog_name=postfix/submission # -o smtpd_tls_security_level=encrypt # -o smtpd_sasl_auth_enable=yes # -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions
По принцип тази нова услуга ползва “smtpd” демона, който е част от софтуера и реагира ако се отвори SMTP връзка на порт 25. С въведените промени сложихме допълнителни опции. - в /var/log/mail.log се маркират връзките към порта за подаване, както е /postfix/submission/smtpd (syslog) - налагаме криптиране на този порт (ниво на сигурност) - налагаме идентификация на потребителя (SASL) - уверяваме се , че само заверен потребител може да изпрати имейл от свое име (sender_login_maps) След промените рестартираме Postfix
# /etc/init.d/postfix restart # /etc/init.d/postfix status
Всичко е наред .
Обърнете внимание на горната строфа която въведохме
-o smtpd_sender_login_maps=mysql:/etc/postfix/mysql-email2email.cf
Това изисква: - адреса на подателя - потребителско име което се ползва за проверка на достоверността на сървъра за електронна поща. В самия файл /etc/postfix/mysql-email2email.cf заявката на MySQL беще SELECT email FROM virtual_users WHERE email='%s'
Така потребителя когато иска да предава пощи, Postfix проверява virtual_users таблицата и търси адреса на подателя. Ако не го намери в таблицата ще върне отговор “reject” Следва WEB интерфейса на пощенския сървър