Ana Sayfa » *nix » qmail – Giden Postalar İçin DKIM İmplementasyonu

qmail – Giden Postalar İçin DKIM İmplementasyonu


BerbatKötüİdare EderGüzelHarika (Toplam 5 oy. 5 puan üzerinden ortalama 4,20 || Oy vererek siz de katkıda bulunabilirsiniz.)
Loading...

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYJ9MD7c' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
qmail_logo Bir kaç web sitesine üye olmuş kişilere, istekleri doğrultusunda gönderilecek bilgi ve duyuru maillerinin iletilmesi için qmail sunucular kullanıyorum. Kullandığınız MTA'nın ne olduğundan bağımsız olarak, çok sayıda mail gönderimi yapmak özellikle büyük e-mail sağlayıcıların sizi spammer olarak bellemesi için yeterli olabilir. Bu gibi bir duruma düşmemek için atmanız gereken bazı teknik adımlar bulunuyor.

Gönderdiğiniz maillerin, gerçekten sizin kurumunuz tarafınızdan yasal olarak gönderildiğini ispat etmeniz, spam filtrelerince spammer olarak bellenmenizi önleyecek adımlardan birisidir. Spam filtreleri artık içerik analizinden çok reputasyon'a yönelik filtrelemeye ağırlık verdiklerinden dolayı, güvenilir bir gönderici olduğunuzu belirtmeniz bu anlamda önemlidir.

Bildiğiniz gibi güvenilir gönderici olduğunuzu ispat etmek için izlenebilecek yollardan birisi   ( Identified Mail) kullanmaktır. Bu yazıda, 'in ne olduğuna değinip  qmail sunucularda giden postaların 'e uygun olarak imzalanması için gerekli kurulum notlarını paylaşacağım.

Yazının başında da belirttiğim gibi hatırı sayılır oranda üyesi olan bir kaç web sitesinin e-mail altyapısı için qmail kullanıyorum. Bu sistemde üyelere, gerek  “şifre hatırlatma” ve “hoşgeldin, beş gittin” tarzı transaction mailleri, gerekse de üye oldukları mail listeleri tarafından gönderilen çeşitli periyodik e-postalar gidiyor ve tüm bu gönderimlerin aylık ortalama adedi 15 ile 20 milyon arasında bir rakama tekabul ediyor.  Hal böyle olunca, sistemden gönderilen mailler her ne kadar kullanıcıların bizzat üye oldukları mail listelerinden ve şifre hatırlatma, yeni mesaj gelince uyarılma gibi site fasilitelerinden kaynaklanıyor olsa da gönderim oranınızın büyüklüğü, belli başlı büyük e-posta sağlayıcıları tarafından spammer olarak algılanmanız için yeterli olabilir… Tabii gerekli önlemleri almazsanız.

İşte bu önlemlerden birisi de, gönderilen maillerin tarafınızdan gönderildiğini ispat edebilmeniz için Domainkeys Identified Mail (DKIM) kullanmaktır.

DKIM Nedir ?


Dkim,  RFC4871‘de standartları belirlenmiş bir e-mail kimlik denetleme yöntemidir. Bu yöntem, gönderilen postaların gerçekten ilgili adresten gönderilip gönderilmediğinin tespit edilebilmesi için kullanılmaktadır. Örneğin bir spammer ya da phising saldırısı amaçlayan birisi sizin e-posta adresinizi From: adresine yazarak herhangi birine bir mail gönderebilir.  İşte DKIM aslında gerçek adres sahibinden gönderilmeyen forge edilmiş bu tip postaların saptanmasını amaçlamaktadır.

Bu yöntem ilk olarak DomainKeys adı altında Yahoo! tarafından geliştirilmiş olsa da artık yavaş yavaş yerini DKIM ( Identified Mail)'e bırakmaya başlamıştır. Ancak her iki yöntemde hali hazırda kullanılmaktadır. Örneğin Yahoo ve Gmail gibi büyük posta sağlayıcıları hem DomainKey hem de DKIM kontrolü yapmaktadırlar. Tabii DKIM ya da DomainKey ile imzalanmamış mailleri de kabul etmektedirler.  Yani ortada zorunlu bir durum bulunmamaktadır.

Fakat dediğim gibi, çok fazla mail gönderimi yapan bir kurumunuz varsa, DKIM kullanmak spam filtreleri ile iyi geçinmeyi sağlayıcı etkenlerden birisi olacaktır. Bu nedenle ben de gönderilen mailler için DKIM kullanmaktayım.

Bunun yanı sıra, yahoo ya da gmail'in yaptığı gibi gelen postalar için siz de sunucularınızda DKIM ya da Domainkey kontrolü yapabilirsiniz. Örnek olarak Spamassassin ile bu iş yapılabiliyor.Fakat, bu her iki teknoloji de uzun zamandır var olmalarına rağmen pek fazla kullanılmamaktadır. Bu açıdan spam ile başınız çok büyük belada değilse DKIM ya da Domainkey sorgulaması yapmak en uç nokta güvenlik yöntemi olacaktır.

DKIM'in ne olduğuna değindikten sonra nasıl çalıştığı ile ilgili olarak teorik tarafına değinmek istiyorum.

DKIM Nasıl Çalışır ?


Kullandığınız posta sunucusuna DKIM implementasyonu yaptığınız zaman, MTA'nız giden maillerin header bölümüne, DKIM-Signature denilen ve mailin içeriğini (header ve body'i) kapsayan bir dijital imza ekler. Bu imzalama işlemi herhangi bir dosyanın şifrelenmesinden farksız olarak gerçekleşen bir konudur.

Misal olarak elinizdeki bir dosyayı pgp, gpg vs gibi  yazılımlarla şifrelemek için öncelikle örneğin openssl kullanarak bir private ve public key oluşturursunuz, sonrasında şifrelenecek dosyayı private key ile encrypt eder ve iletmek istediğiniz kişiye gönderirsiniz. Alıcı şifrelenmiş dosyayı açmak için imzalama sırasında kullanılan private key'in public key'ine ihtiyaç duyar. Bu key'i alıcıya yollamanız durumunda, alıcı şifrelenmiş datayı bu public key ile açabilir.

DKIM olayında da mantık benzerdir. Tek fark, mailin doğrulanmasını sağlayacak olan header bölümünde yer alan şifrelenmiş verinin decrypt edilmesi için gerekli olan public key'in, maili gönderen domaine ait bir DNS kaydından yayınlanmasıdır. Böylece, gönderilen maili alan SMTP sunucusu bir DNS sorgusu ile şifrelenmiş veriyi açabilmek için ihtiyaç duyduğu public key'i edinebilir ve decrypt işlemini yapabilir. (Yazının ilerleyen bölümlerinde DNS kayıtlarının nasıl olması gerektiğini anlatacağım.)

Sonuç olarak mailin tamamını içeren şifrelenmiş bölüm SMTP sunucusu tarafından açılır ve mailin içeriği ile aynı olup olmadığı kontrol edilir. Eğer şifrelenmiş veri, mailin içeriği ile aynı ise doğrulama gerçekleşmiş olur ve posta sunucusu bu mailin gerçekten sizden geldiğine emin olur. Mailin açılması için gerekli public key'in edinilmesi bir faz, mailin imzalı kısmı ile imzasız kısmının birbiri ile uyuşması ikinci fazdır. Her iki şart da yerini getirilirse doğrulama tamamlanmış olur.

Konuya yabancıysanız aklınız karışmış olabilir, (yabancı değilseniz kurulum notlarının verildiği bir sonraki bölüme atlayabilirsiniz.)  Bu nedenle, bir örnek üzerinden anlatarak toparlamak istiyorum.

Elimde, syslogs.org domainine ait maillerin gönderildiği bir qmail sunucusu olduğunu varsayalım. cagri[at]syslogs[.]org adresinden, cagri.ersen[at]gmail[.]com  bir mail gönderdiğim zaman posta sunucum gidecek olan mailin tamamını (başlığını ve gövdesini) bir private key kullanarak şifreliyor ve şifrelenen veriyi olduğu gibi ilgili mailin header kısmına DKIM-Signature başlığıyla ekleyip gönderiyor. Bu mail gmail sunucularına ulaştığı zaman, gmail postanın başlık kısmında dijital imzayı görüyor ve şifrelemiş veriyi açmak üzere syslogs.org domainine bir DNS sorgusu göndererek, bu domain altında yayınlanan public key'i alıyor. Ardından bu key ile encrypt edilmiş veriyi decrypt ediyor.  Son olarak da decrypt edilmiş veri ile mailin kendisini karşılaştırarak doğrulamayı gerçekleştiriliyor.

Böylece, ilgili mailin şifreli bölümü,  private key'in sahibi tarafından yayınlanan public key ile decrypt edilebilir ve ayrıca mailin yolculuğu sırasında herhangi bir değişime uğramadığının teyit edilmesi için şifreli bölümle şifresiz bölüm karşılaştırılır.  Bu iki aşama sorunsuz olarak tamamlanınca mail'in gerçekten syslogs.org domaininden geldiği tespit edilmiş olur.

Örnek olarak, gmail'e DKIM ile imzalanmış bir mail gönderdiğiniz zaman, mailin başlık kısmında, postanın mail sunucunuz tarafından imzalandığını belirtir “signed-by alan-adı.com” başlıklı aşağıdaki şekilde bir ibare görürsünüz.

signed-mail

Ayrıca, aynı mailin full header kısmında da dkim ile ilgili aşağıdakine benzer ibareleri görebilirsiniz:

[email protected]; dkim=pass (test mode) [email protected]

Bu şekilde, gönderdiğiniz maillerin, gerçekten sizin tarafınızdan gönderildiğinin teyit edilmesini sağlayabilirsiniz. Yahoo ve Gmail gibi büyük e-posta sağlayıcıları DKIM konusunu zorunlu tutmasalar bile mesajlarınızı DKIM ile imzalamanız, güvenilirliğinizi arttırıcı bir etken olacaktır.  Bu nedenle üzerinde durulması gereken bir konudur.

Konu ile ilgili bu kadar teorik bilgi yeter sanıyorum. Daha fazla detay için yukarıdaki ilgili wiki linkine başvurabilirsiniz.

Yazının bundan sonraki bölümünde, qmail sunucularda giden postaların DKIM ile imzalanması için yapılması gereken teknik işlemlerden bahsedeceğim.

qmail ve DKIM


qmail sunuculara, DKIM desteği kazandırmak için kullanılabilecek çeşitli patchler ve uygulamalar mevcut, kısa bir google araması ile bu çözümlere kolayca erişebilirsiniz. Ben bu konu üzerinde araştırma yaparken  libdkim isimli taşınabilir DKIM kütüphanesine ulaştım. libdkim yönteminde  qmail'e herhangi bir patch geçmeye gerek yok. Şahsen libdkim'i zahmetsiz ve efektif olmasından ötürü epey beğendim. Dolayısı ile bu yazıda, libdkim kurulumuna ve giden postaları imzalamak için gerekli olan basit qmail yapılandırmasına değineceğim.

Libdkim


Libdkim ile giden postaları imzalayabildiğiniz gibi gelen postaların imzalarını doğrulamak da mümkün. Ancak ben gelen postalar için DKIM doğrulaması yapmıyorum. Bu nedenle sadece giden postaların imzalanması konusuna değineceğim.

Kurulum ve yapılandırma aşamalarından önce kısaca libdkim'in ne olduğuna değinmek istiyorum.

Nedir ?

Libdkim, Alt-N Technologies isimli bir firma tarafından geliştirilmiş olan ve e-postaları, OpenSSL kütüphanesini kullanarak RFC 4871'de belirtilen şartlara uygun olarak imzalamaya ya da doğrulamaya yarayan portable bir kütüphanedir.

Bunun yanı sıra, libdkim için http://patchlog.com/security/qmail-and-dkim/ adresinde de libdkim'in altında derlenebilmesi için gerekli olan bir patch ve küçük iyileştirmeler ekleyen extra options isimli bir başka patch yayınlanıyor. Bu patchlerden özellikle extra özellikler ekleyenini çeşitli iyileştirmeler sunduğu için kullanmaktayım. Örneğin bu patchle, istediğiniz domain'i ve selector'ü belirtebiliyorsunuz ancak kütüphanenin orjinalinde bu durum hardcoded olduğu için ilgili kütüphane ile sadece tek bir domainden giden mailler imzalanabiliyor. Bu nedenle patch'li versiyonu kullanmak mantıklı. Zaten yazıda da bu versiyonu kullanacağız.

libdkim'e ait patchleri yukarıda linkini verdiğim adresten download edip anlatıldığı şekilde uygulayabildiğiniz gibi, hali hazırda her iki patch'in geçildiği kaynak kodları içeren bir libdkim paketini de direk download edebiliyorsunuz. Bu şekilde ekstradan, patchler ile ilgilinmek durumunda kalmıyorsunuz ki ben de bu paketi kullanacağım.

Not: Yukarıdaki adreste yayınlanan patch'li libdkim versiyonu 1.0.14 ancak şu anki son sürüm libdkim 1.0.19. Bu nedenle aynı sayfadaki kurulum şekline sadık kalacağım ama libdkim 1.0.19'un patch'li versiyonunu kullanacağım.

libdkim'in ne olduğunda değindikten sonra, nasıl işlediğine de değinelim.

Çalışma Prensibi

Öncelikle, libdkim kullanmak için sisteminizde OpenSSL'in kurulu olması gerekiyor. (neyseki hemen tüm nix dağıtımlarında bu paket ön tanımlı gelir.) Çünkü libdkim emailleri imzalamak için OpenSSL kütüphanesini kullanan libdikimtest isimli bir binary kullanıyor. Hal böyle olunca,  imza işlemlerinde kullanılmak üzere bir private key ve public key'e de ihtiyacınız bulunuyor. Bu key'leri de kurulum aşamasında OpenSSL kullanarak oluşturacağız. Private ve public key'lerinizi edindikten sonra herhangi bir dosyayı komut satırından libdkim'i çağırarak formal bir şekilde imzalamak mümkün.

Aynı imzalama işlemini, qmail'in gidecek olan postalara uygulaması için, giden postalardan sorumlu olan qmail-remote'un yerine geçecek bir wrapper script kullanacağız. Bu script, qmail-remote'un yerine geçtiği için uzaktaki bir yere gönderilmesi için qmail'e iletilen postayı alıyor, libdkim'i çağırıp imzalanmasını sağlıyor ve sonra oluşturulan hash'i mailin header kısmına formal bir şekilde ekliyor. Son olarak da bu maili, gideceği yere iletilmesi için yerine geçtiği gerçek qmail-remote'a veriyor.

Böylece, giden mailleri imzalamış oluyorsunuz.

Zannedersem bu kadar teorik bilgi, konunun net olarak anlaşılması için yeterli olacaktır. Şimdi işin pratik kısmına geçelim.

Libdkim Kurulumu


Qmail'e DKIM implementasyonunu anlatan bu yazı FreeBSD ve LWQ tarzı qmail kurulumlarını baz alarak hazırlanmıştır. Ancak, herhangi bir patch gereksinimi vs. olmadığı için farklı qmail kurulumlarında da sorun çıkmayacaktır.

FreeBSD Üzerinde Libdkim Kurulumu

FreeBSD'ler altında, Libdkim'i derlemek için gmake kullanmak gerekiyor. Bu nedenle öncesinde sisteminizde yüklü olması gerekir. Kontrol etmek için aşağıdaki şekilde pkg_info komutundan yararlanabilirsiniz:

# pkg_info |grep gmake

Eğer yüklü ise sorun yok, ancak değilse kurmanız gerekir. gmake, port ağacında /usr/ports/devel/gmake dizininde bulunuyor. Dolayısı ile port ağacınızı güncelledikten sonra aşağıdaki şekilde kurulum yapabilirsiniz.

# cd /usr/ports/devel/gmake/
# make install clean

Sisteminizde port ağacı yoksa, “pkg_add -r gmake” komutu ile yüklemeniz de mümkün. Gmake kurulumundan sonra, derleme işlemine geçebilirsiniz.

Ben, derleme vs işlemleri için çalışma dizini olarak /usr/local/src dizinini kullanıyorum.

Dolayısı ile ilgili çalışma dizinine girip libdkim'in yukarıda bahsettiğim patchlenmiş haline ait kaynak kodları download edelim:

# cd /usr/local/src
# fetch http://syslogs.org/getfile/libdkim-1.0.19-patched.tgz.gz

Şimdi, paketi açalım ve gmake ile derleme işlemini yapalım.

# tar xvfz libdkim-1.0.19-patched.tgz
# cd libdkim-1.0.19-patched/src/
# gmake

Şu anda src dizini içerisinde libdkimtest isimli ile derlenmiş binary dosyasını görebilirsiniz.

Bu binary dosyasını /usr/local/bin dizinine kopyalıyoruz.

# cp libdkimtest /usr/local/bin/

libdkimtest dosyası herkes tarafından çalıştırılabilir olmalıdır. Gerçi kopyalama sırasında, libdkintest muhtemelen /usr/local/bin dizininin ön tanımlı yetkilerini almıştır ama biz yine de işi sağlama alıp manuel olarak yeniden tanımlayalım.

# chown root:wheel /usr/local/bin/libdkimtest
# chmod 755 /usr/local/bin/libdkimtest

Libdkim kurulumu bu kadar. Bundan sonra, qmail'in mailleri imzalaması vs. işleri için gerekli olan anatharların oluşturulması işlemine geçiyoruz.

OpenSSL Private ve Public Key Oluşturmak


Bu adımda, OpenSSL kullanarak bir private key ve bu key'e ait public key'i oluşturacağız ve bu dosyaları /etc/ isimli dizinde barındıracağız.

Bu işleri, manuel yapabileceğimiz gibi, http://www.backschues.net/backschues.net/know-how/qmail/domainkey adresinde bulunan shell scriptini de kullanabiliriz. Bu script işi oldukça kolaylaştırdığı için bu yöntemi izleyelim.

Script “./domainkey alanadi.com selector” şeklinde çalıştırılıyor ve anahtar oluşturma işlemlerini yapıyor.

Betik önce, /etc/domainkeys isimli bir dizin açıyor, sonrasında bu dizin altında, komut satırında belirtilen alan adı ve selector için bir private ve public key oluşturuyor.
Bu anahtar dosyalarına sadece qmail-remote'un erişebilmesi için dizinin sahibini qmailr (qmail-remote) grubunu da qmail olarak atayıp izinlerini 700 olarak set ediyor. Oluşturulan key'lerin isimleri rsa.private_selector ve rsa.public_selector şeklinde oluyorlar. ve /etc/domainkeys/alanadi.com/ dizini altında bulunuyorlar. Ayrıca, script rsa.private_selector isimli key için default isminde bir de link oluşturuyor. (Dolayısı ile alanadi.com dizininin yerini ya da ismini değiştirirseniz link uçacaktır ancak bizim zaten bu link'e ihtiyacımız olmayacak. )

Script son olarak, public key'i yayınlamak için DNS sunucusuna girilmesi gereken TXT kaydı veriyor. DNS sunucusundaki tanımlarla ilgili bilgiye yeri geldiği zaman değineceğim.

Bu betikle, alan adlarına özel farklı key'ler üretiyor ve üretilen key'lerle, qmail'in ilgili domainler için o domaine ait anahtarı kullanarak imzalama yapmasını sağlayabiliyorsunuz. Ancak, bu şekilde gönderim yaptığınız tüm domainler için DNS'de farklı TXT kayıtları açmanız/açtırmanız vs. gerekiyor, bu nedenle ben mail hangi domainden gönderilirse gönderilsin aynı anahtar ile imzalaması yönünde işlem yapıyorum. Yani sadece bir private ve public key yeterli oluyor ve DNS kaydı olarak hep aynı public key'e ait TXT kaydını kullanıyorum. Yazıda da tek key kullanma yöntemini izleyeceğim.

Şimdi, domainkey isimli shell scriptini kullanarak bir key oluşuturalım.

Önce shell scripti download ediyoruz:

Kod
# cd /usr/local/src
# fetch http://www.backschues.net/backschues.net/know-how/qmail/domainkey

Tüm domainler için tek key kullanacağımdan bu örnekte özel bir alan adı belirtmeme gerek yok sadece selector olarak “genel” ismini vereceğim. Bu örneğe göre çalıştırmam gereken komut aşağıdaki şekilde:

# sh domainkey dkim-anahtarlari genel

Komutu verdiğiniz zaman yukarıda bahsettiğim işlemler gerçekleştiriliyor ve ekrana DNS için girilmesi gereken kayıt basılıyor.
Şöyle:

Generating RSA private key, 1024 bit long modulus
.........++++++
...............++++++
e is 65537 (0x10001)
writing RSA key

TXT record for BIND:
genel._domainkey.dkim-anahtarlari. IN TXT "v=DKIM1\; k=rsa\; t=y\; p=MZGfMA0KASqGSIb3DQEBAQUAA4GNADCBiQKBgQDyo5o5rUPEfm18MTU00cnk/tXkbjUv74GdPz7g                                                        DzdBKLzLRyTJDLIztk9OXyBjK8uwrNUp5bn8IvKlruAdtug4ocN3VKjPvB4oz1MGrjfL8Gpr8Hvw/KksWvrtzksSFGgFARkNOTMz93b0R6H9Sqn/cl99p0fwSjUkDpy8kx+45TQIDAQAB"

Yukarıdaki çıktıda görüldüğü gibi anahtar üretildi ve DNS'e girilmesi gereken kayıt verildi. (formal bir domain belirtmediğimiz için kaydın, genel._domainkey.dkim-anahtarlari isimli alan adı için girilmesini söylüyor; ancak bir sonraki adım olan DNS bölümünde formal alan adının nasıl olması geretiğini belirteceğim.) Şimdi, bu kaydı bir yere kopyalayın, gene bir sonraki adımda anlatılacağı gibi DNS'e girmek için gerekli olacak.

/etc/domainkeys dizinine bakarsanız içerisinde dkim-anahtarları isminde bir dizin olduğunu görebilirsiniz. Bu dizinin içeriği şu şekilde olacaktır:

lrwxr-xr-x  1 root    qmail   50 Oct  2 16:44 default -> /etc/domainkeys/dkim-anahtarlari/rsa.private_genel
-rw-------  1 qmailr  qmail  887 Oct  2 16:44 rsa.private_genel
-rw-------  1 qmailr  qmail  272 Oct  2 16:44 rsa.public_genel
-rw-------  1 qmailr  qmail    6 Oct  2 16:44 selector

Private ve public key ve selector için dosyalar oluşturulmuş durumda.
Ayrıca, rsa.private_genel dosyasına bakan bir de link bulunuyor. (Dediğim gibi biz zaten bu link dosyasını kullanmayacağız.) Bir de dikkat ederseniz dosyaların sahibi qmailr ve grubu qmail. Ayrıca bu dosyaları sadece qmailr okuyabiliyor.

Gerekli dosyalar oluşturulduğuna göre, bundan sonra izlenmesi gereken adım, public key'i yayınlamak için DNS kaydı açmaktır.

DKIM Public Key İçin DNS Kaydı Oluşturulması


DKIM'in çalışma mantığında ve yazının muhtelif yerlerinde dns txt kaydı, selector vb. gibi konulardan söz etmiştim ancak pek detay vermemiştim. Şimdi, bu detaylara değinebilir teknik olarak yapılması gerekenleri uygulayabiliriz.

Öncelikle, DNS kaydının amacı söylediğim üzere private key'imiz ile encypt edilmiş imzalı bir mailin, ulaştığı posta sunucusunca decrypt edilebilmesi için ihtiyaç duyulacak public key'e ulaşılmasını sağlamaktır. Eğer public key'inizi domaininizin kayıtlarının tutulduğu DNS sunucusuna bir TXT kaydı şeklinde girerseniz, sizden gelen imzalı mailleri alan posta sunucusu public anahtarınıza bir DNS sorgusu ile erişebilir ve decrypt işlemini yapıp mailin sizden gelip geldiğini doğrulayabilir.

Public key'i yayınlamak için  açmanız gereken DNS kayıtlarının global standartları bulunmaktadır. Şimdi bu standartlara değinmek istiyorum.

_domainkey (Genel DKIM politikası)

public key'inizi TXT tipi DNS kaydı olarak gireceğiniz domain “_domainkey” ön adı ile başlayan bir sub domain olmalıdır. Örnek olarak cagriersen.net için public key yayını yapacağım domain mutlaka “_domainkey.cagriersen.net” isminde olacaktır. Bu öntanımlı isim domainkey ya da DKIM için bir standart olarak kullanılır ve bu şekilde herhangi bir domaine ait public key'i dns sorgusu ile almak isteyen bir posta sunucusu DNS sorgusunu  _domainkey.alanadi.com şeklindeki sub domain altında yapması gerektiğini bilir.

_domainkey.alanadi.com isimli subdomain'iniz DKIM için genel policy'i içeren bir TXT kaydından oluşur. Ön tanımlı olarak şu şekide bir TXT kaydı girmek yerindedir:

"t=y\;" "o=~"

Kullanulan switchlerin anlamları şu şekildedir:
t=y : Bu domain DKIM'i test mode'da kullandığını belirtir. Yani imzalı mailler ile imzasız mailler arasında teknik olarak ayırım yapılmaması söylenir.
o=~ : Buradaki tilda (~), bu domainden gönderilecek maillerin bazılarının imzalı bazılarının imzasız olabileceğini belirtir. Sonuç olarak imzasız mail göndermeniz durumunda sorun çıkmayacaktır. Eğer (~) yerine (-) işareti kullanırsanız, bu domaine ait her mailin imzalı olması gerektiğini belirtmiş olursunuz.

Selector

Bir de yazıda bol bol adı geçen “selector”  standardı bulunmaktadır. Bizim örnekte “genel” ismi ile set ettiğimiz selector, public key'in yayınlanacağı asıl sub domaindir. Gene bizim örneğimize göre cagriersen.net domaini için kullanmam gereken DKIM sub domain'i “genel._domainkey.cagriersen.net” olmalıdır. Bundan dolayı domainkey scripti ile anahtar oluşturma sırasında bir kenara not ettiğimiz aşağıdaki kaydı “genel._domainkey.cagriersen.net” sub domain altında TXT tipi DNS kaydı olarak eklemem gerekir.

"v=DKIM1\; k=rsa\; t=y\; p=MZGfMA0KASqGSIb3DQEBAQUAA4GNADCBiQKBgQDyo5o5rUPEfm18MTU00cnk/tXkbjUv74GdPz7gDzdBKLzLRyTJDLIztk9OXyBjK8uwrNUp5bn8IvKlruAdtug4ocN3VKjPvB4oz1MGrjfL8Gpr8Hvw/KksWvrtzksSFGgFARkNOTMz93b0R6H9Sqn/cl99p0fwSjUkDpy8kx+45TQIDAQAB"

Burada dikkat edilmesi gereken bir konu bulunuyor: domaininize ait genel DKIM politikası için kullanacağınız sub domain mutlaka “_domainkey” ile başlayacak şeklide olmak zorundadır, yani alan adınız için bir DKIM kaydı açmak isterseniz zorunlu olarak _domainkey.alanadi.com şeklindeki formatı kullanmanız gerekir. Ancak selector için bir zorunluluk yoktur ve değişiklik gösterebilir.  Biz örneğimizde “genel” ismini verdik ama aslında herhangi başka bir isim de verebilirdik. “_domainkey”‘in neden zorunlu olduğunu yukarıda söylemiştim, posta sunucuları DNS sorgusunu _domainkey.alanadi.com sub domaini altında yapacaklarını, formatın standart olması nedeni ile bilirler ancak selector standart değildir ve herhangi bir şey olabilir.

Peki posta sunucuları selector'ünüzün ismini nasıl bilebilirler ?

Bu sorunun cevabı, posta sunucunuzun bir maili imzalaması sırasında header'a selector ve domain bilgilerini de girmesinde yatmaktadır. Örnek olarak twitter.com'dan gönderilen imzalı bir email'in header'ında selector bilgisinin yazılı olduğu bölüm şöyle görünmektedir:

DKIM-Signature: v=1; a=rsa-sha1; c=simple/simple; d=twitter.com; s=dkim;
	t=1253887887; [email protected]; bh=PW84+wEURAxHeLWxk7UiWchUrGc=;

Yukarıdaki header kısmında ,  “d=” ile mailin hangi alan adı için imzalandığı bilgisi,  “s=” ile de selector'un ne olduğu bilgisi verilmektedir. Görüldüğü gibi twitter'in domain'i “twitter.com” ve selector'u de dkim olarak geçiyor. DKIM kayıtları için öntanımlı subdomainin “_domainkey” olduğu da bilindiğine göre
bu maili alan posta sunucusu imzayı kontrol etmek için ihtiyaç duyduğu public anahtara, “dkim._domainkey.twitter.com” sub domainine bir TXT tipi sorgu göndererek ulaşabilir ve anahtarı alıp doğrulamayı yapabilir.

Aynı şekilde siz de bu sub domaine txt tipi bir sorgu gönderirseniz, cevap olarak public key'i alabilirsiniz:

# nslookup -q=txt dkim._domainkey.twitter.com

dkim._domainkey.twitter.com     text = "v=DKIM1\;" "g=*\;" "k=rsa\;" "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrZ6zwKHLkoNpHNyPGwGd8wZoNZOk5buOf8wJwfkSZsNllZs4jTNFQLy" "6v4Ok9qd46NdeRZWnTAY+lmAAV1nfH6ulBjiRHsdymijqKy/VMZ9Njjdy/+FPnJSm3+tG9Id7zgLxacA1Yis/18V3TCfvJrHAR/a77Dxd65c96UvqP3QIDAQAB"

Umarım kafa karıştırmadan anlatabilmişimdir. DNS kaydı ile ilgili daha fazla bilgi için www.dkim.org adresinden ya da http://domainkeys.sourceforge.net/ yararlanabilirsiniz. Eğer siz de, domainkey scripti ile oluşturduğunuz anahtar'a ait public key'i (scriptin ekrana bastığı formatta) DNS sunucunuza eklediyseniz DNS ile ilgili yapılması gerekenler tamamlanmış demektir.

DNS ile ilgili işlerden sonra, qmail tarafındaki yapılandırma işlemine geçebiliriz.

qmail'in DKIM için Yapılandırması


Yazının başında da söylediğim için ben DKIM'i sadece giden mailler için kullanacağım. Yani qmail sadece giden postaları imzalayacak ve gelen mailler için imza doğrulaması gibi bir konuya girmeyecek.  Giden maillerin imzalanması için, gene yazının başında anlatmış olduğum, qmail-remote'un yerine geçip libdkim ile imzalama yapacak bir wrapper script kullanacağım.

Bahsettiğim bu script, http://patchlog.com/security/qmail-and-dkim/ adresinde yayınlanmakta. Bu, script her domain için farklı bir private key kullanıyor. Ancak ben, tüm domainlerin tek bir private key kullanılarak imzalanmasını  yeterli bulduğumdan dolayı, script üzerinde küçük değişiklikler yaptım ve tüm domainler için aynı anahtarın kullanılmasını sağladım . Bu yazının gidişatı da sadece tek bir anahtar kullanmak yönünde olduğu için scriptin, tarafımdan modifiye edilmiş halini paylaşacağım.

Böylece, posta sunucunuz, birden fazla domain tarafından iletilen maillerin gönderiminde kullanılıyorsa bile, yapmanız gereken tek şey, yazının DNS bölümünde anlatıldığı şekilde, tüm domainleriniz için public key'inizi içeren birer DNS kaydı açmak olacaktır.

Bunun dışında, wrapper, qmail-remote'un yerine geçtiği için istisnasız giden tüm mailler imzalayacaktır.  Ancak scripti biraz değiştirerek belli domainlerin imzalanmamasını sağlamak da mümkün. Benim bu şekilde bir ihtiyacım olmadığı için böyle bir düzenleme yapmadım. Sonuç olarak scripti istediğiniz şekilde düzenleyebilirsiniz. Ama bu yazıdan hareketle kurulum yapıyorsanız herhangi bir değişiklik yapmanıza gerek yok.

Evet, qmail-remote'un yerini alacak wrapper script aşağıdaki şekilde.

#!/usr/local/bin/bash

[ "$DKSIGN" ] || DKSIGN="/etc/domainkeys/dkim-anahtarlari/rsa.private_genel"
[ "$DKREMOTE" ] || DKREMOTE="/var/qmail/bin/qmail-remote.orig"

if [[ $DKSIGN == *%* ]] ; then
DOMAIN=${2##*@}
DKSIGN="${DKSIGN%%%*}${DOMAIN}${DKSIGN#*%}"
fi
if [ -f "$DKSIGN" ] ; then
tmp=`mktemp -t dkim.sign.XXXXXXXXXXXXXXX`
tmp2=`mktemp -t dkim.sign.XXXXXXXXXXXXXXX`

/bin/cat - >"$tmp"
/usr/local/bin/libdkimtest -d"$DOMAIN" -ygenel -i"$DOMAIN" -z1 -s "$tmp" "$DKSIGN" "$tmp2" 2>/dev/null

(/bin/cat "$tmp2" |tr -d "\\015") | "$DKREMOTE" "$@"
retval=$?
rm "$tmp" "$tmp2"
exit $retval
else
exec "$DKREMOTE" "$@"
fi

Şimdi scriptin içeriğini kopyalayın ve /usr/local/src dizini altında qmail-remote-dkim ismi ile açacağınız bir dosyaya yapıştırın. Kopyala yapıştır yapmak yerine direk download için bu linkten de yararlanabilirsiniz.

Script ile ilgili olarak dikkat edilmesi gereken bir diğer nokta da, yukarıdaki çıktıda da gördüğünüz gibi scriptin bash kullanıyor olmasıdır. Eğer sisteminizde shell olarak bash bulunmuyorsa
ya scriptin en başındaki #!/usr/local/bin/bash ibaresini #!/bin/sh olarak değiştirip, ön tanımlı olarak gelen sh'ı kullanabilirsiniz ya da “pkg_add -r bash” komutu ile sisteme bash kurabilirsiniz. Bu şekilde dosyayı editlemenize gerek kalmaz.

Herşey hazırsa, qmail'i yapılandırabiliriz.

Önce qmail'i durduruyoruz.

# qmailctl stop

Daha sonra, /var/qmail/bin dizinine girip, qmail-remote'un ismini qmail-remote.orig olarak değiştiriyoruz.

# cd /var/qmail/bin
# mv qmail-remote qmail-remote.orig

Şimdi ise, demin /usr/local/src dizinine qmail-remote-dkim ismi ile kaydedilen script dosyasını /var/qmail/bin altıa qmail-remote ismi ile kopyalıyoruz.

# cp /usr/local/src/qmail-remote-dkim /var/qmail/bin/qmail-remote

Son olarak da, yeni qmail-remote dosyasına gerekli izinleri veriyoruz.

# chown root:qmail /var/qmail/bin/qmail-remote
# chmod 755 /var/qmail/bin/qmail-remote

Qmail'in yapılandırılması işlemi bundan ibaret. Şimdi qmail'i yeniden başlatalım.

# qmailctl start

Evet, artık qmail, gidecek olan mailleri /etc/domainkeys/dkim-anahtarlari/rsa.private_genel anahtarını kullanarak imzalamak üzere set edilmiş durumda.

Bu sunucu üzerinden bir mail attığınız zaman, qmail-remote ismi ile /var/qmail/bin dizinine koyduğumuz wrapper script maili alacak ve imzalama işlemini yaptıktan sonra qmail-remote.orig isimli gerçek qmail-remote'a verecek.

Örnek olarak, test için _domainkey DNS kaydı açtırdığınız bir domain'den, bu sunucuyu kullanarak gmail hesabına bir mail atın. Herşey yolunda gittiyse, gmail'e ulaşacak mailin imzası doğrulanacak ve yazının önceki bir bölümünde verilen ekran görüntüsünde olduğu gibi header kısmında signed-by alanadi.com şeklinde bir ibare göreceksinizdir.

Herhangi bir sorun varsa aşağıdaki başlıktan yararlanabilirsiniz.

Sorun Giderme


Hiç bir yere mail gönderemiyorsanız, muhtemelen qmail-remote isimli wrapper scriptte bir sorun vardır. Bu durumda, /var/log/qmail/current isimli log dosyasında göndediğiniz mail ile ilgili herhangi bir hata olup olmadığını kontrol edin.

Eğer mailleriniz gidiyor ama örneğin gmail'e giden mailin header kısmında signed-by ibaresi bulunmuyorsa şu adımları izleyerek sistemi kontrol etmenizi öneririm.

1 – Oluşturduğunuz anahtar'ın /etc/domainkeys/dkim-anahtarlari/ isimli dizinde rsa.private_genel ismi ile durup durmadığını kontrol edin ve qmailr kullanıcısının bu dosyaya yazma çizme yetkisi olduğundan emin olun.

2 – DNS'inizde private key'e ait public key'in “genel._domainkey.alanadi.com” sub domaini altında TXT kaydı olarak girilip girilmediğini kontrol edin ve dışarıdan bu TXT kaydının sorgulanabildiğinden emin olun.

3 – DNS'den yayınladığınız public key'iniz /etc/domainkeys/dkim-anahtarlari/ dizininde, rsa.public_genel ismindeki dosya içerisinde bulunmaktadır. DNS'de yayınlanan key ile bu dosya içerisindeki key'in birbiri ile aynı olduğundan emin olun.

4 – libdkim imzalanacak mailleri için işlemleri için /tmp dizini altında yapmaktadır. /tmp dizininde yer olduğundan ve qmail'in yazıp çizebildiğinden emin olun.

4 – Bunların hiç biri işe yaramadıysa, yazıda anlatılan işlem adımlarını bir kez daha kontrol edip, herhangi bir yerde hata yapıp yapmadığınızı kontrol.

Tüm bunları kontrol ettiniz ve halen sorununuz varsa, bu yazıya yorum girerek bana ulaşın. Yardımcı olmaya çalışırım.

Visited 1.901 times, 1 visit(s) today
Kategoriler: *nix,Qmail,Security |

Bu yazılar da ilginizi çekebilir:


- qmail – Giden Maillerin DKIM ve DomainKeys ile İmzalanması
- qmail Kurulum Scripti – FreeBSD 9.x
- qmail Kurulum Scripti – CentOS 6.x
- FreeBSD – Sendmail Smart Host Configuration
- qmail-channels patch: Giden Postalar için Domain Bazlı Hız Limiti

Yorumlar


  1. Huzeyfe ONAL | (Ekim 6th, 2009 9:49 am)

    Eline saglik Cagri. Guzel ve detay bir yazı olmuş.

    [Cevapla]

    Baki tarafından yanıtlandı.

    Anlatımınız için teşekkürler, fakat benim linux red hat olduğu için bunları yapamadım, msnden görüşememiz mümkünmüdür, yardımınıza ihtiyacım var. [email protected]

    [Cevapla]

    Cagri Ersen tarafından yanıtlandı.

    Sorunuzu, [email protected] adresine gonderebilirsiniz.

    [Cevapla]

  2. irfan | (Aralık 17th, 2010 3:57 am)

    merhaba abim msn den görüşme imkanımız varmı? gerçekden ihtiyacım var

    [Cevapla]

    Cagri Ersen tarafından yanıtlandı.

    Bana [email protected] adresinden ulasabilirsiniz. Maelsef msn kullanmiyorum, ancak gtalk ile konusabiliriz.

    [Cevapla]

  3. ceyhun | (Şubat 28th, 2012 10:33 am)

    Merhabalar,

    Yazınız için teşekkür derim. Benim serverim win2003 mail yazılımı merak mail server kullanıyorum merak mail serverde dkim oluşturlması çok kolay ben selector bölümüne genel yazdım domain bölümüne ise deneme.com yazıp key oluşturmasını sağladım sonrada dns serverden bahsettiğiniz gibi txt dosyası oluşturdum sonrada denemek için hotmail adresine mail attım ve header bölümüne baktığımda ise dkim bölümlerinin aşağıdaki gibi hata verdiğini gördüm. bunu nasıl çözebilirim veya nerede yanlış yapmış olabilirim.

    X-DKIM-Result: TempError
    dkim=temperror
    sender-id=temperror

    [Cevapla]

    Cagri Ersen tarafından yanıtlandı.

    Denemelerinizi deneme.com uzerinden yaptiysaniz ve deneme.com domaini sizin degilse dns’e yazdiginiz txt kayitlarinin bir gecerliligi olmaz.

    Buna dikkat etmis miydiniz ?

    [Cevapla]

  4. Ahmet | (Temmuz 2nd, 2012 11:23 am)

    Merhaba, centos üzerinde libdkim derlerken aşağıdaki hatayı alıyorum.Araştırdım ama elle tutulur bişey göremedim, neden olabilir acaba?

    [root@qmail src]# make
    g++ -c -c dkim.cpp
    g++ -c -c dns.cpp
    g++ -c -c dkimbase.cpp
    g++ -c -c dkimsign.cpp
    g++ -c -c dkimverify.cpp
    rm -f libdkim.a
    ar cr libdkim.a dkim.o dns.o dkimbase.o dkimsign.o dkimverify.o
    ranlib libdkim.a
    g++ -c -c libdkimtest.cpp
    g++ -olibdkimtest \
    -L . libdkimtest.o -lcrypto -ldkim
    ./libdkim.a(dns.o): In function `_DNSGetTXT(char const*, char*, int)’:
    dns.cpp:(.text+0x6c): undefined reference to `__res_query’
    dns.cpp:(.text+0x14d): undefined reference to `__dn_expand’
    dns.cpp:(.text+0x1de): undefined reference to `__dn_expand’
    collect2: ld returned 1 exit status
    make: *** [libdkimtest] Error 1

    [Cevapla]

    Cagri Ersen tarafından yanıtlandı.

    Selamlar,

    Yazıda da anlatildigi sekilde libdkim-1.0.19-patched.tgz versiyonunu kullanmalisiniz ve make için LINUX=y parametresini de vermelisiniz:

    make LINUX=y
    

    Bu şekilde sorunsuz derelenmesi gerekir.

    [Cevapla]

    Ahmet tarafından yanıtlandı.

    Evet derleyebildim, teşekkürler.

    [Cevapla]

  5. Val | (Ekim 1st, 2014 3:21 pm)

    Merhaba,

    Çağrı Hocam freebsd portlar üzerinde de libdkim paketleri var. Bunu kurarsak qmaili yeniden derlememiz gerekir mi?

    sevgiler.

    [Cevapla]

    Cagri Ersen tarafından yanıtlandı.

    Merhaba,

    Hayır derlemenize gerek yok; libdkim’i kurup yazıda anlatıldığı gibi devam edebilirsiniz.

    [Cevapla]

Trackbacks

Yorumda bulunun.