Postfix, Dovecot ve MySQL, mükemmel karışım.

2. Postfix Kurulumu

Postfix kurulumu hiç korktuğunuz gibi değil, gayet kolay bir şekilde olacak merak etmeyin. Öncelikle bir kaç tane dosyaya ihtiyacımız var, bunlarla postfix’i MySQL ile konuşturacağız. Dosyaları tek tek yaratmakla uğraşmak istemiyorsanız, yukarıda verdiğim adreste hepsini bulabilirsiniz, tüm virtual map dosyalarını /etc/postfix/maps/ dizini içine koymalı, veya başka yere koyacaksanız main.cf içerisinde gerekli değişiklikleri yapmalısınız.

# mysql-virtual_access.cf
user = root
password = zagorTenay
dbname = mailAdmin
query = SELECT Durum FROM Access WHERE Adres='%s' AND Status='1' -- Virtual Access
hosts = 127.0.0.1
# mysql-virtual_bcc.cf
user = root
password = zagorTenay
dbname = mailAdmin
query = SELECT Destination FROM BCC WHERE Original='%s' AND Status='1' -- Virtual BCC
hosts = 127.0.0.1
# mysql-virtual_domains.cf
user = root
password = zagorTenay
dbname = mailAdmin
query =  SELECT Name FROM Domains WHERE Name='%s' AND Status='1' -- Virtual Domains
hosts = 127.0.0.1
# mysql-virtual_email2email.cf
user = root
password = zagorTenay
dbname = mailAdmin
query = SELECT Username FROM Users WHERE Username='%s' AND Status='1' -- Virtual E2E
hosts = 127.0.0.1
# mysql-virtual_alias.cf
user = root
password = zagorTenay
dbname = mailAdmin
query = SELECT Destination FROM Alias WHERE Original='%s' AND Status='1' -- Virtual Alias
hosts = 127.0.0.1
# mysql-virtual_users.cf
user = root
password = zagorTenay
dbname = mailAdmin
query = SELECT CONCAT(SUBSTRING_INDEX(Username,'@',-1),'/',SUBSTRING_INDEX(Username,'@',1),'/') FROM Users WHERE Username='%s' AND Status='1' -- Virtual Users
hosts = 127.0.0.1
# mysql-virtual_mailbox_limit_maps.cf
user = root
password = zagorTenay
dbname = mailAdmin
query = SELECT Quota FROM Users WHERE Username='%s' AND Status='1' -- Virtual Quota
hosts = 127.0.0.1
# mysql-virtual_transport.cf
user = root
password = zagorTenay
dbname = mailAdmin
query = SELECT Destination FROM Transport WHERE Original='%s' and Status='1' -- Virtual Transport
hosts = 127.0.0.1

Query satırlarının sonunda — ve query’nin ne yaptığı yazıyor, bunları silmenize gerek yok çünkü MySQL — gördü mü gerisini okumuyor. Böylece Deneme kısmında göreceğimiz üzere loglarımızda hangi queryler nasıl çalışıyor izleyebileceğiz ve herhangi bir müdahale gerekirse hemen uygulayabileceğiz. MySQL ayar dosyalarının içerisindeki şifreyi ve veritabanını çok kolay bir şekilde değiştirebilirsiniz;

for i in mysql-virtual_*; do sed 's/root/yeni_DB_Kullanicisi/' $i > $i.tmp; mv $i.tmp $i; done
for i in mysql-virtual_*; do sed 's/zagorTenay/yeni_DB_Sifresi/' $i > $i.tmp; mv $i.tmp $i; done
for i in mysql-virtual_*; do sed 's/mailAdmin/yeni_DB_Adi/' $i > $i.tmp; mv $i.tmp $i; done

mysql-virtual_access.cf dosyasına gelince, bu dosya kimin mail gönderip kimin gönderemeyeceğini tutan bir tablo, bunu kullanarak çok sık SPAM yapanları sistemden uzak tutuyoruz. Orada ‘550 No soup for you, next!‘ diye default olarak gelen bir satır var, bu satırı başındaki 550’yi sabit tutarak başka bir şeyle veya 550’yi de silerek direkt REJECT yazarak değiştirebilirsiniz. Tabi bu dosya aslında aynı zamanda bir beyaz liste, eğer gerekiyorsa REJECT veya 550 … yerine OK yazarak domain veya kullanıcıdan gelen maillerin asla SPAM statüsüne düşmemesini de sağlayabilirsiniz.

Bizim kurduğumuz sistem sadece tek bir kullanıcı ile çalışacak, o yüzden kendi kullanıcımızı kendimiz yaratacağız. Yalnız burada dikkat edilmesi gereken nokta kullanıcının ev dizininin (home directory) nerede olacağı. Her yaptığım kurulumda /home klasörünü ayrı bir bölüme alıyorum, böylece güncelleme ve yapılacak değişikliklerden en az derecede etkileniyor, en önemlisi de yedek alması da kolay oluyor. Kullanıcımıza normal kullanıcı numaralarından farklı bir grup ve kullanıcı id’si vereceğiz, 5000 uygun bir rakam.

groupadd vmail --gid 5000
useradd --gid 5000 --uid 5000 -s /bin/false -d /home/vmail vmail
mkdir /home/vmail
chown 5000:5000 /home/vmail

Sunucumuzun bir de ismi olmalı ki başka bir mail sunucusuna bağlandığımızda kendimizi tanıtabilelim.

echo buraya.bir.domain.yaz > /etc/mailname

Şimdi postfix’in main.cf ayarlarını yapalım;

# bu bizim karşı tarafa göndereceğimiz sunucu ismimiz
myhostname = buraya.bir.domain.yaz.com
# burası hangi domainler için mail alacağımız,
# ama aslında bunu mysql ile halledeceğiz.
mydestination = buraya.bir.domain.yaz.com, localhost, localhost.localdomain
# hangi networkler güvenebileceğimiz networkler
mynetworks = 127.0.0.0/8 192.168.1.0/24
# tüm ağ bağlantılarını dinleyeceğiz
inet_interfaces = all
# sistem genelindeki yönlendirmeler, temel sunucu işlemleri için gerekli
# ancak içerisinde bir değişiklik yapmak şart değil
alias_maps = hash:/etc/aliases
# mbox yerine Maildir formatını kullanacağız.
home_mailbox = Maildir/
# burada SASL ayarlarını yapacağız ve SASL arayüzü olarak
# Cyrus yerine Dovecot'u kullanacağız
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth-client
smtpd_sasl_security_options = noanonymous
smtpd_sasl_authenticated_header = yes
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
# karşı taraf bize mutlaka kim olduğunu söylemeli
smtpd_helo_required = yes
# virtual tanımlamalar, burası MySQL ile göz göze geldiğimiz yer
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:/etc/postfix/maps/alias.cf,
 mysql:/etc/postfix/maps/email2email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/maps/domain.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/maps/user.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/maps/mailboxLimit.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = 'The user you are trying to reach is over quota.'
virtual_overquota_bounce = no

transport_maps = proxy:mysql:/etc/postfix/maps/transport.cf

# ah burası en sevdiğim yer, burada hangi kullanıcının maillerini
# hangi kullanıcıya çaktırmadan yönlendirebileceğimizi tanımlıyoruz.
# standart sunucular için şart değil, ama özellikle şirket içinde kullanım
# için gerekli olabiliyor, dikkat edilmesi gereken nokta sender_bcc_maps ile
# sadece gelen değil, giden epostaları da kopyalıyor.
sender_bcc_maps = proxy:mysql:/etc/postfix/maps/bcc.cf
recipient_bcc_maps = proxy:mysql:/etc/postfix/maps/bcc.cf

# burada tanımladığımız dosyaları bir ön okuma yapıyoruz ki
# daha sonra her seferinde dosyaları aramayalım.
proxy_read_maps = $alias_maps
 $local_recipient_maps
 $mydestination
 $virtual_alias_maps
 $virtual_alias_domains
 $virtual_mailbox_maps
 $virtual_mailbox_domains
 $virtual_accesslist
 $virtual_mailbox_limit_maps
 $transport_maps
 $sender_bcc_maps
 $recipient_bcc_maps
 $relay_recipient_maps
 $relay_domains
 $canonical_maps
 $sender_canonical_maps
 $recipient_canonical_maps
 $relocated_maps
 $mynetworks

# burada hangi kullanıcıların hangi şartlarla izinli olduğunu anlatıyoruz
# eğer postgrey kullanmayacaksanız en alttaki check_policy_service satırının
# başına # koyun. aman dikkat, #'den önce mutlaka bir boşluk olmalı, yoksa mailler
# asla size ulaşmaz, en güzeli silin siz, #'yle falan uğraşmayın.
smtpd_recipient_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_unauth_destination,
 reject_invalid_hostname,
 reject_unauth_pipelining,
 reject_non_fqdn_sender,
 reject_unknown_sender_domain,
 reject_non_fqdn_recipient,
 reject_unknown_recipient_domain,
 check_sender_access mysql:/etc/postfix/maps/access.cf,
 reject_rbl_client cbl.abuseat.org,
 reject_rbl_client bl.spamcop.net,
 reject_rbl_client sbl.spamhaus.org,
 reject_rhsbl_sender blackhole.securitysage.com,
 reject_rhsbl_client blackhole.securitysage.com,
 check_policy_service inet:127.0.0.1:10023,
 permit

Şimdilik yapacağımız Postfix ayarları bu kadar. Postfix’le alakalı olarak, tek yapmamız gereken ayar postgrey ayarları. Postgrey postfix’e müthiş yardımcı olan bir program, tek yaptığı mail geldiği zaman önce geçici sebeplerden dolayı kapalıyız mesajı göndermek. Düzgün yapılandırılmış bir mail sistemi gitmeyen mailleri tekrar denemek zorundadır, postgrey ise tekrar gönderilene kadar mailleri tutar. Tekrar gönderildiğinde ise eğer gerekli zaman dolmuşsa maili son kullanıcıya iletilmek üzere kabul eder. Bekleme süresi 300 saniye, yani 5 dakikadır. Daha az veya daha fazla beklemesini sağlamak için /etc/default/postgrey ayar dosyasını kurcalamanız yeterli olacaktır. Neden güzel olduğuna gelince SPAM yapan programlar genelde mail sunucusu mantığı ile değil, doğrudan mail sunucusuna talep yollamak üzere ayarlandığı için tekrar deneme ihtiyacı duymazlar, bu yüzden SPAM’in önünü kesmek için müthiş etkilidir.

Postfix’in SSL sertifikaları ile donatılması da mümkün, ancak bununla ilgili şu anda bir şey yazmadım. Kaynakça’da belirttiğim siteleri ziyaret ederek bu konuda da bilgi alabilirsiniz.

Son olarak /etc/aliases adında bir dosya olup olmadığını kontrol edin, eğer bu dosya yoksa

echo postmaster: root > /etc/aliases

ile yaratıp,

newaliases

komutu ile postfix’in okuyabileceği hale getirebilirsiniz. Tüm değişiklikleri yaptıktan sonra kısaca şöyle çalıştırabiliriz;

/etc/init.d/postfix restart

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir