29 Temmuz 2014 Salı

Yaz Stajım-2

Merhaba, bu yıl stajımı Metglobal'in sistem yönetimi bölümünde yaptım. Uğraştığım işten ve bana kazandırdıklarından kısaca bahsedeyim istiyorum.

Şirketin Amazon'da baya sunucusu var. Kullandıkları araçlardan biri de Puppet. Ne olduğu hakkında burada bir yazım var. Puppet'a eklenen yeni bir sertifika çeşidi "Policy-Base Autosigning". Öncekinden farkı da, makinalar arası imza gerçekleşmeden önce, yazılan sorgu çalışıp, sonucuna göre işlem yapılıyor. Kısaca daha fazla güvenli diyebiliriz.

Benim yaptığım iş ise imzalanmak için master'a gelen sertifikayı  çözüp, bazı bilgileri çekerek Python ile sorgulamaktı. Örneğin, imzalanmak için gelen sertifikadaki instance_id şirketin sunucularından birine mi ait, ya da hostname'leri, common_name'leri uyumlu mu gibi.. Sorgu yazma daha kısa süren kısımdı. Puppet nasıl çalışıyor, sertifika yönetimi nasıl oluyor, master makinada talimatlar nasıl yazılıyor kısımlarını deneyip test etmem daha çok zamanımı aldı.

Sertifika kodunu çözerken OpenSSL'i, sorguları yaparken AWS arayüzü için kullanılan Boto'yu öğrendim. Son olarak, imza gerçekleşmediğinde uyarı olarak mail ve log yazma kısmı ekledim. Mail atma kısmında da smtplib kütüphanesiyle uğraştım.

Bu teknik deneyim dışında, birlikte çalıştığım ekibi çok sevdim. Emre'ye, Aydan'a, Barış'a, Kubilay'a ve Eray'a ve Simge'ye buradan teşekkür edeyim. Geçirdiğim 4 hafta yoğun olduğu kadar çok da eğlenceliydi :)


Son olarak Kubilay'ın yorumu ile yazımı bitireyim: "Tanrıığm çok tatlışız değil miğğ !!"  :):)







22 Temmuz 2014 Salı

Puppet Otomatik İmzalama Hakkında

Bu yazımda Puppet'taki otomatik imzalama çeşitlerinden bahsedeceğim. 3 çeşit otomatik imza kullanılabiliyor. Bunlar:

** Naive Autosigning : Master makinaya gelen tüm imzalar (CSR - Certificate Sign Request) imzalanır.  Master'daki puppet.conf'da autosign = true olması yeterli.

** Basic Autosigning : Otomatik imza için sertifika ve domain isimlerinin olduğu bir beyaz liste oluşturmalıyız. İmzalama gerçekleşecek makinaları önceden tanıtmak gibi düşünebiliriz. Master'daki puppet.conf dosyasında autosign = <whitelist file> diye oluşturduğumuz listeyi bilirtmeliyiz. Bu listenin yolu $confdir/autosign.conf şeklinde olmalı. autosign.conf içeriği şu şekilde olmalı: 
ornek1.ornek1.com
*.ornek2.com
*.local

** Policy-Based Autosigning : Kendi belirlediğimiz ilkelere uygunsa, imzalamanın gerçekleşeceği çeşittir. Diğerlerine göre güvenlik açığı daha az. Çünkü direk imzalama gerçekleşmeden önce ilkelere uygunluk sonucunda işlem yapılıyor.

Bunun için master makinadaki puppet.conf'a autosign = <policy executable file> diyerek belirlediğimiz ilkelerin olduğu çalıştırılabilir dosyayı belirtmeliyiz. Peki ilkeleri hangi kurallara göre yazmalıyız?

* İlkeleri herhangibir programlama dili ile yazabiliyoruz. 
* İstek olarak master makinaya gelen pem formatlı dosyayı, ilkeleri yazacağımız dosyaya stdin ile almalıyız. 
* Çıktı olarak 0 ise onay(imza gerçekleşecek), 1 ise red döndürmeliyiz.

Ayrıntılı şekilde buradan da bakabilirsiniz. Kolay gelsin :)



21 Temmuz 2014 Pazartesi

Python-Boto İle AWS'ye Bağlanmak

Boto, AWS(Amazon Web Services) arayüzü için bir Python kütüphanesi. Fotoğraftaki seçenekler ve alt başlıkları için fazlasıyla modül içeriyor. Bana stajımda EC2( Elastic Compute Cloud ) kısmı lazım olmuştu. Bağlantı kurup instance_id kısmı ile birkaç işlem yapacaktım.


Krulumu oldukça basit:

pip install boto

ya da kaynak kodu yerelimize çekersek:

$ git clone git://github.com/boto/boto.git
$ cd boto
$ python setup.py install

Yapılandırma:
Bunun için AWS'de hesabımız olmalı çünkü API Key ve Secret Access Key bilgileri gerekiyor. Boto sırasıyla şu dosyalara bakıyor:

* /etc/boto.cfg
* ~/.boto
* ~/.aws/credentials

1. "~/.aws/credentials", "~/.boto" ve "/etc/boto.cfg" dosyalarını oluşturup, API Key ve Secret Access Key bilgileri vereceğiz. Burada fazladan region(alan) tanımı var. Belirtmek zorunda değiliz ama Amazon Servisleri'nin hangi alanına bağlanmak istediğimizi yazabiliriz.

[default]
aws_access_key_id =*******************
aws_secret_access_key = ****************************************
# Optional, to define default region for this profile.
# region=eu-west-1

2. "export AWS_AWS_CREDENTIAL_FILE=/path/to/aws-credentials.txt" ve 
    "export BOTO_CONFIG=/path/to/.boto" diyerek

dosya yollarını çevresel değişkenlerde belirtmeliyiz. "$ set" komutu ile kontrol edebilirsiniz.

Bağlantı kurma kısmı:

ipython ile oldukça hızlı şekilde deneyebilirsiniz.

>> import boto.ec2 

>> regions = boto.ec2.regions () ,

>> regions
[RegionInfo:us-east-1,
 RegionInfo:cn-north-1,
 RegionInfo:ap-northeast-1,
 RegionInfo:eu-west-1,
 RegionInfo:ap-southeast-1,
 RegionInfo:ap-southeast-2,
 RegionInfo:us-west-2,
 RegionInfo:us-gov-west-1,
 RegionInfo:us-west-1,
 RegionInfo:sa-east-1]


>> eu = regions[3]
>> eu_conn = eu.connect()

Kütüphaneyi ekledikten sonra, ilk satırda ec2 bağlantı alanlarının listesini regions değişkeninde tutuyoruz. 3. satırda, regions[3] teki alanı,  bağlanmak için bir değişkene atıyoruz. Son satırda ise connect() ile bağlantı gerçekleşiyor. 

ipython'da tab tuşu ile fazlasıyla modül olduğunu görebilirsiniz.  Örneğin benim işime yarayanlardan biri get_all_instances modülüydü. Alt satırda; i_id değişkeni, bağlandığı alandaki makinalardan birisine ait mi diye kontrol yapılabiliyor.

eu_conn.get_all_instances(filters={'instance-id' : i_id})

 Kısaca Boto'nun ana işlevi böyle. Tabiki daha çok karıştırmak gerektiğini düşünüyorum. Şimdilik görüşmek üzere..


15 Temmuz 2014 Salı

Python Kullanarak E-mail Göndermek

Merhabalar, mail gönderme durumuyla stajda uğraştığım projede karşılaştım. Ters bir sonuç olduğunda, uyarı niteliğinde yetkili kişilere mail yollamam gerekiyordu. Python ile kolayca yapılabiliyormuş, ben de sizlerle paylaşmak istedim :)

"smtp" kütüphanesi kullanılarak birkaç satırda hallediliyor. SMTP (simple mail transfer protocol) posta sunucuları arasında e-posta göndermek için kullanılan yaygın bir protokol.

"import smtplib" diyerek smtp modülünü yüklemiş oluyoruz.

Önce, Gmail'in SMTP sunucusuna bağlantı kurulmalı. Bu bağlantı TLS veya SSL biriyle yapılabilir. Bu örnekte, STARTTLS bağlantısı (port 587) kullandık. Son olarak Gmail hesabı kimlik bilgilerini ekledik.
server = smtplib.SMTP( "smtp.gmail.com", 587 )
server.starttls()
server.login( '<gmail_address>', '<gmail_password>' ) 

Metin mesajı, mobil taşıyıcıların e-posta avantajlarından yararlanarak gönderiliyor.

Örneğin, T-Mobile numarasına kısa mesaj göndermek için <number>@tmomail.net, AT&T numarasına metin mesajı göndermek için, <number>@mms.att.net biçiminde kullanmalısınız.

Sonra, mesajı ekleyip python dosyasını çalıştırdığımızda mail atmış oluyoruz.
server.sendmail( '<from>', '<number>@tmomail.net', 'Hello!' ) 

Kolay gelsin :)

 
  

4 Temmuz 2014 Cuma

Temel Puppet Kullanımı

Merhaba, önceki yazımda puppetın ne olduğundan bahsetmiştim. Bu yazımda agent ve master makinalar arasındaki iletişimin nasıl olduğundan ve master makinalarda yönergeler yazarak agent makinalara nasıl işlemler yaptırıldığından bahsedeceğim.

Master ve agentta Puppet'ın düzgün kurulu olduğunu varsayıyorum. Çalışma şekli de fotoğrafta anlaşılır halde diye bunu da siteden aldım :D Daha çok bilgi için.

** Makinaların iletişimde olması için öncelikle birbirlerine ping atabiliyor olmalılar.

** Birbirlerinin makina isimlerini (hostname) biliyor olmalılar. ('$hostname' komutu ile kısaca öğrenilebilir.)

** Daha sonra her iki makinada “/etc/hosts”  dosyasına:  “ip hostname.localdomain hostname puppet.localdomain puppet” biçiminde birbirlerinin bilgilerini yazıyoruz. 

** Son olarak saatlerinin de senkron olması gerekiyor.


Şimdik bağlama işlemi için agentta "# puppet agent --test" komutu çalıştırıp bir sertifika oluşturuyoruz. Oluşan sertifika /var/lib/puppet/ssl altında. Masterda "#puppet cert list" komutu ile oluşan sertifikayı görüyoruz. Son olarak "# puppet cert sign hostname.localdomain" diyerek imzalama işlemini gerçekleştiriyoruz.

Bugün çok eğlenerek çalıştığım kısım agenta birşeyler yaptırmaktı :)
Çalışma alanı /etc/puppet altında. 
Önce master makinada manifest dizini altına ".pp" uzantılı bir dosya oluşturmalıyız.
Sonrası agenta ne yaptırmak istediğinize bağlı. Ben 'pgbuncer' kurdurup, servisi çalıştır dedim mesela. Yazım için de biçimleri burada.

Benim site.pp dosyam şöyle:

node 'hostname.localhost' {
    package{"pgbouncer":
      ensure => "installed",
  }
    file {"/etc/pgbouncer/userlist.txt":
      ensure  => present,
      content => '"username" "password"',
  }
    exec {"sed1":
      command => "/bin/sed -i 's/;;   dbname= host= port= user= password=/dbname host=NAME user=username password=password/g' /etc/pgbouncer/pgbouncer.ini",
      path => "/bin/sed/",
  }
    exec {"sed2":
      command => "/bin/sed -i 's/START=0/START=1/g' /etc/default/pgbouncer",
      path => "/bin/sed",
  }
    exec {"start":
      command => "/etc/init.d/pgbouncer start",
  }
}

Burada node kısmında yine agentı belirttik. 
* Package kısmında anlaşıldığı gibi paketi indirip kurulduğundan emin oluyor. 

* File kısmında /etc/pgbouncer/userlist.txt dosyasına pgbouncer için kullanıcı adı ve parola ekliyor. 

exec kısımlarında komut çalıştırıyor. 
* sed1'de dbname, host, kullanıcı adı, parola bilgilerini .ini dosyasına giriyor. 
* sed2 komutunda da /etc/default/pgbouncer dosyasındaki START değerini değiştiriyoruz. Çünkü servisin başlaması için "1" değerini almalı.
*start adındaki komut da pgbouncer'ı başlatıyor.

Bunu kaydedip agentta "# puppet agent -t" komutunu çalıştırdığımızda, masterda bir değişiklik varsa agent bunu uyguluyor. Son olarak agentta pgbouncer çalışıp çalışmadığını "$ ps auxf | grep pgbouncer" diye çalışan süreçlerden görebiliriz.












Kolay gelsin :)

1 Temmuz 2014 Salı

Virtualbox - Aynı IP Sorunu

Merhaba, bugün başıma gelen sorunun çözümünü öğrenince sizlerle paylaşmak istedim :)
Virtualbox, bir işletim sistemi içinde sanal bir makina oluşturarak 1 veya daha fazla işletim sistemi kurmaya yarayan, sistem içinde sanal bir sistem oluşturan bir program.

Bende de sanalda 2 makina kuruluydu. Puppet'ı denemek için bu makinları birbiri ile iletişimde tutmam, bir bakıma bağlamam gerekiyordu ve Virtualbox aynı ip adresini verdiği için bağlama işlemini yapamadım. 

Çözümü çok kısa ve kolaymış.

1.  Virtualbox uygulaması açıkken sol köşede sırasıyla Dosya-Tercihler yolunu izleyip Ağ bölümünde "Sadece-makina Ayarları" kısmına sağdaki ekleme butonuna tıklıyoruz ve vboxnet0 adında bir bağdaştırıcı ekliyoruz.

2. Daha sonra makinamızın birini seçip Ayarlar'a tıklayoruz. Ağ bölümünde "Bağdaştırıcı 1" ayarını "NAT" olarak ayarlıyoruz.


3. "Bagdaştırıcı 2" kısmında ise "Sadece-Anamakina Bağdaştırıcısı" seçeneğini seçiyoruz. Bunları her iki makina için de yapmalıyız. Tabi bu işlemlerde makinalar kapalı durumda olmalı.

Bu işlemden sonra makiaları çalıştırıp "# ifconfig" komutunu verdiğimizde ip'lerin farklı olduğunu görebiliriz.

Görüşmek üzere :)