<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[gezegen - Sazliklardan Havalanan]]></title><description><![CDATA[\xc7a\u011fr\u0131 ve ugraslari]]></description><link>http://blog.cagriemer.net/</link><generator>Ghost 0.11</generator><lastBuildDate>Wed, 20 Dec 2017 04:20:04 GMT</lastBuildDate><atom:link href="http://blog.cagriemer.net/tag/gezegen/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Haydi sifreleyelim girisimi (let's encrypt initiative)]]></title><description><![CDATA[<p>EFF bugun internetin gelecegini degistirme potansiyeli olan <em>let's encrypt</em> adini verdikleri projeyi <a href="https://www.eff.org/deeplinks/2014/11/certificate-authority-encrypt-entire-web">duyurdu</a>. Mozilla, Cisco, Akamai gibi devlerin yani sira IdenTrust ve Michigan Universitesi arastirmacilarinin da katkilariyla olusturduklari yeni bir sertifika otoritesi olan <em>let's encrypt</em>, web'in http'den https'ye gecisi onunde kalan son engelleri de kaldirmayi amacliyor. Bu yazida https'nin http'ye</p>]]></description><link>http://blog.cagriemer.net/haydi-sifreleyelim-girisimi/</link><guid isPermaLink="false">5a63c50e-7e1f-4b9e-a653-183a0e8b5aed</guid><category><![CDATA[eff]]></category><category><![CDATA[let's encrypt]]></category><category><![CDATA[tls]]></category><category><![CDATA[ssl]]></category><category><![CDATA[gezegen]]></category><dc:creator><![CDATA[Cagri Emer]]></dc:creator><pubDate>Tue, 18 Nov 2014 19:31:30 GMT</pubDate><content:encoded><![CDATA[<p>EFF bugun internetin gelecegini degistirme potansiyeli olan <em>let's encrypt</em> adini verdikleri projeyi <a href="https://www.eff.org/deeplinks/2014/11/certificate-authority-encrypt-entire-web">duyurdu</a>. Mozilla, Cisco, Akamai gibi devlerin yani sira IdenTrust ve Michigan Universitesi arastirmacilarinin da katkilariyla olusturduklari yeni bir sertifika otoritesi olan <em>let's encrypt</em>, web'in http'den https'ye gecisi onunde kalan son engelleri de kaldirmayi amacliyor. Bu yazida https'nin http'ye gore artilarini siralamaktansa <em>let's encrypt</em> otoritesini, girisimin kurmayi planladigi sistemi ve su anda gelistirmekte olduklari ACME protokolunu anlatacagim.</p>

<p>Internet guvenligi arastirma grubu, ISRG, ismiyle yeni olusturulan ve kar amaci gutmeyen bir organizasyon tarafindan isletilecek <em>let's encrypt</em> sertifika otoritesinin hangi problemi cozmeye calistigini aciklayarak baslamak yerinde olacaktir diye dusunuyorum. SSL/TLS'in genis capta uygulanabilmesinin onundeki en buyuk engellerden en onemlileri kurulum karmasikligi, burokrasi ve sertifikalarin yuksek ucretleri olarak goruluyor. 2015 yazindan itibaren <strong>ucretsiz</strong> olarak sertifika dagitmaya baslayacak olan yeni otoritemiz su siralar tek bir komut calistirilarak, hazirda sunulmakta olan sitelerin alan adi dogrulamasini yaptiktan sonra https'ye gecirilmesi islemini yapacak bir <a href="https://github.com/letsencrypt/lets-encrypt-preview">istemci yazilimi</a> ve bu yazilimin insa edilerken temel alindigi <a href="https://github.com/letsencrypt/acme-spec">protokol</a> uzerinde calisiyor. <em>Let's encrypt</em> bu surecte gozetecegi ana prensipleri ise soyle siraliyor;</p>

<p><strong>Bedelsiz</strong>: Alan adi sahipleri kontrol ettikleri alanlar icin hicbir ucret odemeden sertifika sahibi olabilecekler</p>

<p><strong>Otomatik</strong>: Sertifika alim sureci ve yenilenmesi ve sunucuda konfigure edilmesi gibi islemler tamamen otomatiklestirilerek minimum operator mudahalesi gerektirecek</p>

<p><strong>Guvenli</strong>: <em>Let's encrypt</em> modern guvenlik tekniklerinin ve alandaki en iyi uygulamalarin implemente edilebilecegi bir platform olacak</p>

<p><strong>Seffaf</strong>: Verilen ya da gecersiz kilinan tum sertifikalar incelemek isteyen herkese acik olacak</p>

<p><strong>Acik</strong>: Gelistirilen protokol herkese acik bir standart olacak, gelistirilen yazilimlar ise elverdigince acik kaynak olarak sunulacak</p>

<p><strong>Katilimci</strong>: Tek bir organizasyonun kontrolunde olmaktansa her acik standartta oldugu uzere topluluktan katilimcilarin fayda saglayacagi tumlesik bir girisim olmayi amaclayacak</p>

<p>Gelelim nasil calistigina. Altyapi ve istemci yazilimi tamamlandiginda kendi ifadeleriyle  </p>

<pre><code>sudo apt-get install lets-encrypt  
sudo lets-encrypt ornek.com  
</code></pre>

<p>komutlarini calistirmak tum ayarlari ve sertifika surecini halletmek icin yeterli olacak. Peki arkaplanda neler oluyor? Aslinda bunun icin istemci yazilimin ne yaptigina bakmadan once ACME protokolune bakmakta fayda var. Taslak halindeki RFC'ye gore genel hatlariyla protokol soyle.</p>

<p>Istemci yazilimi operatore hangi alan adlari icin sertifika istedigini soracak. Bu islemin ardindan sertifika otoritelerinin bir listesi gelecek. Eger secilen otorite ucretsiz sertifika saglayan bir otorite degilse odeme bilgisi bu asamada istenecek. Daha sonra yazilim operatore kisa bir sure icinde sertifikanin verilecegini bildirecek. Arkaplanda sunucu, sertifika otoritesi ile ACME kullanarak operatorun belirttigi alan adlari icin sertifika isteginde bulunacak. Sertifika otoritesinin verilen sertifikanin tipine gore belirledigi gereksinimler yerine getirildiginde verilen sertifika otomatik olarak indirilecek ve web sunucu sertifikayi kullanacak sekilde yapilandirilacak. Tercihen operatore e-posta, sms vb. gibi bir yontemle haber verilecek. Normal web hizmeti surecinde web sunucu sertifika otoritesi ile gerektigi taktirde konusarak OCSP (cevrimici sertifika durum protokolu) cevaplari, sertifika listeleri gibi bilgileri almaya devam ederek sorunsuz bir web sunma isinin yururlugunu saglamaya devam edecek.</p>

<p>Burada araya girip bir iki konuya acikliga kavusturayim. Yukarida web sunucu olarak bahsedilse de e-posta, xmpp vs. gibi sertifika kullanabileceginiz her hizmette ACME protokolunu ve bu protokol uzerinden calisan istemciyi kullanabileceksiniz. Su asamada organizasyon dogrulamasi(organization validation) ya da kapsamli dogrulama(extended validation) surecleri nasil isleyecek cok net olmasa da alan adi dogrulama icin(domain validation) bir sorun yok gibi gozukuyor. Protokole doneyim.</p>

<p>Standardimizda uc adet anahtar/anahtar cifti tanimi bulunuyor.</p>

<p><em>Ozne acik anahtari</em> (subject public key): Sertifikaya konu olan alanlar icin dahil edilecek acik anahtar</p>

<p><em>Yetkilendirilmis anahtar cifti</em> (authorized key pair): Sertifika otoritesinin herhangi bir kimligin yonettigi/yonetebilecegi sertifikalar icin iletisimde kullanacagi anahtar cifti. Bu cift birden fazla kimlik icin kullanilabiliyor.</p>

<p><em>Sifirlama anahtari</em> (recovery token): Diger anahtarlarin ya da anahtar ciftlerinin kaybedilmesi durumunda sertifika otoritesine kimlik kanitlamak icin kullanilabilecek gizli anahtar</p>

<p>Butun iletisim https uzerinden json ile saglaniyor. Kimlikler ACME'de anahtar ciftleri ile ifade ediliyor. Bir alan adi icin istek yapilmadan once gecerli bir anahtar ciftinin ozel anahtarinin o alan adini kontrol eden tarafindan sahipliginin gosterilmesi gerekiyor. Bu kisim bildigimiz acik anahtarli sifrelemenin aynisi oldugundan uzerinde cok durmaya gerek yok. Alan adinin ya bir DNS kaydi ile ya da sunulan bir dosya ile bir ozel anahtar tarafindan kontrol edildigi kanitlaniyor. Sertifika otoritesi bu kanitlama basarili olursa basarili mesaji ve sifirlama anahtari donuyor istemciye.</p>

<p>Kimlik kanitlama isleminin ardindan istemci, belirtilen alan icin bir sertifika imzalama istegi olusturuyor(CSR) ve bu istegi ozel anahtari ile imzalayip sunucuya gonderiyor. Sunucu gelen istegin daha once dogruladigi anahtar ciftine ait olduguna emin olduktan sonra sertifikayi olusturuyor ve istemciye gonderiyor. Bu cevapta sertifika yenilemenin tekrar bir dogrulama gerektirmedigi durumlarda, istemci tarafindan yenileme icin kullanilabilecek adres de gonderilebiliyor. Sertifikanin iptali icin istemci basitce, ozel anahtariyla imzaladigi iptal istemini sunucuya gonderiyor ve sunucu bu istegi aldiginda sertifikayi iptal ediyor. Istemci ya da sunucu yazacaklar icin taslak standardin burada atladigim teknik detaylarina yukarida paylastigim protokol adresinden ulasmak mumkun.</p>

<p>Sistem 100 metre yukaridan bakildiginda aciklamaya calistigim sekilde isliyor. Ucretsiz sertifikalarin edinilebilmesine olanak taniyacagi ve TLS implementasyonu onundeki teknik engelleri kaldirma potansiyeli oldugu icin interneti degistirebilecek bir proje olarak goruyor ve heyecanlaniyorum. Umarim Postfix, Nginx, ejabberd gibi projeler de ACME'yi ve dolayisiyla <em>let's encrypt</em> sertifika otoritesini otomatik olarak kullanabilmek ve yapilandirabilmek icin gereken adimlari en kisa surede atarlar. Bu sayede gorece daha guvenli bir internet deneyimi icin gereken en temel adimlardan birini atmis oluruz.</p>]]></content:encoded></item><item><title><![CDATA[OpenSSL enc Uygulamasi]]></title><description><![CDATA[<p>Asagi yukari bir, birbucuk ay kadar once OpenSSLâ€™in tum uygulamaciklari icin belgelendirme yapmaya baslamistim. Tum belgeleri yazmayi bitirdigimde CC ile lisanslayacagim ve ozgurce dagitilabilecek ufak bir kitapcik sekline getirmeyi planliyorum. Ikincil amacim da OpenSSLâ€™e biraz daha hakim olabilmek.</p>

<p>Simdiye kadar uzerinde cokca calisamadigimdan ancak dgst, enc, rand, version</p>]]></description><link>http://blog.cagriemer.net/openssl-enc-uygulamasi/</link><guid isPermaLink="false">9660114d-25b0-4f55-92a4-0771563180a3</guid><category><![CDATA[gezegen]]></category><dc:creator><![CDATA[Cagri Emer]]></dc:creator><pubDate>Sat, 21 Dec 2013 03:56:56 GMT</pubDate><content:encoded><![CDATA[<p>Asagi yukari bir, birbucuk ay kadar once OpenSSLâ€™in tum uygulamaciklari icin belgelendirme yapmaya baslamistim. Tum belgeleri yazmayi bitirdigimde CC ile lisanslayacagim ve ozgurce dagitilabilecek ufak bir kitapcik sekline getirmeyi planliyorum. Ikincil amacim da OpenSSLâ€™e biraz daha hakim olabilmek.</p>

<p>Simdiye kadar uzerinde cokca calisamadigimdan ancak dgst, enc, rand, version ve genel man sayfasini tamamlayabildim. Bir de cogu ozellik OpenSSL tarafindan da belgelendirilmemis oldugundan ne ise yaradigini anlayip aciklamasi epey vakit aliyor bir parametrenin. Bu ufak girizgahtan sonra enc icin yazdigim belgenin ham halini genel bir fikir vermesi adina paylasmak istedim. Bu erken asamada gelebilecek geri donuslere gore uzun donemli haftasonu projemin ilerleyen asamalarini da sekillendirebiliriz diye umuyorum.</p>

<p>OpenSSLâ€™in enc komutu sifreleme ve sifre cozme islemlerini gerceklestirmeye yariyor. Bu belgede enc komutunun man sayfasinda listelenmemisse bile kaynak kodda gozuken tum secenekleri orneklerle birlikte aciklamaya calisacagim.</p>

<p>Kullanilabilecek seceneklerin detayina inmeden once zlib ve base64â€™a kisaca bir goz atalim. Eger OpenSSLâ€™e ilk arguman olarak enc yerine zlib ya da base64 gecirirseniz ve platformunuzdaki openssl zlib destegi ile birlikte derlendiyse girdi dosyanizin zlib ile sikistirilmis halini ya da base64 ile kodlanmis halini elde edebilirsiniz. Diyelim icerigi asagida gosterilen gibi bir metin dosyaniz var.</p>

<script src="https://gist.github.com/cagriemer/c2d91bc3d67f6605978d.js"></script>

<p>Bu sifrelerim dosyasini zlib ile sikistirmak isterseniz calistirmaniz gereken komut soyle olacaktir.</p>

<script src="https://gist.github.com/cagriemer/b4e430e60bd1054ee214.js"></script>

<p>Eger zlib ile sifrelenmis (aslinda sikistirilmis) dosya alirsaniz da icerigini gormek icin vermeniz gereken komut soyle olacaktir.</p>

<script src="https://gist.github.com/cagriemer/aa3a5b5c1b14d1b71662.js"></script>

<p>Zlib ornegiyle base64 ornegi birebir ayni. Yukaridaki komutlarda zlib gordugunuz yere base64 yazarsaniz base64 ile sifreleyecektir. Komutun genel kullanimi hakkinda bir fikir olusmaya baslamistir saniyorum.</p>

<p>enc komutunun alabilecegi butun seceneklere kisaca goz gezdirebiliriz bu noktada.</p>

<script src="https://gist.github.com/cagriemer/6ccd4690730b6d373d45.js"></script>

<p>Kullanilabilecek sifreleme yontemleri ise soyle; aes, bf, camellia, cast, cast5, des, id, rc2, rc4, seed ve tabii bunlarin cesitli anahtar boyutuna ve sifreleme moduna gore olusturulacak varyasyonlari. Burada amac OpenSSLâ€™in enc komutunun nasil calistigini aciklamak oldugundan her bir sifreleme yontemini aciklamaya calismak gibi bir cilginligi denemeyecegim.</p>

<p>Kaldigimiz yerden seceneklere devam edelim. Simdi ayni dosyayi aes-256-ctr ile sifreleyelim ve ciktiyi da eposta ile kolayca aktarabilmek icin base64 olarak verelim.</p>

<script src="https://gist.github.com/cagriemer/87ee6ea6bb810f9d275c.js"></script>

<p>Eger yukaridaki ornekte de goruldugu uzere sifreyi komutu verirken gostermezsek bize bir sifre soracaktir. Ardindan sifreyi dogrulayacak ve dosyamizi ancak ve ancak iki sifre birbirleriyle tutuyorsa duzgun sekilde olusturacaktir. Komutta aslinda enc kelimesini kullanmayabiliriz. Eger kullanmaz isek aes-256-ctrâ€™i basinda â€“ isareti olmadan kullanmamiz gerekir. Yani su sekilde.</p>

<script src="https://gist.github.com/cagriemer/d2391ff1116e43c7a3c2.js"></script>

<p>Elimizdeki sifreli dosyalari acmak icin ise yapmamiz gereken su;</p>

<script src="https://gist.github.com/cagriemer/82bc3b9e9b56b5af1b6f.js"></script>

<p>Yine bu komutun kisa versiyonu da soyle olacaktir;</p>

<script src="https://gist.github.com/cagriemer/887f2e8e8165f3fc000a.js"></script>

<p>-pass secenegi bes deger alabiliyor. Burada eger sifreyi bize sormasini istemezsek yukaridaki orneklerde oldugu gibi, nereden okumasi gerektigini belirtiyoruz. Yani ornegin, komut satirindan sifre gecirmek eger problem degilse su sekilde yapabiliriz sifreleme islemimizi;</p>

<script src="https://gist.github.com/cagriemer/07c19445b070d3611fe3.js"></script>

<p>Goruldugu uzere dogrudan sifre vermek icin pass:sifre seklinde tanimlamamiz gerekiyor. env:degisken, file:/dosya/yolu, fd:dosyatanimlayicinumara, stdin kullanabilecegimiz diger secenekler. Ornegin bir de file:/dosya/yolu ile yapalim islemimizi. Tabii dosya kullanildiginda parolamizi karmasiklastirabiliriz. Mesela once 2048 bitlik bir dosya olusturalim /dev/urandom yardimiyla.</p>

<script src="https://gist.github.com/cagriemer/2d0cc9f8ac042db759a5.js"></script>

<p>Alternatif olarak anahtari soyle de uretebiliriz.</p>

<script src="https://gist.github.com/cagriemer/faef5ca71fa133c8e828.js"></script>

<p>Simdi bu dosya ile sifrelemeyi deneyelim sifreleri iceren metini.</p>

<script src="https://gist.github.com/cagriemer/168398daf80b7430d085.js"></script>

<p>Artik anahtarimizi USB bellegimize atabilir, yine daha once ornekledigimiz sekilde base64 ile sifreleyip(kodlayip) bir ciktisini aldiktan sonra ailemize/arkadaslarimiza saklamasi icin gonderebilir ya da cuzdanimiza atabiliriz.</p>

<p>-p ve -v secenekleri yaptigimiz sifrelemedeki kullanilan girdi ve cikti boyutlarini, uretilen anahtari, salt ve baslangic vektoru degerlerini goruntulemek icin kullaniliyor. Bilgi amacli oldugundan sifreleme ya da desifre etme islemleri sirasinda kullanilmasi hayati onem tasimiyor. -P herhangi bir sifreleme/desifreleme yapmadan anahtari, baslangic vektorunu ve salt degerini bastirip programi sonlandiriyor.</p>

<p>-a ve -base64 orneklerini yukarida vermistik -z ise base64 yerine zlib kullaniyor. Burada deginilmesi gereken bir de -A var. -A yine -a ya da -base64 ile ayni isi yapiyor fakat ciktiyi tek bir satir olarak olusturuyor. Dolayisiyla cok buyuk dosyalarda calismayabiliyor.</p>

<p>-salt ontanimli oldugundan yukaridaki orneklerde kullanmamistik fakat yine komutun okunabilirligi acisindan harici olarak kullanilabilir. -nosalt ise salt kullanilmamasi gerektigini soyluyor ki sozluk ataklarini etkin kilabileceginden kullanilmasi pek onerilmiyor.</p>

<p>-K, -S ve -iv ile hex formatinda sirasiyla anahtar, salt ve baslangic vektoru degerlerini komuta gecirmek mumkun. Fakat eger bir parola kullaniyorsaniz -pass orneklerinde oldugu gibi bu degerleri haricen gecirmenize gerek yok(salt degerini vermek isteyebilirsiniz belki) cunku gecirdiginiz paroladan hesaplanacaklardir.</p>

<script src="https://gist.github.com/cagriemer/7628dd71303535c97cf1.js"></script>

<p>Acikca gorulecegi uzere eger -K ile anahtar ve -iv ile baslangic vektoru degerlerini veriyorsaniz salt hic kullanilmiyor. Bunun nedeni salt degerinin verdiginiz paroladan anahtar uretilirken kullanilmasi. Yani zaten anahtari verdiginizde bir de salt degeri vermenize gerek yok. -K kullanirsaniz -iv de kullanmaniz gerekiyor. Fakat hem -K verip hem de sifre verip -iv degerini OpenSSLâ€™den sifreden turetmesini istemek de su ornekte oldugu gibi mumkun.</p>

<script src="https://gist.github.com/cagriemer/17e7d0533836a63bb977.js"></script>

<p>-md parolamizdan bir anahtar olustururken kullanilacak hash fonksiyonunu belirtmeye yariyor. normalde md5 kullaniyor. Ornek;</p>

<script src="https://gist.github.com/cagriemer/55fe5bdf5b903a8930a7.js"></script>

<p>salt kullanmayarak parolamizdan uretilen anahtarlarin hangi hash fonksiyonu ile uretilmis oldugunu gormus olduk. Farkettiginiz uzere ayni anahtari urettiginden, onceden olusturulmus sozluklerle saldirilabilir hale gelecektir verimiz. Dolayisiyla salt kullanmak cok onemli. md4, md5, ripemd160, sha, sha1, sha224, sha256, sha384, sha512 ve whirlpool kullanilabilecek hash fonksiyonlari olarak siralanabilir.</p>

<p>-engine ayri bir uretec kullanabilmek icin veriliyor komuta. Ornegin rastgele sayi ureten bir donaniminiz varsa ya da baska bir uretec kullanmak istiyorsaniz bunu secebilirsiniz.</p>

<p>-debug ile girdi cikti islemlerinde bir sorun yasaniyorsa nerede sorun yasandigini gorebilirsiniz. Daha cok gelistiricilere yonelik olmakla birlikte baskasi tarafindan yazilmis bir komutun hic openssl kullanmadiysaniz ne yaptigini ogrenmek icin de kullanilabilir belki. Ornek;</p>

<script src="https://gist.github.com/cagriemer/85b18fbca8e2a71b84e7.js"></script>

<p>Bellekte gerekli islemler icin alan olusturuyor. Dosyayi okuyor. Sifreliyor. Base64â€™a ceviriyor. Cikti dosyasina yaziyor ve calisirken olusturdugu bellek alanini geri birakiyor.</p>

<p>-none ile cipher degerini bosaltiyoruz. Dolayisiyla herhangi bir sifreleme yapilmiyor. Bunu niye yapmak isteyebilirsiniz bir kullanim alani bulamadim acikcasi. Yine de ornekleyelim;</p>

<script src="https://gist.github.com/cagriemer/b53204b79d544bdcf67f.js"></script>

<p>-nopadâ€™i aciklamak icin biraz ayrintiya girmek gerekecek. Bazi sifreleme modlari verilen mesajin boyutunun ontanimli blok boyutunda olmasini gerektirir. Ornegin aes-cbc bunlardan birisi. Simdi 10 bytelik bir karakter dizisini sifreleyelim ve cikti boyutu ne kadar olacak ona bakalim.</p>

<script src="https://gist.github.com/cagriemer/820a42ec0f395ccee7b1.js"></script>

<p>Gordugunuz gibi 16 byteâ€™a tamamladi. Yani cbc 16 byteâ€™lik bloklar bekliyor bizden. O halde -nopad kullanip 10 bytelik dizgi icin ne yapacak ona bakalim.</p>

<script src="https://gist.github.com/cagriemer/1ffabc34820221ff52e6.js"></script>

<p>Hata verdi. Demek ki CBC icin illa 16 byteâ€™a tamamlamamiz gerek mesajimizi. Peki mesajimiz 16 byte ise o zaman ne olacak?</p>

<script src="https://gist.github.com/cagriemer/3c8cce792912b163f2d5.js"></script>

<p>Yine bir sonraki 16 byteâ€™a tamamladi. Fakat sifrelenmis metinin boyutu iki katina cikti. O halde 16 byteâ€™in tam sayi kati oldugunu bildigimiz mesajlar icin -nopad kullanip ciktinin boyutundan tasarruf edebiliriz. Hemen ornekleyecek olursak;</p>

<script src="https://gist.github.com/cagriemer/22fff8d3c624e33a36ac.js"></script>

<p>Farkettiginiz uzere bu sefer padding yapmadi, boylelikle biz de boyuttan tasarruf etmis olduk. Iste -nopad de bu ise yariyor. Fakat bu secenegin guvenlik acisindan bir sorun cikarip cikarmayacagindan emin degilim.</p>

<p>Diyelim bir veri akisiniz var ve karsi tarafa gondermeden once sifrelemek istiyorsunuz. Bu islemi de yazida bolca ornekledigimiz aes-256-ctr -blok gibi gozuken stream cipher :)- ile yapmaya karar verdiniz. -bufsize secenegi OpenSSLâ€™in gerekli islemi gerceklestirmeden once ne kadar veriyi almasi gerektigini soyluyor. Yani kullandiginiz sifreden bagimsiz olarak OpenSSLâ€™e gelen veriyle alakali bir secenek -bufsize. Asagidakinden daha uygun bir senaryo yaratamadim ne yazik ki ornek icin, eger akliniza gelen daha anlasilir bir ornek varsa eklemenizi rica ederim.</p>

<script src="https://gist.github.com/cagriemer/125de369ea38d08015ef.js"></script>

<p>netcatâ€™e benim icin 10001 numarali portu dinlemesini soyledim. Bu porttan gelen veri akisi OpenSSL ile desifre edilecek ve ardindan mplayerâ€™a gonderilecek. Bu istemci komutumuz. Baska bir terminal penceresinde sunucu komutunu girelim.</p>

<script src="https://gist.github.com/cagriemer/dd98b8cef5e396e7cc93.js"></script>

<p>Elimde bulunan 1.2GB boyutunda final2.avi isimli videoyu aes-256-ctr ile sifreleyip netcat yardimiyla bu sifrelenmis akisi localhosttaki 10001 numarali porta yolla diyorum. Burada -bufsize 350 milyon byte olarak verildi ki arada gecen sure hissedilebilir olsun. Yani OpenSSL 350M byte veri alana kadar bekliyor ardindan islemi yapiyor. Benim sistemimde mplayerâ€™in baslamasi bu sartlar altinda yaklasik 4 saniye suruyor. Cunku OpenSSL bufferâ€™inin dolmasini bekliyor. Eger 350 milyon yerine 350 bin kullanirsam mplayer sunucu komutunu calistirdigim anda ekrana geliyor yani OpenSSL bufferâ€™ini zaten almis ve islemi gerceklestirmis oluyor. Simdi normalde bunu aslinda tam tersi icin kullanirsiniz. Yani ne kadar az bufsize verirseniz o kadar puruzsuz kesintisiz bir akisiniz olacaktir. Ote yandan bufsize degeri ne kadar kuculurse CPUâ€™ya binen yuk de o oranda artacaktir. O yuzden veri akisinin kesintisizligi ve CPU yuku arasindaki optimum deger bulunmalidir eger boyle bir is yapacaksaniz. Uc bir ornek oldu ama -bufsizeâ€™in ne is yaptigini iyi acikladi saniyorum.</p>

<p>Deginmedigimiz bir tek -non-fips-allow kaldi. Bu da FIPS versiyonu kurulmussa eger, standartta olmayan sifre turlerinin kullanilabilmesini sagliyor.</p>

<p>OpenSSLâ€™in ufak bir parcasi olan enc iste burada anlatildigi kadar kullanmasi kolay ve guclu bir uygulama. Ne yazik ki belge bulmakta sikinti yasandigi icin son kullanici arasinda cok yayginlasmis degil. Bu yaziyla sifreleme ve desifreleme islemlerinin aslinda ne kadar kolay yapilabilecegini gostermeye calistim. Bir yandan da enc icin yalandan man sayfasi olmus oldu. Umarim birilerinin isine yarar bir gun.</p>]]></content:encoded></item><item><title><![CDATA[AS112 Projesi]]></title><description><![CDATA[<p>Kisa bir yazi olacak. Ilginc olmasini umuyorum.</p>

<p>Gunumuzde neredeyse hemen hemen her â€œteknolojikâ€ cihaz icinde bulundugu agda DNS istekleri yapiyor. Bu nedenle kimi zaman yanlis yapilandirma kimi zaman da seytani amaclar dolayisiyla, genel dolasima acik olmayan IP adreslerine ait PTR sorgulari bazen yerel aglardan cikip/<em>kacip</em> kok sunuculara kadar</p>]]></description><link>http://blog.cagriemer.net/as112-projesi/</link><guid isPermaLink="false">3d98cae1-10e1-4864-b7a5-09cdd8c2dc17</guid><category><![CDATA[gezegen]]></category><category><![CDATA[DNS]]></category><dc:creator><![CDATA[Cagri Emer]]></dc:creator><pubDate>Thu, 29 Aug 2013 17:48:07 GMT</pubDate><content:encoded><![CDATA[<p>Kisa bir yazi olacak. Ilginc olmasini umuyorum.</p>

<p>Gunumuzde neredeyse hemen hemen her â€œteknolojikâ€ cihaz icinde bulundugu agda DNS istekleri yapiyor. Bu nedenle kimi zaman yanlis yapilandirma kimi zaman da seytani amaclar dolayisiyla, genel dolasima acik olmayan IP adreslerine ait PTR sorgulari bazen yerel aglardan cikip/<em>kacip</em> kok sunuculara kadar gidiyor. Iste AS112[1] projesi adini kendisine atanmis â€œAutonomous System Numberâ€dan[2][3] alan ve amaci kok sunuculara gelmemesi gerektigi halde gelen PTR sorgularinin neden oldugu yuku azaltmak olan bir proje.</p>

<p>Bu noktada daha once denk gelmemisler icin PTR kaydi nedir, AS numarasi nedir kisa bir tanim yapmakta fayda var diye dusunuyorum. PTR, â€œdomain name pointerâ€ obegindeki isaretci manasina gelen â€œpointerâ€ kelimesinin kisaltmasi. Cogu zaman sadece ve sadece bir IP adresinin hangi alan adina isaret ettiginin ogrenilmesi icin kullanilsa da aslinda konfigurasyon gerektirmeyen ag kurulumlarinda da (DNS Service Discovery, zeroconf) onemli bir rolu var. Ozet bilgi vermek amaci guduldugunden simdilik ikinci kisimi bir kenara birakabiliriz. Basitce yaptigi is 10.0.0.4â€™teki bilgisayarin adi ne gibi sorulara cevap vermek. AS numarasi ise internetin neredeyse belkemigi diyebilecegimiz bir kavram. IANA tarafindan bolgesel kayit otoritelerine (Ornegin Avrupaâ€™da RIPE) dagitilan bu numara BGP adi verilen protokolde hangi IP adresinin hangi numara tarafindan anons edildiginin belirlenmesinde kullaniliyor. Yani bir nevi IP adreslerinin IP adresi. Analoji ne kadar dogru oldu pek emin degilim gerci. Kisaca tanimlarimizi yaptigimiza gore AS112 projesine donelim.</p>

<p>En bilinenleri RFC 1918[4] ile tanimlanmis olmak uzere, genel dolasima acik olmayan IP adresleri vardir. Bu adresler yerel aglarda, multicast yapisinda, gelecekteki kullanimlar icin ve dokumantasyon amaciyla ayrilmis IP adresleridir. Bu IP adreslerinin coguna ait PTR kayitlari ya tanimsiz ya da sorguyu yapan agdaki cihaz icin gecersizdir. Dolayisiyla PTR kayitlarinin sorgulanmasi bu istekleri yanitlayan sunuculara ekstra bir yuk getirmektedir. RIPE orneginde 2000-3000 sorgu/saniye[5], IANAâ€™da ise 3000-4000 sorgu/saniye[6] olan bu yukten kurtulmak icin AS112 projesi ortaya cikmistir. RFC 6304[7] ile destek vermek isteyenlerin neler yapmalari gerektiginin ogrenilebilecegi bu proje 2012 verilerine gore[8] 72 uc noktadan olusmaktadir.</p>

<p>[1] <a href="https://www.as112.net/">https://www.as112.net/</a> <br>
 [2] <a href="http://as.robtex.com/as112.html#asinfo">http://as.robtex.com/as112.html#asinfo</a> <br>
 [3] <a href="http://en.wikipedia.org/wiki/Autonomous">http://en.wikipedia.org/wiki/Autonomous</a><em>System</em>(Internet)\ <br>
 [4] <a href="https://tools.ietf.org/html/rfc1918">https://tools.ietf.org/html/rfc1918</a> <br>
 [5] <a href="http://www.ripe.net/data-tools/dns/as112/about">http://www.ripe.net/data-tools/dns/as112/about</a> <br>
 [6] <a href="http://dns.icann.org/cgi-bin/dsc-grapher.pl?plot=bynode&amp;server=as112">http://dns.icann.org/cgi-bin/dsc-grapher.pl?plot=bynode&amp;server=as112</a> <br>
 [7] <a href="http://tools.ietf.org/html/rfc6304">http://tools.ietf.org/html/rfc6304</a> <br>
 [8] <a href="https://www.as112.net/2012-survey.html">https://www.as112.net/2012-survey.html</a></p>]]></content:encoded></item><item><title><![CDATA[Profesyonel Paranoya]]></title><description><![CDATA[<p>Lavabit* belirsiz bir sureligine kapatildi.[1] Hushmail*[2] simdilik Kanada sinirlarinda oldugundan ve gerekirse mahkeme emriyle anahtar ciftlerinizi sifreleyen parolanizi saklayabildiginden hizmet vermeye devam ediyor. Onun da akibeti bence belirsiz.</p>

<p>Ben kriptografi gurusu degilim, kimsenin de boyle bir unvanin hakkini verebilecegini sanmiyorum. O yuzden bu kisa yazida guncel kimi olaylardan</p>]]></description><link>http://blog.cagriemer.net/profesyonel-paranoya/</link><guid isPermaLink="false">ec7f558f-0afe-4b69-add0-0d90655f67f4</guid><category><![CDATA[gezegen]]></category><dc:creator><![CDATA[Cagri Emer]]></dc:creator><pubDate>Fri, 09 Aug 2013 05:35:23 GMT</pubDate><content:encoded><![CDATA[<p>Lavabit* belirsiz bir sureligine kapatildi.[1] Hushmail*[2] simdilik Kanada sinirlarinda oldugundan ve gerekirse mahkeme emriyle anahtar ciftlerinizi sifreleyen parolanizi saklayabildiginden hizmet vermeye devam ediyor. Onun da akibeti bence belirsiz.</p>

<p>Ben kriptografi gurusu degilim, kimsenin de boyle bir unvanin hakkini verebilecegini sanmiyorum. O yuzden bu kisa yazida guncel kimi olaylardan ogrendiklerimizle ne yapmaya baslayabiliriz kendi penceremden, bilgimin yettigi kadariyla aktarmaya calisacagim. Yanlisim olursa, simdiden, bana yanlislarimi gostereceginiz icin tesekkur ederim. Amacim konu uzerinde biraz daha dusunulmesini saglamak. Hatta kimbilir belki birkac istekli e-posta grubu bile kurabilir.</p>

<p>Google ya da Skype ya da herhangi bir sirket, istihbarat ajanslarinin sunucularimiza dogrudan erisimi yok veya uygulamamiz uzerinden gecen trafigi bu ajanslarin kolayca dinleyebilecegi forma donusturen degisiklikler yapmayacagiz dediginde bu soylediklerine ne kadar guvenebiliyoruz? Herkesin yalan soyledigi, hatta avukatlar alinmasin ama kullanici sozlesmeleri ve bilgilendirmelerinin olasi bir yargilanma durumunda mahkemece kabul edilebilir yalanlari yazma sanati oldugu goz onunde bulunduruldugunda ben bu aciklamalarin hicbirine guvenemiyorum. Evet, son birkac yildir cogu sirket yetersiz de olsa seffaflik raporlari aciklamaya ve kendilerine yapilan hukuki istekleri kamuyla paylasmaya basladi. EFF (Electronic Frontier Foundation â€“ Turkceâ€™ye kazandirilmis bir adi var mi bilmiyorum ama Elektronik Gelecek Vakfi desek olur herhalde. Dijital haklar alaninda faaliyet gosteriyor.) ise isi bir adim daha ileri goturup devletin seffafligiyla ilgili aydinlatici yayinlar yapiyor bir suredir.[3] Fakat bu yeterli degil. A ya da B sirketine gelene kadar trafik hangi kanallardan nasil geciyor bunlari bilmiyoruz.[4] Ya da mesela Verizon orneginde[5] oldugu gibi tek bir istek ile milyonlarca kullanici bilgisi talep edilebildiginde yapilan isteklerin sayisi da anlamsizlasmaya basliyor. Bu da basitce hicbir sirketin sundugu hizmete guvenememeniz yani paranoya anlamina geliyor.</p>

<p>Sadece kriptografi bir cozum mu? Elbette tek basina kriptografi yeterli degil. Bu biraz sadece alicisinin gormesi gereken seyi naylon torba icine koyup torbanin agzina asma kilit takmaya benziyor. Bilgiyi ele gecirmek isteyen kisi asma kilitle ugrasmadan, bicakla torbayi kesiyor. Dolayisiyla sistemin ya da hadi moda adiyla soyleyeyim yazilim hizmetinin (SaaS, software as a service) yaratim surecinde mumkun oldukca cok guvenlik tehdidi dusunulerek yapilandirilmasi, farkli uzmanliklardan insanlarin gorusleri alinarak hayata gecirilmesi gerekiyor. Sifir bilgi (zero knowledge) politikasiyla matematikten hukuga, kuantum fiziginden islemci tasarimina ve akla gelebilecek bir suru alana ait uzmanliklarin bir araya gelip, Turkiyeâ€™de henuz pek bulunmayan risk sermayesi yatirimcilarinin fonlayabilecegi kucuk sirketler icin, herkese acik, denetlenebilen ve mumkunse prototipleri olan bilgi birikiminin (know how) olusmasina katkida bulunmasi gerekiyor.</p>

<p>Pratik bir soruyla yaziyi tamamlayayim. Diyelim sirketiniz sifir bilgi politikasiyla kullanicilara gizlilik imkani taniyan bir e-posta hizmeti vermek istiyor. Sunucularinizi nasil, nerelerde kurardiniz? Kimlik yonetimini ne sekilde yapardiniz? Kriptografik tercihleriniz ne yonde ve nasil olurdu? Hangi acik standartlari kullanir ve denetleme mekanizmanizi ne sekilde yapilandirirdiniz?</p>

<ul>
<li>Lavabit ve Hushmail genel anahtarli asimetrik sifreleme destegi veren eposta saglayicilari. Edward Snowdenâ€™in Lavabit kullandigi biliniyor.</li>
</ul>

<p>[1] <a href="http://www.lavabit.com">http://www.lavabit.com</a> <br>
 [2] <a href="http://www.hushmail.com">http://www.hushmail.com</a> <br>
 [3] <a href="https://www.eff.org/issues/transparency">https://www.eff.org/issues/transparency</a> <br>
 [4] <a href="http://fabiusmaximus.com/2013/06/11/nsa-surveillance-51264/">http://fabiusmaximus.com/2013/06/11/nsa-surveillance-51264/</a> <br>
 [5] <a href="http://arstechnica.com/tech-policy/2013/06/top-secret-doc-shows-nsa-demands-verizon-hand-over-millions-of-phone-records-daily/">http://arstechnica.com/tech-policy/2013/06/top-secret-doc-shows-nsa-demands-verizon-hand-over-millions-of-phone-records-daily/</a></p>]]></content:encoded></item><item><title><![CDATA[BIND, IPv6 ve DNSSEC]]></title><description><![CDATA[<p>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</p>]]></description><link>http://blog.cagriemer.net/bind-ipv6-ve-dnssec/</link><guid isPermaLink="false">72f816bd-776c-47a8-9e66-c2b9eabaf282</guid><category><![CDATA[Authoritative]]></category><category><![CDATA[BIND]]></category><category><![CDATA[gezegen]]></category><category><![CDATA[Ubuntu]]></category><category><![CDATA[Tunnelbroker]]></category><category><![CDATA[Sunucu]]></category><category><![CDATA[Slave]]></category><category><![CDATA[Master]]></category><category><![CDATA[IPv6]]></category><category><![CDATA[DNSSEC]]></category><category><![CDATA[DNS Sunucu]]></category><category><![CDATA[DNS]]></category><category><![CDATA[CentOS]]></category><dc:creator><![CDATA[Cagri Emer]]></dc:creator><pubDate>Thu, 23 May 2013 18:49:00 GMT</pubDate><content:encoded><![CDATA[<p>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)</p>

<p>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.</p>

<p>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.</p>

<p>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 <br>
 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.</p>

<pre><code>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
</code></pre>

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

<pre><code>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  
</code></pre>

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

<pre><code>NETWORKING_IPV6=yes  
IPV6_DEFAULTDEV=he-ipv6  
IPV6_DEFAULTGW=2001:470:1f14:efa::1  
</code></pre>

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

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

<p>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;</p>

<pre><code>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  
</code></pre>

<p>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.</p>

<p>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.</p>

<p><code>dig @a.gtld-servers.net dnssecenabled.net NS</code></p>

<p>Eger asagidakine benzer bir cevap aliyorsak, yapilandirmamizda bir sorun yok demektir.</p>

<pre><code>; &gt; DiG 9.9.2-P1 &gt; @a.gtld-servers.net dnssecenabled.net NS
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;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
</code></pre>

<p>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.</p>

<pre><code>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  
</code></pre>

<p>Ubuntu icin ise basliyoruz.</p>

<p><code>sudo apt-get install bind9</code></p>

<p>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.</p>

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

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

<pre><code>;
; 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.  
</code></pre>

<p>BIND servisini yeniden baslattigimizda master sunucumuz hazir olacak.</p>

<p><code>service bind9 restart</code></p>

<p>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.</p>

<p><code>sudo yum install bind bind-utils</code></p>

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

<p>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.</p>

<pre><code>rndc-confgen -a -r /dev/urandom  
service named restart  
</code></pre>

<p>Yerelimizden <code>dig @ns2.dnssecenabled.net google.com A</code> 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.</p>

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

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

<p>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 :).</p>

<p>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.</p>

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

<p>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</p>

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

server 198.211.120.12 {  
    keys { "ns1-to-ns2." ;} ;
};
</code></pre>

<p>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.</p>

<p><code>client 198.199.111.195#39669: received notify for zone 'dnssecenabled.net': TSIG 'ns1-to-ns2'</code></p>

<p>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.</p>

<p>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.</p>

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

<p>-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.</p>

<p><code>dnssec-keygen -r /dev/urandom -a 8 -b 2048 dnssecenabled.net</code></p>

<p>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.</p>

<p>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.</p>

<p><code>dnssec-dsfromkey Kdnssecenabled.net.+008+01207</code></p>

<p>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.</p>

<pre><code>dnssecenabled.net. IN DS 1207 8 1 597A5CB9F0...  
dnssecenabled.net. IN DS 1207 8 2 9030FF4BF3...  
</code></pre>

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

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

<p>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.</p>

<p>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.</p>

<p>Asagida yeni olusturdugumuz alan adinin DNSSEC testine ait goruntuyu paylasiyorum.</p>

<p><a href="https://blog.cagriemer.net/wp-content/uploads/2013/05/dnssecenabled.net-2013-05-23-15-11-05.png"><img src="https://blog.cagriemer.net/wp-content/uploads/2013/05/dnssecenabled.net-2013-05-23-15-11-05-405x1024.png" alt="dnssecenabled.net-2013-05-23-15-11-05" title=""></a></p>

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

<p>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 :).</p>

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

<p>[1] www.hover.com</p>

<p>[2] <a href="http://www.icann.org/en/news/in-focus/dnssec/deployment">http://www.icann.org/en/news/in-focus/dnssec/deployment</a></p>]]></content:encoded></item><item><title><![CDATA[DNSSEC]]></title><description><![CDATA[<p>Ana basliga â€œnasilâ€ sozcugunu koyacaktim fakat yazi, ortalama bir nasil yazisindan biraz daha derine indi. Dolayisiyla okuyacaklarin bunu goz onunde bulundurmasinda fayda var.</p>

<p><strong>Neden DNSSEC?</strong> <br>
 DNSSEC nasil yazisi okumaya gelmis insanlara â€œDNS nedir, nicin onemlidir?â€ anlatmaya gerek olmadigindan DNSSEC standardinin gelistirilmesine onayak olan ihtiyac ya da ihtiyaclar</p>]]></description><link>http://blog.cagriemer.net/dnssec/</link><guid isPermaLink="false">3f3934ef-ac4f-4565-8181-2977060ab6a5</guid><category><![CDATA[gezegen]]></category><category><![CDATA[SSHFP]]></category><category><![CDATA[PowerDNS]]></category><category><![CDATA[DNSSEC]]></category><category><![CDATA[.tr]]></category><dc:creator><![CDATA[Cagri Emer]]></dc:creator><pubDate>Tue, 21 May 2013 14:42:34 GMT</pubDate><content:encoded><![CDATA[<p>Ana basliga â€œnasilâ€ sozcugunu koyacaktim fakat yazi, ortalama bir nasil yazisindan biraz daha derine indi. Dolayisiyla okuyacaklarin bunu goz onunde bulundurmasinda fayda var.</p>

<p><strong>Neden DNSSEC?</strong> <br>
 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.</p>

<p>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.</p>

<p>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 <br>
 giriyor. Asimetrik sifreleme yapilarak genel anahtarlarla bir guven zinciri olusturuluyor.</p>

<p>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.</p>

<p><strong>DNSSEC Kayit Turleri</strong> <br>
 DNSâ€™i yeniden icat etmektense DNSSEC varolan DNS uzerine eklenti olarak dusunulmustur. Dolayisiyla beraberinde birkac yeni kayit turu getirir.</p>

<p>-DNSKEY Kaydi <br>
 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.</p>

<p>a) Key Signing Keys (KSK-Anahtar imzalama anahtarlari) <br>
 b) Zone Signing Keys (ZSK-Alan imzalama anahtarlari)</p>

<p>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.</p>

<pre><code>dig paypal.com DNSKEY&lt;br&gt;&lt;/br&gt;  
;; ANSWER SECTION:&lt;br&gt;&lt;/br&gt;
paypal.com. 503 IN DNSKEY 256 3 5 AwEAAc/7r7w6qEg59vy...&lt;br&gt;&lt;/br&gt;  
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.
</code></pre>

<p>dig paypal.com DS<br><br> <br>
;; ANSWER SECTION:<br><br>
paypal.com. 8698 IN DS 21037 5 2 0DF17B28554954D819E...```</p>

<p>21037 Anahtar Etiketi oluyor ve bir DNS alani icin essiz olmasi gerekiyor <br>
 5 RSA/SHA1 Algoritmasi <br>
 2 Son alanda gozuken hashâ€™i hesaplamak icin kullanilan algoritma, SHA256</p>

<p>-RRSIG Kaydi <br>
 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.</p>

<pre><code>dig +dnssec paypal.com MX&lt;br&gt;&lt;/br&gt;  
;; ANSWER SECTION:&lt;br&gt;&lt;/br&gt;
paypal.com. 185 IN MX 10 gort.ebay.com.&lt;br&gt;&lt;/br&gt;  
paypal.com. 185 IN MX 10 lore.ebay.com.&lt;br&gt;&lt;/br&gt;  
paypal.com. 185 IN MX 10 data.ebay.com.&lt;br&gt;&lt;/br&gt;  
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.
</code></pre>

<p>paypal.com. 59 IN NSEC <em>dmarc.paypal.com. A NS SOA MX TXT RRSIG NSEC DNSKEY<br><br> <br>
_sip.</em>tls.paypal.com. 59 IN NSEC accounts.paypal.com. SRV RRSIG NSEC```</p>

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

<pre><code>dig accu.paypal.com NSEC&lt;br&gt;&lt;/br&gt;  
paypal.com. 59 IN NSEC _dmarc.paypal.com. A NS SOA MX TXT RRSIG NSEC DNSKEY&lt;br&gt;&lt;/br&gt;  
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.
</code></pre>

<p>dig verisign.com NSEC3<br><br> <br>
LVNT2DK6E38UB5HG27E7MCINT8M21C9P.verisign.com. 3599 IN NSEC3 1 0 8 4C44934802D3 LVP1CAGP8QAQJ5OTUH00PN5VDSSARVDE A NS SOA MX TXT RRSIG DNSKEY NSEC3PARAM```</p>

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

<p>-DLV Kaydi <br>
 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 <a href="https://dlv.isc.org/">https://dlv.isc.org/</a> 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.</p>

<p>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.</p>

<p><strong>PowerDNS+MySQL ile Ana isim sunucunun DNSSEC icin yapilandirilmasi</strong></p>

<p>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 <br>
 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 <br>
 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.</p>

<pre><code>dig +dnssec paypal.com a&lt;br&gt;&lt;/br&gt;  
; &gt; DiG 9.9.2-P1 &gt; +dnssec paypal.com a&lt;br&gt;&lt;/br&gt;
;; global options: +cmd&lt;br&gt;&lt;/br&gt;
;; Got answer:&lt;br&gt;&lt;/br&gt;
;; -&gt;&gt;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.
</code></pre>

<p>CREATE DATABASE mydnsdata;<br><br> <br>
GRANT ALL PRIVILEGES ON mydnsdata.* TO 'mydnsadmin'@'localhost' identified by 'sifre';<br><br> <br>
FLUSH PRIVILEGES;<br><br> <br>
USE mydnsdata;```</p>

<p>Gerekli tablolari olusturalim.[4] Bu kisimi oldugu gibi kopyalayip yapistirabilirsiniz.</p>

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

<p>pdnssec secure-zone test.name.tr<br><br> <br>
pdnssec set-nsec3 test.name.tr<br><br> <br>
pdnssec rectify-zone test.name.tr```</p>

<p>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.</p>

<p><code>dnssec show-zone test.name.tr</code></p>

<p>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.</p>

<p>.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.</p>

<p><a href="https://blog.cagriemer.net/wp-content/uploads/2013/05/dnssec-test1.png"><img src="https://blog.cagriemer.net/wp-content/uploads/2013/05/dnssec-test1-675x1024.png" alt="dnssec-test" title=""></a></p>

<p>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.</p>

<p>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.</p>

<p>[1] <a href="http://tools.ietf.org/html/rfc4034">http://tools.ietf.org/html/rfc4034</a> <br>
 [2] <a href="http://googleonlinesecurity.blogspot.com/2013/03/google-public-dns-now-supports-dnssec.html">http://googleonlinesecurity.blogspot.com/2013/03/google-public-dns-now-supports-dnssec.html</a> <br>
 [3] <a href="http://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xml">http://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xml</a> <br>
 [4] <a href="http://doc.powerdns.com/html/generic-mypgsql-backends.html">http://doc.powerdns.com/html/generic-mypgsql-backends.html</a> <br>
 [5] <a href="https://www.poweradmin.org/trac/">https://www.poweradmin.org/trac/</a> <br>
 [6] <a href="https://code.google.com/p/powerdns-webinterface/">https://code.google.com/p/powerdns-webinterface/</a></p>]]></content:encoded></item><item><title><![CDATA[Postfix, Dovecot ve MySQL ile Sanal Kullanici ve Alan Adlari icin E-posta yapilandirilmasi]]></title><description><![CDATA[<p>Yazi biraz uzun, dolayisiyla gezegeni webâ€™den takip edenlerden ozur diliyorum.</p>

<p>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</p>]]></description><link>http://blog.cagriemer.net/postfix-dovecot-ve-mysql-ile-sanal-kullanici-ve-alan-adlari-icin-e-posta-yapilandirilmasi/</link><guid isPermaLink="false">6a3963e5-ae56-4f5f-9f09-323a1e1229d5</guid><category><![CDATA[gezegen]]></category><category><![CDATA[Ubuntu 12.04]]></category><category><![CDATA[SquirrelMail]]></category><category><![CDATA[Sanal E-posta]]></category><category><![CDATA[Postfix]]></category><category><![CDATA[MySQL]]></category><category><![CDATA[E-posta]]></category><category><![CDATA[Dovecot]]></category><dc:creator><![CDATA[Cagri Emer]]></dc:creator><pubDate>Mon, 20 May 2013 07:45:28 GMT</pubDate><content:encoded><![CDATA[<p>Yazi biraz uzun, dolayisiyla gezegeni webâ€™den takip edenlerden ozur diliyorum.</p>

<p>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.</p>

<p><a href="https://blog.cagriemer.net/wp-content/uploads/2013/05/mail.png"><img src="https://blog.cagriemer.net/wp-content/uploads/2013/05/mail-300x242.png" alt="mail" title=""></a></p>

<p>Bu gorselde bulunan sayilara karsilik gelen istek ve yanitlar ise su sekilde;</p>

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

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

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

<p>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.</p>

<p><strong>Host adinin ayarlanmasi</strong> <br>
 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.</p>

<pre><code>nano /etc/hosts&lt;br&gt;&lt;/br&gt;  
127.0.0.1 localhost konusmalar.tk&lt;br&gt;&lt;/br&gt;  
198.199.112.50 konusmalar.tk neith&lt;br&gt;&lt;/br&gt;  
echo neith &gt; /etc/hostname&lt;br&gt;&lt;/br&gt;  
hostname -F /etc/hostname```

Bu asamada hostname ve hostname -f ciktilari sirayla su sekilde donmeli.  
</code></pre>

<p>hostname<br><br> <br>
neith<br><br> <br>
hostname -f<br><br> <br>
konusmalar.tk```</p>

<p><strong>DNS kayitlarinin eklenmesi</strong> <br>
 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.</p>

<p><strong>Gerekli paketlerin kurulmasi</strong></p>

<p><code>sudo apt-get install mysql-server postfix-mysql dovecot-mysql dovecot-lmptd dovecot-imapd dovecot-pop3d</code></p>

<p>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.</p>

<p>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.</p>

<p><strong>MySQL yapilandirmasi</strong></p>

<p>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, sanal<em>alanadlari, sanal</em>kullanicilar 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.</p>

<pre><code>mysql -u root -p&lt;br&gt;&lt;/br&gt;  
&gt;&gt; CREATE DATABASE sanalposta;&lt;br&gt;&lt;/br&gt;
&gt;&gt; GRANT SELECT ON sanalposta.* TO 'sanalpostayoneticisi'@'127.0.0.1' IDENTIFIED BY '12345';&lt;br&gt;&lt;/br&gt;
&gt;&gt; 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.
</code></pre>

<blockquote>
  <blockquote>
    <p>CREATE TABLE <code>sanal_alanadlari</code> (<br><br>
    <code>id</code> int(5) UNSIGNED ZEROFILL NOT NULL auto_increment,<br><br>
    <code>name</code> varchar(64) NOT NULL,<br><br>
    PRIMARY KEY (<code>id</code>)<br><br> <br>
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;```</p>
  </blockquote>
</blockquote>

<p>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.</p>

<pre><code>&gt;&gt; CREATE TABLE `sanal_kullanicilar` (&lt;br&gt;&lt;/br&gt;
`id` int(5) UNSIGNED ZEROFILL NOT NULL auto_increment,&lt;br&gt;&lt;/br&gt;
`domain_id` int(5) UNSIGNED ZEROFILL NOT NULL,&lt;br&gt;&lt;/br&gt;
`password` varchar(106) NOT NULL,&lt;br&gt;&lt;/br&gt;
`email` varchar(100) NOT NULL,&lt;br&gt;&lt;/br&gt;
PRIMARY KEY (`id`),&lt;br&gt;&lt;/br&gt;  
UNIQUE KEY `email` (`email`),&lt;br&gt;&lt;/br&gt;  
FOREIGN KEY (domain_id) REFERENCES sanal_alanadlari(id) ON DELETE CASCADE&lt;br&gt;&lt;/br&gt;  
) 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.
</code></pre>

<blockquote>
  <blockquote>
    <p>CREATE TABLE <code>sanal_takmaadlar</code> (<br><br>
    <code>id</code> int(5) UNSIGNED ZEROFILL NOT NULL auto<em>increment,<br><br>
    <code>domain_id</code> int(5) UNSIGNED ZEROFILL NOT NULL,<br><br>
    <code>source</code> varchar(100) NOT NULL,<br><br>
    <code>destination</code> varchar(100) NOT NULL,<br><br>
    PRIMARY KEY (<code>id</code>),<br><br> <br>
    FOREIGN KEY (domain</em>id) REFERENCES sanal_alanadlari(id) ON DELETE CASCADE<br><br> <br>
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;```</p>
  </blockquote>
</blockquote>

<p>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.</p>

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

&gt;&gt; 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.
</code></pre>

<blockquote>
  <blockquote>
    <p>INSERT INTO <code>sanalposta</code>.<code>sanal_takmaadlar</code><br><br>
    (<code>id</code>, <code>domain_id</code>, <code>source</code>, <code>destination</code>)<br><br>
    VALUES<br><br> <br>
    ('1', '1', 'root@konusmalar.tk', 'kullanici1@konusmalar.tk');```</p>
  </blockquote>
</blockquote>

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

<pre><code>&gt;&gt; USE sanalposta;&lt;br&gt;&lt;/br&gt;
&gt;&gt; SHOW TABLES;```

+â€”â€”â€”â€”â€”â€”â€“+  
 | Tables_in_anlatim |  
 +â€”â€”â€”â€”â€”â€”â€“+  
 | sanal_alanadlari |  
 | sanal_kullanicilar |  
 | sanal_takmaadlar |  
 +â€”â€”â€”â€”â€”â€”â€“+  
 3 rows in set (0.00 sec)

&gt;&gt; SELECT * FROM sanal_alanadlari;

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

&gt;&gt; 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.

`&gt;&gt; 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.
</code></pre>

<p>smtpd<em>banner = $myhostname ESMTP $mail</em>name (Ubuntu)<br><br> <br>
biff = no<br><br> <br>
append<em>dot</em>mydomain = no<br><br> <br>
readme<em>directory = no<br><br> <br>
smtpd</em>tls<em>cert</em>file=/etc/ssl/certs/dovecot.pem<br><br> <br>
smtpd<em>tls</em>key<em>file=/etc/ssl/private/dovecot.pem<br><br> <br>
smtpd</em>tls<em>security</em>level=may<br><br> <br>
smtpd<em>tls</em>auth<em>only=yes<br><br> <br>
smtpd</em>sasl<em>type = dovecot<br><br> <br>
smtpd</em>sasl<em>path = private/auth<br><br> <br>
smtpd</em>sasl<em>auth</em>enable = yes<br><br> <br>
smtpd<em>recipient</em>restrictions = permit<em>sasl</em>authenticated, permit<em>mynetworks, reject</em>unauth<em>destination<br><br> <br>
myhostname = konusmalar.tk<br><br> <br>
alias</em>maps = hash:/etc/aliases<br><br> <br>
alias<em>database = hash:/etc/aliases<br><br> <br>
myorigin = /etc/mailname<br><br> <br>
mydestination = localhost<br><br> <br>
relayhost =<br><br> <br>
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 198.199.112.50<br><br> <br>
mailbox</em>size<em>limit = 0<br><br> <br>
recipient</em>delimiter = +<br><br> <br>
inet<em>interfaces = all<br><br> <br>
virtual</em>transport = lmtp:unix:private/dovecot-lmtp<br><br> <br>
virtual<em>mailbox</em>domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf<br><br> <br>
virtual<em>mailbox</em>maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf<br><br> <br>
virtual<em>alias</em>maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf```</p>

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

<p>smtpd<em>banner = $myhostname ESMTP $mail</em>name (Ubuntu)</p>

<p>Herhangi bir bilgisayardan asagidaki komutu verirseniz</p>

<p><code>telnet konusmalar.tk 587</code></p>

<p>size suna benzer bir cikti donecektir.</p>

<pre><code>Trying 198.199.112.50...&lt;br&gt;&lt;/br&gt;  
Connected to konusmalar.tk.&lt;br&gt;&lt;/br&gt;  
Escape character is '^]'.&lt;br&gt;&lt;/br&gt;  
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.
</code></pre>

<p>Trying 198.199.112.50...<br><br> <br>
Connected to konusmalar.tk.<br><br> <br>
Escape character is '^]'.<br><br> <br>
220 konusmalar.tk Linux cok guzel, gelsenize!```</p>

<p>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.</p>

<p>append<em>dot</em>mydomain 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.</p>

<p>readme_directory derleme, calistirma islemlerini anlatan dosyalarin nerede tutulacagini soyluyor ki hic ihtiyacimiz yok.</p>

<p>smtpd<em>tls</em>cert<em>file=/etc/ssl/certs/dovecot.pem <br>
 smtpd</em>tls<em>key</em>file=/etc/ssl/private/dovecot.pem <br>
 smtpd<em>tls</em>security<em>level=may <br>
 smtpd</em>tls<em>auth</em>only=yes</p>

<p>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. smtpd<em>tls</em>cert<em>file ve smtpd</em>tls<em>key</em>file sertifikanin ve ozel anahtarin nerede tutuldugunu belirtiyor. smtpd<em>tls</em>security<em>level ile iletisimin mumkunse sertifika ile sifrelenmesini istiyoruz. Burada encrypt ile zorunlu tutabilirdik fakat SquirrelMail kurulumu yaptigimizda encrypt biraz basimizi agritabilir. Eger security</em>level icin may dersek smtpd<em>tls</em>auth_only ile giris yapilmasi icin sertifika kullanilmasini zorunlu hale getirebiliriz ki istedigimiz de zaten buydu.</p>

<p>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.</p>

<p>smtpd<em>sasl</em>auth<em>enable = yes <br>
 smtpd</em>sasl<em>type = dovecot <br>
 smtpd</em>sasl_path = private/auth</p>

<p>auth<em>enable ile Postfixâ€™e SASL kullanacagimizi soyledik. SASL icin konusacagi daemonâ€™i da smtpd</em>sasl_typeâ€™a dovecot degerini vererek gosterdik. Dovecot ile konusurken kullanacagi soketin yerini path degiskeniyle verdik. Buraya Dovecotâ€™i yapilandirirken bir daha deginecegiz.</p>

<p>smtpd<em>recipient</em>restrictions = permit<em>sasl</em>authenticated, permit<em>mynetworks, reject</em>unauth_destination</p>

<p>Yukaridaki ayar hangi kullanicilarin posta gonderebilecegini yapilandirmak icin gereken bir ayar. Icinde reject ya da defer tipinden en az bir tane deger olmasi gerekiyor. permit<em>sasl</em>authenticated eger bir kullanici SASL kullarak giris yapmissa posta gondermesine izin verilecegi anlamina geliyor. permit<em>mynetworks mynetworksâ€™te belirtilen agdaki istemcilere posta gonderme izini verildigini soyluyor. reject</em>unauth_destination ile eger posta Postfixâ€™in bildigi bir alana gelmiyor ise reddetmesi gerektigini anlatiyoruz.</p>

<p>myhostname = konusmalar.tk <br>
 alias<em>maps = hash:/etc/aliases <br>
 alias</em>database = hash:/etc/aliases <br>
 myorigin = /etc/mailname <br>
 mydestination = localhost <br>
 relayhost = <br>
 mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 198.199.112.50 <br>
 mailbox<em>size</em>limit = 0 <br>
 recipient<em>delimiter = + <br>
 inet</em>interfaces = all</p>

<p>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.</p>

<p>Gelelim Postfixâ€™in MySQL ile nasil konusacagina.</p>

<p>virtual<em>transport = lmtp:unix:private/dovecot-lmtp <br>
 virtual</em>mailbox<em>domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf <br>
 virtual</em>mailbox<em>maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf <br>
 virtual</em>alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf</p>

<p>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.</p>

<p>virtual<em>mailbox</em>domains kisminda Postfixâ€™in kontrol edecegi alan adlarini MySQLâ€™den nasil alacagini anlatan dosyayi, virtual<em>mailbox</em>mapsâ€™te ise eslesen alanadlari icin kullanicilari nasil bulacagini gosteren dosyayi belirtiyoruz. virtual<em>alias</em>maps 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.</p>

<p>/etc/postfix/mysql-virtual-mailbox-domains.cf dosyasi</p>

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

/etc/postfix/mysql-virtual-mailbox-maps.cf dosyasi
</code></pre>

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

<p>/etc/postfix/mysql-virtual-alias-maps.cf dosyasi</p>

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

Simdi Postfixâ€™i yeniden baslatalim ve bakalim MySQL ile konusabiliyor mu test edelim.
</code></pre>

<p>service postfix restart<br><br> <br>
postmap -q konusmalar.tk mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf<br><br> <br>
postmap -q kullanici1@konusmalar.tk mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf<br><br> <br>
postmap -q root@konusmalar.tk mysql:/etc/postfix/mysql-virtual-alias-maps.cf```</p>

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

<p><strong>Dovecot yapilandirmasi</strong></p>

<p>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.</p>

<p>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.</p>

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

<pre><code>!include_try /usr/share/dovecot/protocols.d/*.protocol&lt;br&gt;&lt;/br&gt;
protocols = imap lmtp&lt;br&gt;&lt;/br&gt;  
dict {&lt;br&gt;&lt;/br&gt;  
#quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext&lt;br&gt;&lt;/br&gt;
#expire = sqlite:/etc/dovecot/dovecot-dict-sql.conf.ext&lt;br&gt;&lt;/br&gt;
}&lt;br&gt;&lt;/br&gt;
!include conf.d/*.conf&lt;br&gt;&lt;/br&gt;
!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.
</code></pre>

<p>mail<em>location = maildir:/var/mail/vhosts/%d/%n<br><br> <br>
mail</em>privileged_group = mail```</p>

<p>mail_locationâ€™da postalarin tutulmasini istedigimiz dizini veriyoruz. %d alanadini %n ise kullanici adini ifade ediyor. Bu dosyayla da isimiz bitti.</p>

<p>Simdi gerekli dizini yaratalim.</p>

<p><code>mkdir -p /var/mail/vohsts/konusmalar.tk</code></p>

<p>Simdi de Dovecotâ€™un dosya sisteminde posta saklamak icin kullanacagi kullanici hesabini olusturalim.</p>

<pre><code>groupadd -g 2000 vmail&lt;br&gt;&lt;/br&gt;  
useradd -g vmail -u 2000 vmail -d /var/mail&lt;br&gt;&lt;/br&gt;  
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.
</code></pre>

<p>disable<em>plaintext</em>auth = yes<br><br> <br>
auth_mechanisms = plain login<br><br> <br>
!include auth-sql.conf.ex```
t</p>

<p>auth-sql.conf.ext dosyasi ile MySQL ile nasil konusacagini anlatacagiz.</p>

<p>/etc/dovecot/conf.d/auth-sql.conf.ext</p>

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

Yukaridaki dosyada belirttigimiz dovecot-sql.conf.ext dosyasinin icerigi ise soyle olacak yorumlardan sonra.
</code></pre>

<p>driver = mysql<br><br> <br>
connect = host=127.0.0.1 dbname=sanalposta user=sanalpostayoneticisi password=12345<br><br> <br>
default<em>pass</em>scheme = SHA512-CRYPT<br><br> <br>
password<em>query = SELECT email as user, password FROM sanal</em>kullanicilar WHERE email='%u';```</p>

<p>Dizin sahipligini duzeltelim.</p>

<pre><code>chown -R vmail:dovecot /etc/dovecot&lt;br&gt;&lt;/br&gt;  
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.
</code></pre>

<p>service imap-login {<br><br> <br>
inet<em>listener imap {<br><br> <br>
port = 0<br><br> <br>
}<br><br>
inet</em>listener imaps {<br><br>  </p>

<h1 id="port993brbr">port = 993<br><br></h1>

<h1 id="sslyesbrbr">ssl = yes<br><br></h1>

<p>}```</p>

<h1 id="numberofconnectionstohandlebeforestartinganewprocesstypically">Number of connections to handle before starting a new process. Typically</h1>

<p># the only useful values are 0 (unlimited) or 1. 1 is more secure, but 0 <br>
 # is faster. <doc wiki="" loginprocess.txt=""> <br>
 #service_count = 1</doc></p>

<h1 id="numberofprocessestoalwayskeepwaitingformoreconnections">Number of processes to always keep waiting for more connections.</h1>

<p>#process<em>min</em>avail = 0</p>

<h1 id="ifyousetservice_count0youprobablyneedtogrowthis">If you set service_count=0, you probably need to grow this.</h1>

<p>#vsz_limit = 64M <br>
 }</p>

<p>service pop3-login { <br>
 inet<em>listener pop3 { <br>
 port = 0 <br>
 } <br>
 inet</em>listener pop3s { <br>
 #port = 995 <br>
 #ssl = yes <br>
 } <br>
 }</p>

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

<h1 id="createinetlisteneronlyifyoucantusetheaboveunixsocket">Create inet listener only if you canâ€™t use the above UNIX socket</h1>

<p>#inet_listener lmtp { <br>
 # Avoid making LMTP visible for the entire internet <br>
 #address = <br>
 #port = <br>
 #} <br>
 }</p>

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

<h1 id="maxnumberofimapprocessesconnections">Max. number of IMAP processes (connections)</h1>

<p>#process_limit = 1024 <br>
 }</p>

<p>service pop3 { <br>
 # Max. number of POP3 processes (connections) <br>
 #process_limit = 1024 <br>
 }</p>

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

<p>unix_listener /var/spool/postfix/private/auth { <br>
 mode = 0666 <br>
 user = postfix <br>
 group = postfix <br>
 }</p>

<p>unix_listener auth-userdb { <br>
 mode = 0600 <br>
 user = vmail <br>
 #group = vmail <br>
 }</p>

<h1 id="postfixsmtpauth">Postfix smtp-auth</h1>

<p>#unix_listener /var/spool/postfix/private/auth { <br>
 # mode = 0666 <br>
 #}</p>

<h1 id="authprocessisrunasthisuser">Auth process is run as this user.</h1>

<p>user = dovecot <br>
 }</p>

<p>service auth-worker { <br>
 # Auth worker process is run as root by default, so that it can access <br>
 # /etc/shadow. If this isnâ€™t necessary, the user should be changed to <br>
 # $default<em>internal</em>user. <br>
 user = vmail <br>
 }</p>

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

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

<pre><code>ssl = required&lt;br&gt;&lt;/br&gt;  
ssl_cert = ssl_key = ```

Bu asama ile posta sunucu yapilandirmamizi tamamladik. Dovecot ve Postfix servislerini yeniden baslatalim.
</code></pre>

<p>service postfix restart<br><br> <br>
start dovecot```</p>

<p>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.</p>

<p>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 smtpd<em>sasl</em>auth<em>enable ve smptd</em>client_restrictions gibi secenekleri kullanabiliyoruz.</p>

<pre><code>submission inet n - - - - smtpd&lt;br&gt;&lt;/br&gt;  
-o syslog_name=postfix/submission&lt;br&gt;&lt;/br&gt;
-o smtpd_sasl_auth_enable=yes&lt;br&gt;&lt;/br&gt;
-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 &gt;&gt;

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.
</code></pre>

<h1 id="2019etcdovecotdovecotconfbrbr">2.0.19: /etc/dovecot/dovecot.conf<br><br></h1>

<h1 id="oslinux32023virtualx86_64ubuntu12042ltsext4brbr">OS: Linux 3.2.0-23-virtual x86_64 Ubuntu 12.04.2 LTS ext4<br><br></h1>

<p>auth<em>mechanisms = plain login<br><br> <br>
mail</em>location = maildir:/var/mail/vhosts/%d/%n<br><br> <br>
mail<em>privileged</em>group = mail<br><br> <br>
passdb {<br><br> <br>
args = /etc/dovecot/dovecot-sql.conf.ext<br><br> <br>
driver = sql<br><br> <br>
}<br><br>
protocols = imap lmtp<br><br> <br>
service auth-worker {<br><br> <br>
user = vmail<br><br> <br>
}<br><br>
service auth {<br><br> <br>
unix<em>listener /var/spool/postfix/private/auth {<br><br> <br>
group = postfix<br><br> <br>
mode = 0666<br><br> <br>
user = postfix<br><br> <br>
}<br><br>
unix</em>listener auth-userdb {<br><br> <br>
mode = 0600<br><br> <br>
user = vmail<br><br> <br>
}<br><br>
user = dovecot<br><br> <br>
}<br><br>
service imap-login {<br><br> <br>
inet<em>listener imap {<br><br> <br>
port = 0<br><br> <br>
}<br><br>
}<br><br>
service lmtp {<br><br> <br>
unix</em>listener /var/spool/postfix/private/dovecot-lmtp {<br><br> <br>
group = postfix<br><br> <br>
mode = 0600<br><br> <br>
user = postfix<br><br> <br>
}<br><br>
}<br><br>
service pop3-login {<br><br> <br>
inet<em>listener pop3 {<br><br> <br>
port = 0<br><br> <br>
}<br><br>
}<br><br>
ssl = required<br><br> <br>
ssl</em>cert = ssl_key = userdb {<br><br> <br>
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n<br><br> <br>
driver = static<br><br> <br>
}<br><br>```</p>

<p>Diyagramin kaynagi ise surada: <a href="https://blog.cagriemer.net/wp-content/uploads/2013/05/posta.dia">https://blog.cagriemer.net/wp-content/uploads/2013/05/posta.dia</a></p>]]></content:encoded></item><item><title><![CDATA[SSH erisimi icin Google Authenticator Destegi]]></title><description><![CDATA[<p>Yakindan Egitim[1] projeleri ilk duyuruldugunda proje tanimlarini okurken kimlik kanitlama araci fikri oldukca hosuma gitmisti. Gecenlerde tekrar kontrol ettigimde YEKK projesinin degerlendirilme sureci sonrasinda devam ettirilmemesine karar verildigini farkettim.[2][3] Google Authenticator ile isimi gorebilir miyim acaba diye bakinirken bu sabah, kodun aslinda ornek bir pam modulu[4]</p>]]></description><link>http://blog.cagriemer.net/ssh-erisimi-icin-google-authenticator-destegi/</link><guid isPermaLink="false">4b6740f0-e90a-4aa2-987a-a34501e64de6</guid><category><![CDATA[gezegen]]></category><dc:creator><![CDATA[Cagri Emer]]></dc:creator><pubDate>Thu, 09 May 2013 07:48:20 GMT</pubDate><content:encoded><![CDATA[<p>Yakindan Egitim[1] projeleri ilk duyuruldugunda proje tanimlarini okurken kimlik kanitlama araci fikri oldukca hosuma gitmisti. Gecenlerde tekrar kontrol ettigimde YEKK projesinin degerlendirilme sureci sonrasinda devam ettirilmemesine karar verildigini farkettim.[2][3] Google Authenticator ile isimi gorebilir miyim acaba diye bakinirken bu sabah, kodun aslinda ornek bir pam modulu[4] oldugunu ogrendim. Gerisi zaten iplik sokugu gibi geldi. Ubuntu makineler icin suradaki[5] betigi yazip 13.04â€™te test ettim. Bagimliliklar saglandigi muddetce de eski surumlerde calisabilecektir. Ornegin 12.04â€™te bir sorun cikarmasini beklemiyorum.</p>

<p>Kabaca anlatmak gerekirse betigin yaptigi isler soyle; Uygulama icin gereken bagimliliklari kontrol ettikten sonra Google Codeâ€™dan kaynak kodu indirip derliyor. Derlemenin ardindan google-authenticator ikiligini calistiriyor ve ev dizinine bir seferlik acil durum sifrelerinin ve gizli anahtarin tutuldugu bir dosya olusturuyor.</p>

<p><a href="https://blog.cagriemer.net/wp-content/uploads/2013/05/1.png"><img src="https://blog.cagriemer.net/wp-content/uploads/2013/05/1-300x139.png" alt="1" title=""></a></p>

<p>Ardindan libqrencode3 sayesinde terminalde, telefonunuzdaki Google Authenticator uygulamasini yapilandirmak icin kullanabileceginiz bir kare kod goruntuluyor. Yine bu asamada bir de cevrimici olarak goruntuleyebilecegiz kare kod baglantisi basiyor. Asagidaki ekran goruntusunun kare kod uzerindeki ilk satirina dikkatlice bakarsaniz gorebilirsiniz.</p>

<p><a href="https://blog.cagriemer.net/wp-content/uploads/2013/05/2.png"><img src="https://blog.cagriemer.net/wp-content/uploads/2013/05/2-257x300.png" alt="2" title=""></a> <br>
 Kare kodâ€™un kalitesi icin ozur dilerim, hata onarmada oldukca basarili oldugu icin iyice bulaniklastirmam gerekti. Bu islem de tamamlandiktan sonra /etc/pam.d/sshd dosyasinin basina su satiri ekliyor.</p>

<p><code>auth required pam_google_authenticator.so</code></p>

<p>Son olarak /etc/ssh/sshd_config dosyasinda su asagidaki degisikligi yapip SSH servisini yeniden baslatiyor.</p>

<p><code>ChallengeResponseAuthentication yes</code></p>

<p><a href="https://blog.cagriemer.net/wp-content/uploads/2013/05/3.png"><img src="https://blog.cagriemer.net/wp-content/uploads/2013/05/3-300x118.png" alt="3" title=""></a></p>

<p>Bu islemden itibaren makineye her SSH erisimi yapmaya calistiginizda once sizden Verification Code dedigi bir seferlik sifreyi girmenizi istiyor. Eger bu sifre dogru ise kullanici sifrenizi girip oturum acabiliyorsunuz. Eger oturum acmak icin sifre yerine genel/ozel anahtar ciftinizi kullaniyorsaniz herhangi bir etkisi olmuyor. Kodun icerisinde de belirttigim uzere eger giris yapamiyorsaniz, sunucunuzun ve Google Authenticator uygulamanizin saatlerinin dogru olduguna emin olmalisiniz.</p>

<p><a href="https://blog.cagriemer.net/wp-content/uploads/2013/05/4.png"><img src="https://blog.cagriemer.net/wp-content/uploads/2013/05/4-300x289.png" alt="4" title=""></a></p>

<p>Betik, yazilabilecek en duzgunu en hizlisi degildir muhtemelen fakat benim bilgim bu kadarini yazmaya yetiyor. Dolayisiyla soyle olursa daha iyi olur ya da burada sunu yapman lazim aslinda gibi onerilerinizi iletirseniz memnun olurum.</p>

<p>[1] <a href="http://yakindanegitim.org">http://yakindanegitim.org</a> <br>
 [2] <a href="http://blog.yakindanegitim.org/2013/05/ara-donem-degerlendirme-sonuclar.html">http://blog.yakindanegitim.org/2013/05/ara-donem-degerlendirme-sonuclar.html</a> <br>
 [3] <a href="https://github.com/YakindanEgitim">https://github.com/YakindanEgitim</a> <br>
 [4] <a href="https://code.google.com/p/google-authenticator/source/browse/#git%2Flibpam">https://code.google.com/p/google-authenticator/source/browse/#git%2Flibpam</a> <br>
 [5] <a href="https://github.com/cagriemer/betikler/blob/master/totpssh.sh">https://github.com/cagriemer/betikler/blob/master/totpssh.sh</a></p>]]></content:encoded></item><item><title><![CDATA[Upstart]]></title><description><![CDATA[<p>Upstart iÅŸletim sisteminin baÅŸlatÄ±lmasÄ± esnasÄ±nda gÃ¶rev ve servislerin baÅŸlatÄ±lmasÄ±nÄ±, kapatÄ±lmasÄ± esnasÄ±nda durdurulmasÄ±nÄ±, bilgisayar Ã§alÄ±ÅŸÄ±rken de kontrol edilmesi iÅŸlevini yerine getiren ve 6.10â€™dan itibaren Ubuntuâ€™da geleneksel init artsÃ¼recinin yerini alan uygulamadÄ±r. AslÄ±nda Ubuntu iÃ§</p>]]></description><link>http://blog.cagriemer.net/upstart/</link><guid isPermaLink="false">e3b8be93-c79b-4ee2-9cb0-c27562b9eacc</guid><category><![CDATA[Init]]></category><category><![CDATA[Ubuntu]]></category><category><![CDATA[Upstart]]></category><category><![CDATA[gezegen]]></category><dc:creator><![CDATA[Cagri Emer]]></dc:creator><pubDate>Sat, 04 May 2013 15:16:45 GMT</pubDate><content:encoded><![CDATA[<p>Upstart iÅŸletim sisteminin baÅŸlatÄ±lmasÄ± esnasÄ±nda gÃ¶rev ve servislerin baÅŸlatÄ±lmasÄ±nÄ±, kapatÄ±lmasÄ± esnasÄ±nda durdurulmasÄ±nÄ±, bilgisayar Ã§alÄ±ÅŸÄ±rken de kontrol edilmesi iÅŸlevini yerine getiren ve 6.10â€™dan itibaren Ubuntuâ€™da geleneksel init artsÃ¼recinin yerini alan uygulamadÄ±r. AslÄ±nda Ubuntu iÃ§in geliÅŸtirilmesine raÄŸmen, init kullanan tÃ¼m Linux daÄŸÄ±tÄ±mlarÄ±nda geleneksel initâ€™in yerini alabilir. Åžu anda bilinen kullanÄ±cÄ±larÄ± arasÄ±nda Ubuntu dÄ±ÅŸÄ±nda Debian, Red Hat, Google Chrome OS ve Maemo gibi daÄŸÄ±tÄ±mlar bulunmaktadÄ±r.</p>

<p>Upstart betiklerinin nasÄ±l yazÄ±lacaÄŸÄ±na geÃ§meden Ã¶nce init ne iÅŸ yapar deÄŸinmek doÄŸru olacaktÄ±r. Ã‡ekirdek tarafÄ±ndan baÅŸlatÄ±lan init, sistemdeki bÃ¼tÃ¼n sÃ¼reÃ§lerin baÅŸlatÄ±lmasÄ± iÅŸlemini yerine getirir. init tarafÄ±ndan yÃ¶netilen tÃ¼m sÃ¼reÃ§ler â€œiÅŸâ€ olarak tanÄ±mlanÄ±r ve /etc/init dizini altÄ±ndaki dosyalarda tutulur. Ubuntudaki init(8)* olay-tabanlÄ± bir artsÃ¼reÃ§tir. Bu da sistem durumundaki herhangi bir deÄŸiÅŸiklikte iÅŸlerin ya da sÃ¼reÃ§lerin otomatik olarak baÅŸlatÄ±lÄ±p durdurulabilmesini saÄŸlar. BaÄŸÄ±mlÄ±lÄ±k-tabanlÄ± init artsÃ¼reÃ§lerinden farklarÄ± bu iÅŸlemleri yapmak iÃ§in baÅŸka iÅŸlerin baÅŸlamasÄ±nÄ± beklememek ve baÄŸÄ±mlÄ±lÄ±k listelerini bir dÃ¶ngÃ¼yle taramamaktÄ±r denebilir.</p>

<p>Sistemde init ile ilgili kullanabilecek Ã¼Ã§ dizinden sÃ¶z edilebilir. Bunlar ÅŸÃ¶yledir,</p>

<p>/etc/init : upstart yapÄ±landÄ±rma dosyalarÄ±nÄ±n tutulduÄŸu dizindir <br>
 /etc/init.d : geleneksel init betiklerinin ve geriye dÃ¶nÃ¼k uyumluluÄŸa sahip upstart yapÄ±landÄ±rmalarÄ±nÄ±n bulunduÄŸu dizindir. <br>
 /etc/default : upstart ve geleneksel initâ€™in Ã§alÄ±ÅŸma ÅŸekillerini kontrol eden dosyalarÄ±n tutulduÄŸu dizindir</p>

<p>SayÄ±lan dizinlerde tutulan dosyalar Ã¶zetle, bir sÃ¼reci kontrol etmek iÃ§in yapÄ±lmasÄ± gerekli olan iÅŸlemleri barÄ±ndÄ±rÄ±rlar. Upstart sayesinde Ã¶rneÄŸin SSH sunucuyu ÅŸu komutlarla yÃ¶netmek mÃ¼mkÃ¼ndÃ¼r.</p>

<p>start ssh : sÃ¼reci baÅŸlatÄ±r <br>
 stop ssh : sÃ¼reci sonlandÄ±rÄ±r <br>
 reload ssh : sÃ¼recin yeni yapÄ±landÄ±rma dosyalarÄ±nÄ± kullanmasÄ±nÄ± saÄŸlar <br>
 restart ssh : sÃ¼rece SIGHUP sinyali gÃ¶ndererek yeniden baÅŸlatÄ±lmasÄ±nÄ± saÄŸlar <br>
 status ssh : sÃ¼recinin Ã§alÄ±ÅŸÄ±p Ã§alÄ±ÅŸmadÄ±ÄŸÄ± bilgisini dÃ¶ndÃ¼rÃ¼r</p>

<p>BÃ¼tÃ¼n bu yukarÄ±da sayÄ±lan iÅŸ tanÄ±mlarÄ± Upstart sayesinde mÃ¼mkÃ¼ndÃ¼r. /etc/init/ssh dosyasÄ± iÃ§erisinde ssh artsÃ¼recini baÅŸlatan exec kÄ±sÄ±mÄ± bulunur. Bir uygulamanÄ±n varolan init dosyasÄ±nÄ± incelemektense, sÄ±fÄ±rdan bir init dosyasÄ± Ã¶rneÄŸi oluÅŸturmak konseptin anlaÅŸÄ±lmasÄ± adÄ±na daha iyi olacaktÄ±r. Ubuntuâ€™da bu iÅŸi sÄ±fÄ±rdan yapmak iÃ§in init(5)** man sayfasÄ± Ã§ok iyi bir kaynaktÄ±r. Bu dosya oluÅŸturulacak betiklerin /etc/init dizininde .conf ya da .override uzantÄ±sÄ± ile oluÅŸturulmasÄ± gerektiÄŸini sÃ¶yler. .conf uygulamanÄ±n ya da sÃ¼recin temel yapÄ±landÄ±rmasÄ± iken .override temel yapÄ±landÄ±rmaki tanÄ±mlarÄ± ezen kurallarÄ± iÃ§eren dosyadÄ±r. DolayÄ±sÄ±yla bir sÃ¼reÃ§ iÃ§in yalnÄ±zca bir .conf dosyasÄ± ya da hem .conf hem de .override dosyasÄ± kullanÄ±labilecekken, yalnÄ±zca .override dosyasÄ±nÄ±n kullanÄ±lmasÄ± mÃ¼mkÃ¼n deÄŸildir. YapÄ±landÄ±rma dosyalarÄ± Ã§alÄ±ÅŸtÄ±rma izinleri olmayan dÃ¼z metin dosyalarÄ± olmalÄ±dÄ±r.</p>

<p>Temel KÄ±sÄ±mlar</p>

<p>exec â€“ script <br>
 BÃ¼tÃ¼n iÅŸ dosyalarÄ± exec ya da script kÄ±sÄ±mÄ± iÃ§ermek zorundadÄ±r. Fakat ikisini birden barÄ±ndÄ±ramazlar.[1] Bu iki kÄ±sÄ±mÄ±n farkÄ±, exec ile bir komut verilebilecekken script ile komutlardan oluÅŸan bir betik yazÄ±labilmesidir. Bir de eÄŸer script kullanÄ±ldÄ±ysa end script ÅŸeklinde sonlandÄ±rmak gerekmektedir.</p>

<p>pre-start â€“ post-start â€“ pre-stop â€“ post-stop <br>
 Ã‡alÄ±ÅŸtÄ±rmak istenilen iÅŸi baÅŸlatmadan ya da durdurmadan Ã¶nce ve baÅŸlattÄ±ktan ya da durduktan sonra Ã§alÄ±ÅŸtÄ±rÄ±lacak komutlar da pre/post-start/stop script kÄ±sÄ±mlarÄ± altÄ±nda tanÄ±mlanmaktadÄ±r. Yine bu kÄ±sÄ±mlar end script ile sonlandÄ±rÄ±lÄ±rlar.</p>

<p>start on â€“ stop on <br>
 YapÄ±landÄ±rma dosyasÄ±na eklenecek bu satÄ±rlar hangi olay sonucu sÃ¼recin baÅŸlatÄ±lacaÄŸÄ±nÄ± ya da durdurulacaÄŸÄ±nÄ± belirtir. Bu kÄ±sÄ±mda tanÄ±mlanabilecek ilk olay startupâ€™tÄ±r. Bilgisayar ilk baÅŸladÄ±ÄŸÄ±nda dosya sistemi sadece okunabilir haldeyken ve aÄŸ baÄŸlantÄ±larÄ± yokkenki durumu belirtir. Belirli iÅŸleri belirli Ã§alÄ±ÅŸtma dÃ¼zeylerinde (runlevel) baÅŸlatmak iÃ§in kullanÄ±labilecek seÃ§enek runlevelâ€™dÄ±r. Bahsedilmeye deÄŸer kullanÄ±labilecek son iki seÃ§enek ise started ve stopped seÃ§enekleridir. Bu seÃ§enekler kontrol edilmek istenen sÃ¼reÃ§lerin hangi sÃ¼reÃ§ler baÅŸlatÄ±ldÄ±ktan ya da durdurulduktan sonra yÃ¶netileceÄŸini anlatÄ±r. Ubuntu iÃ§in tanÄ±mlÄ± bÃ¼tÃ¼n olaylarÄ±n listesine upstart wikisinde bulunan â€œcookbokâ€ isimli belgenin ilgili kÄ±sÄ±mÄ±ndan ulaÅŸÄ±labilir.[2]</p>

<p>console <br>
 Bu yazÄ±da deÄŸinilecek son Ã¶nemli kÄ±sÄ±m console kÄ±sÄ±mÄ±dÄ±r. Console kÄ±sÄ±mÄ± sayesinde bir sÃ¼recin girdi ya da Ã§Ä±ktÄ±larÄ±nÄ±n nereden alÄ±nÄ±p nereye gÃ¶nderileceÄŸi kontrol edilebilir. KullanÄ±labilecek dÃ¶rt seÃ§enek logged, output, owner ve none seÃ§enekleridir. none iÃ§in /dev/null kullanÄ±lÄ±r ve sÃ¼reÃ§le etkileÅŸime girilmez. output seÃ§eneÄŸi /dev/consoleâ€™u kullanÄ±r ve iÅŸleri uÃ§birim Ã¼zerinden yÃ¼rÃ¼tÃ¼r. owner seÃ§eneÄŸi outputâ€™a ek olarak uÃ§birimin sahibi kullanÄ±cÄ±ya sÃ¼reÃ§lere CTRL+C gibi belirli sinyaller gÃ¶nderebilme olanaÄŸÄ± tanÄ±r. Ã–ntanÄ±mlÄ± olarak gelen logged ise Ã§Ä±ktÄ±larÄ±n log tutucaya gÃ¶nderileceÄŸini belirtir.</p>

<p>Bu yazÄ±da bahsedilen kÄ±sÄ±mlar dÄ±ÅŸÄ±nda kullanÄ±labilecek kÄ±sÄ±mlarÄ±n tam listesine upstart wikiâ€™den[3] eriÅŸilebilir. AyrÄ±ca detaylÄ± bir baÅŸucu kaynaÄŸÄ± upstart cookbook[4] da sÄ±k kullanÄ±lanlar arasÄ±nda yerini almalÄ±dÄ±r.</p>

<p>Ã–rnek Uygulama</p>

<p>Åžimdi yukarÄ±da tanÄ±mlanan temel iÅŸlemleri kullanan iki basit yapÄ±landÄ±rma dosyasÄ± oluÅŸturulacaktÄ±r.</p>

<p>sudo nano /etc/init/surecbir.conf komutu ile dosya aÃ§Ä±larak iÃ§erisine ÅŸunlar yazÄ±lÄ±r.</p>

<pre><code>pre-start script&lt;br&gt;&lt;/br&gt;  
    mkdir /home/kullanÄ±cÄ±_adÄ±/MasaÃ¼stÃ¼/dizinim&lt;br&gt;&lt;/br&gt;
end script&lt;br&gt;&lt;/br&gt;  
script&lt;br&gt;&lt;/br&gt;  
    echo "Ã‡alÄ±ÅŸÄ±yor!" &gt; /home/kullanÄ±cÄ±_adÄ±/MasaÃ¼stÃ¼/dizinim/calisma.log&lt;br&gt;&lt;/br&gt;
end script&lt;br&gt;&lt;/br&gt;  
post-start script&lt;br&gt;&lt;/br&gt;  
    sleep 5&lt;br&gt;&lt;/br&gt;
end script&lt;br&gt;&lt;/br&gt;  
post-stop script&lt;br&gt;&lt;/br&gt;  
    chown -R kullanÄ±cÄ±_adÄ±:kullanÄ±cÄ±_adÄ± /home/kullanÄ±cÄ±_adÄ±/MasaÃ¼stÃ¼/dizinim&lt;br&gt;&lt;/br&gt;
end script```

CTRL+X ile dosya kaydedilir.

sudo nano /etc/init/sureciki.conf komutu ile yeni bir dosya aÃ§Ä±larak iÃ§erisine ÅŸunlar yazÄ±lÄ±r.
</code></pre>

<p>start on stopped surecbir<br><br> <br>
script<br><br> <br>
    echo "Bu iÅŸ ilk iÅŸin sonlanmasÄ± ile baÅŸladÄ±." >> /home/kullanici_adi/MasaÃ¼stÃ¼/dizinim/calisma.log<br><br>
end script```</p>

<p>CTRL+X ile dosya kaydedilir.</p>

<p>Åžu anda iki adet sÃ¼reci tanÄ±mlamÄ±ÅŸ bulunmaktasÄ±nÄ±z. Bunlar surecbir ve sureciki olarak adlandÄ±rÄ±ldÄ±lar. Ä°kinci sÃ¼reÃ§ ilk sÃ¼rece baÄŸÄ±mlÄ± olduÄŸundan onun elle baÅŸlatÄ±lmasÄ±na gerek yoktur. Ä°lk sÃ¼reci ÅŸu komut ile baÅŸlatabilirsiniz.</p>

<p><code>sudo service surecbir start</code></p>

<p>Bu komut sonrasinda ilk olarak masaÃ¼stÃ¼nde bir dizinim klasÃ¶rÃ¼ oluÅŸturulacaktÄ±r. TanÄ±mÄ± pre-start altÄ±nda yapÄ±lmÄ±ÅŸtÄ±r. ArdÄ±ndan dizinim iÃ§erisinde calisma.log isimli bir dosya oluÅŸturulacak ve iÃ§eriÄŸine â€œÃ‡alÄ±ÅŸÄ±yor!â€ yazÄ±lacaktÄ±r. Bu iÅŸlemin de tanÄ±mÄ± script altÄ±nda verilmiÅŸtir. ArdÄ±ndan surecbir isimli sÃ¼reÃ§ beÅŸ saniye boyunca bir ÅŸey yapmadan bekleyecek ve sonlanacaktÄ±r. Bu kÄ±sÄ±m da post-start altÄ±nda tanÄ±mlÄ± bulunmaktadÄ±r. SÃ¼recin sonlanmasÄ± ile masaÃ¼stÃ¼nde bulunan dizinim klasÃ¶rÃ¼nÃ¼n sahipliÄŸi iÃ§indeki dosyalar ile birlikte kullanÄ±cÄ±nÄ±za verilecektir. Bu iÅŸlem de post-stop kÄ±sÄ±mÄ±nda tanÄ±mlanmÄ±ÅŸtÄ±r.</p>

<p>surecbir sÃ¼recinin sonlanmasÄ±nÄ±n ardÄ±ndan sureciki sureci baslayacak ve calisma.log dosyasina â€œBu iÅŸ ilk iÅŸin sonlanmasÄ± ile baÅŸladÄ±.â€ satÄ±rÄ±nÄ± ekleyecektir. surecikiâ€™nin ne zaman baÅŸlayacaÄŸÄ±nÄ± tanÄ±mlayan kÄ±sÄ±m start on kÄ±sÄ±mÄ±dÄ±r.</p>

<p>KullanÄ±cÄ± SÃ¼reÃ§leri</p>

<p>Upstartâ€™Ä±n gÃ¼ncel sÃ¼rÃ¼mleri, sistem kullanÄ±cÄ±larÄ±nÄ±n kendi iÅŸlerini tanÄ±mlamalarÄ±na da izin vermektedir. BÃ¶ylelikle yÃ¶netici haklarÄ± gerekmeksizin, kullanÄ±cÄ±lar kendi sÃ¼reÃ§lerini yaratabilmekte ve Ã§alÄ±ÅŸtÄ±rabilmektedirler. Sistem iÃ§in kullanÄ±labilecek stanzaâ€™larÄ±n(bu yazÄ±da kÄ±sÄ±m olarak adlandÄ±rÄ±ldÄ±lar) tÃ¼mÃ¼ henÃ¼z kullanÄ±cÄ± tanÄ±mlÄ± iÅŸler iÃ§in tanÄ±mlanmamÄ±ÅŸ olmasÄ±na raÄŸmen, temel iÅŸleri gÃ¶rebilecek ÅŸekilde kullanÄ±cÄ± tanÄ±mlÄ± Upstart yapÄ±landÄ±rmalarÄ± oluÅŸturulabilmektedir. Bunun iÃ§in yapÄ±lmasÄ± gereken ev dizininde .init isimli bir dizin oluÅŸturup iÅŸ tanÄ±mlarÄ±nÄ± tutan .conf dosyalarÄ±nÄ± bu dizin altÄ±na koymaktÄ±r. Bir de Ubuntu Upstart Ã¶ntanÄ±mlÄ± olarak kullanÄ±cÄ± iÅŸlerinin Ã§alÄ±ÅŸtÄ±rÄ±lmasÄ±na izin vermediÄŸi iÃ§in /etc/dbus-1/system.d/Upstart.conf dosyasÄ± bir yedeÄŸi alÄ±narak, Upstartâ€™Ä±n Launchpad sayfasÄ±ndan indirilen yapÄ±landÄ±rma ile deÄŸiÅŸtirilmelidir. ArdÄ±ndan start-stop gibi komutlarla kullanÄ±cÄ± tanÄ±mlÄ± iÅŸler Ã§alÄ±ÅŸtÄ±rÄ±labilir.</p>

<p>.init dizinini oluÅŸturmak ve Upstart.conf dosyasÄ±nÄ± deÄŸiÅŸtirmek iÃ§in izlenmesi gereken adÄ±mlar kÄ±saca ÅŸÃ¶yledir. EÄŸer bu yapÄ±landÄ±rma deÄŸiÅŸtirilmek istenirse yedek dosyasÄ±nÄ±n geri dÃ¶ndÃ¼rÃ¼lmesi yeterli olacaktÄ±r.</p>

<p><code>
mkdir ~/.init&lt;br&gt;&lt;/br&gt; <br>
cd ~&lt;br&gt;&lt;/br&gt; <br>
wget http://bazaar.launchpad.net/~upstart-devel/upstart/trunk/download/head:/upstart.conf-20080508231852-jw3hh1a1d02tcmj7-1/Upstart.conf&lt;br&gt;&lt;/br&gt; <br>
sudo mv /etc/dbus-1/system.d/Upstart.conf /etc/dbus-1/system.d/Upstart.conf.yedek&lt;br&gt;&lt;/br&gt; <br>
sudo mv Upstart.conf /etc/dbus-1/system.d/Upstart.conf</code></p>

<p>Bu yazÄ±da Upstart gibi Ã§ok geniÅŸ bir konuya giriÅŸ yapÄ±lmÄ±ÅŸ ve temel iÅŸlemlerin nasÄ±l yapÄ±lacaÄŸÄ± anlatÄ±lmÄ±ÅŸtÄ±r. Daha kapsamlÄ± iÅŸlemler iÃ§in kullanÄ±cÄ±larÄ±n baÅŸvuru yapabilecekleri kaynaklar gÃ¶sterilmiÅŸ ve iki basit Ã¶rnekle kavramÄ±n anlatÄ±mÄ± tamamlanmaya Ã§alÄ±ÅŸÄ±lmÄ±ÅŸtÄ±r. BaÅŸlangÄ±Ã§ sÃ¼reÃ§leri ile ilgili daha fazla bilgi edinmek iÃ§in /etc/rc* dizinlerinin ne iÅŸe yaradÄ±ÄŸÄ±nÄ±n, o dizinlerde bulunan dosyalarÄ±n nasÄ±l isimlendirildiÄŸinin ve nasÄ±l yazÄ±ldÄ±ÄŸÄ±nÄ±n araÅŸtÄ±rÄ±lmasÄ± bu yazÄ±ya tamamlayÄ±cÄ± olmasÄ± aÃ§Ä±sÄ±ndan Ã¶nerilmektedir.</p>

<p>Bu yazi ilk defa Temmuz 2012â€™de cikan Ubuntu Turkiye E-dergisi SUDOâ€™nun 43. sayisinda yayimlanmistir.</p>

<ul>
<li>man 8 init (5. ve 8. bÃ¶lÃ¼mlerinde tanÄ±mlanan init farklÄ±dÄ±r) <br>
** man 5 init (5. ve 8. bÃ¶lÃ¼mlerinde tanÄ±mlanan init farklÄ±dÄ±r) <br>
[1] <a href="http://upstart.ubuntu.com/wiki/Stanzas?highlight=((CategoryDoc))#script">http://upstart.ubuntu.com/wiki/Stanzas?highlight=((CategoryDoc))#script</a> <br>
[2] <a href="http://upstart.ubuntu.com/cookbook/#ubuntu-well-known-events-ubuntu-specific">http://upstart.ubuntu.com/cookbook/#ubuntu-well-known-events-ubuntu-specific</a> <br>
[3] <a href="http://upstart.ubuntu.com/wiki/Stanzas">http://upstart.ubuntu.com/wiki/Stanzas</a><em>for</em>0.5.1 <br>
[4] <a href="http://upstart.ubuntu.com/cookbook/">http://upstart.ubuntu.com/cookbook/</a></li>
</ul>]]></content:encoded></item><item><title><![CDATA[SSH kullanicilarini ev dizinlerine hapsetmek]]></title><description><![CDATA[<p>Onceki gun, arkadasimin internet baglantisini sunucu uzerinden tunellemek icin ihtiyac duydugu bir kullanici olusturmak istedim. Gereksinimlerim ozetle soyleydi. Kullanici baglandiginda ev dizinine hapsedilecek. Temel dosya ihtiyaclari (ssh -N burada secenek olmaktan cikiyor) icin kullanabilecegi nano, rm, cp, ls, mv, grep ve cat disinda baska bir komut/programcik kullanamayacak. Shell olarak</p>]]></description><link>http://blog.cagriemer.net/ssh-kullanicilarini-ev-dizinlerine-hapsetmek-2/</link><guid isPermaLink="false">110fc380-402b-433a-932b-bc6cbbb60efd</guid><category><![CDATA[gezegen]]></category><category><![CDATA[ssh]]></category><category><![CDATA[NSS]]></category><category><![CDATA[linux]]></category><category><![CDATA[chroot]]></category><category><![CDATA["I have no name!"]]></category><dc:creator><![CDATA[Cagri Emer]]></dc:creator><pubDate>Fri, 26 Apr 2013 12:24:33 GMT</pubDate><content:encoded><![CDATA[<p>Onceki gun, arkadasimin internet baglantisini sunucu uzerinden tunellemek icin ihtiyac duydugu bir kullanici olusturmak istedim. Gereksinimlerim ozetle soyleydi. Kullanici baglandiginda ev dizinine hapsedilecek. Temel dosya ihtiyaclari (ssh -N burada secenek olmaktan cikiyor) icin kullanabilecegi nano, rm, cp, ls, mv, grep ve cat disinda baska bir komut/programcik kullanamayacak. Shell olarak BASH atayacagim. Bu kisimdan itibaren yapilan tum islemler Ubuntu 12.04.2 LTS 64 bit sunucuda yapildi.</p>

<p>sshd<em>config(5) man sayfasini okurken yapmak istedigim seyin ChrootDirectory direktifi sayesinde yapilabilecegini gordum. Problem ChrootDirectoryâ€™nin varsayilan olarak tum kullanicilari hapsetmesiydi. Sisteme yonetici olarak erismesi gereken uc kisiyi bir sekilde bu yeni olusturacagim tunel kullanicisindan ayirmam gerekiyordu. sshd</em>config(5) sayfasinda chroot diye arama yaparken bir de Match direktifine denk geldim. Match ifadesi User, Group, Host ve Address kriterleriyle eslesme yapabiliyormus. Eslesme ardindan ise genel ayarlari ne sekilde ezecegimizi belirtmemiz gerekiyormus. Yapmak istedigime geri donecek olursak, kullanicilari ev dizinlerine hapsetme. Yalniz bir kullanici sana adim ORNEK diyorsa onu ev dizinine hapsetmelisin. Match ifadeleri bir baska Match ifadesine rastlayana ya da dosya bitene kadar devam ediyorlarmis. Dolayisiyla ornegin normalde X11Forwardingâ€™e izin verdigimizi varsayarsak Match bloguna yazilacak X11Forwarding no ile kritere uyan oturumlar icin X yonlendirmeyi kapatabilmek mumkun.</p>

<p>man sayfasina gore ChrootDirectory en az bir kabuk, /dev/null, /dev/zero, /dev/stdin, /dev/stdout, /dev/arandom ve /dev/tty aygit dugumlerini icermeliymis. Bu bilgiyi bir kenarda tutup yavas yavas islemi nasil yapacagimizi anlatmaya baslayayim.</p>

<p>Once yeni kullanicimizi olusturuyoruz.</p>

<p>sudo adduser --home /home/ornek --shell /bin/bash ornek</p>

<p>Sifreyi ve bir iki soruyu yanitladiktan sonra kullanicimiz olusturulmus oldu. Simdi /etc/ssh/sshd_config dosyasinin en sonuna su ifadeleri eklemeliyiz. Duzenledigimiz yapilandirma dosyasinin aktif hale gelmesi icin servisi yeniden baslatiyoruz.</p>

<p>Match User ornek ChrootDirectory %h sudo service ssh restart</p>

<p>Su anda ornek kullanicisi SSH baglantisi yapmak isterse sifresini girdikten sonra su iki satiri gorecek ve baglanti kuramayacaktir.</p>

<p>Connection to ornek.com closed by remote host. Connection to ornek.com closed.</p>

<p>Yukarida da belirttigim gibi kullanici bir kabuk bulmayi bekliyor -olustururken /bin/bash demistik- fakat hapsoldugu dizinde -ki %h ile ev dizini olan /home/ornek altina hapsediyoruz- /bin/bash yok. O halde kopyalayalim.</p>

<p>sudo mkdir /home/ornek/bin sudo cp /bin/bash /home/ornek/bin</p>

<p>Su asamada baglanmayi denerse yine ayni sekilde hata alacaktir. (Ubuntu 12.04.2 LTS 64 bit altinda calistigimizi tekrar hatirlatayim) Bunun nedeni BASHâ€™in kullandigi kitaplik nesnelerinin dinamik olarak baglanmis olmasi. Peki bunu nasil ogreniyoruz? Asagidaki komutu calistiralim ve ciktisina bakalim.</p>

<p>file /bin/bash /bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xe643cefb2c672ad94e955067c511537ddbab48da, stripped</p>

<p>Yukaridaki cikti kabaca bize BASHâ€™i calistirmak icin birkac baska dosyaya ihtiyacimiz oldugunu soyluyor. Neyse ki bu dosyalari bulmak cok kolay. ldd komutunun bir dosyanin hangi paylasilan nesnelere ihtiyaci oldugunu gosterdigini biliyoruz. Hemen BASH icin bakalim. linux-vdso.so.1 icin bir dizin vermemis fakat bellek adresi oldugunu tahmin ettigim bir adres var. O halde bizim bir kopyalama islemi yapmamiza gerek yok. libtinfo.so.5, libdl.so.2, libc.so.6 nesnelerini /home/ornek/lib/x86_64-linux-gnu altina, ld-linux-x86-64.so.2 nesnesini ise /home/ornek/lib64 altina kopyalamamiz gerekiyor.</p>

<p>ldd /bin/bash linux-vdso.so.1 => (0x00007ffff8dfc000) libtinfo.so.5 => /lib/x86<em>64-linux-gnu/libtinfo.so.5 (0x00007f5e61aa7000) libdl.so.2 => /lib/x86</em>64-linux-gnu/libdl.so.2 (0x00007f5e618a3000) libc.so.6 => /lib/x86<em>64-linux-gnu/libc.so.6 (0x00007f5e614e3000) /lib64/ld-linux-x86-64.so.2 (0x00007f5e61cd5000) sudo mkdir -p /home/ornek/lib/x86</em>64-linux-gnu sudo mkdir /home/ornek/lib64 sudo cp /lib/x86<em>64-linux-gnu/libtinfo.so.5 /home/ornek/lib/x86</em>64-linux-gnu/ sudo cp /lib/x86<em>64-linux-gnu/libdl.so.2 /home/ornek/lib/x86</em>64-linux-gnu/ sudo cp /lib/x86<em>64-linux-gnu/libc.so.6 /home/ornek/lib/x86</em>64-linux-gnu/ sudo cp /lib64/ld-linux-x86-64.so.2 /home/ornek/lib64/ sudo chown -R root:root /home/ornek</p>

<p>Tekrar giris yapmayi denerse kullanici, su asamada giris yapabilecektir. Fakat bu haliyle henuz saydigim gereksinimlerin tumunu yerine getirebilmis degiliz. Kullanici bir ev dizini bulmayi bekliyor fakat /home/ornek altinda hapsoldugundan -yani /home/ornek dizinini / olarak gordugunden- ev dizinini bulamiyor. Bu yuzden dogrudan / altinda basliyor oturumuna. Bulmayi bekledigi dizini olusturup izinlerini verelim.</p>

<p>sudo mkdir -p /home/ornek/home/ornek sudo chown ornek:ornek /home/ornek/home/ornek</p>

<p>ls, nano, rm, cat ve grep hala eksik. Oncelikle bu komutlar icin hangi nesnelere ihtiyac duyuldugunu ogrenmeliyiz. libncursesw.so.5 disindaki nesneleri zaten BASH icin kopyalamistik. Dolayisiyla onu ve /bin/nanoâ€™yu kopyalayalim.</p>

<p>ldd /bin/nano linux-vdso.so.1 => (0x00007fffe97ff000) libncursesw.so.5 => /lib/x86<em>64-linux-gnu/libncursesw.so.5 (0x00007f93b0480000) libc.so.6 => /lib/x86</em>64-linux-gnu/libc.so.6 (0x00007f93b00c1000) libdl.so.2 => /lib/x86<em>64-linux-gnu/libdl.so.2 (0x00007f93afebc000) libtinfo.so.5 => /lib/x86</em>64-linux-gnu/libtinfo.so.5 (0x00007f93afc95000) /lib64/ld-linux-x86-64.so.2 (0x00007f93b06b4000) sudo cp /lib/x86<em>64-linux-gnu/libncursesw.so.5 /home/ornek/lib/x86</em>64-linux-gnu sudo cp /bin/nano /home/ornek/bin</p>

<p>Su anda nanoâ€™yu calistirabiliriz diye dusunuyorsaniz, yaniliyorsunuz. ornek kullanicisi ile hemen denememizi yapalim. Bir terminal emulatoru bulamadi. xterm icin gereken dosyayi kopyalayalim.</p>

<p>-bash-4.2$ nano ornekyazi Error opening terminal: xterm. sudo mkdir -p /home/ornek/lib/terminfo/x sudo cp /lib/terminfo/x/xterm /home/ornek/lib/terminfo/x/</p>

<p>Nanoâ€™yu boylelikle calisir hale getirdik. Simdi sirada ls ve rm var. rm icin gereken butun nesneleri daha once kopyalamistik. /bin/rmâ€™i kopyaladigimizda o da calisir hale gelecek.</p>

<p>ldd /bin/rm linux-vdso.so.1 => (0x00007ffff8621000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac4d2bf000) /lib64/ld-linux-x86-64.so.2 (0x00007fac4d685000) sudo cp /bin/rm /home/ornek/bin</p>

<p>ls ile devam ediyoruz. Eksik olanlari yerlerine kopyalayalim.</p>

<p>ldd /bin/ls linux-vdso.so.1 => (0x00007fffdd5ff000) libselinux.so.1 => /lib/x86<em>64-linux-gnu/libselinux.so.1 (0x00007f3fde415000) librt.so.1 => /lib/x86</em>64-linux-gnu/librt.so.1 (0x00007f3fde20d000) libacl.so.1 => /lib/x86<em>64-linux-gnu/libacl.so.1 (0x00007f3fde004000) libc.so.6 => /lib/x86</em>64-linux-gnu/libc.so.6 (0x00007f3fddc45000) libdl.so.2 => /lib/x86<em>64-linux-gnu/libdl.so.2 (0x00007f3fdda41000) /lib64/ld-linux-x86-64.so.2 (0x00007f3fde63b000) libpthread.so.0 => /lib/x86</em>64-linux-gnu/libpthread.so.0 (0x00007f3fdd823000) libattr.so.1 => /lib/x86<em>64-linux-gnu/libattr.so.1 (0x00007f3fdd61e000) sudo cp /lib/x86</em>64-linux-gnu/libselinux.so.1 /home/ornek/lib/x86<em>64-linux-gnu/ sudo cp /lib/x86</em>64-linux-gnu/librt.so.1 /home/ornek/lib/x86<em>64-linux-gnu/ sudo cp /lib/x86</em>64-linux-gnu/libacl.so.1 /home/ornek/lib/x86<em>64-linux-gnu/ sudo cp /lib/x86</em>64-linux-gnu/libdl.so.2 /home/ornek/lib/x86<em>64-linux-gnu/ sudo cp /lib/x86</em>64-linux-gnu/libpthread.so.0 /home/testci/lib/x86<em>64-linux-gnu/ sudo cp /lib/x86</em>64-linux-gnu/libattr.so.1 /home/ornek/lib/x86_64-linux-gnu/ sudo cp /bin/ls /home/ornek/bin/ls</p>

<p>lsâ€™i de calisir hale getirdik. BASH ile ilgili dosyalari ev dizinine alip izinlerini duzenleyelim.</p>

<p>sudo cp /home/ornek/.bash* /home/ornek/home/ornek sudo cp /home/ornek/.profile /home/ornek/home/ornek sudo chown -R root:root /home/ornek sudo chown -R ornek:ornek /home/ornek/home/ornek</p>

<p>Kullanici giris yaptiginda .bashrc PS1 degiskenine kullanici adini atamaya calisacak fakat kullanici adini bulamadigi icin â€œI have no name!â€ ismiyle karsilasacagiz. Gereken dosyalari olusturalim. Genel bilgi olarak /etc/profile ve /etc/profile.d/ nedir ne ise yarar arastirilirsa iyi olacaktir. Aslinda bu dosyalar gerekli degil fakat kullaniciya masaustunde alistigi ortami yaratmak istiyoruz.</p>

<p>sudo mkdir /home/ornek/etc grep ornek /etc/passwd | sudo tee /home/ornek/etc/passwd grep ornek /etc/group | sudo tee /home/ornek/etc/group sudo cp /etc/profile /home/ornek/etc/profile sudo cp -R /etc/profile.d/ /home/ornek/etc</p>

<p>Su asamada giris yapilirsa id komutunun bulunamadigindan yakinacaktir. /etc/profile dosyasi id ile kullanici numarasini kontrol eder. Olusturalim.</p>

<p>sudo mkdir -p /home/ornek/usr/bin sudo cp /usr/bin/id /home/ornek/usr/bin</p>

<p>Tekrar giris yaptigimizda /etc/passwd ve /etc/group yerinde olmasina ragmen yine â€œI have no name!â€ ile karsilasilacagiz. Bunun nedeni bu dosyalari okumak icin gereken kitaplik nesnelerinin kayip olmasi. nsswitch.conf(5) man sayfasi FILES bolumunde ilgili dosyalardan bahseder.</p>

<p>sudo cp /lib/x86<em>64-linux-gnu/libnss</em>files* /home/ornek/lib/x86_64-linux-gnu/</p>

<p>Iste artik kullanici adi da gozukuyor. Gelelim geride kalan son birkac komut ve gorsel zenginlestirmeye. ~/.bashrc dircolors komutuna ihtiyac duyar lsâ€™in renkli cikti verebilmesi icin. Hemen ayarlayalim.</p>

<p>sudo cp /usr/bin/dircolors /home/ornek/usr/bin</p>

<p>Kullanicinin hapsoldugu kok dizindeki gereksiz dosyalari silelim. Geri kalan gereksinimlerimizi tamamlayalim. Hepsinin paylasilan nesnelerini daha once kopyaladigimiz icin ana programlari kopyalamamiz yeterli.</p>

<p>sudo rm -rf /home/ornek/.cache sudo rm /home/ornek/.bash* sudo rm /home/ornek/.profile sudo cp /bin/cat /home/ornek/bin sudo cp /bin/grep /home/ornek/bin sudo cp /bin/cp /home/ornek/bin sudo cp /bin/mv /home/ornek/bin sudo chown -R root:root /home/ornek sudo chown -R ornek:ornek /home/ornek/home/ornek</p>

<p>Su asamada istedigimiz sekilde chroot ortamimizi yapilandirmis olduk. Butun bu islemleri baska bir kullanici icin de tekrarlamamak adina /home/ornek dizinimizin bir arsiv yedegini alabilir ve yeni kullanicilar yaratirken bu yedekten ev dizinlerini rahatlikla olusturabiliriz. chroot ortamindaki /etc/passwd, /etc/group dosyalarinin duzenlenmesi unutulmamali. Ayrica dosya isimleri ve sahiplikleri yeniden duzenlenip sunucudaki asil /etc/ssh/sshd_config dosyasina da kullaniciya ait Match direktifi eklenmeli ya da olan Match direktifine ek yapilmali ve ssh servisi yeniden baslatilmalidir. Fakat sunu da hatirlatmak gerek ki chroot etmeniz gereken kullanicilar eger sistemde yonetim islemlerini yapacak kullanicilardan fazla hale geliyorsa varsayilan ayari tum kullanicilari chroot edecek sekilde degistirip yonetim yetkisine sahip kullanicilari match ile kacmak daha mantikli olacaktir.</p>

<p>Bonus: Yazinin basinda /dev altindaki cesitli sanal aygitlarin da sshd_config(5) tarafindan baglanmasinin onerildigini yazmistim. Su ana kadar bu hesabi olusturdugumuz kullanici bu dugumlerin eksikliklerinden kaynaklanan bir hata bildirmedi. Fakat ornegin scpâ€™yi de kullanicinin erisimi olan komutlar arasina katarsaniz /dev/null aygitini bulamadigindan yakinacaktir. Bunun icin aygit dugumlerini su adimlari izleyerek olusturabilirsiniz.</p>

<p>sudo mkdir /home/ornek/dev cd /home/ornek/dev sudo MAKEDEV -v std</p>

<p>Ardindan icinde bulundugunuz dizinde olusturulmus pekcok aygit dugumuÂ goreceksiniz. Bunlardan kmem, mem, ram, loop olanlarini silmenizde birÂ sakinca yok. Digerleri cat ile kullanicinin da isine yarayabilecek olanlar.</p>

<p>Yazida dilimin dondugunce yonettigimiz makinede hesaba sahip olan bir SSH kullanicisini nasil istegimize gore kisitlayabilecegimizi anlatmaya calistim. Umarim benzer ihtiyaci olan birine yol gosterir.</p>]]></content:encoded></item></channel></rss>