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 :)

23 Haziran 2014 Pazartesi

Puppet'a Giriş ve Debian Wheezy'ye Kurulumu

Bu yaz, stajımda Puppet ile çokça zaman geçireceğim. Giriş niteliğinde okuduklarımı ve denediklerimi sizlerle paylaşmak istedim.

Puppet, Ruby dili ile yazılmış bir yapılandırma yönetimi aracı. Aslında bu yapılandırma yönetimi 3 şekilde oluyor. 

1. Elle (manuel)
2. Kurulum sırasında
3. Araç kullanarak

Araç kullanmak bizi birçok uğraştan kurtarıyor. Sunucularımızı nasıl yapılandırmak istediğimizi tarif ediyoruz ve kullandığımız araç yapılandırmayı tarife göre uyguluyor. 

Puppet'ın yapılandırma dosyası (/etc/puppet/puppet.conf) 3 kısımdan oluşuyor.

main: Özel olarak belirtilmiş yapılandırma ayarları yoksa geçerli olacak ayarları içerir.

master: Puppetmaster (yönetim birimi) içindir.

agent: Puppet istemcisi yönetimi içindir.

2 modda çalıştırılabiliyor. "Sunucu-İstemci Mod" ve "Bağımsız Mod".  

Sunucu-İstemci Modu:

Puppetserver: Tüm yapılandırma dosyaları masterda bulunur. CA (Certificate Authority), SSL keyleri tutar. Verilerin şifrelenerek iletişimde olmasını sağlar.

Node: 3o dakikada bir mastera sistem bilgilerini yollar. Master, istenilen yapılandırma durumunu belirten bir katalog yollar. Node, kataloğu uygulayıp mastera raporlar. 

Bağımsız (Standole) Mod: Sunucu-İstemci modu gibi çalışır, tek farkı yapılandırma dosyalarının locale'de bulunmasıdır.

Ben Puppet'ı denemek için sanalda iki makinaya Debian kurdum. Birini master, birini agent olarak ayarladım. Şimdi bu kısımı açıklayayım.

İlk makinayı master yapalım.

1. deb paketini çekip paketi yükleyelim.
#wget http://apt.puppetlabs.com/puppetlabs-release-wheezy.deb 
#dpkg -i puppetlabs-release-wheezy.deb

2. Paket listesini güncelleyelim.
#apt-get update 

3. İsteğe bağlı önsürümler için etkinleştirme:

/etc/apt/sources.list.d/puppetlabs.list dosyasında aşağıdaki bölümde #'yi kaldırarak yapılıyor.

# Puppetlabs devel (uncomment to activate)
 deb http://apt.puppetlabs.com precise devel
# deb-src http://apt.puppetlabs.com precise devel 
 
4.  Master sunucuyu kuralım.
 $ sudo apt-get install puppetmaster 

Son sürüme yükseltmek için: 
 $ sudo apt-get update
 $ sudo puppet resource package puppetmaster ensure=latest

Diğer makinamızı da agent yapmak için aşağıdaki komutu vermemiz yeterli.
 $ sudo apt-get install puppet
 Yine son sürüm için update dedikten sonra:
  $ puppet resource package puppet ensure=latest
Bir sonraki yazımda bu iki makina arasındaki çalışmanın ne şekilde olduğundan bahsedeceğim. 
Esen kalın :)

16 Mayıs 2014 Cuma

PebbleTextWatch-tr

Pebble smartwatch, Kickstarter'da duyrulduktan sonra beklenenin üzerinde destek alıp hayata geçirilen bir proje.

Bu akıllı saat; telefon(İOS - Android), tablet ya da bilgisayarınız ile bluetooth üzerinden eşleştirilerek çalışıyor. Gelen bildirimleri anında görme imkanının yanında, telefondaki uygulamalara saatten müdahale de edilebiliyor, gelen aramalara cevap verilebiliyor. +Gülşah Pebble ile ilgili daha önce bikaç yazı yazmıştı. Buradan ulaşabilirsiniz.

Pebble için uygulama ve watchface geliştirilebiliyor. Bir uygulama bir de watchface marketi mevcut. Her geçen gün yeni şeyler ekleniyor:) Biz de bir süredir Gülşah ile watchface geliştirmek üzerine çalışıyoruz.

Bu işe PebbleTextWatch diye bir watchface'in Türkçe halini yapalım diye başladık, tahmin edersiniz ki Türkçe halini yapınca bitmedi. Yeni bir teknoloji ile çalışmak gerçekten çok heyecan verici. Biz de yeni özellikler eklemeye başladık. 

Son çıkardığımız 2. versiyonunda, pil göstergesi var. Ayrıca bluetooth bağlantısı koptuğunda saat kullanıcıyı uyarıyor:) Hala da birşeyler eklemeye devam ediyoruz. Pebble kullanıcısıysanız artık markette PebbleTextWatch-tr adında Türkçe bir watchface de olduğunu bilin :)

Daha da güzel haberler vermek dileğiyle...