GSoC 2013 için kabul olan öğrenciler belli oldu

Bu seneki Google Summer of Code için Honeynet projesinde danışman (mentor) olarak başvurmuştum. Az önce sonuçların açıklanması ile benim için de sevindiri haber geldi ve 2 öğrenciye danışmanlık edeceğimi öğrendim.

Değerlendirme süreci bu sene daha önceki senelerden biraz farklı oldu. Honeynet daha önceki senelerde danışmanların değerlendirmelerine bakarak karar veriyor idi. Bu sene daha fazla katılım ile yapılan başvurular değerlendirildi. Network Analyzer projesi için benim dışımdaki 2 yardımcı danışmanın değerlendirme notları dışında öğrencilere yollanan kodlama sınavı da dikkate alındı. Sonrasında Honeynet üyelerinden Felix, öğrencilere kodlamalarıyla ilgili sorular sordu. Kodundaki hata durumları nedir, nasıl düzeltirsin, nasıl test edersin gibi sorular idi bunlar. Bu sorulara gelen yanıtlara göre bir değerlendirme notu verdi. En son olarak da öğrenciler ile hiç iletişim kurmamış bir üye, David, başvuruları,  epostaları, kodlama cevaplarını okuyarak bir not verdi. Bütün bu notların ortalamasına ve eldeki slot sayısına göre öğrenci seçimleri yapıldı. Son dakikada artan bir slot ile bana 2. öğrenciyi kabul etme şansı doğmuş oldu ve bu sene GSoC için Network Analyzer projesine Gürcan Gerçek ve Hao Ma kabul oldu. Böylece son iki senelerde öğrenci olarak yaşadığım GSoC tecrübesini bu sene danışmanlık ile şekillendirmiş olacağım.

Gürcan ile hali hazırda Yakından Eğitim‘de beraber çalışıyoruz. Öncesinde beraber iş yaptığımızdan sonrasında daha rahat yönlendirip çalışabileceğimi biliyorum. Aynı anda 2 öğrencinin aynı projenin farklı parçalarını yapmasını sağlamak benim için güzel bir deneyim olacak. Eğlenceli bir yaz kodlaması bizleri bekliyor.

Kabul olan tüm öğrencilere şimdiden başarılar.

27 Mayıs 2013

Posted In: Gezegen, gsoc

BIND, IPv6 ve DNSSEC

Bir onceki yazida DNSSEC’e giris yapmis ve PowerDNS’i arkada MySQL kullanacak sekilde yapilandirdiktan sonra sundugumuz DNS alanina DNSSEC destegi kazandirmistik. Bu yazida ayni islemin BIND ile nasil yapilabilecegine bakacagiz. Diger yazidan farkli olarak bu yazida temel kayitlarin aciklamalari yerine kayitlarin imzalanmasi, alan transferi (axfr) gibi diger alanlara da deginecegiz. Bu seferki ornegimiz .net TLD’sine sahip olacagindan farkli bir guvenlik zincirine kayit eklememiz gerekmeyecek. (DLV)

Problem su ki kendi DNS alanimizi kendimiz sunsak dahi DS kaydini alan adimizi kaydettigimiz yere vermemiz gerekiyor ki bizi icinde barindiran alana bu kayit iletilebilsin. Boyle olunca da yine destek veren ve destek vermeyen alan adi kaydedicilerden bahsetmek gerekiyor. Ben normalde Hover[1] kullaniyorum fakat ne yazik ki Hover henuz DS kaydi eklenmesine izin vermiyor. Bu isleme olanak taniyan alan adi kaydedicilerin ICANN tarafindan tutulan bir listesine suradan[2] ulasilabilir. Gozuken o ki kala kala yine SOPA destekcisi GoDaddy’ye kaliyoruz.

dnssecenabled.net adresi icin, Ubuntu 12.04 ve CentOS 6.4 uzerinde BIND ile IPv6 ve DNSSEC destegi veren 2 ana isim sunucu (authoritative nameserver) kuracagiz. Bu DNS sunuculardan biri ana (master Ubuntu) digeri ise ikincil(slave CentOS epel ve remi tanimli) olarak gorev yapacak ve ikincil isim sunucu ana isim sunucudan kayitlari alacak. DigitalOcean’da olusturdugum bu sunucular IPv6’e sahip degiller o yuzden HE’nin (Hurricane Electric) tunnelbroker.net hizmetini kullanip IPv6 adreslerini IPv4 uzerinden tunelleyerek ise baslayacagiz.

Tunnelbroker’da hesap actiktan sonra “Create regular tunnel” diyoruz ve IPv4 adresimizi ve kullanmak istedigimiz tunel sunucuyu secip “Create tunnel” tusuna bastigimizda tunnelbroker bizim icin gereke ayarlari
ekrana basiyor. Gelen pencerede “Example Configuration” altinda kullandiginiz isletim sistemini secerseniz hangi dosyada ne degisiklikleri yapmaniz gerektigini size gosterecektir. Ornegin Ubuntu sunucu icin /etc/network/interfaces dosyasina asagidaki satirlari eklememi soyluyor.

auto he-ipv6  
iface he-ipv6 inet6 v4tunnel  
        address 2001:470:1f04:9cb::2
        netmask 64
        endpoint 72.52.104.74
        local 198.199.111.195
        ttl 255
        gateway 2001:470:1f04:9cb::1

CentOS seceneklerde bulunmadigindan onu su sekilde elle ekliyorum. Tabii bu ve yukaridaki degerleri kendinize gore degistirmeyi unutmayin.

ip tunnel add he-ipv6 mode sit remote 216.66.84.46 local 198.211.120.12 ttl 255  
ip link set he-ipv6 up  
ip addr add 2001:470:1f14:efa::2/64 dev he-ipv6  
ip route add ::/0 dev he-ipv6  
ip -f inet6 addr  

Ardindan /etc/sysconfig/network dosyasini acip su uc satiri ekliyoruz.

NETWORKING_IPV6=yes  
IPV6_DEFAULTDEV=he-ipv6  
IPV6_DEFAULTGW=2001:470:1f14:efa::1  

Son adimda ise /etc/sysconfig/network-scripts/ifcfg-he diye bir dosya olusturup icine su degerleri yazdiktan sonra network servisini yeniden baslatiyoruz.

DEVICE=he-ipv6  
TYPE=sit  
BOOTPROTO=none  
ONBOOT=yes  
IPV6INIT=yes  
IPV6TUNNELIPV4=216.66.84.46  
IPV6ADDR=2001:470:1f14:efa::2  

Lutfen degerleri kendinize gore degistirmeyi unutmayin. Bu asamayi da tamamlayinca ping6 ve traceroute6 ile IPv6 yapilandirmasinin calisip calismadigini kontrol edebilirsiniz. Geldigimiz kademede elimizdeki bilgiler su sekilde;

ns1.dnssecenabled.net Ubuntu BIND 9.8.1 Master 198.199.111.195 2001:470:1f04:9cb::2

ns2.dnssecenabled.net CentOS BIND 9.8.2 Slave 198.211.120.12 2001:470:1f14:efa::2  

Simdi alan adimizi kaydettigimiz GoDaddy’ye gidip Glue Record’lari (bunun Turkce’ye nasil cevirilmesi gerektigini bilen varsa lutfen benimle iletisime gecsin) ekleyecegiz. Bir DNS terimi olan glue record’un yaptigi is basitce soyle. dnssecenabled.net’in kayitlarini ns1.dnssecenabled.net ve ns2.dnssecenabled.net uzerinden sunmak istiyoruz. www.dnssecenabled.net’e ulasmak istedigimizde once ns1.dnssecenabled.net’e adresine www.dnssecenabled.net’i nerede bulacagimizi sormamiz gerekiyor ama ns1.dnssecenabled.net zaten dnssecenabled.net alaninda. Iste bunun gibi dongusel bir bagimlilik durumunda alan adini kaydettirdigimiz yere bak bunlar isim sunucularin IP adresleri ona gore diyerek verdigimiz kayitlara glue records deniyor.

GoDaddy’de bu kayitlari ekledigimiz alan “domain control panel”‘de sol alttaki “Host Summary” bolumunde bulunuyor. “Add” tusu ile ns1 ve ona ait IPv4 ve IPv6 adreslerini ekledikten sonra sayfayi yenileyip ayni islemi ns2 icin de yapiyoruz. Boylelikle glue records da eklenmis oluyor. Ardindan yine “domain control panel”‘de “Nameserver” bolumundeki “Set Nameservers” tusuna tiklayip dnssecenabled.net alan adimiz icin glue record’lari az once eklemis oldugumuz ve isim sunuculari barindiracagimiz ns1.dnssecenabled.net ve ns2.dnssecenabled.net adreslerini giriyoruz. Artik geriye iki sunucudaki BIND’i yapilandirmak ve DNSSEC isleri bittiginde GoDaddy’ye donup DS kaydini eklemek kaliyor. Isim sunucularin internette yayilmasi zaman alacagindan su asamada az once ekledigimiz kayitlari goremezsek cok endiselenmemekte fayda var. Fakat kontrol icin bir root isim sunucuyu sorgulayabiliriz.

dig @a.gtld-servers.net dnssecenabled.net NS

Eger asagidakine benzer bir cevap aliyorsak, yapilandirmamizda bir sorun yok demektir.

; > DiG 9.9.2-P1 > @a.gtld-servers.net dnssecenabled.net NS
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 5
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:  
 ; EDNS: version: 0, flags:; udp: 4096  
 ;; QUESTION SECTION:  
 ;dnssecenabled.net. IN NS

;; AUTHORITY SECTION:  
 dnssecenabled.net. 172800 IN NS ns1.dnssecenabled.net.  
 dnssecenabled.net. 172800 IN NS ns2.dnssecenabled.net.

;; ADDITIONAL SECTION:  
 ns1.dnssecenabled.net. 172800 IN A 198.199.111.195  
 ns1.dnssecenabled.net. 172800 IN AAAA 2001:470:1f04:9cb::2  
 ns2.dnssecenabled.net. 172800 IN A 198.211.120.12  
 ns2.dnssecenabled.net. 172800 IN AAAA 2001:470:1f14:efa::2

;; Query time: 234 msec  
 ;; SERVER: 192.5.6.30#53(192.5.6.30)  
 ;; WHEN: Thu May 23 16:28:09 2013  
 ;; MSG SIZE rcvd: 170

Gelelim BIND kurulumu ve yapilandirmasina. Yazinin basinda da bahsettigim uzere Ubuntu sunucu master, CentOS sunucu ise slave olarak gorev yapacak. Bu ornekte su kayitlari tanimlayacagim.

www.dnssecenabled.net A 198.199.111.195  
www2.dnssecenabled.net A 198.199.111.195  
www3.dnssecenabled.net A 198.199.111.195  
www4.dnssecenabled.net A 198.211.120.12  
www5.dnssecenabled.net A 198.211.120.12  
mail.dnssecenabled.net A 198.199.111.195

www.dnssecenabled.net AAAA 2001:470:1f04:9cb::2  
www2.dnssecenabled.net AAAA 2001:470:1f04:9cb::2  
www3.dnssecenabled.net AAAA 2001:470:1f04:9cb::2  
www4.dnssecenabled.net AAAA 2001:470:1f14:efa::2  
www5.dnssecenabled.net AAAA 2001:470:1f14:efa::2  
mail.dnssecenabled.net AAAA 2001:470:1f04:9cb::2

dnssecenabled.net MX mail.dnssecenabled.net  
alt1.dnssecenabled.net CNAME www.dnssecenabled.net  
alt2.dnssecenabled.net CNAME www4.dnssecenabled.net  

Ubuntu icin ise basliyoruz.

sudo apt-get install bind9

Kurulum bittikten sonra /etc/bind/named.conf.options dosyamizda IP ve port ayarlarini yapiyoruz. Daha sonra /etc/bind/named.conf.local dosyasini acip su satirlari giriyoruz ki dnssecenabled.net alanini sunucagimiz isim sunucuya soylemis olalim.

zone "dnssecenabled.net"  
    type master;
    file "/etc/bind/db.dnssecenabled.net"
    allow-transfer { 2001:470:1f14:efa::2;
                     198.211.120.12;};
};

Sira geldi db.dnssecenabled.net dosyasini olusturmaya. Benim dosyamin icerigi yukaridaki kayitlar goz onunde bulunduruldugunda su sekilde gozukuyor.

;
; BIND data file for dnssecenabled.net
;
$TTL    300
@    IN  SOA dnssecenabled.net. root.dnssecenabled.net.(
                  3     ; Serial
                300     ; Refresh
                300     ; Retry
                300     ; Expire
                300)    ; Negative Cache TTL

dnssecenabled.net. IN NS ns1.dnssecenabled.net.  
dnssecenabled.net. IN NS ns2.dnssecenabled.net.  
dnssecenabled.net. IN MX 10 mail.dnssecenabled.net.

ns1 IN A 198.199.111.195  
ns2 IN A 198.211.120.12  
ns1 IN AAAA 2001:470:1f04:9cb::2  
ns2 IN AAAA 2001:470:1f14:efa::2

mail IN A 198.199.111.195  
mail IN AAAA 2001:470:1f04:9cb::2

www IN A 198.199.111.195  
www2 IN A 198.199.111.195  
www3 IN A 198.199.111.195  
www4 IN A 198.211.120.12  
www5 IN A 198.211.120.12  
www IN AAAA 2001:470:1f04:9cb::2  
www2 IN AAAA 2001:470:1f04:9cb::2  
www3 IN AAAA 2001:470:1f04:9cb::2  
www4 IN AAAA 2001:470:1f14:efa::2  
www5 IN AAAA 2001:470:1f14:efa::2

alt1 IN CNAME www.dnssecenabled.net.  
alt2 IN CNAME www4.dnssecenabled.net.  

BIND servisini yeniden baslattigimizda master sunucumuz hazir olacak.

service bind9 restart

Isim sunucumuz aslinda dnssecenabled.net'i barindiran sunucu da oldugundan ters DNS kayitlarini yapmayacagim. Bunun icin baska kaynaklara bakilabilir. Zaten cok zor da degil ayarlamasi. Sira geldi CentOS sunucuya BIND kurulup bu ayarladigimiz sunucunun ikincil sunucusu olarak hizmet vermesini saglamaya.

sudo yum install bind bind-utils

Komutuyla gerekli paketleri kuruyorum. bind-utils aslinda gerekli degil fakat test ve hata giderme amacli kurulmasi iyi olacaktir.

CentOS'ta BIND'in kullandigi dizin yapisi biraz daha degisik. Ilk olarak yapmamiz gereken /etc/named.conf dosyasina gecip IP ve port ayarlarini duzenledikten sonra recursion'i kapatmak. named servisini yeniden baslatmadan once su komutu calistiriyoruz. Aslinda servisi ilk yeniden baslattigimizda kendisi bu anahtari olusturmasi gerekiyor fakat islemleri SSH uzerinden yaptigimizdan yeterli entropi olmayinca anahtar uretmesi uzun zaman aliyor, belki de hic uretemiyor hic o kadar uzun beklemedim :). O yuzden elle olusturuyoruz anahtarimizi.

rndc-confgen -a -r /dev/urandom  
service named restart  

Yerelimizden dig @ns2.dnssecenabled.net google.com A ile recursion yapip yapmadigini kontrol edebiliriz CentOS'a az once kurdugumuz isim sunucumuzun. WARNING: recursion requested but not available diyorsa sorun yok demektir. Simdi master sunucunun slave'i olarak ayarlayacagiz. Bunun icin /etc/named.conf dosyasina su satirlari eklememiz yeterli olacaktir.

zone "dnssecenabled.net" IN {  
    type slave;
    file "slaves/db.dnssecenabled.net";
    masters { 2001:470:1f04:9cb::2;
            198.199.111.195; };
};

Yazinin sonuna firsat bulunca bu yazi icin olusturdugum ve duzenledigim tum ayar dosyalarini barindiran tar.bz2 arsivini koyacagim. Ayarlari oradan da kontrol edebilirsiniz.

Evet boylelikle temel DNS kurulumunu bitirmis olduk. Sira geldi DNSSEC islemlerine. Fakat ondan once iki ana sunucu arasindaki veri transferini nasil daha guvenli hale getirebiliriz ona bakalim. TSIG (transaction signatures) iste tam olarak bu ise yariyor. Alan transferi sirasinda iki sunucunun birbirleriyle konustuklarina emin olabilmelerine simetrik sifreleme yontemiyle imkan taniyor. Simetrik sifreleme kullanildigindan her ikincil(slave) sunucu icin yeni bir anahtar olusturulmasi tavsiye ediliyor. Bu sayede bir ikincil sunucunun ele gecirilmesi daha buyuk bir guvenlik tehdidi olusturmamis oluyor. TSIG aslinda DNSSEC'in bir parcasi degil fakat bunca zahmete girdigimize gore hazir elimiz degmisken TSIG islemini de yapmakta bir sakinca yok. Burada onemli bir hususu gozden kacirmamak gerekiyor. TSIG iki sunucu arasindaki veri transferinde veriyi sifrelemiyor, sadece sunucularin gercekten konusmak istedikleri sunucularla konustuklarini anlamalarina olanak taniyor. Eger transfer sirasinda veriyi sifreleme gereksinimi de duyuyorsaniz VPN ya da duruma gore SSH vs. cozumlerine bakmaniz gerekecek. Fakat onlar bu yazinin konusu degil zira blog degil de ansiklopedi yazmak gerekecek o kadar derine inmeye niyetlenirsek :).

TSIG anahtarini uretmek icin dnssec-keygen aracini kullanacagiz. Yine RFC'lere dalarak hangi algoritmalarin desteklendigini bulup cikarabiliriz fakat ben sizin icin isin buyuk kismini yapip, kabul edilebilir duzeyde degerleri olan komutlari buraya yazacagim. HMAC-SHA512 algoritmasi ile 512 bitlik anahtar uzunlugu seciyorum.

dnssec-keygen -r /dev/urandom -a HMAC-SHA512 -b 512 -n HOST ns1-to-ns2.

Sonda nokta var teamulen. Bu komutta degismesi gereken tek kisim sondaki ns1-to-ns2. kismi ki bu da anahtari tanimama yarayan anahtar adini ifade ediyor. Yani anahtari ns1 ile ns2 arasinda kullanacagim. Burada istediginiz isimi secmekte ozgursunuz. Anahtar uretimi -r /dev/urandom kullanmasaydik yine SSH uzerinde oldugumuzdan ve sistem yeterli entropi toplayamadigindan cok uzun zaman alabilirdi fakat etrafindan dolasmis olduk. Bu komutu verdigimiz dizinde .key ve .private ile biten iki dosya olusacak. Ikisinde de ayni anahtari gorecegiz. Simdi bu uretilen anahtari hem ana hem de ikincil sunucuda BIND'i yapilandirdigimiz dosyalara ekleyecegiz. Ekleyecegimiz satirlar suna benziyor. Tekrar dosya yollarini da yazmakta yarar var. Ubuntu icin /etc/bind/named.conf.options CentOS icin /etc/named.conf

key "ns1-to-ns2." {  
    algorithm hmac-sha512;
    secret "Uh8uk5kUR/whQYNGoq50Z80hA1ab706fdPccJq...";
};

server 198.211.120.12 {  
    keys { "ns1-to-ns2." ;} ;
};

Bunu iki sunucuda da IP adreslerini duzelterek yapiyorsunuz. Ardindan asil sunucu olan Ubuntu'da named.conf.local dosyasinda bulunan zone'umuzdaki allow-trasnfer alanina bu paylasilan anahtari girip iki sunucudaki servisleri de yeniden baslatiyoruz. Artik TSIG'in calisip calismadigini kontrol edebiliriz. Bu testi yapmanin en kolay yolu master sunucudaki alan dosyasinda bir degisiklik yapip DNS servisini yeniden baslatmak. Bir CNAME kaydi ekleyip bu islemi gerceklestiriyorum ve ikincil sunucudaki /var/log/messages dosyasina tail ile goz atiyorum.

client 198.199.111.195#39669: received notify for zone 'dnssecenabled.net': TSIG 'ns1-to-ns2'

benzeri bir cikti goruyorsak TSIG istedigimiz gibi yapilandirilmistir demektir. Tabii server tanimlarini IPv6 adreslerimiz icin eklemeyi de unutmayalim ki hem IPv4 hem de IPv6 transferleri TSIG kullansin.

Yazinin baslangicindan yaklasik 1500-2000 kelime sonra nihayet DNSSEC'e gelebildik. Onceki yazida da bahsettigim uzere ZSK ve KSK adi verilen anahtarlara ihtiyacimiz olacak. Bunlari bir suru algoritma kullanarak olusturabiliriz. RSA/SHA-256 (root alaninin da kullandigi algoritma) ile yolumuza devam edecegiz. 2048 bit uzunluk da su an icin gayet yeterli gozukuyor fakat 4096 secmekte de sakinca yok. TSIG'de oldugu gibi bu is icin de dnssec-keygen kullanacagiz.

dnssec-keygen -r /dev/urandom -f KSK -a 8 -b 4096 dnssecenabled.net

-r'i daha once kullanmistik. -f KSK bu anahtar ciftinin key signing key olarak gorev yapacagini soyluyor. -a 8 ise RSA/SHA-256 algoritmasi. -b bit uzunlugu ve son olarak alanimizin adi. .key ve .private uzantili iki dosya olusmus olmasi gerekiyor. ZSK de benzer komutla uretiliyor fakat bu sefer -f KSK'i komuttan cikartiyoruz.

dnssec-keygen -r /dev/urandom -a 8 -b 2048 dnssecenabled.net

Boylelikle 4 adet dosya olusturmus olduk. Izinlerini 640 olarak duzenlemek isteyebilirsiniz. Burada aslinda biraz da guvenlige deginsek iyi olacak. Normalde BIND'i chroot ederek calistirip, bu sunuculari bir firewall'in ya da hic olmadi duzgun iptables kurallarinin arkasina koymak gercekten onemli. Bu kisimi da umarim bir ileride bir iptables yazisiyla anlatmaya calisirim.

KSK ve ZSK'imizi olusturduktan sonra alan adimizi kaydettirdigimiz (bu ornekte GoDaddy) yere DS kaydimizi vermemiz gerekiyor. Urettigimiz KSK'den DS kaydimizi dnssec-dsfromkey komutu ile uretiyoruz.

dnssec-dsfromkey Kdnssecenabled.net.+008+01207

bu komutta Kdnssec... ile baslayan kisimi kendi KSK'iniz tuttugunuz dosya ile degistirmeniz gerekiyor. Dosya sonundaki .key veya .private uzantisini kullanmiyorsunuz. Komut suna benzer bir cikti verecektir.

dnssecenabled.net. IN DS 1207 8 1 597A5CB9F0...  
dnssecenabled.net. IN DS 1207 8 2 9030FF4BF3...  

Iste bu kayitlar alan adimizi kaydettirdigimiz yere verecegimiz DS kayitlaridir. Bir kenara not edelim. Kayitlari imzalamaya geciyoruz.

dnssec-signzone -a -o dnssecenabled.net -N increment -r /dev/urandom db.dnssecenabled.net Kdnssecenabled.net.+008+01207.private Kdnssecenabled.net.+008+19800.private

Aslinda BIND'in 9.9.x surumleri bu islemleri bizim icin yapabiliyor fakat depolarda 9.8.1 oldugunda elle imzalamak durumunda kaldik. Simdi NSEC'ten NSEC3'e cevirmek icin ne yapacagimiza bakalim. Ayni komuta -H 10 -3 d00dbaaf verdigimizde bizim icin NSEC'ten NSEC3'e cevirecek. -3'ten sonraki kisim hexadecimal olarak yazabileceginiz herhangi bir sey olabilir. Ben deadbeef'ten esinlenip bunu sectim. Simdi eski alani yedekleyip imzalanmasi(db.dnssecenabled.net.signed) uzerine yazalim ve servisi yeniden baslatalim. Su anda slave'e imzalanmis alanin gitmis olmasi gerekiyor. DS kayitlarini eklemenin vakti geldi. GoDaddy'nin kontrol paneline gidiyoruz ve "Add DS Records" altindan gerekli kayitlari ekliyoruz. Bu kayitlar DNS sisteminde yayildiginda dig'e +dnssec parametresi vererek alanimizi sorgulayanlar ad(authenticated data) bayragini donen cevap icerisinde gormeye baslayacaklardir. Iste DNSSEC bu kadar basit.

Alanimiza yeni bir kayit ekledigimizde imzalama ve servisi yeniden baslatma isini su an icin yeniden yapmamiz gerekiyor. Dolayisiyla .signed'i normal dosyanin uzerine yazmadan once yedegini almis olmakta fayda var. Yoksa her seferinde butun kayitlari yazmak iskence olacaktir. BIND 9.9.x surumleri itibariyle bu islemler otomatik yapilabiliyor olmasina ragmen ne Ubuntu 12.04 ne de CentOS 6.4 depolarinda o surum bulunmadigindan islemleri elle yaptik. Fakat BIND surumu yukseldikce isimiz biraz daha kolaylasacak.

Asagida yeni olusturdugumuz alan adinin DNSSEC testine ait goruntuyu paylasiyorum.

dnssecenabled.net-2013-05-23-15-11-05

Gordugunuz gibi bir onceki yazida baktigimiz test.name.tr gibi siyah kalin oklar bulunmuyor ve butun DNS kayitlari DNSSEC ile imzalanmis durumda.

DNSSEC ile ilgili bu ikinci yazida yine anahtar degisimi (key rollover), SSHFP kayitlari ve DANE(TLSA) konusunda yazmaya firsat olmadi fakat onlari da bir sonraki yazida ele alip DNSSEC defterini bir sureligine kapatmayi planliyorum. Ardindan "iptables: anneye anlatir gibi" projesine baslayacagim :).

Sunuculari iki hafta kadar kurcalamak isteyen olursa diye acik birakacagim. Eger olur da girip bir bakmak isterseniz haber etmeniz yeterli.

[1] www.hover.com

[2] http://www.icann.org/en/news/in-focus/dnssec/deployment

24 Mayıs 2013

Posted In: Authoritative, BIND, CentOS, dns, DNS Sunucu, dnssec, Gezegen, IPv6, Master, Slave, Sunucu, Tunnelbroker, ubuntu

DNSSEC

Ana basliga “nasil” sozcugunu koyacaktim fakat yazi, ortalama bir nasil yazisindan biraz daha derine indi. Dolayisiyla okuyacaklarin bunu goz onunde bulundurmasinda fayda var.

Neden DNSSEC?
DNSSEC nasil yazisi okumaya gelmis insanlara “DNS nedir, nicin onemlidir?” anlatmaya gerek olmadigindan DNSSEC standardinin gelistirilmesine onayak olan ihtiyac ya da ihtiyaclar nelerdi bunlara kisaca deginmeye calisacagim.

Onbellek yaniltma saldirilari (DNS Cache Poisoning Attack) diye adlandirilan atak turu, onbellekleme yapan bir isim sunucuya (caching nameserver) asil iletisilmek istenen sunucu yerine o sunucuyu taklit eden baska bir sunucunun gosterilmesi olarak tanimlaniyor. Bunun sonucunda o isim sunucuyu kullanan diger istemcilerden gelen trafik ya gitmesi gereken yere hic ulasmadan baska bir yere gidiyor ya da gecmemesi gereken bir sunucu uzerinden gecirilip nihai hedefine yonlendiriliyor. Bu sayede e-posta iceriklerinin, VoIP vb. iletisimin takibi, hatta kullanicilarin hesaplarinin calinmasi mumkun olabiliyor. Onbellek yaniltma saldirilari disinda, tam olarak olmasa da benzer mantikla calisan aradaki adam (MITM) ve dogrudan o alan adini barindiran ana isim sunucudaki (authoritative nameserver) verinin degistirilmesi mantigiyla calisan saldirilar da mevcut.

Burada saydigim ve saydiklarima benzer saldirilarin onlenebilmesi icin, istemcideki DNS cozucunun bir sekilde aldigi DNS verisinin dogrulugunu ve butunlugunu kontrol etmesi gerekiyor. Iste DNSSEC bu asamada devreye
giriyor. Asimetrik sifreleme yapilarak genel anahtarlarla bir guven zinciri olusturuluyor.

Cogumuz genel anahtarli sifrelemenin e-posta uygulamalarina asinadir. Daha once kullanmamis olanlar da pek cok viki ya da dergide konuyla ilgili yazilar bulabilirler. DNSSEC icin genel anahtarli sifreleme uygulamalarindan verinin imzalanmasi konusuna deginecegiz. Aynen e-posta’da oldugu gibi DNSSEC’te de anahtarinizla DNS verinizi imzaliyorsunuz. DNSSEC dogrulamasi yapan istemciler sizi icinde barindiran zone’dan (alandan) anahtarinizi okuyor ve DNS verisinin degistirilmedigine boylelikle emin oluyorlar. Tabii DNS oldukca dagitik bir yapi oldugundan su an icin mevcut her ccTLD ve TLD’nin bu sistemi uygulamaya baslamadigini goruyoruz. Bu da guven zincirinin belirli noktalarda kirilmasina neden oluyor. “Bu gibi durumlarla bas edilebilir mi? Bas edilebilerse nasil edilebilir?” gibi sorularin yanitlarini yazinin ilerleyen kisimlarinda vermeyi deneyecegim.

DNSSEC Kayit Turleri
DNS’i yeniden icat etmektense DNSSEC varolan DNS uzerine eklenti olarak dusunulmustur. Dolayisiyla beraberinde birkac yeni kayit turu getirir.

-DNSKEY Kaydi
Bir DNS alanindaki kayitlar DNSSEC icin alana ait anahtar ile imzalanirlar. Fakat bu beraberinde su guvenlik riskini dogurur; Olasi bir saldirgan kayitlarin duz metin ve hashlenmis hallerine sahip olacagindan, eger cok sayida DNS kaydini barindiran bir alansa saldirilan, sifresinin kirilabilme ihtimali ortaya cikacaktir. Bu problemin onune gecmek icin iki tur anahtar tanimlanmistir.

a) Key Signing Keys (KSK-Anahtar imzalama anahtarlari)
b) Zone Signing Keys (ZSK-Alan imzalama anahtarlari)

Zone signing key, DNS alanini imzalamak icin kullanilir. Key signing key ise kendisi de dahil butun DNSSEC verisini imzalar. Bu sayede saldirganin elinde tek bir hash olacagindan sifrenin kirilmasi neredeyse olanaksizlasmistir. Sistemi biraz daha guvenilir yapmak icin bu anahtarlarin omurleri kisitlanabilir. Omru dolan anahtarlar, yeni anahtarlarla degistirilir. Bu isleme verilen isim de key rollover oluyor. DNSKEY kaydina geri donelim. Bu kayitlarin KSK ya da ZSK’leri tutan kayitlar oldugunu soylemistik. Ornegin paypal.com (su anda aklima gelen ve DNSSEC kullandigini bildigim ilk alan adi bu oldugundan bu ornegi sectim) icin kayitlarin nasil gozuktuklerine bakalim.

dig paypal.com DNSKEY<br></br>  
;; ANSWER SECTION:<br></br>
paypal.com. 503 IN DNSKEY 256 3 5 AwEAAc/7r7w6qEg59vy...<br></br>  
paypal.com. 503 IN DNSKEY 257 3 5 AwEAAdVtmC6yOQb0+5M...```

Biraz RFC karistirarak gelen cevabi anlamaya calisalim. RFC 4034[1] burada yardimimiza kosuyor ve bizim icin su tanimlari yapiyor. Ilk 4 hane DNS icin de aynisi oldugundan TTL, IN gibi bolumlere deginmeyecegim.

256 Alan imzalama anahtari (ZSK)  
 257 Anahtar imzalama anahtari (KSK)  
 3 Protokol degeri (Sabit olarak 3)  
 5 RSA/SHA1 Algoritmasi

RSA/SHA1 disinda kullanilabilecek algoritmalar da var, bunlar icin tek tek RFC numarasi vermek biraz uzun olacagindan ilgili okuyucuyu IANA sayfasina[3] yonlendireyim. Geri kalan ve okunurlugu arttirmak icin kisalttigim alan ise genel anahtarlarin tutuldugu bolumden olusuyor.

-DS Kaydi  
 Bu kayit tipi, ilgili DNS alani icin kullanilan KSK’nin hashinin tutuldugu kayit tipi oluyor. DS kaydimizi icinde bulundugumuz DNS alani tutuyor. Yani ornek.com alani icin DS kaydimiz .com tarafindan tutuluyor. Tekrar ornegimize donelim ve oradan bakalim.

dig paypal.com DS


;; ANSWER SECTION:

paypal.com. 8698 IN DS 21037 5 2 0DF17B28554954D819E...```

21037 Anahtar Etiketi oluyor ve bir DNS alani icin essiz olmasi gerekiyor
5 RSA/SHA1 Algoritmasi
2 Son alanda gozuken hash’i hesaplamak icin kullanilan algoritma, SHA256

-RRSIG Kaydi
Bir alana ait bir tipten (ornegin sadece A ya da sadece MX) olusan kayit setinin ZSK ile imzalanmasi sonucu elde edilen verinin tutuldugu kayit tipidir. Ayni tipten birden fazla kayit olsa dahi bir tip icin bir RRSIG kaydi tutulur. Ornege bakalim.

dig +dnssec paypal.com MX<br></br>  
;; ANSWER SECTION:<br></br>
paypal.com. 185 IN MX 10 gort.ebay.com.<br></br>  
paypal.com. 185 IN MX 10 lore.ebay.com.<br></br>  
paypal.com. 185 IN MX 10 data.ebay.com.<br></br>  
paypal.com. 185 IN RRSIG MX 5 2 600 20130530031336 20130430022820 11811 paypal.com. r2CuXIHZtJn1VHJ2jPC4```

Ornegin paypal bana uc adet MX kaydi dondurmesine ragmen bu kayitlara ait tek bir RRSIG kaydina sahip oldugunu gorebiliyoruz.

MX ile hangi tip kayitlara ait RRSIG oldugunu soyluyor.  
 5 RSA/SHA1 Algoritmasi  
 2 Etiket numarasi (Burada paypal.com dedigimiz icin 2, wildcard kayit olup olmadigini tespit etmek icin kullaniliyor. Daha fazla detay icin RFC4034[2]‘a bakilabilir)  
 600 Orijinal TTL suresi. Onbellekleme yapan cozucu icin onemli  
 20130530031336 Imzanin suresinin ne zaman dolacagi  
 20130430022820 Imzanin ne zamandan itibaren gecerli olacagi  
 11811 Bu veriyi imzalayan DNSKEY kaydinin etiket numarasi  
 paypal.com. Imzalamayi yapan yer  
 Son alan ise dijital imzayi gosteriyor

-NSEC3(NSEC) Kaydi  
 Simdiye kadar tanimladigimiz kayit tipleri ile bir kaydin gercek olup olmadigini dogrulayabiliyorduk. NSEC3 ile ise bir kaydin olmadiginin dogrulamasini yapabiliyoruz. NSEC ile NSEC3 temel olarak ayni isi yapsalar da NSEC’in bir alan icindeki tum kayitlara ulasilabilmesine olanak veren yapisindan dolayi (herkesin DNS alaninizi transfer edebildigini dusunun) NSEC3 ortaya cikiyor. Paypal neyse ki NSEC kullaniyor da bir ornegini gorebilecegiz ne kadar istenmeyen bir sey olabileceginin.

`dig aaaaaa.paypal.com NSEC`

aaaaaa ile sorgulamaya basliyoruz.

paypal.com. 59 IN NSEC dmarc.paypal.com. A NS SOA MX TXT RRSIG NSEC DNSKEY


_sip.
tls.paypal.com. 59 IN NSEC accounts.paypal.com. SRV RRSIG NSEC```

Bize dmarc, _sip.tls ve accounts kayitlarini verdi. O halde accu ile bir sey deneyip sonraki kayidi almaya calisalim.

dig accu.paypal.com NSEC<br></br>  
paypal.com. 59 IN NSEC _dmarc.paypal.com. A NS SOA MX TXT RRSIG NSEC DNSKEY<br></br>  
accounts.paypal.com. 59 IN NSEC active-history.paypal.com. CNAME RRSIG NSEC```

Artik active-history’yi de biliyoruz. Bu sekilde yeterince sorgu yaparsak gorulecegi uzere paypal’in tum DNS alanini alabiliriz ki pek istenmeyen bir sey. Ornegimizi NSEC3 donduren bir yer ile tamamlayip o kaydin da nasil gozuktugune bir bakalim.

dig verisign.com NSEC3


LVNT2DK6E38UB5HG27E7MCINT8M21C9P.verisign.com. 3599 IN NSEC3 1 0 8 4C44934802D3 LVP1CAGP8QAQJ5OTUH00PN5VDSSARVDE A NS SOA MX TXT RRSIG DNSKEY NSEC3PARAM```

Gordugunuz gibi donen kisim gizlenmis bir sekilde geliyor. Iste NSEC ile NSEC3 arasindaki en onemli fark bu.

-DLV Kaydi
Yazinin baslarinda DNS’in dagitik bir sistem oldugundan ve kimi ccTLD ve TLD’lerin henuz DNSSEC destegi vermeye baslamadiklarindan bahsetmistim. Peki icinde bulundugumuz alan (diyelim .tr) DNSSEC destegi vermiyorsa DNSSEC’i hic mi kullanamayacagiz? Cevap neyse ki hayir. Iste DLV kaydi bu isi yapmamizi saglayan kayit tipi. DNS lookaside validation’in kisaltmasi olan DLV, DNS alanimizi dogrulayacak alternatif bir ust alan belirtebilmemize izin veriyor. ISC’nin (bind ve dhcp’den hatirlayacaginiz) DLV hizmeti mevcut. Ornek yapilandirmamizda https://dlv.isc.org/ adresinden erisilebilen bu hizmeti kullanacagiz. Aslinda DLV kaydini recursor sunucular icin kullaniyoruz. Boylelikle root alaninda bulamadiklari kayitlari bu alternatif guven adasindan dogrulamaya calisiyorlar. Biz bu yazida authoritative bir sunucu kuracagimiz icin pek isimiz dusmeyecek. Fakat dlv.isc.org uzerinden dogrulama yapabilen recursive sunucular icin dlv.isc.org’ta bir kayit olusturacagiz.

Yaziyi burada bir ozetlemekte fayda var. DNSSEC icin bir guven zinciri olusturmaliyiz. Bu guven zinciri root zone’dan baslayip, bizim alanimiza kadar gelmeli. Eger alanimizi icinde barindiran alan imzalanmamissa bir sekilde baska bir rota’dan root zone’a ulastirmaliyiz bu zinciri. Bunu da DLV ile yapiyoruz.

PowerDNS+MySQL ile Ana isim sunucunun DNSSEC icin yapilandirilmasi

Ana isim sunucular (authoritative nameservers) yapi geregi kendi tuttuklari alan bilgileri icin dogrulama yapamiyorlar. Ornek vermek gerekirse, arkadasiniza “Benim yasim 30.” dediginizde, kendinize hemen ardindan “Yasimin 30 olduguna guveniyor muyum?” demiyorsunuz. Guvenmeseydiniz ilk asamada soylemezdiniz degil mi? DNSSEC icin de durum bu sekilde. Yinelemeli sorgu yapan bir isim sunucu (recursive nameserver), ana isim sunucuya (authoritative nameserver) “Boyle boyle bir bilgi geldi, onayliyor musun?” derken, ana isim sunucu kendisine “Boyle bir bilgi paylastim, bunu onayliyor muyum?” demiyor. Dolayisiyla DNSSEC icin ilk asamada yinelemeli sorgu yapan isim sunuculara bu yetenegin kazandirilmasi gerekiyor. Google’in islettigi genel isim
sunucular gecen ay itibariyle[2] istemciden DNSSEC dogrulamasinin talep edildigi bilgisini alirsa dogrulama yapmaya basladilar. Yani aslinda DNS sunucularinizi sadece ana isim sunucu (authoritative nameserver) olarak
yapilandirsaniz da, DNSSEC destegini varsayilan olarak kullanan diger yinelemeli sunucular istemcilere dogrulanmis DNS verinizi sunabilecek. (Burada bir parantez acip DLV degil de dogru duzgun DNSSEC destegi veren bir alan kullandiginiz varsayiyorum. Ornegin .com ya da .net) Fakat bir sirketin ya da kurumun yerel agindan gelen istekler icin yinelemeli sorgu yapan kendi DNS sunucusuna ihtiyaci varsa, o sunucuya DNSSEC verisini nasil yorumlayacaginin ogretilmesi gerekiyor. UNBOUND bu konuda oldukca basarili denedigim kadariyla. Bu arada DNS verisinin dogrulandigini dig sorgusunun ciktisinda bulunan flags kisminda ad bulunup bulunmamasindan anliyoruz.

dig +dnssec paypal.com a<br></br>  
; > DiG 9.9.2-P1 > +dnssec paypal.com a<br></br>
;; global options: +cmd<br></br>
;; Got answer:<br></br>
;; ->>HEADER
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1```

Gordugunuz gibi flags ad (authentic/authenticated data) ile donuyor eger DNSSEC dogrulamasi yapilabiliyorsa.

Ubuntu 12.04 LTS 64 bit uzerinde gerceklestirecegim tum islemleri. Depolarda pdns-server diye arama yaptigimda su anda 3.0.1 surumunun (son surumu tarih itibariyle 3.2) oldugunu goruyorum. Verileri MySQL'de saklayacagim icin pdns-backend-mysql ile birlikte kuruluma basliyorum.

`sudo apt-get install pdns-backend-mysql`

PowerDNS bizim icin MySQL yapilandirmasini onerecek fakat es gecip elle yapmayi tercih ediyorum. Ilk kurulumda oldukca makul degerler ile geliyor fakat degistirmek isterseniz /etc/powerdns/pdns.conf dosyasina goz atabilirsiniz. /etc/powerdns/pdns.d/ altindaki pdns.local.gmysql dosyasini ise veritabanimizi yapilandirdiktan sonra PowerDNS'e tanitmak icin kullanacagiz. Yalniz bu surumde bir bocek var ve bu sekilde conf.d ile kullandigimizda pdnssec komutunu kullanmamiza izin vermiyor. O yuzden ana yapilandirma dosyasi olan pdns.conf'taki !include ile baslayan satiri yorum haline getirip, pdns.local.gmysql dosyasinin icerigini pdns.conf dosyasina aktarmalisiniz.

`mysql -u root -p`

ile komut satirina duselim. Yeni bir veritabani ve bu veritabani icin bir kullanici olusturalim.

CREATE DATABASE mydnsdata;


GRANT ALL PRIVILEGES ON mydnsdata.* TO 'mydnsadmin'@'localhost' identified by 'sifre';


FLUSH PRIVILEGES;


USE mydnsdata;```

Gerekli tablolari olusturalim.[4] Bu kisimi oldugu gibi kopyalayip yapistirabilirsiniz.

CREATE TABLE domains (<br></br>  
id INT AUTO_INCREMENT,<br></br>  
name VARCHAR(255) NOT NULL,<br></br>  
master VARCHAR(128) DEFAULT NULL,<br></br>  
last_check INT DEFAULT NULL,<br></br>  
type VARCHAR(6) NOT NULL,<br></br>  
notified_serial INT DEFAULT NULL,<br></br>  
account VARCHAR(40) DEFAULT NULL,<br></br>  
primary key (id)<br></br>  
) Engine=InnoDB;<br></br>
CREATE UNIQUE INDEX name_index ON domains(name);<br></br>  
CREATE TABLE records (<br></br>  
id INT AUTO_INCREMENT,<br></br>  
domain_id INT DEFAULT NULL,<br></br>  
name VARCHAR(255) DEFAULT NULL,<br></br>  
type VARCHAR(10),<br></br>  
content VARCHAR(64000) DEFAULT NULL,<br></br>  
ttl INT DEFAULT NULL,<br></br>  
prio INT DEFAULT NULL,<br></br>  
change_date INT DEFAULT NULL,<br></br>  
ordername VARCHAR(255) BINARY,<br></br>  
auth BOOL,<br></br>  
primary key(id)<br></br>  
) Engine=InnoDB;<br></br>
CREATE INDEX rec_name_index ON records(name);<br></br>  
CREATE INDEX nametype_index ON records(name,type);<br></br>  
CREATE INDEX domain_id ON records(domain_id);<br></br>  
CREATE TABLE supermasters (<br></br>  
ip VARCHAR(25) NOT NULL,<br></br>  
nameserver VARCHAR(255) NOT NULL,<br></br>  
account VARCHAR(40) DEFAULT NULL<br></br>  
) Engine=InnoDB;<br></br>
CREATE TABLE domainmetadata (<br></br>  
id INT AUTO_INCREMENT,<br></br>  
domain_id INT NOT NULL,<br></br>  
kind VARCHAR(16),<br></br>  
content TEXT,<br></br>  
primary key(id)<br></br>  
);<br></br>
CREATE INDEX domainmetaidindex ON domainmetadata(domain_id);<br></br>  
CREATE TABLE cryptokeys (<br></br>  
id INT AUTO_INCREMENT,<br></br>  
domain_id INT NOT NULL,<br></br>  
flags INT NOT NULL,<br></br>  
active BOOL,<br></br>  
content TEXT,<br></br>  
primary key(id)<br></br>  
);<br></br>
CREATE INDEX domainidindex ON cryptokeys(domain_id);<br></br>  
CREATE INDEX recordorder ON records (domain_id, ordername);<br></br>  
CREATE TABLE tsigkeys (<br></br>  
id INT AUTO_INCREMENT,<br></br>  
name VARCHAR(255),<br></br>  
algorithm VARCHAR(50),<br></br>  
secret VARCHAR(255),<br></br>  
primary key(id)<br></br>  
);<br></br>
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);```

Bu islemlerin ardindan DNSSEC icin kullanabilecegimiz veritabani semamiz hazir hale geliyor. Simdi veritabanimiza bir alan ekleyecegiz. Istersek bunu yine MySQL uzerinden yapabiliriz fakat degisik bir sey gormek icin bir arayuz kullanalim bu sefer. PowerDNS icin oldukca fazla sayida yonetim arayuzu var. Bunlarin bildiklerimden hicbiri DNSSEC'i desteklemiyor. Dolayisiyla DNSSEC islerini yine terminalden yapacagiz fakat basit bir alani bu arayuzlerden biri ile ekleyelim. Tavsiye edebileceklerim arasinda poweradmin[5] ve powerdns-webinterface[6] var. Zaten ikisi de birbirine oldukca benziyor. Herhangi birini kurabilirsiniz.

Ubuntu icin php5-mysql ve apache2 paketlerine ihtiyac duyacaksiniz bagimlilik olarak. Kurmasi cok kolay oldugu icin daha detaya inmiyorum. Kurulum islemi(bir tar dosyasini indirip actiktan sonra veritabani bilgilerini tutan dosyayi duzenlemek) tamamlandiktan sonra arayuzden alan adimizi ekleyelim. Ben bu yazida .tr altindaki alan adlarinin DNSSEC destegi olmadigini gostermek icin test.name.tr alan adini ekledim.

[![pdns-webinterface](https://blog.cagriemer.net/wp-content/uploads/2013/05/pdns-webinterface-300x101.png)](https://blog.cagriemer.net/wp-content/uploads/2013/05/pdns-webinterface.png)

Bu asamayi da tamamladiktan sonra terminale donup su komutlari verebiliriz.

pdnssec secure-zone test.name.tr


pdnssec set-nsec3 test.name.tr


pdnssec rectify-zone test.name.tr```

PowerDNS bizim icin anahtarlari olusturmaktan tutun, kayitlari imzalamaya kadar her islemi yapmis oldu. Bir sonraki yazida BIND ile ayni islemleri elle nasil yapabiliriz onlari da anlatmaya calisacagim. Unutulmamasi gereken en onemli nokta DNS alanimizda herhangi bir kayit degisikligi yaptigimizda (ekleme/cikarma/degistirme) son komut olan pdnssec rectify-zone alanadi komutunu yeniden calistirmak.

dnssec show-zone test.name.tr

komutu ile KSK ve ZSK'lerimizi gorebiliriz. Iki ZSK olmasinin nedeni PowerDNS'in, yazinin baslarinda bahsettigim key rollover islemini otomatik olarak yapmaya olanak tanimasi. Yazinin son kisimlarinda cevrimici araclarla yapilandirmamizi test ederken bu ikinci ZSK'i yeniden gorecegiz.

.tr'nin henuz DNSSEC destegine kavusmadigini (YIL 2013) defalarca tekrarladim ama bir kere daha tekrarlayayim. Su asamada bizim DLV kayitlarina sahip resolverlar icin dlv.isc.org adresine gidip DNSKEY'imizi (KSK) oraya eklememiz gerekiyor. show-zone komutunun verdigi ciktidaki DNSKEY'i dlv.isc.org adresinden bir hesap acip oraya tanitirsak bize DNS alanimiza eklememiz icin bir TXT kaydi veriyor. Yukaridaki ekran goruntusunde de bu TXT kaydinin ekli oldugunu gorebilirsiniz. Gelip bu kaydi DNS alanimiza ekliyoruz ve rectify-zone iceren komutu bir daha calistiriyoruz. Su asamada dlv.isc.org alanin gercekten bize ait oldugunu dogrulamaya calisacaktir. Bu islem de tamamsa artik alanimizi DNSSEC ile sunuyoruz demektir. dnsviz.net adresine gidip kontrol edelim bakalim her sey duzgun calisiyor mu? Bu arac bize asagidaki gibi bir cikti veriyor.

dnssec-test

Bu ciktida gordugunuz siyah kalin oklar DNSSEC destegi olmayan alanlari gosteriyor. Yani . (root) alani .tr icin, .tr alani .name.tr icin, .name.tr alani ise test.name.tr icin bir DS kaydina sahip degil. Dolayisiyla DNSSEC ne yazik ki desteklenemiyor. Fakat ISC'nin islettigi DLV sayesinde test.name.tr alani dogrulanabiliyor. Yalniz dedigim gibi cozumlemeyi yapan resolver'larin bu DLV kaydini kullanacak sekilde yapilandirilmis olmasi gerekiyor. Yine yukarida bahsettigim ikinci ve henuz kullanimda olmayan ZSK'i de kesikli cizgilerle cizilmis elips icerisinde gorebiliyoruz.

Bu testten de basariyla gectiyseniz, tebrikler. Artik DNS alaniniz bir nebze de olsa daha guvenli. Peki bunca seyi nicin yaptik? Burada favori DNS kaydim olan SSHFP'ye geliyoruz. SSHFP, adi uzerinde SSH fingerprint'leri (sunuculari tanimaya yarayan anahtarlar) DNS uzerinden dagitmaya yariyor. OpenSSH da sagolsun bizim icin bu anahtarlari kontrol edebiliyor. Dolayisiyla sunucuya erisirken gercekten erismek istedigimiz sunucuya gittigimize emin oluyoruz. Tabii eger biri DNSSEC ile guclendirdigimiz DNS alanimizla oynamadiysa. SSHFP'ye BIND ile bu islemleri nasil yaptigimiz yazida tekrar deginecegim.

[1] http://tools.ietf.org/html/rfc4034
[2] http://googleonlinesecurity.blogspot.com/2013/03/google-public-dns-now-supports-dnssec.html
[3] http://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xml
[4] http://doc.powerdns.com/html/generic-mypgsql-backends.html
[5] https://www.poweradmin.org/trac/
[6] https://code.google.com/p/powerdns-webinterface/

22 Mayıs 2013

Posted In: dnssec, Gezegen, PowerDNS, SSHFP, tr

Yakından Eğitim’de Kötü Amaçlı Yazılım Görsellemesi

Yakındaneğitim kapsamında başlayan Malwarez isimli projede, Gürcan Gerçek alpha (Projenin ilk halinin fikir babası Ben Reardon için Ben kod ismi ile) sürümünü yayınladı. Dağıtık bal çanaklarından gelen kötü amaçlı yazılım bilgilerinin toplanmasını sağlayan hpfeeds ve veri paylaşımını sağlayan Hpfriends kullanarak alınan gerçek zamanlı verilerin Dünya haritası üzerinde görsellenmesini hedefleyen bir proje, Malwarez. Projede Github üzerindeki ilk yol adımı temel düzeyde tamamlandı. Proje detaylarını içeren Tükçe ve İngilizce birer günlük girdisi de yazıldı.

Alpha sürümünde Dünya haritası üzerinde anlık olarak kötü amaçlı yazılım kaynakları gösterilirken, ülke bazında da şehirlere ait sayısal değerleri görmek mümkün. Elbette projede yapılabilecek epey nokta var.

Geri bildirimlerinizi bekliyoruz.

21 Mayıs 2013

Posted In: Gezegen, Görselleme, yakindanegitim

Postfix, Dovecot ve MySQL ile Sanal Kullanici ve Alan Adlari icin E-posta yapilandirilmasi

Yazi biraz uzun, dolayisiyla gezegeni web’den takip edenlerden ozur diliyorum.

Bir gorsel kimi zaman bin kelimeden daha etkili olabildigi icin bir gorselle anlatima baslamak sistemin nasil calistigini aktarabilmek icin faydali olacaktir diye dusunuyorum. Gorsel icin .dia dosyasini yazinin sonundaki adresten indirebilir, indirdiginiz dosyayi istediginiz gibi duzenleyebilir ve dagitabilirsiniz. Kaynak gosterseniz hos olur ama zorunda degilsiniz.

mail

Bu gorselde bulunan sayilara karsilik gelen istek ve yanitlar ise su sekilde;

Gelen Posta
1) Gonderici, posta gondermek istedigi adres icin MX kayitlarini ister
2) DNS sunucu MX kayitlarini gondericiye iletir
3) Gonderici MX kaydinin gosterdigi sunucuya posta gondermek istedigini soyler
4) Postayi alan sunucudaki MTA(postfix), MySQL’e alicinin tanimli olup olmadigini sorar
5) MySQL ustteki sorguya evet ya da hayir cevabini verir.
6) Evet cevabini alan Postfix, Dovecot’a postayi kendisi icin saklamasini soyler
7) Dovecot(MDA) gelen postayi kullaniciya ait dizine depolar

Posta Kontrolu
8) Alici Dovecot’a postalarini kontrol etmek istedigini soyler
9) Dovecot aliciya iletisim icin bu sertifikayi kullan diyerek cevap verir
10) Alici, gelen sertifika ile hesap bilgilerini sifreler ve tekrar yollar
11) Dovecot MySQL’e hesap bilgilerinin dogru olup olmadigini sorar
12) MySQL bu sorguyu yanitlar.
13) Dovecot depolama yaptigi dizinden kullanici icin tuttugu postalari ister
14) Bilgi Dovecot’a gonderilir
15) Gondermesi gereken her seye sahip olan Dovecot kullaniciya postalarini iletir

Giden Posta
16) Alici, Postfix’e posta gondermek istedigini soyler
17) Postfix sertifikasini gonderir ve kimlik dogrulamasi yapmasini ister alicidan
18) Alici gelen sertifika ile kimlik bilgilerini sifreler ve geri yollar
19) Postfix, Dovecot’tan gelen bilgileri kendisi icin kontrol etmesini ister
20) Dovecot, MySQL’e kullanici bilgilerinin dogru olup olmadigini sorar
21) MySQL, Dovecot’a yanit verir
22) Dovecot, Postfix’e kimlik dogrulamasinin sonucunu bildirir
23) Postfix kullaniciya kimliginin dogru oldugunu postayi gonderebilecegini soyler
24) Alici, postayi Postfix’e iletir.
25) Postfix, karsi tarafin MTA’sina postayi iletir (karsi tarafin MX kaydina sahip oldugu varsayilmistir)

Artik sistemin nasil calistigini anladigimiza gore neye ihtiyacimiz oldugunu listelemeye gecebiliriz. Oncelikle posta gondermek isteyen birinin bizi bulabilmesi icin MX kayitlarimiza erisebilmesi gerekiyor. Dolayisiyla bu kayitlari yapilandiracagiz. Ardindan Postfix, Dovecot ve MySQL kurulumunu yapacagiz. MySQL bizim icin alan adlarini, kullanicilarin kimlik bilgilerini ve takma adlarini saklayacak. Dovecot, IMAP ve POP3 sunucu olarak calismasinin yani sira SASL(Simple Authentication and Security Layer) implementasyonu sayesinde Postfix icin kimlik dogrulamasi yapacak. Postfix ise gelen ve giden postalari ilgili yerlere iletme gorevini ustlenecek. Postfix ve Dovecot ile iletisimin duz metin olarak yapilmamasi icin SSL sertifikalari kullanacagiz. Anlatimi Ubuntu 12.04 LTS uzerinde yaptigimi da hatirlatayim.

Host adinin ayarlanmasi
Ben bu rehberde Venus’un bir ayi olarak dusunulen fakat daha sonradan olmadigi anlasilan neith adini kullanacagim. Posta alip gonderecegimiz adres ise .tk’den ucretsiz olarak kayit ettigim konusmalar.tk adresi olacak. Islemleri root olarak gerceklestiriyorum. Ardindan sudo kullanabilen bir kullanici olusturup SSH uzerinden root girisini kapatacagim fakat o baska bir anlatimin konusu.

nano /etc/hosts<br></br>  
127.0.0.1 localhost konusmalar.tk<br></br>  
198.199.112.50 konusmalar.tk neith<br></br>  
echo neith > /etc/hostname<br></br>  
hostname -F /etc/hostname```

Bu asamada hostname ve hostname -f ciktilari sirayla su sekilde donmeli.  

hostname


neith


hostname -f


konusmalar.tk```

DNS kayitlarinin eklenmesi
MX kayitlari iki alandan olusuyor. Priority (oncelik) ve host adi. Ben VPS saglayicinin DNS hizmetini kullandigimdan kontrol paneline gidip oncelige 10, host adina da konusmalar.tk diyecegim bir kayit yaratacagim. Bu anlatimda tek bir posta sunucu yapilandiracagimizdan onceligin ne ise yaradiginin aslinda bir onemi yok ama kisaca aciklamak gerekirse birden fazla posta sunucu kurdugumuzda hangisinin tercih edilmesi gerektigini soylemek icin kullaniyoruz. Ornegin 10 konusmalar.tk ve 20 alt.konusmalar.tk MX kayitlarimiz var. alt ve @ farkli IP adresleri donduren A kayitlarina sahipler. Bize e-posta gondermek isteyen biri MX sorgusu yapiyor ve bu iki kaydi da aliyor. Ilk olarak onceligi yuksek olan (sayi degeri dusuk olan, bu durumda 10) sunucu ile iletisime gecmek istiyor. Eger bu sunucudan bir nedenden oturu cevap alamazsa ikinci siradaki sunucu ile iletisime gecmeye calisiyor. Basitce oncelik alaninin yaptigi is bu. Fakat dedigim gibi tek bir sunucu yapilandiracagimizdan 100 de verilse 1 de verilse bir onemi olmayacaktir. DNS konusundaki ikinci ve son onemli nokta ise MX kaydini tutan hostun bir A kaydina sahip olmasi gerektigi. Bu ornekte ben sunucunun FQDN’i icin (hostname -f ciktisi) konusmalar.tk kullandim karisikliga neden olmamak icin fakat posta.konusmalar.tk ya da oncelik ayarinda anlattigim gibi alt.konusmalar.tk gibi bir FQDN de kullanabilirdim. Eger boyle bir isim kullansaydim konusmalar.tk DNS alaninin (zone) alt ya da posta isimleri icin bir A kaydina (bu adresin IP’si nedir kaydi A kaydi oluyor) cevap vermesi gerekecekti. Eger sunucu adinizi bu sekilde yapilandirdiysaniz ve posta alamiyorsaniz DNS kaydinizi kontrol etmenizde yarar var.

Gerekli paketlerin kurulmasi

sudo apt-get install mysql-server postfix-mysql dovecot-mysql dovecot-lmptd dovecot-imapd dovecot-pop3d

Bu paketler zaten gerekli olan birkac diger paketi de kuracagindan kurulmasi gereken tum paketleri apt-get’e vermemize gerek yok. POP3 destegi vermek istemiyorsak dovecot-pop3d paketini kurmamiza gerek yok. Ayni sey IMAP icin de gecerli. Geri kalanlar anlatimin takip edilmesi icin mutlaka kurulmasi gereken paketleri iceriyor. Belki dovecot-lmptd biraz yabanci gelebilir. LMTP local mail transfer protocol anlamina geliyor. Kavrami aciklamadan once mail queue ne ise yarar ona bakalim. Diyelim postfix’e su iki posta adresine bizim icin bu postayi ilet dedik. Postfix ilk posta adresine gonderimizi iletti fakat ikincisine ilk denemesinde ulasamadi. Iste bu durumda postfix bizim icin daha sonra denemek uzere gonderimizi kuyruga aliyor ve bir sure sonra tekrar iletmeye calisiyor. Yerelde ise bu isi yapmak cekirdek citlemek icin cekic kullanmaya benziyor. Bu yuzden posta iletilebiliyorsa ileten, iletemiyorsa reddeden bir protokol gereksinimi ortaya cikiyor ve adina da LMTP deniyor. Postfix, Dovecot ile LMTP sayesinde iletisim kuruyor.

Kurulum asamasinda MySQL icin root sifresi istenecek. Sonrasinda gelen postfix yapilandirma ekraninda Internet Site secimi yapip, System mail name sordugu yere konusmalar.tk adresini girecegim. Eger alt.konusmalar.tk ya da posta.konusmalar.tk olarak yapilandirsaydim DNS kayitlarimi buraya o degerlerden biri gelecekti.

MySQL yapilandirmasi

Yazinin baslarinda MySQL’in bizim icin kullanici ve alan adi bilgilerini tutacagini soylemistik. Bunun icin bir veritabani ve bu veritabaninda uc adet tablo olusturacagiz. Veritabanina sanalposta, olusturacagimiz uc tabloya ise sirayla, sanalalanadlari, sanalkullanicilar ve sanal_takmaadlar isimlerini verecegim. Bu veritabanini kontrol eden kullanici sanalpostayoneticisi olacak ve sifresi anlatim kolayligi acisindan 12345 olacak. Umarim kendi sunucunuzda boyle bir sifre kullanmiyorsunuzdur.

mysql -u root -p<br></br>  
>> CREATE DATABASE sanalposta;<br></br>
>> GRANT SELECT ON sanalposta.* TO 'sanalpostayoneticisi'@'127.0.0.1' IDENTIFIED BY '12345';<br></br>
>> FLUSH PRIVILEGES;```

Ilk satirda veritabanimizi olusturduk. Ardindan gelen iki satirda ise localhost’tan erisim yapacak ve 12345 sifresiyle kimlik dogrulayacak kullaniciya, sanalposta veritabaninda olusturacagimiz tum tablolarda SELECT islemi yapabilmesi icin izin verdik. Sira geldi sanal_alanadlari tablosunu olusturmaya.

CREATE TABLE sanal_alanadlari (

id int(5) UNSIGNED ZEROFILL NOT NULL auto_increment,

name varchar(64) NOT NULL,

PRIMARY KEY (id)


) ENGINE=InnoDB DEFAULT CHARSET=utf8;```

En son RFC’yi kontrol ettigimde bir alan adi nokta dahil maksimum 64 karakter olabiliyordu. Dolayisiyla name sutununu 64 karaktere sinirladik. int(5) ise sadece gorsellik acisindan onemli oldugundan uzerinde durmaya pek gerek yok. sanal_kullanicilar tablomuzu ise su sekilde olusturuyoruz.

>> CREATE TABLE `sanal_kullanicilar` (<br></br>
`id` int(5) UNSIGNED ZEROFILL NOT NULL auto_increment,<br></br>
`domain_id` int(5) UNSIGNED ZEROFILL NOT NULL,<br></br>
`password` varchar(106) NOT NULL,<br></br>
`email` varchar(100) NOT NULL,<br></br>
PRIMARY KEY (`id`),<br></br>  
UNIQUE KEY `email` (`email`),<br></br>  
FOREIGN KEY (domain_id) REFERENCES sanal_alanadlari(id) ON DELETE CASCADE<br></br>  
) ENGINE=InnoDB DEFAULT CHARSET=utf8;```

Kullanici tablomuzda bir kullanici id’si, bu tabloyu alan adlari tablosuna baglayan domain_id, kullanici sifresi ve e-posta sutunlarini olusturduk. @alanadi.com su asamada maksimum 65 karakter tutabileceginden kullanici adina 35 karakter yer kaliyor. Eger daha uzun kullanici adlari tanimlayacaksaniz email kismindaki varchar degerini degistirebilirsiniz. Son olarak sanal_takmaadlar tablomuzu olusturalim.

CREATE TABLE sanal_takmaadlar (

id int(5) UNSIGNED ZEROFILL NOT NULL autoincrement,

domain_id int(5) UNSIGNED ZEROFILL NOT NULL,

source varchar(100) NOT NULL,

destination varchar(100) NOT NULL,

PRIMARY KEY (id),


FOREIGN KEY (domain
id) REFERENCES sanal_alanadlari(id) ON DELETE CASCADE


) ENGINE=InnoDB DEFAULT CHARSET=utf8;```

Bir onceki asamada email alani icin varchar degerini degistirdiyseniz buradaki source ve destination alanlarinda da ayni degisikligi yapmak isteyeceksiniz. Gelelim olusturdugumuz bu tablolara veri eklemeye.

>> INSERT INTO `sanalposta`.`sanal_alanadlari`<br></br>
(`id` ,`name`)<br></br>
VALUES<br></br>  
('1', 'konusmalar.tk');```

>> INSERT INTO `sanalposta`.`sanal_kullanicilar`  
 (`id`, `domain_id`, `password` , `email`)  
 VALUES  
 (‘1′, ‘1’, ENCRYPT(‘sifre1′, CONCAT(‘$6$’, SUBSTRING(SHA(RAND()), -16))), ‘kullanici1@konusmalar.tk’),  
 (‘2′, ‘1’, ENCRYPT(‘sifre2′, CONCAT(‘$6$’, SUBSTRING(SHA(RAND()), -16))), ‘kullanici2@konusmalar.tk’);

Yukaridaki istekte rand() ile 0-1 arasinda bir rastgele sayi urettik. Ardindan sha() ile bunu hashledik ve substring(hash, -16) ile bu hash degerinin son 16 hanesini aldik. concat(‘$6$’, hash’in son 16 hanesi) ile elimizdeki degerin basina $6$ ekledik ki bu da crypt icin SHA512 anlamina gelir. Ardindan ENCRYPT ile sifremizi ve az once olusturdugumuz tuzumuzu birlestirip sifre alanimiza bu degeri verdik. /etc/shadow dosyanizdaki root girdisine bakarsaniz benzer bir yapi goreceksiniz.

INSERT INTO sanalposta.sanal_takmaadlar

(id, domain_id, source, destination)

VALUES


('1', '1', 'root@konusmalar.tk', 'kullanici1@konusmalar.tk');```

root posta hesabi icin de bir yonlendirme belirlemis olduk boylece takmaadlar tablomuzda. Simdi bu degerleri kontrol edebiliriz.

>> USE sanalposta;<br></br>
>> SHOW TABLES;```

+——————–+  
 | Tables_in_anlatim |  
 +——————–+  
 | sanal_alanadlari |  
 | sanal_kullanicilar |  
 | sanal_takmaadlar |  
 +——————–+  
 3 rows in set (0.00 sec)

>> SELECT * FROM sanal_alanadlari;

+——-+—————+  
 | id | name |  
 +——-+—————+  
 | 00001 | konusmalar.tk |  
 +——-+—————+  
 1 row in set (0.00 sec)

>> SELECT * FROM sanal_kullanicilar;

+——-+———–+———————————————————–+  
 | id | domain_id | password | email |  
 +——-+———–+——————-+—————————————+  
 | 00001 | 00001 | $6$bf198693267470de$YukkyGzAs/ | kullanici1@konusmalar.tk |  
 | 00002 | 00001 | $6$da2ea5ba6e70ac34$pRLBLvIRtJ | kullanici2@konusmalar.tk |  
 +——-+———–+———————————————————–+  
 2 rows in set (0.00 sec)

password alani burada gosterdigimden cok daha uzun olacak, duzgun gozukmesi icin bir kismini kestim. $ isaretlerine dikkat ederseniz concat ve encrypt islemlerinin sonucunu gorebilirsiniz.

`>> SELECT * FROM sanal_takmaadlar;`

+——-+———–+——————–+————————–+  
 | id | domain_id | source | destination |  
 +——-+———–+——————–+————————–+  
 | 00001 | 00001 | root@konusmalar.tk | kullanici1@konusmalar.tk |  
 +——-+———–+——————–+————————–+  
 1 row in set (0.00 sec)

Yukaridakilere benzer ciktilar goruyorsaniz her sey yolunda demektir.

**Postfix Yapilandirmasi**

/etc/postfix/main.cf dosyasinin yorumlardan arindirilmis nihai hali su sekilde olacak. Bu ayarlari dosyayi gosterdikten sonra aciklayacagim.

smtpdbanner = $myhostname ESMTP $mailname (Ubuntu)


biff = no


appenddotmydomain = no


readmedirectory = no


smtpd
tlscertfile=/etc/ssl/certs/dovecot.pem


smtpdtlskeyfile=/etc/ssl/private/dovecot.pem


smtpd
tlssecuritylevel=may


smtpdtlsauthonly=yes


smtpd
sasltype = dovecot


smtpd
saslpath = private/auth


smtpd
saslauthenable = yes


smtpdrecipientrestrictions = permitsaslauthenticated, permitmynetworks, rejectunauthdestination


myhostname = konusmalar.tk


alias
maps = hash:/etc/aliases


aliasdatabase = hash:/etc/aliases


myorigin = /etc/mailname


mydestination = localhost


relayhost =


mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 198.199.112.50


mailbox
sizelimit = 0


recipient
delimiter = +


inetinterfaces = all


virtual
transport = lmtp:unix:private/dovecot-lmtp


virtualmailboxdomains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf


virtualmailboxmaps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf


virtualaliasmaps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf```

Postfix, bence, belgelendirmesi en iyi olan ozgur yazilim projelerinden biri. main.cf altindaki her ayarin aciklamasini da http://www.postfix.org/postconf.5.html adresinden bulabilirsiniz. Ustte paylastigim 25-30 tanesinin kisa aciklamalari soyle.

smtpdbanner = $myhostname ESMTP $mailname (Ubuntu)

Herhangi bir bilgisayardan asagidaki komutu verirseniz

telnet konusmalar.tk 587

size suna benzer bir cikti donecektir.

Trying 198.199.112.50...<br></br>  
Connected to konusmalar.tk.<br></br>  
Escape character is '^]'.<br></br>  
220 konusmalar.tk ESMTP Postfix (Ubuntu)```

iste buradaki 220 konusmalar.tk ESMTP Postfix (Ubuntu) satirini smtpd_banner ayari ile kontrol ediyoruz. smtpd_banner’in $myhostname ile baslamasi zorunlu, fakat bunun disinda istediginiz degisikligi yapabilirsiniz. Yani soyle bir goruntu elde etmek mumkun. Fakat bu kisimda belki Ubuntu’yu silmek disinda bir degisiklik yapmanizi pek onermem. Zannetmiyorum ama bu bilgileri e-posta gondermek icin kullanmaya calisan enteresan(!) uygulamalar olabilir.

Trying 198.199.112.50...


Connected to konusmalar.tk.


Escape character is '^]'.


220 konusmalar.tk Linux cok guzel, gelsenize!```

Eger 1980’de yasamiyorsaniz biff ayarini no yapmanizda bir sakinca yok. Kullanicilar posta kontrol etmek icin lokal hesaplariyla sisteme giris yapmayacaklarindan -hatta bir lokal hesaplari olmayacagindan- biff kullanmak istemiyoruz.

appenddotmydomain ayari lokal posta icin gitmesi gereken adresin sonuna alanadinin koyulup koyulmayacagini soyluyor. yani root a gitsin bu posta dediginizde sonuna @konusmalar.tk koymak isteyip istemediginiz soyluyorsunuz. Hayir diye devam ediyorum.

readme_directory derleme, calistirma islemlerini anlatan dosyalarin nerede tutulacagini soyluyor ki hic ihtiyacimiz yok.

smtpdtlscertfile=/etc/ssl/certs/dovecot.pem
smtpd
tlskeyfile=/etc/ssl/private/dovecot.pem
smtpdtlssecuritylevel=may
smtpd
tlsauthonly=yes

Onemli kisimlardan bir tanesi burasi. Iletisimin duz metin olarak yapilmamasi icin sertifika kullanacagimizi soylemistik. Postfix icin sertifika ayarini burada yapiyoruz. Dovecot kurulurken bizim icin sertifika olusturuyor. Dolayisiyla eger bir CA tarafindan imzalanmis sertifika kullanmiyorsak Dovecot’in bizim icin urettiklerini kullanabiliriz. smtpdtlscertfile ve smtpdtlskeyfile sertifikanin ve ozel anahtarin nerede tutuldugunu belirtiyor. smtpdtlssecuritylevel ile iletisimin mumkunse sertifika ile sifrelenmesini istiyoruz. Burada encrypt ile zorunlu tutabilirdik fakat SquirrelMail kurulumu yaptigimizda encrypt biraz basimizi agritabilir. Eger securitylevel icin may dersek smtpdtlsauth_only ile giris yapilmasi icin sertifika kullanilmasini zorunlu hale getirebiliriz ki istedigimiz de zaten buydu.

Bir sonraki onemli kisim SASL ayarlarini yaptigimiz kisim. Yazinin basinda Postfix’in kimlik dogrulamasi yaparken Dovecot’a benim icin su kullaniciyi dogrular misin diyecegini ve bu islemi SASL ile yapacagini soylemistik.

smtpdsaslauthenable = yes
smtpd
sasltype = dovecot
smtpd
sasl_path = private/auth

authenable ile Postfix’e SASL kullanacagimizi soyledik. SASL icin konusacagi daemon’i da smtpdsasl_type’a dovecot degerini vererek gosterdik. Dovecot ile konusurken kullanacagi soketin yerini path degiskeniyle verdik. Buraya Dovecot’i yapilandirirken bir daha deginecegiz.

smtpdrecipientrestrictions = permitsaslauthenticated, permitmynetworks, rejectunauth_destination

Yukaridaki ayar hangi kullanicilarin posta gonderebilecegini yapilandirmak icin gereken bir ayar. Icinde reject ya da defer tipinden en az bir tane deger olmasi gerekiyor. permitsaslauthenticated eger bir kullanici SASL kullarak giris yapmissa posta gondermesine izin verilecegi anlamina geliyor. permitmynetworks mynetworks’te belirtilen agdaki istemcilere posta gonderme izini verildigini soyluyor. rejectunauth_destination ile eger posta Postfix’in bildigi bir alana gelmiyor ise reddetmesi gerektigini anlatiyoruz.

myhostname = konusmalar.tk
aliasmaps = hash:/etc/aliases
alias
database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 198.199.112.50
mailboxsizelimit = 0
recipientdelimiter = +
inet
interfaces = all

Yukaridaki bolumde myhostname, mydestination ve mynetworks parametreleri ilgi alanimiza giriyor. myhostname’i MX kaydindaki gibi ayarliyoruz. mydestination’da sadece localhost’u birakiyoruz. mynetworks’e ise kendi IP adresimizi ekliyoruz.

Gelelim Postfix’in MySQL ile nasil konusacagina.

virtualtransport = lmtp:unix:private/dovecot-lmtp
virtual
mailboxdomains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual
mailboxmaps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual
alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

virtual_transport degeri bize Postfix’in postalari MDA(Dovecot) ile nasil degis tokus edecegini anlatiyor. Bunun icin daha once de bahsettigimiz gibi LMTP protokolunu kullanacagiz.

virtualmailboxdomains kisminda Postfix’in kontrol edecegi alan adlarini MySQL’den nasil alacagini anlatan dosyayi, virtualmailboxmaps’te ise eslesen alanadlari icin kullanicilari nasil bulacagini gosteren dosyayi belirtiyoruz. virtualaliasmaps ise MySQL’de son olarak ekledigimiz sanal_takmaadlar tablosundaki sorgularin nasil yapilacagini anlatiyor. Boylelikle Postfix yapilandirmasinda son asamaya girmis oluyoruz. O da az once verdigimiz dosya yollarindaki dosyalari olusturmak.

/etc/postfix/mysql-virtual-mailbox-domains.cf dosyasi

user = sanalpostayoneticisi<br></br>  
password = 12345<br></br>  
hosts = 127.0.0.1<br></br>  
dbname = sanalposta<br></br>  
query = SELECT 1 FROM sanal_alanadlari WHERE name='%s'```

/etc/postfix/mysql-virtual-mailbox-maps.cf dosyasi

user = sanalpostayoneticisi


password = 12345


hosts = 127.0.0.1


dbname = sanalposta


query = SELECT 1 FROM sanal_kullanicilar WHERE email='%s'```

/etc/postfix/mysql-virtual-alias-maps.cf dosyasi

user = sanalpostayoneticisi<br></br>  
password = 12345<br></br>  
hosts = 127.0.0.1<br></br>  
dbname = sanalposta<br></br>  
query = SELECT destination FROM sanal_takmaadlar WHERE source='%s'```

Simdi Postfix’i yeniden baslatalim ve bakalim MySQL ile konusabiliyor mu test edelim.

service postfix restart


postmap -q konusmalar.tk mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf


postmap -q kullanici1@konusmalar.tk mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf


postmap -q root@konusmalar.tk mysql:/etc/postfix/mysql-virtual-alias-maps.cf```

Ilk iki sorgu icin 1 ciktisini, son sorgu icin ise hangi posta hesabina yonlendirdiysek onun ciktisini gormeliyiz. Ciktilar dedigim sekildeyse bir sorun yok demektir.

Dovecot yapilandirmasi

Dovecot 2.x surumlerine kadar tek bir yapilandirma dosyasina sahipti fakat yapilandirmanin daha kolay(!) olacagi dusunulerek 2.x surumleri itibariyle bu tek yapilandirma dosyasi birden cok dosyaya dagitildi. Bana sorarsaniz birden cok dosya ile yapilandirmasi daha zor. Fakat gelecege yatirim acisindan bu halini ogrenmek amaciyla birden cok dosya ile yapilandirma yapacagiz. Islem bittiginde doveconf -n ile aslinda bunca isin tek bir dosya ile ne kadar kolay yapilabilecegini gorecegiz.

Dovecot’un bizim icin yapacagi isler sunlardi. MySQL ile konusup kullanicilarin kimliklerini kontrol edecek Postfix icin. Postfix ile LMTP uzerinden konusup kullanicilarin postalarini dosya sisteminde ilgili dizine gonderecek. IMAP ya da POP3 sunucu olarak gorev yapip SSL destegi sunacak.

Ise /etc/dovecot/dovecot.conf ile baslayacagiz. Dosya ayni squid yapilandirma dosyasi gibi inanilmaz sayida yorum iceriyor. Yorumlari kaldirdiktan sonra elimizde kalanlar ise sunlar.

!include_try /usr/share/dovecot/protocols.d/*.protocol<br></br>
protocols = imap lmtp<br></br>  
dict {<br></br>  
#quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext<br></br>
#expire = sqlite:/etc/dovecot/dovecot-dict-sql.conf.ext<br></br>
}<br></br>
!include conf.d/*.conf<br></br>
!include_try local.conf```

Bu dosyaya bizim ekledigimiz aslinda su satirlar.

!include_try /usr/share/dovecot/protocols.d/*.protocol  
 protocols = imap pop3 lmtp

POP3 ya da IMAP istemiyorsak buradan kaldirabiliriz. Siradaki dosya /etc/dovecot/conf.d/10-mail.conf dosyasi. Yine yorumlardan sonra icerigi su sekilde.

maillocation = maildir:/var/mail/vhosts/%d/%n


mail
privileged_group = mail```

mail_location’da postalarin tutulmasini istedigimiz dizini veriyoruz. %d alanadini %n ise kullanici adini ifade ediyor. Bu dosyayla da isimiz bitti.

Simdi gerekli dizini yaratalim.

mkdir -p /var/mail/vohsts/konusmalar.tk

Simdi de Dovecot’un dosya sisteminde posta saklamak icin kullanacagi kullanici hesabini olusturalim.

groupadd -g 2000 vmail<br></br>  
useradd -g vmail -u 2000 vmail -d /var/mail<br></br>  
chown -R vmail:vmail /var/mail```

/etc/dovecot/conf.d/10-auth.conf dosyasina gelip kimlik kanitlama ayarlarini yapalim. Yorumlanmis satirlardan sonra kalan satirlar soyle. !include auth-system.conf.ext satirinin basina # koyalim. Sisteme giris yapmis kullanici diye bir sey olmayacagindan ayarina da gerek yok.

disableplaintextauth = yes


auth_mechanisms = plain login


!include auth-sql.conf.ex``` t

auth-sql.conf.ext dosyasi ile MySQL ile nasil konusacagini anlatacagiz.

/etc/dovecot/conf.d/auth-sql.conf.ext

passdb {<br></br>  
driver = sql<br></br>  
args = /etc/dovecot/dovecot-sql.conf.ext<br></br>  
}<br></br>
userdb {<br></br>  
driver = static<br></br>  
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n<br></br>  
}```

Yukaridaki dosyada belirttigimiz dovecot-sql.conf.ext dosyasinin icerigi ise soyle olacak yorumlardan sonra.

driver = mysql


connect = host=127.0.0.1 dbname=sanalposta user=sanalpostayoneticisi password=12345


defaultpassscheme = SHA512-CRYPT


passwordquery = SELECT email as user, password FROM sanalkullanicilar WHERE email='%u';```

Dizin sahipligini duzeltelim.

chown -R vmail:dovecot /etc/dovecot<br></br>  
chmod 750 /etc/dovecot```

/etc/dovecot/conf.d/10-master.conf dosyasinda soket ayari su sekilde yapiliyor. SSL kullanmasini istedigim icin imap-login ve pop-login’in port degerini 0 ile degistirdim. service-lmtp ve smtp-auth icin postfix’e gosterdigim ayarlari yaptim. Dosyadaki kimi yorumlari eklemelerin nereye yapilacagini gostermek icin birakiyorum.

service imap-login {


inetlistener imap {


port = 0


}

inet
listener imaps {

port = 993

ssl = yes

}```

Number of connections to handle before starting a new process. Typically

# the only useful values are 0 (unlimited) or 1. 1 is more secure, but 0
# is faster.
#service_count = 1

Number of processes to always keep waiting for more connections.

#processminavail = 0

If you set service_count=0, you probably need to grow this.

#vsz_limit = 64M
}

service pop3-login {
inetlistener pop3 {
port = 0
}
inet
listener pop3s {
#port = 995
#ssl = yes
}
}

service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}

Create inet listener only if you can’t use the above UNIX socket

#inet_listener lmtp {
# Avoid making LMTP visible for the entire internet
#address =
#port =
#}
}

service imap {
# Most of the memory goes to mmap()ing files. You may need to increase this
# limit if you have huge mailboxes.
#vsz_limit = 256M

Max. number of IMAP processes (connections)

#process_limit = 1024
}

service pop3 {
# Max. number of POP3 processes (connections)
#process_limit = 1024
}

service auth {
# authsocketpath points to this userdb socket by default. It’s typically
# used by dovecot-lda, doveadm, possibly imap process, etc. Its default
# permissions make it readable only by root, but you may need to relax these
# permissions. Users that have access to this socket are able to get a list
# of all usernames and get results of everyone’s userdb lookups.

unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}

unix_listener auth-userdb {
mode = 0600
user = vmail
#group = vmail
}

Postfix smtp-auth

#unix_listener /var/spool/postfix/private/auth {
# mode = 0666
#}

Auth process is run as this user.

user = dovecot
}

service auth-worker {
# Auth worker process is run as root by default, so that it can access
# /etc/shadow. If this isn’t necessary, the user should be changed to
# $defaultinternaluser.
user = vmail
}

service dict {
# If dict proxy is used, mail processes should have access to its socket.
# For example: mode=0660, group=vmail and global mailaccessgroups=vmail
unix_listener dict {
#mode = 0600
#user =
#group =
}
}

Siradaki dosya /etc/dovecot/conf.d/10-ssl.conf dosyasi. Yorumlardan sonra kalan satirlar su sekilde. Ayarlar zaten kendini aciklar nitelikte.

ssl = required<br></br>  
ssl_cert = ssl_key = ```

Bu asama ile posta sunucu yapilandirmamizi tamamladik. Dovecot ve Postfix servislerini yeniden baslatalim.

service postfix restart


start dovecot```

Thunderbird ile ornek olarak olusturdugumuz kullanicilardan birini yapilandirabilirsiniz. Yeni kullanicilar ya da alanadlari eklemek icin MySQL komut satirina dusup ornek kullanicilari ekledigimiz sekilde sorgulari ya da istekleri tekrar calistirmaniz gerekiyor. Tabii bu arada hangi alanadinin hangi id ile tutuldugu gibi detaylar gozden kacirilmamali. Catchall diye tabir edilen ve bir kullanici adiyla eslesmeyen tum postalari yakalamak icin sanal_takmaadlari tablosuna source icin @alanadi.com adresini verebilirsiniz.

Squirrelmail kurulumu ile rehberi tamamlamadan once yapmak isteyebileceginiz bir iki sey uzerinde durayim. Submission portunu(587) acmak icin /etc/postfix/master.cf dosyasini duzenlemelisiniz. Benim yapilandirmamda ilgili bolum soyle gorunuyor. Farkettiginiz uzere bu dosyada da main.cf dosyasinda oldugu gibi smtpdsaslauthenable ve smptdclient_restrictions gibi secenekleri kullanabiliyoruz.

submission inet n - - - - smtpd<br></br>  
-o syslog_name=postfix/submission<br></br>
-o smtpd_sasl_auth_enable=yes<br></br>
-o smtpd_client_restrictions=permit_sasl_authenticated,permit_mynetworks,reject```

Servislerin calisip calismadigi, calisiyorlarsa hangi portlari dinlediklerini gormek icin ise benim kullandigim komut su. IPv6 henuz ilginizi cekmiyorsa buyuk hata yapiyorsunuz fakat t’nin yanina 4 ekleyebilirsiniz sadece IPv4 icin. Ilk uc kolonu almazsak cikti suna benzeyecektir. Ben sadece IMAPs sundugum icin 993, SMTP icin ise 25 ve 587 calistiriyorum. Siz bu ciktida SSH ve calistiriyorsaniz diger daemon’lari da goreceksiniz.

`netstat -plnt4`

Active Internet connections (only servers)  
 Local Address Foreign Address State PID/Program name  
 127.0.0.1:3306 0.0.0.0:* LISTEN 22790/mysqld  
 0.0.0.0:587 0.0.0.0:* LISTEN 24543/master  
 0.0.0.0:25 0.0.0.0:* LISTEN 24543/master  
 0.0.0.0:993 0.0.0.0:* LISTEN 22920/dovecot

**Squirrelmail yapilandirmasi**

Ilk olarak gerekli paketi kuruyoruz.

`apt-get install squirrelmail`

Squirrelmail bir suru bagimliligiyla birlikte kurulacaktir. Ardindan su komutu veriyoruz.

`squirrelmail-configure`

SquirrelMail Configuration : Read: config.php (1.4.0)  
 ———————————————————  
 Main Menu —  
 1. Organization Preferences  
 2. Server Settings  
 3. Folder Defaults  
 4. General Options  
 5. Themes  
 6. Address Books  
 7. Message of the Day (MOTD)  
 8. Plugins  
 9. Database  
 10. Languages

D. Set pre-defined settings for specific IMAP servers

C Turn color on  
 S Save data  
 Q Quit

Command >>

gibi bir ekran bizi karsilayacaktir. Onemli bolum 2. Server Settings dedigi bolum. R ile bir onceki menuye donuluyor. S ile yapilan ayarlar kaydediliyor. Q ise ile yapilandirmadan cikiliyor. 2’ye basrak ayarlara gecelim. Bu menude A ve B tuslariyla IMAP ve SMTP ayarlarinizi yapabilirsiniz.

Son islem ise Apache’ye squirrelmail yapilandirmasini tanitmak. Hazir gelen yapilandirmayi kopyalayalim.

`cp /usr/share/squirrelmail/config /etc/apache2/sites-available`

Sites-available altina aldigimiz dosyada istedigimiz degisiklikleri yapabiliriz. Ornegin alias direktifini duzenleyelim.

Alias /posta /usr/share/squirrelmail

Degisikliklerimizi de yaptiktan sonra Apache’yi yeniden yukleyelim.

`service apache2 reload`

Artik kullanicilar hesaplarina http://konusmalar.tk/posta adresine eriserek giris yapabileceklerdir.

[![Screenshot from 2013-05-20 14:09:59](https://blog.cagriemer.net/wp-content/uploads/2013/05/Screenshot-from-2013-05-20-140959-300x229.png)](https://blog.cagriemer.net/wp-content/uploads/2013/05/Screenshot-from-2013-05-20-140959.png)

Ekler:  
 doveconf -n ile tek bir dosya olsaydi yapilandirmanin nasil olacagini gorecegiz demistim. Su sekilde gozukuyor.

2.0.19: /etc/dovecot/dovecot.conf

OS: Linux 3.2.0-23-virtual x86_64 Ubuntu 12.04.2 LTS ext4

authmechanisms = plain login


mail
location = maildir:/var/mail/vhosts/%d/%n


mailprivilegedgroup = mail


passdb {


args = /etc/dovecot/dovecot-sql.conf.ext


driver = sql


}

protocols = imap lmtp


service auth-worker {


user = vmail


}

service auth {


unixlistener /var/spool/postfix/private/auth {


group = postfix


mode = 0666


user = postfix


}

unix
listener auth-userdb {


mode = 0600


user = vmail


}

user = dovecot


}

service imap-login {


inetlistener imap {


port = 0


}

}

service lmtp {


unix
listener /var/spool/postfix/private/dovecot-lmtp {


group = postfix


mode = 0600


user = postfix


}

}

service pop3-login {


inetlistener pop3 {


port = 0


}

}

ssl = required


ssl
cert = ssl_key = userdb {


args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n


driver = static


}

```

Diyagramin kaynagi ise surada: https://blog.cagriemer.net/wp-content/uploads/2013/05/posta.dia

20 Mayıs 2013

Posted In: Dovecot, E-posta, Gezegen, MySQL, Postfix, Sanal E-posta, SquirrelMail, Ubuntu 12.04

How I did a streaming Test

Hi,

I nearly promised to write about "the syn that's not replied" and "The port can not be opened" but I have something better to write about now. Well I've already written most of it already ;)

This is about a streaming test I've had performed for the GSM operator I'm consulting in Thailand. Have you ever encountered a streaming server to be load tested? Well I've in the last few weeks. It was a success let alone the bandwidth bottlenecks of my vps provider [1] Vpshispeed of Thailand.  I'm possibly going to retry these test with more Thailand bandwidth to reach my tests target in a later time. Any help on huge bandwidth vps or cloud providers in Thailand?

I'm bound to thank Diederik dee Gee for all the help he has provided to me. Thank you Diederik. It's been a really pleasure to work and talk with you! Also I must tell that that bottleneck was not any fault of Diederik's side. It's just I had consumed all the bandwidth available to his service and even I could use more than he has promised. His service exceeds his promises ;) I strongly recommend his services for anyone in need of vps in Thailand.

If I return to the foundation of my load test, as you already know it's a hard process. Also seemingly there are virtually no tools to load test a streaming server. So I had to improvise about it.

My concerns for a streaming load test are as follows:
  • No tools -
    Build in house scripts or tools.
  • Bandwidth -
    Streaming is bandwidth intensive so you need huge amounts of it.
  • What to monitor and how to analyse data? -
    For a web server load test we have many tools and patterns to use. Like ab, jmeter and many many more and easy structure to make the test. "Fire requests and receive responses." But how to load test a streaming server? It's not http.
So I prepared a foundation to design my tests. My Foundation is as follows:
  1. Receive Assumption: Users has enough bandwidth to saturate itself for maximum performance and keep busy the server at most.
  2. Receive Assumption: Users can consume all the data it receives or has enough buffer for constant data receiving.
  3. Receive Assumption: Users has enough time and patience to consume streams from beginning to end without any exceptions.
  4. Consume Assumption: users has a limited buffer but overflowing data is received with the next burst added to the received data.
  5. Consume Assumption: users consume data in a constant bitrate relative to the bitrate of the stream
  6. Server Assumption: Servers are more bandwidth constraint then memory or cpu.
  7. Server Assumption: Different protocols for streaming only has minimal effect on cpu and memory usage on the server side

After creating my foundation I started searching for tools to use. Because of assumptions 6 and 7 I decided on focusing on a single protocol and with the openrtsp tool [2] and (live555 Streaming Media Library [3]) availability rtsp seemed to be a suitable choice.

But as is, OpenRtsp would not give me any data to analyse. So I quickly hacked one of its samples into giving me data about stream bursts and put the received data into void. As this would only give me raw data about the network usage I built a simple python tool to analyse the raw data in a simplistic but informative way. This tool gives a [4] gnuplot data file about the data burst which then be used to create graphs of the bursts in a visual way.

I've put the foundation into github and can be pulled from [5] https://github.com/fsniper/streaming-loadtest-foundation . There are more info in the README file in the repository.

All pull requests are welcome ;) Please don't be harsh and please try to be constructive with your comments. These are hacks as they are right now.

[1] http://www.vpshispeed.com/en/
[2] http://www.live555.com/openRTSP/
[3] http://www.live555.com/liveMedia/
[4] http://www.gnuplot.info
[5] https://github.com/fsniper/streaming-loadtest-foundation

17 Mayıs 2013

Hello for my torments! And what’s happened?

Too long it has been, since I've written on the internet.  Too much has came and gone. I've done many things, passed many. I even don't know why I started writing back. Especially why in English? I believe, I do not have a clear answer to that question.

Maybe I need to practice writing in English? Maybe need more audience?  It does not matter. I will be writing in English and will have too many mistakes but won't care. I'll just write if I can. I do not promise anything. Promises are a burden if they can't be kept. I even has one on my shoulders that I could not manage to fulfil. Once I promised some of my college mates to cook for them. I still feel the urge. So long, and I even lost contact with many of them. Never mind, that's a lost cause. .

Since the last post I tried to write once and could not finish. I'm more inclined to finish this time. I know, if I pause, or postpone that means another half an effort that's lost.

I'm in a hotel bed in a foreign country now. I'm in Bangkok and started the feel the urge to write again. I've been abroad since my last post. Been to North Cyprus, Bahrain, Greek Islands and now Thailand. Some of them for work, some of them for leisure. But always with a leisure sauce.  In Bahrain I worked for Batelco, Ericsson, Parkyeri as an outside consultant. In Thailand I'm consulting at Parkyeri for TrueLife this time. Greek Islands and Cyprus was all leisure. 

In Bahrain I travelled the country with a rental car and stuck in desert to be rescued by U.S. Soldiers. (thank you uncle Sam!) In North Cyprus gambled and won to loose on adultery ;)  In Greek islands I was on a cruise ship and with my ex. And I'm in Thailand now. Not yet have much leisure. But I'm sure to have some in the coming days.

What will I be ramble about? As the name suggests, I'm a Linux System administrator and will be rambling about my experiences or my torments of all about system administration and anything that's complementary for it. Like the torture of my beloved two friends Barış and Barış's cycling tour designed to torture me!. For the tour route look at  http://dunyadangecerken.com/?p=38756

Now I have to sleep some. So see you! Maybe I will write next about my last struggle with  "unreplied syn" and my friends "port that can not be listened".

15 Mayıs 2013

Steam’in Linux’taki İlk 6 Ayının Ardından

steamlinux

Dünyada dijital oyun dağıtımının liderliğine sahip olan Steam, Linux için ilk beta sürümünü 2012 yılının kasım ayında kullanıcılara sunmuştu. 2003 yılında Windows ve 2010 yılında Mac sürümlerini (ve beraberlerinde bu platformlar için oyunlarla birlikte) çıkartan Steam’in Linux’taki ilk 6 ayında neler olduğunu şöyle toparlamaya çalışayım.

  1. Beta’nın yayınlandığı ilk akşam Linux oyun kütüphanesinde 26 oyun vardı. Bugün bu sayı 115. Bu oyunlara hızlıca göz gezdirdiğimizde çoğunun indie dediğimiz bireyler veya küçük oyun stüdyoları tarafından hazırlanan oyunlar olduğunu görüyoruz. Tabii ki sayfalara göz gezdirdiğimizde adını daha çok duyurmuş oyunlarla karşılaşabiliyoruz ama bunların da çoğunun Half-Life, Portal, Counter-Strike gibi yine bizzat Valve’in geliştirdiği oyunlar olduğunu görüyoruz.
  2. Steam Donanım & Yazılım istatistikleri sayfasında işletim sistemleri başlığını genişlettiğimizde karşımıza çıkan tüm Linux yüzdelerini toplayacak olursak 1.82% gibi bir sayı çıkıyor karşımıza. Bu yüzdenin önemli bir çoğunluğunu Ubuntu kullanıcıları oluştururken liderlikte 54.18% ile 64 bit Windows 7 kullanıcıları yer alıyor. Windows 8 kullanıcılarının sayısı ise toplamda 11.65%.
  3. İster Linus Torvalds tepkisini “gösterdi” diye olsun, ister Steam Linux’a geldi diye olsun; Nvidia’nın Optimus destekli ilk resmi sürücülerinin Linux’a çıkması da bu 6 ay içine denk geliyor 🙂
  4. Hakkında çok fazla açıklama olmasa da Valve’in Linux tabanlı oyun konsolu olan Steam Box söylentileri aldı başını gidiyor…

steamlinux

 

Gelecek İçin Tahminlerim

  1. Valve’in ürettiği tüm oyunlar neredeyse Linux’a port edildi ve Linux katalogundaki diğer oyunlar gibi güzel güzel problemsizce, takılmadan ve Windows sürümlerinden daha performanslı şekilde çalışıyorlar. Şu an aklıma geldiği kadarıyla geriye Portal 2 ile Dota 2 kalmış durumda, Dota 2 de Linux’a port edilirse kullanım yüzdelerinde bir miktar artış olacaktır (yazıyı hazırladığım şu an dünya genelinde Dota 2’yi açmış ve oynayan oyuncu sayısı 289.321).
  2. Geride bıraktığımız 3 yıl içersinde Mac için çıkmış olan oyun sayısı 412. Bu oyunlara hızlıca göz gezdirdiğimde Grand Theft Auto III-VC-SA başlıkları, Assassin’s Creed serisinden 1-2 başlık, Knights of the Old Republic gibi 4-5 Star Wars başlığı gibi adları duyulmuş ünlü oyunlar da yer alıyor ancak bu oyunların henüz Linux sürümleri yok. Bu başlıkların Windows’un yanı sıra Mac’e de çıkmış olmaları, oyun üreticilerinin eğer isterlerse ve gerekli emeği gösterirlerse Microsoft teknolojilerine olan bağımlılıklarını kırarak başka platformlarda da oyunlarını çalıştırabildiklerini gösteriyor. Örneğin daha ilk günden Linux’ta oynanabilir olan Serious Sam 3. Bu oyunların da şirketlerin zaman ayırdıkça Linux’a birer ikişer geleceğini düşünüyorum. Mesela indie cenneti haline gelmiş Linux’a aniden Assassin’s Creed IV: Black Flag geliverse ne güzel olurdu değil mi?
  3. Steam Box’ın Playstation gibi, Xbox gibi rakiplerini olduğu bir pazarda pay alabilmesi için yukardaki maddede de belirttiğim gibi ünlü oyunların Linux sürümlerini çıkartması için oyun şirketlerini teşvik etmesi gerekiyor.

Özetle ilk 6 ay Valve’in Linux dünyasında kendine yer açmasıyla geçti diyebiliriz. Artık diğer şirketlerin de katkı vermeye başlaması zamanı geldi. Bakalım bir 6 ay daha geçtikten sonra ne değişiklikler yaşanacak.

14 Mayıs 2013

Posted In: Gezegen Yazıları, linux, Mac, Oyun, steam, ubuntu, windows

Yeni bir blog – arslan.io

Yeni bir blog açtım: arslan.io. Burada teknik ağırlıklı yazılar olacaktır. Bu blog’un en büyük farkı ingilizce olması. Bunu uzun zamandır yapmak istiyordum ama bir türlü fırsat bulamamıştım. Diğer bir fark ise Jekyll yerine Posthaven kullanmamdır. Posthaven kullanmamın en büyük sebebi de, kolay yazmama izin vermesi. Ayrıca Posthaven kurucuların uzun vadeli düşüncelerini de destekliyorum. Bakalım nasıl olacak o kısımda.

Neden İngilizce peki? İçimde kalmasın dedim. Hem daha fazla insanlarla irtibata geçebilme, hem de ingilizce yazma anlamında kendimi geliştirmek istediğimden ve çoğu şeyin Türkiye sınırları içinde malesef yeterince rağbet görmemesi beni bu diğer bloğu açmaya itti.

Örneğin şu yazı: QTcpServer sınıfına SSL desteği eklemek (Qt). İngilizce olsaydı muhtemelen bir çok kişinin işine yarayacaktı, halbuki bu tarz niche konuları türkçe yazmak ayağına sıkmak gibi bir şey. Kimsenin işine yaramıyor ve kimse de okumuyor.

..

Arslan.io domain ismini de alınca, bu blogu açmam için hiç bir engel kalmadı diyebilirim. Şimdiden bir kaç tane yazı yazdım. İleride çok daha fazla ve değişik yazılar paylaşacağım. İlgilenen herkesi beklerim, seveceğinizi düşünüyorum: arslan.io

13 Mayıs 2013

Twitter Auto Publish Powered By : XYZScripts.com