Ana Sayfa » *nix » qmail – Giden Maillerin DKIM ve DomainKeys ile İmzalanması

qmail – Giden Maillerin DKIM ve DomainKeys ile İmzalanması


BerbatKötüİdare EderGüzelHarika (Toplam 4 oy. 5 puan üzerinden ortalama 4,00 || Oy vererek siz de katkıda bulunabilirsiniz.)
Loading...
Dkim DomainKeys Gönderdiğiniz maillerin gerçekten sizin tarafınızdan gönderildiğini ispat etmeye yönelik bir kimlik doğrulama metodu olan konusuna önceki bir yazımda değinmiş ve qmail sunucularda giden maillerin ( Identified Mail) ile imzalanmasının nasıl sağlanabileceğini anlatmıştım. Özellikle toplu mail gönderileri yapıyorsanız maillerinize mutlaka uygulanması gereken bildiğiniz gibi denilen bir diğer kimlik doğrulama metodunun geliştirilmiş ve yaygın olarak kullanılan versiyonudur.

ile aynı şeyi amaçlayıp aynı teknolojiyi kullanıyor olsalar ve sadece kullanmak yeterli gibi görünse de gönderdiğiniz mailleri hem hem de Domainkeys ile imzalamak elbette daha iyi olacaktır. Zira bazı sistemlerde sadece doğrulaması yapılırken bazılarında sadece DomainKeys kullanılıyor olabilir. Bu nedenle her iki yöntemi kullanarak yapılan imzalama, iki yöntemden sadece birini kullanan alıcı sistemlerle de iyi geçinmek anlamına gelir. Yazının devamında, daha önceki yazıma ek olarak qmail sistemlerde giden maillerin DKIM’in yanı sıra DomainKeys kullanılarak da imzalanmasından bahsedeceğim.

 

DomainKeys ve DKIM


Giriş bölümünde de değindiğim gibi DomainKeys ve DKIM birbirleri ile aynı mantıkta çalışıyor ve çok benzer metodları kullanıyorlar, daha önceki yazımda DKIM’in ne olduğuna ve çalışma mantığına uzun uzun değindiğim için bu yazıda DKIM nedir, DomainKeys nedir gibi konulara tekrar değinmeyeceğim, bu konularda bilgi almak için http://www.syslogs.org/qmail-giden-postalar-icin-dkim-implementasyonu/ linkindeki ilgili yazıya göz atabilirsiniz.

Çalışma Mantığı


qmail sistemlerde DKIM ve DomainKeys ile imzalama işlemi, giden maillerin gönderilmesinden sorumlu olan qmail-remote’un, imzalama işlemini yapacak olan bir wrapper script ile değiştirilmesi sayesinde yapılabilmektedir. İlgili script, uzaktaki sisteme gönderilmesi için qmail-remote’a verilmek istenen mail’i alır, DKIM için libdkim kütüphanesi ile birlikte gelen libdkimtest ve DomainKeys için de libdomainkeys kütüphanesi ile gelen dktest isimli programcıktan yararlanarak ve özel anahtarınızı kullanarak imzalama işlemini yaptıktan sonra teslim işlemi için gerçek qmail-remote verir. Yazının devamında, adım adım libdkimtest ve dktest’in kurulmasından, openSSL kullanarak private  key ve  (dns txt recordu olarak yayınlanacak) public key’in oluşturulmasından son olarak da qmail-remote’un imzalama işlemini yapacak wrapper script ile değiştirilmesinden bahsedeceğim.

Kurulum


libdkimtest ve dktest portable uygulamalar olduğu için uzun uzadıya kurulum prosedürleri bulunmuyor. İlgili paketleri download edip make işlemi yaptıktan sonra oluşan dosyaları sistemin binary dizinine atmak yeterli oluyor. Ben qmail’i FreeBSD sistemler üzerinde çalıştırıyorum. Dolayısı ile bu bölümde FreeBSD üzerine kurulumdan bahsedeceğim. Ancak kurulum herhangi bir linux dağıtımı için de pek farklı değildir. Dolayısı ile aynı yönergeler ile Linux’lar için de kurulum yapabilirsiniz.

Libdkim

Aslında libdkim http://libdkim.sourceforge.net/ adresinde bulunuyor ancak ben http://patchlog.com/security/qmail-and-dkim/ adresinde bulunan ve kütüphanenin Linux sistemler altında derlenebilmesi ve bizim wrapper scriptimizin de kullanacağı bir takım extra özellik içeren patch’li bir versiyonunu kullanıyorum.

Şimdi bu versiyonu sisteme kuralım:

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. Şimdi ilgili çalışma dizinine girip libdkim’in yukarıda bahsedilen patchli  versiyonunu indirelim

# cd /usr/local/src
# fetch http://dkim.moogly.nl/libdkim-1.0.19-patched.tgz

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

Derleme işleminden sonra src dizininde libdkimtest isimli 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:

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

Libdkim kurulumu bu kadar. libdkimtest komutunu vermeniz ve aşağıdaki gibi bir çıktı almanız gerekir.

# libdkimtest
dkimlibtest: can't open private key file test.pem

Yukarıdaki çıktıyı alıyorsanız, (özel anahtar dosyasını bulamadığı için uyarı veriyor olsa da) libdkimtest sorunsuz çalışıyor demektir.

Şimdi de libdomainkeys’in kurulumunu yapalım.

Libdomainkeys

Libdomainkeys http://sourceforge.net/projects/domainkeys/ adresinden download edilebilmektedir. /usr/local/src dizinine geçelim ve paketi indirelim.

# cd /usr/local/src/
# fetch http://downloads.sourceforge.net/project/domainkeys/libdomainkeys/0.69/libdomainkeys-0.69.tar.gz

Şimdi de paketi açıp make edelim.

# tar xvf libdomainkeys-0.69.tar.gz
# cd libdomainkeys-0.69
# make

Make işlemi sonucu oluşan dktest binary’sini /usr/local/bin dizinine taşıyıp, gerekli izinleri verelim:

# cp dktest /usr/local/bin/
# chown root:wheel /usr/local/bin/dktest
# chmod 755 /usr/local/bin/dktest

libdomainkeys kurulumu da bu kadar. dktest komutunu verdiğiniz zaman aşağıdaki gibi usage bilgisini içeren bir çıktı almanız gerekir.

# dktest
dktest: [-f] [-b#] [-c nofws|simple] [-v|-s selector] [-h] [-t#] [-r] [-T]

Durum sizde de yukarıdaki şekildeyse dktest çalışıyor demektir.

Gerekli programcıkların kurulmasından sonra, OpenSSL kullanarak private ve public key’lerin oluşturulması ve txt recordu olarak dns’e girilecek kayıtların düzenlenmesi bölümüne geçiyoruz.

Private ve Public Keylerin Oluşturulması


Key’lerle ilgili teorik bilgiye daha önceki yazımda değindiğim için burda uzun uzadıya tekrarlamayacağım, detay ve teorik bilgi isterseniz, daha önceki yazımın “OpenSSL Private ve Public Key Oluşturmak” bölümüne bakabilirsiniz. İmzalama işleminde kullanılacak private key ve alıcı tarafında doğrulama işlemi için kullanılacak (dns sorgusu ile elde edilecek) public key’i oluşturmak için OpenSSL kullanılmaktadır. Keylerin oluşturulması işlemi manual olarak yapılabilir ancak http://www.syslogs.org/downloads/domainkey * adresinde bulunan shell script ile daha kolay bir şekilde yapmak mümkün. İlgili script, verdiğiniz alan adı ve selector için private ve public key’leri  /etc/domainkeys dizini altında oluşturmakta ve dns sunucusuna girilmesi gereken txt kaydını da vermektedir.  Bu yüzden bu aşamada scripti kullanmak daha yerinde olacaktır.

* Scriptin orjinali http://www.backschues.net/backschues.net/know-how/qmail/domainkey adresinde bulunuyor. Ben scripte küçük bir değişiklik yaptım.

Şimdi shell scripti download edelim:

Kod
# cd /usr/local/src
# fetch http://www.syslogs.org/downloads/domainkey

Örnek olarak, syslogs.org domainini ve genel isimli selector’u kullanacağımızı düşünürsek scripti aşağıdaki şekilde çalıştırabiliriz:

Kod
# sh domainkey syslogs.org genel

Komutu verdiğiniz zaman, anahtarlar oluşturulup, /etc/domainkeys/ altında syslogs.org dizini altında konulacaktır ve aşağıdaki gibi bir çıktı verilecektir.

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

TXT record for BIND:
genel._domainkey.syslogs.org. IN TXT "v=DKIM1\; k=rsa\; t=y\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDynTqLz+FyCuU4GM4h87Jg1tXd9AxDaK6Ix2HV9vByoCkY8uY0LRd/1XSZMSP2oyeABsdppAahts5whPayVjG83XDb80C3bGaJW8/XKYjUjfmtzwQ/5sivpTAjfsPCvt7LGaQnkAIO20FDCybksYWRobvit9aD8WJGvqOc9bpQCwIDAQAB"

Gördüğünüz gibi bind dns sunucuları için sisteme eklenmesi gereken txt recordu veriliyor. Yukarıdaki çıktıyı bir yere not edin, dns kaydı oluşturulması ile ilgil bölümde kullanacağız.

Ayrıca /etc/domainkeys dizinine bakarsanız içerisinde alanadi.com isminde bir dizin olduğunu görebilirsiniz. Bizim örneğimiz için dizinin içeriği şu şekilde olacaktır:

# ls -l /etc/domainkeys/syslogs.org/
total 6
lrwxr-xr-x  1 root    wheel   45 Apr 26 23:30 default -> /etc/domainkeys/syslogs.org/rsa.private_genel
-rw-------  1 qmailr  qmail  887 Apr 26 23:30 genel
-rw-------  1 qmailr  qmail  887 Apr 26 23:30 rsa.private_genel
-rw-------  1 qmailr  qmail  272 Apr 26 23:30 rsa.public_genel
-rw-------  1 qmailr  qmail    6 Apr 26 23:30 selector

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 sunucusunda txt kayıtlarını oluşturmaktır.

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


Bu bölümde de uzun uzadıya teorik detaylara değinmeyeceğim, detay almak isterseniz daha önceki yazımın “Public Key İçin DNS Kaydı Oluşturulması” bölümüne bakabilirsiniz.

DKIM ve Domainkeys, aynı dns kaydını kullanmakta olduğu için sadece bir txt kaydı oluşturmak hem dkim hem de domainkeys için yeterlidir.

Şimdi örneğimizde kullandığımız syslogs.org domaini için dkim/domainkey kayıtlarını oluşturalım.

Öncelikle, _domainkey.syslogs.org alt domaini için aşağıdaki txt kaydını dns sunucusuna ekliyoruz:

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

Kullanılan 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.

Şimdi de genel._domainkey.syslogs.org için biraz önce not aldığımız txt kaydını giriyoruz:

"k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDynTqLz+FyCuU4GM4h87Jg1tXd9AxDaK6Ix2HV9vByoCkY8uY0LRd/1XSZMSP2oyeABsdppAahts5whPayVjG83XDb80C3bGaJW8/XKYjUjfmtzwQ/5sivpTAjfsPCvt7LGaQnkAIO20FDCybksYWRobvit9aD8WJGvqOc9bpQCwIDAQAB"

Bu kayıt, bir önceki bölümde oluşturduğumuz public key’i barındırdığı için, gene aynı adımda oluşturulan private key ile imzalanan mailler için imza doğrulaması yapılabilmesine olanak sağlayacaktır. DNS kayıtlarınızı ekledikten sonra nslookup ile durumu doğrulayabilirsiniz:

Kod
# nslookup -q=txt genel._domainkey.syslogs.org

Çıktı şu şekilde olacaktır:

genel._domainkey.syslogs.org      text = "v=DKIM1\; k=rsa\; t=y\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDynTqLz+FyCuU4GM4h87Jg1tXd9AxDaK6Ix2HV9vByoCkY8uY0LRd/1XSZMSP2oyeABsdppAahts5whPayVjG83XDb80C3bGaJW8/XKYjUjfmtzwQ/5sivpTAjfsPCvt7LGaQnkAIO20FDCybksYWRobvit9aD8WJGvqOc9bpQCwIDAQAB"

DNS kayıtlarınız sorunsuz olarak çalışıyorsa, bir sonraki bölüme geçebilirsiniz.

qmail`in Yapılandırılması


Şimdi ki adımda qmail-remote’u imzalama işlemini yapacak wrapper script ile değiştireceğiz.

Bunun için öncelikle qmail’i stop edelim.

# qmailctl stop

Daha sonra da /var/qmail/bin dizinine geçip qmail-remote’un adını qmail-remore.orig olarak değiştiriyoruz.

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

Şimdi de, yeni bir qmail-remote dosyası açıyoruz:

# vi /var/qmail/bin/qmail-remote

ve aşağdaki satırları bu dosyaya ekliyoruz :
FreeBSD kullanıyorsanız:

#!/usr/local/bin/bash
# version 7
PATH=/bin:/usr/bin:/usr/local/bin

DOMAIN=${2##*@}
[ "$DKREMOTE" ] || DKREMOTE="/var/qmail/bin/qmail-remote.orig"
[ "$SELECTOR" ] || SELECTOR=$(cat "/etc/domainkeys/$DOMAIN/selector")
[ "$DKSIGN" ] || DKSIGN="/etc/domainkeys/$DOMAIN/rsa.private_$SELECTOR"

if [ -r "$DKSIGN" ] ; then

        tmp=`mktemp -t dk.sign.XXXXXXXXXXXXXXXXXXX`
        tmp2=`mktemp -t dk2.sign.XXXXXXXXXXXXXXXXXXX`
        tmp3=`mktemp -t dk3.sign.XXXXXXXXXXXXXXXXXXX`
        tmp4=`mktemp -t dk4.sign.XXXXXXXXXXXXXXXXXXX`
        /bin/cat - >"$tmp"

        /usr/local/bin/dktest -s "$DKSIGN" -c nofws d="$DOMAIN" -h <"$tmp" >> "$tmp2" 2>&1

        (/bin/cat "$tmp2" "$tmp" |tr -d "\\015") > "$tmp3"

        /usr/local/bin/libdkimtest -d"$DOMAIN" -y"$SELECTOR" -z1 -s "$tmp3" "$DKSIGN" "$tmp4" 2>/dev/null

        (/bin/cat "$tmp4" |tr -d "\\015") | "$DKREMOTE" "[email protected]"
        retval=$?
                rm "$tmp" "$tmp2" "$tmp3" "$tmp4"
        exit $retval
else
        # No signature added
        exec "$DKREMOTE" "[email protected]"
fi

Linux kullanıyorsanız:

#!/bin/bash
# version 7
PATH=/bin:/usr/bin:/usr/local/bin

DOMAIN=${2##*@}
[ "$DKREMOTE" ] || DKREMOTE="/var/qmail/bin/qmail-remote.orig"
[ "$SELECTOR" ] || SELECTOR=$(cat "/etc/domainkeys/$DOMAIN/selector")
[ "$DKSIGN" ] || DKSIGN="/etc/domainkeys/$DOMAIN/rsa.private_$SELECTOR"

if [ -r "$DKSIGN" ] ; then

        tmp=`mktemp -t dk.sign.XXXXXXXXXXXXXXXXXXX`
        tmp2=`mktemp -t dk2.sign.XXXXXXXXXXXXXXXXXXX`
        tmp3=`mktemp -t dk3.sign.XXXXXXXXXXXXXXXXXXX`
        tmp4=`mktemp -t dk4.sign.XXXXXXXXXXXXXXXXXXX`
        /bin/cat - >"$tmp"

        /usr/local/bin/dktest -s "$DKSIGN" -c nofws d="$DOMAIN" -h <"$tmp" >> "$tmp2" 2&gt&1

        (/bin/cat "$tmp2" "$tmp" |tr -d "\\015") > "$tmp3"

        /usr/local/bin/libdkimtest -d"$DOMAIN" -y"$SELECTOR" -z1 -s "$tmp3" "$DKSIGN" "$tmp4" 2>/dev/null

        (/bin/cat "$tmp4" |tr -d "\\015") | "$DKREMOTE" "[email protected]"
        retval=$?
                rm "$tmp" "$tmp2" "$tmp3" "$tmp4"
        exit $retval
else
        # No signature added
        exec "$DKREMOTE" "[email protected]"
fi

Not: Script bash kullanmak üzere düzenlenmiştir, bu nedenle sisteminizde bash’ın kurulu olması gerekir.

Şimdi de 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

Herşey yolunda gittiyse artık qmail giden mailler için hem dkim hem de domainkeys ile imzalama işlemi yapacaktır. Durumu test etmek için, sunucunuzdan herhangi bir yahaoo adresine gönderim yapabilirsiniz. Yahoo hem dkim hem de domainkeys doğrulaması yaptığı için imzalama işlemlerinin doğruluğunu net olarak kontrol edebilirsiniz.

Düzgün çalışan bir qmail sunucudan, yahoo’ya gönderilen bir mailin header’ında dkim ve domainkeys ile ilgili şu ibareler bulunacaktır.

Authentication-Results: mta1020.mail.sk1.yahoo.com  from=syslogs.org; domainkeys=pass (ok);  from=syslogs.org; dkim=pass (ok)

Görüldüğü üzere kimlik doğrulama hem domainkeys hem de dkim için pass etmiş durumda.

Konu ile ilgili daha fazla bilgi almak için aşağıdaki adresleri de inceleyebilirsiniz:

Kaynaklar


http://libdkim.sourceforge.net/
http://domainkeys.sourceforge.net/
http://www.syslogs.org/qmail-giden-postalar-icin-dkim-implementasyonu/

Kategoriler: *nix,Qmail,Security |

Bu yazılar da ilginizi çekebilir:


- qmail – Giden Postalar İçin DKIM İmplementasyonu
- qmail Kurulum Scripti – FreeBSD 9.x
- qmail Kurulum Scripti v0.2 – CentOS 5.4
- qmail Kurulum Scripti
- Rblsmtpd

Yorumlar


Henuz yorum yapilmamis.

Yorumda bulunun.