16 Ocak 2012 Pazartesi

OpenSSL ile Güvenli Tünel

Selamlar,

4. sınıf güz yarı yılı derslerimizden olan Bilgisayar Ağları dersi için senenin başında hepimiz birer ödev konusu seçtik. Ve dönem sonuna kadar istediğimiz zaman sunumunu yapabilecektik. Ben ödev başlıkları içinden güvenli tüneli seçtim.

Bu konuda araştırma yapmaya başladım. Birçok kullanılan güvenli tünel uygulamaları vardı. Bunlardan bazıları uygulama olarak değişiklikler gösteriyordu. Örneğin; SSH örnek olarak verilebilir. SSH ile iş yapmak istediğiniz bir bilgisayara uzaktan bağlantı sağlayabiliyor ve bu safhada yaptığınız tüm veri aktarımını şifreli olarak gerçekleştiriyorsunuz. Bu da günümüzde SSH uygulamasında kullanılan şifreleme algoritmalarının (DES, AES, RSA, DSA gibi) kırılamayacağı inancında olduğumuz için güvenli olarak kabul ediyoruz.

Bende güvenli tünel olarak arada şifreli veri gönderimi yapan bir uygulama yazmaya karar verdim. Aynı zamanda Python dilini kullanacağım için onun ssl kütüphanesini kullanabilirdim[1]. Bu dökümantasyon sayfasını incelemeye başladım. Kullanabileceğim fonksiyonlar olduğunu gördüm. Yapmam gereken bir client bir de server tarafı yazmaktı. Bu tarafları yazarken en başta haberleşmeleri için karşılıklı portları açıp soket oluşturdum. Daha sonra ssl kütüphanesinin bana sağladığı avantajlardan biri olan "ssl.wrap_socket(sock, keyfile=None, certfile=None, server_side=False, cert_reqs=CERT_NONE, ssl_version={see docs}, ca_certs=None, do_handshake_on_connect=True, suppress_ragged_eofs=True, ciphers=None) "
fonksiyonu ile oluşturduğum socketleri birer ssl socket haline getirip socketler arası bağlantı yaptım. Bu kod kısmı server tarafında dinleme şeklinde olamlıydı. Yani server tarafında soket bind işlemi yapılacak ve herhangi bir adresten gelecek bağlantı dinlenecekti. Aşağıda yazdığım kod parçalarına yer vereceğim ve hangi saturda ne oluyor yorum satırı olarak ekleyeceğim.

Kod kısmının anlatımına geçmeden kısaca wrap_socket() fonksiyonun aldığı parametreler ile ilgili bilgi vermek istiyorum.
sock, oluşturduğumuz socket nesnesi,
keyfile, certfile ise daha ileride ayrıntılı bahsedeceğim alınması gereken sertifikayı ve sonrasında kullanabildiğimiz key ve sertifika dosyalarını kastediyor.
server_side parametresi ise boolean olarak yazılan kodun server ya client davranışları gösterip göstermediğini belirtir. Yazdığım server tarafında bu parametreyi True olarak işaretledim.
cert_reqs ise sertifikanın gerekliliğinden bahsedilen kısım, kullanabileceğiniz seçenekler CERT_NONE(sertifika gerekli değil), CERT_OPTIONAL(seçimlik), CERT_REQUIRED(belirtilmesi gerekli) olarak belirlenmiş. Buradan sonraki parametrelere ben None değeri atadım. Kullanmadım.

Güvenli Tünel Uygulamamın client tarafı kodları:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import socket, ssl, pprint

host = '127.0.0.1' // bu kısma kendi ip adresinizi yazacaksınız, ben tek bilgisayarda denediğim için '127.0.0.1'
port = 10023 //port olarak 10023 sectim, iki taraftada aynı port kullanılmalı
addr = (host, port)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) // soket oluşturuldu

# bu kısımda server tarafından sertifika doğrulama karşılaştırma için sertifika gerekir
ssl_sock = ssl.wrap_socket(s,   //  soket
        ca_certs="/home/ssezgin/sertifikalar/certs/myca.crt",  // sertifika otoritesi
        cert_reqs = ssl.CERT_REQUIRED, // sertifika gerekli olarak belirlenmiş
        ssl_version = ssl.PROTOCOL_TLSv1 ) // kullanılan ssl versiyonu belirtilmiş.
# [2] adresinde sertifika alma işlemlerini sırasıyla ayrıntılı bir şekilde anlattım
ssl_sock.connect(addr) // yeni oluşturulan ssl soket ile bağlantı yapıldı

print repr(ssl_sock.getpeername())  // ssl objesinin fonk. ve soketin özelliklerini gösterir, (ip, port gibi)
print ssl_sock.cipher()  // hangi şifreleme formatının kullanıldığını söyler
print("DER-encoded formda:")
print pprint.pformat(ssl_sock.getpeercert(True)) // DER-encoded formda sertifikanın içeriğini gösterir
print("Duz Metin olarak:")
print pprint.pformat(ssl_sock.getpeercert())     // sertifikanın içeriğini gösterir

ssl_sock.write("deneme")  // Burada write() fonk ile şifreli gönderim yapılır.

data = ssl_sock.read() // serverdan geri dönen veriler okunur

ssl_sock.close() // artık ssl özelliği olan soket kapatılır.

Server tarafı:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import socket,ssl

bindsocket = socket.socket()
bindsocket.bind(('',10023))
bindsocket.listen(5000)

while True:
    newsocket, fromaddr = bindsocket.accept() // client tarafından gelen istek kabul edilir bağlantı sağlanır
    print "I got a connection from ", fromaddr

# client tarafı için gerçekleştirdiğimiz ssl soket oluşturma işlemi burada da tekrarlanır, bu aşamada sertifikanın düzgün oluşturulması gerekir, eğer hatalıysa, bağlantı reddi, karşı tarafı tanımama gibi hatalar alınarak bağlantı başlamaz server ve client arasında bu kısım gerçekten sorun oluşturabilecek tek yer
    baglanti = ssl.wrap_socket(newsocket,
            certfile = "/home/ssezgin/sertifikalar/certs/server.crt",
            keyfile = "/home/ssezgin/sertifikalar/private/server-key-cert.pem",
            server_side=True,
            ssl_version = ssl.PROTOCOL_TLSv1)

    data = baglanti.read()
    print data

    baglanti.shutdown(socket.SHUT_RDWR)
    baglanti.close()

ssl versiyonu seçilirken dikkatli olmak gerekir. ssl_version, kullanılan SSL protokolünün versiyonunu belirtir. Tipik olarak server belli bir protokol versiyonunu seçer ve client' ın server' ın seçimine uyum sağlamasını bekler. Yani client/server ssl_version eşleşmelerinde sınırlamalar vardır. Başarılı bağlantı openssl in versiyonuna bağlı olarak da değişiklik gösterebilir. Örneğin; openssl in bazı eski versiyonlarında (0.9.7l)
bir SSLv2 client bir SSLv23 server ile bağlantı kuramaz. Bir başka örnek; openSSL 1.0.0 başlangıcında sen SSLv2 bağlantısını açıkça etkinleştirmedikçe SSLv23 client SSLv2 bağlantısına teşebbüs etmeyecektir. Bu “ALL” “SSLv2” şeklinde belirtilerek sağlanabilir.

Güvenli Tünel için yazdığım kod parçaları bunlar. Ama çalışabilmesi için daha öncede belirttiğim gibi sertifika oluşturma işlemlerinin tamamlanmış, doğrulanmış hatasız çalışıyor olması gerekli. Bu yüzden [2] adresinde ayrıntılı olarak sertifika işlemlerinden bahsettim.


[1]- http://docs.python.org/library/ssl.html
[2]- http://simgesezgin.blogspot.com/2012/01/kendi-sertifika-otoritemizi-nasl.html

Kendi Sertifika Otoritemizi Nasıl Yaratırız?

    Merhabalar,
  Sertifika sahibi olma konusunda birden fazla yöntem mevcut. Bunlardan bir tanesi güvenilir sertifika otoritelerine başvurmak ve bir ücret karşılığı sertifika edinmek, diğeri de OpenSSL komutları sayesinde kendi sertifika otoritemizi yaratıp, bu otorite ile sertifikalar imzalayıp kullanmaktır. Bir web sayfası ile bağlantıya geçildiğinde browser karşı tarafın sertifikasını indirir ve bu şekilde etkileşimi başlatır. Ancak self-signed sertifikaları kullandığımızda, günümüz browserları bunları güvenli olarak görmez ve hata verir. Size bu sertifikaya güvenip güvenmediğinizi sorar ve eğer siz olumlu yanıt verirseniz bu sertifika bilgisayarınıza indirilir ve güvenli olarak işaretlenir. Yani güvenilir sertifika otoriteleri dışında üretilmiş sertifikalar için bu şekilde bir güvenlik adımı vardır. Bu her mesaj kutusuna okumadan evet deyip geçmeyen dikkatli kullanıcılar için işe yarayabilir. Çünkü gerçek olmayan bir tarafın o olduğunu kabul etmiş olma riskiniz vardır. Kimliğinin doğru olduğuna emin olunduğunda izin vermek daha mantıklıdır.

   Kendi sertifika otoritemizi yaratırken, imzalama yaparken openssl komutlarından faydalanabiliriz. Bu sertifikalar kişisel kullanım için, intranette login olma, servislerle iletişim aşamasında güvenli ve iyi bir yol sağlar. Çünkü veriler ya da parolalar açık şekilde taşınmaz. Ama yine de güvenilir sertifikalardan değildirler.

Öncelikle bilgisayarınızda openssl paketi kurulu olmalı. Bende kurulu versiyonu;
OpenSSL 1.0.0d 8 Feb 2011 (1.0.0e versiyonu da duyurulmuş)

İlk yapılacaklardan biri yeni bir dizin oluşturmak bunu komut olarak yazıyorum. Bu aşamadan sonra sertifika üretimi aşamalarına geçeceğiz.

# mkdir sertifikalar

# cd sertifikalar

# mkdir certs private crl newcerts

sertifikalar : Bizim sertifika otoritesi dizinimiz
certs: Server sertifikamızın konumlandığı yer
private: Gizli anahtarımızın tutulduğu alt dizindir. Bu dizinin sadece root tarafından okunabilir şekilde izinlerini sınırlandırmak gereklidir. Bir sunucuyla bağlantı kurmadan önce
newcerts: openssl yarattılan .pem formatlı dosyayı buraya koyar ve biçimi cert_serial_number.pem şeklindedir. Bizim sertifika yaratabilmemiz için openssl bu dizine ihtiyaç duyar.
Crl: İptal edilmiş sertifikaların listesi 

Şimdi sırada varsayılan openssl konfigürasyon dosyasını kendi sertifikalar dizinimize kopyalama var. Varsayılan openssl.cnf dosyasının bulunduğu dizine girip:

# cp /etc/pki/tls/openssl.cnf ./openssl.my.cnf

Bu dosyanın herkes tarafından okunmasına gerek yok ancak biz değişiklik yapabilmeliyiz.

# chmod 0600 ./openssl.my.cnf

İki dosyaya daha ihtiyacımız var bunlardan biri openssl için database hizmeti verecek:

# touch index.txt

Diğer dosya sertifikaların seri numaralarını tutacak hiç sertifika üretmeyene kadar 01 değerini veriyoruz.

# echo '01' > serial
Birazdan sertifika üretme aşamalarında karşımıza çıkacak dosya uzantılarının anlamlarından da bahsetmek istiyorum:

key : private key
csr : certificate request(Bu sunucu sertifikaları oluşturmak için CA tarafından imzalanmış olacak.)
crt : certificate ( Bu genel ve açık bir şekilde dağıtılabilir)
pem : gizli anahtar ve sunucu sertifikası bir arada olan dosyalar için kullanılan bir uzantıdır. Bu dosyaların izinleri sınırlandırılmalıdır.
crl : Certificate Revokation List (Dağıtımı açıkça olabilir)

Bütün ön düzenlemeler bittikten sonra sertifika otoritemizi (CA) kullanarak
self-signed sertifikamızı oluşturabiliriz.

# cd sertifikalar

Sertifika otoritesi ve özel anahtar üretimi:

# openssl -req -config openssl.my.cnf -new -x509 -extensions v3_ca -keyout private/myca.key -out certs/myca.crt -days 1825

certs/myca.crt: Bu bizim sertifika otoritemizin sertifikası, public, herkes tarafından okunabilir.
private/myca.key: Sertifika otoritemizin private key i. Erişimi sınırlandırılmalı, root sadece okuyabilmeli ve bir parola ile korunmalı.

# chmod 0400 ./private/myca.key

Varsayılan olarak aldığımız openssl.cnf dosyasına bazı dosyalarımızın yolunu göstermemiz ve ayarlamalar yapmamız gereklidir. Bu dizinler:
  • dir dizini
  • certificate
  • private_key

Şimdi de bir server sertifikası nasıl oluşturulur buna bakalım:
openssl.my.cnf dosyamızı da düzenledikten sonra artık sertifika yaratma, imzalama gibi konularda bazı politikaları belirlemiş oluyoruz. Genel amaçlı bir sertifika oluşturacağız, bağlantı sırasında parola sordurmayacağız, yani private key bir parola tarafından korunmayacak dosya erişimini sınırlayacağız.

Sertifika İsteği Üretmek :

# openssl req -config openssl.my.cnf -new -nodes -keyout private/server.key -out server.csr -days 365

-nodes seçeneği parolalı koruma yapılmak istenmediğinde ihtiyaç duyulan bir seçenektir.

server.csr : sertifika isteği
private/server.key : parola korumalı olmayan özel anahtar

Gizli anahtarda izin sınırlamaları. Sadece root ya da kullanıcı okuma iznine sahip olmalı.

# chown root.root ./private/server.key
# chmod 0400 ./private/server.key

Sertifika İsteğini İmzalamak:

# openssl ca -config openssl.my.cnf -policy policy_anything -out certs/server.crt -infiles server.csr

Burada isteğin imzalanması için CA'nın private key ine ihtiyaç duyulur. Openssl.my.cnf dosyasında policy_anything kısmında Country, State, City alanlarının CA sertifikasıyla eşleşme gerekliliği yoktur.

Certs/server.crt : server sertifikası public olması uygundur
newcerts/01.pem : Bu kesinlikle üstteki dosyanın aynısıdır, fakat dosya adı seri numarasıyladır ve ihtiyaç duyulmaz.

Sertifikaları doğrulamak:

# openssl x509 -subject -issuer -enddate -noout -in ./certs/server.crt

ya da

# openssl x509 -in ./certs/server.crt -noout -text

Server yetkilendirme için sertifika gecerliliğinin doğrulanması:

# openssl verify -purpose sslserver -CAfile ./certs/myca.crt ./certs/server.crt

Server Sertifikası ve anahtarı bir dosyada :

# cat certs/server.crt private/server.key > private/server-key-cert.pem

# chown root.root private/server-key-cert.pem
# chmod 0400 private/server-key-cert.pem

Yararlandığım sayfalar:

11 Aralık 2011 Pazar

VirtualBox üzerine Android İşletim Sistemi Kurulumu Aşamasında Karşılaşılan SD Card Sorunları

Merhabalar,
Sanal makine üzerine android kurulumundan kısaca bahsetmek istiyorum. Video ya da anlatım şeklinde bu konuda birçok kaynağa ulaşmak mümkün ancak bu kurulum sırasında benim karşılaştığım sorunlarla karşılaşabileceklere zaman kazandırmak açısından önemli olabilir. Kurulum sırasında SD Card ın tanıtılması açısından iki faklı yöntemden bahsedeceğim.

Kurulumunu yapacağım android sürümüne şu adresten ulaşabilirsiniz:

     Kurulum sırasında yaptıklarım sırasıyla şunlar:
1.Sanal makinede new diyip yeni bir sanal makine oluşturma işlemine başladım.
2.İsim : Android Froyo 2.2 , İşletim Sistemi : Linux ve Version : Other Linux olarak yazdım ve ileri dedim.
3.Bellek boyutunu belirledim (256 mb,512 mb uygun olabilir) ve ileri dedim.
4.Start-Up disk ve create new harddisk seçerek ilerledim.
5.File type olarak VirtualBox Disk Image şıkkını sectim.
6.Storage details da dynamically allowed seçip devam ettim
7.5.nci şıkta oluşturduğumuz sanal disk dosyalarının konumunu belirledim. Bunu kendinize göre ayarlayabilirsiniz. Ayrıca bu bölümlendirmenin boyutunu da belirttim (8 gb olarak)
8.Devamında create diyerek disk yaratma işlemini konumunu belirterek tamamladım.
9.Android Froyo 2.2 adlı makinemiz oluşturuldu. Başlat butonunu tıklayarak kurulum yapacağımız iso yu gösterme işlemine sıra geldi. İleri diyerek başlat kısmına geldik . Başlat butonunu tıklayınca kurulum için seçim yapacağımız ekran karşımıza geldi.
10.Installation – Install Android-x86 to harddisk seçeneğini seçtik.
11.Daha sonra create/modify partitions seçtik.
12.Partitions oluşturma ekranı karşımıza geldi. Burada New->Primary seçtik sırasıyla. Size ı 8.00GB olarak enter ladık. Daha sonra bu oluşan sda1 in bayrağını bootable olarak değiştirdik. Ve write diyerek yaptığımız değişiklikleri kalıcı hale getirdik. Çıkan (yes/no) seceneğine yes daha sonra da o kısımdan çıkmak için quit diyerek işlemi bitirdik.
13.Sda1 partitions ı oluştu, dosya sistemini belirlemek için seçtik. ext3 seçeneğini sectik.Daha sonra bu alanı formatlaması için yes dedik.
14.Gelen boot loader grub şıkkına yes ve dosyaların read/write olma durumuna da yes dedikten sonra sda1 üzerine Android x86 kurulumu tamamlanmış oldu.
15.Benim burada bir dikkatsizliğim olmuştu hemen run Android-x86 diyip çalıştırmıştım. Ancak kurulumu eksik bırakmış oldum. Çünkü sdcard bölümü oluşturmadım. Bu run şıkkının altındaki;
16.Create a fake SD card seçeneğiyle devam etmemiz gerekliydi. Buna varsayılan olarak 2.00 GB alan ayrıldı bunu değiştirmedim. Ve sdcard.img yaratılmaya başlandı.
17.SD card başarılı bir şekilde oluşturulduktan sonra reboot işlemine sıra geldi.
    
Bu aşamada makineyi kapatıp bazı ayarlamaları yapmamız gerekiyor.
     1. Settings şıkkından System kısmına girip enable absolute pointing device ın tikini kaldırıp tamam dedik.
     2. Yine settings şıkkında Storage(depolama) kısmında CD/DVD Drive seçeneğinin attribute' ünü remove disk from virtual device diyerek kaldırdık.

     Kurulum aşaması tamamlandı. Artık makineyi başlattığımızda grub ekranı ile karşılaşıyor olmalıyız. Burada debug modu da mevcut, bu seçenek konsol kullanarak çalışmalarımızda ortaya çıkan sorunları anlamada, takip etmede ayrıca yakalayabilmede kullanılabilir.

     Yukarıda bahsettiğim makinenin kapatılıp bazı ayarlamalara ihtiyaç duymasının sebebi her defasında makine başlatıldığında kurulmamış gibi varsayıp çalışabilir olarak devam etme seçeneklerinin karşımıza çıkması.
Cd/ dvd device kısmında android-x86-2.2.generic.iso görünüyordu. Bu durumu engelledik(1,2.nci şık).
Bu sayede açılışta kurulumu yapılmış kısımdan devam etme şansımız oldu. Bunu yapmamış olsaydık oluşturduğumuz sdcard ve bootable olan disk bölümlerini LiveCD VESA şıkkındayken TAB tuşuna basıp daha önceden atadığımız labellar aracılığıyla DATA=sda1 SDCARD=sdb1 demeden görülmesini sağlayamıyorduk. Sadece sda1 kısmını görüp çalıştırılabiliyormuş gibi devam ediyordu. Ancak herhangi bir uygulama indirme aşamasında sdcard kısmının tanımlanmamış ve görülmüyor olması engel yaratıyordu. Bu yüzden ikinci şık herhangi bir dikkatsizlik, unutkanlık anında makineyi tekrar baştan başlatma ve sda1 ve sdb1 i tanıtma ihtiyacını doğuruyor ve zaman kaybına neden oluyordu.

     Yukarıda LiveCD VESA da TAB a basıp diskleri belirterek devam edebildiğimizi bunun da kurulum sırasında create a fake SDcard şıkkını atladığım için olduğunu söylemiştim. Bu durum şu şekilde de çözülebiliyor. VirtualBox ın arayüzünden (Storage-> IDE Controlller -> Add HardDisk yolu ile)sdcard için bir alan oluşturup daha sonra makineyi debug modda çalıştırıp bu oluşturulan alanı formatlayarak mümkün. Bu işlemi doğru bir şekilde bir kez yaptığımızda artık diskleri belirterek sdcard görme sorununu çözmüş oluyoruz. Açılışta Live CD Debug Mode seçtikten sonra, Sdcard yani benim sdb olarak adlandırdığım disk alanının oluşturulması aşağıdaki komutlarla gerçekleştirilir:

  1. fdisk -l ile hangi disk bölümleri var görelim.
  2. sda1 de android-x86 var bu kısım biçimlendirilmiş ancak bizim arayüzden oluşturduğumuz sdb gecerli bir bölümlendirmeye sahip değil.
  3. fdisk /dev/sdb komutunu yazdığımızda bölümlendirme işlemini yapacağımız komut satırı gelir.
     [command (m for help) : ] 
  4. Burada n(new partitions) anlamına gelir. n yazarak ilerleriz.
  5. Daha sonra primary partition olacağından p yazarız.
  6. (1-4) arasında sayı belirtiriz. sdb1 gibi
  7. First cylinder ve last cylinder şıklarını default olarak aldım.
  8. Bunları belirledikten sonra write(w) yazarak seçimlerimi kalıcı yaptım. Ve sdb1 oluşturulmuş oldu.
  9. Şimdi yapılması gereken açılışta bunların tanınması için kullanacağım labelları atamaya geldi.
  10. mdev -s
  11. mke2fs -j -L DATA /dev/sda1 (label atandı)
  12. mke2fs -j -L SDCARD /dev/sdb1 (label atandı)
  13. reboot -f ile de yeniden başlama ekranına gelmiş olduk
  14. Burada VESA yı seç TAB tuşuna bas ve DATA = sda1 SDCARD= sdb1 yazarak enter a bas.
  15. Daha sonra açılınca Settings->SD card & phone storage-> Format Sd card-> Mount Sdcard
    diyerek kullanıma hazır hale getirilir.
Bu da bir diğer yöntem ancak çok daha fazla uğraştırıcı olduğu kesin

İyi çalışmalar.



10 Temmuz 2011 Pazar

OpenSUSE Build Service Projesi

     Geliştirmeye başladığımız build service projesinde ilk olarak nelere gereksinimimiz olduğunu araştırmaya başladık. Önce build service'in ne olduğundan bahsettikten sonra bu iş için nasıl araçlara ihtiyaç duyduğumuzu ve bunları nasıl işler hale getirdiğimizi anlatacağım.
   
     Open Build Service, openSUSE' nin geliştirdiği, farklı mimari ve işletim sistemlerinin(Fedora, Ubuntu, Debian, Mandriva gibi dağıtımlar) desteklendiği bir paket derleme platformudur, özet olarak. Projemizin amacıysa sadece RPM ve dpkg paket desteği olan build service' e pisi desteği kazandırmak.
 
     OBS kurulumu öncesi, kurulum yapacağımız bilgisayarın internete çıkıp çıkamadığını ifconfig ile kontrol edip dhcpcd ile ip aldık. İnternete erişir hale getirdik.·
    # ifconfig eth1 down  // kapatma
    # ifconfig eth1 up      // açma

    #dhcpcd eth1
    ile ip alma işlemini yaptırdık, eğer yanıt gelmezse (timed out gibi) killall dhcpcd ile süreci öldürüp yeniden üstteki komutla ip alma işlemini tekrarladık.

     OBS kurulumu için ilk önce iki fiziksel harddisk gerekli. Tek disk ile yapma yolları da var ama biz iki fiziksel disk ile çalıştık. Bunlardan ilkine    
http://download.opensuse.org/repositories/openSUSE:/Tools/images/obs-server.x86_64-2.X.Y-BuildN.M-raw.bz2  
adresinden indirdiğimiz iso ile /dev/sda diskine CD'den yürüterek obs-server kurulumunu yaptık.

# fdisk /dev/sda; /dev/sdb -> primary (birincil) partition üretmek
# pvcreate /dev/sda1 -> LVM hacimlerini oluşturmak için hazırlık
# vgcreate "OBS" /dev/sda1-> Mantıksal araç üretmek
# lvcreate -L 50G -n "server" /dev/OBS -> Not : Disk boyutuyla uyumlu olmalı.
# vgscan
# mkfs.ext4 /dev/OBS/server

    Sırasıyla yukarıdaki komutları uygulayarak obs - server kurulumunda ilerledik. Bu aşamaların ayrıntılı anlatımına [1]' deki linkten ulaşabilirsiniz.

     İkinci disk içinde obs workerlarını yarattık. OBS workerlarını oluşturmak için fdisk yardımıyla ikinci disk üzerinde LVM hacimlerini oluşturduk. OBS sunucusu boot ederken sistemdeki tüm LVM hacimlerini tarayarak arıyor ve bunları data partition olarak bağlıyor.

     Devamında oluşturduğumuz bu LVM üzerinde yine fdisk yardımıyla 2 tane worker yarattık. Her bir worker' da iki adet worker_root_1, worker_swap_1 gibi partitionlar oluşturduk. Bunlar adlarından da anlaşılacağı gibi biri asıl dosya sistemi diğeri de swap alanı için vardı. Ayrıca performansı arttırmak için indirilen paketlerin ortak tutulacağı bir cache alanı oluşturuldu. Bu aşamalarında kodlarını aşağıda kısaca verdim.

     # fdisk /dev/sdX -> fdisk ve 8e ile yeni birincil partition oluşturulur.
     # pvcreate /dev/sdX1 -> lvm için hazırlık kısmı yaratılır
     # vgcreate "OBS" /dev/sdX1-> antıksal araç yaratılır 
     # lvcreate -L 50G -n "cache" OBS 
     # vgscan   // yapılan bölümlemelerden sonra diskin güncellenmiş son halini gösterir 
     # mkfs.ext4 /dev/OBS/cache

      Her worker için iki partition ayrıldı. 
     # lvcreate -L 4G -n "worker_root_1" /dev/OBS 
     # lvcreate -L 512M -n "worker_swap_1" /dev/OBS 
     # lvcreate -L 4G -n "worker_root_2" /dev/OBS 
     # lvcreate -L 512M -n "worker_swap_2" /dev/OBS 
     # vgscan 
     # mkfs /dev/OBS/worker_root_1 
     # mkfs /dev/OBS/worker_root_2

     Disk tanıtma, sunucu kurulumu, disklerin bölümlendirilmesi ve birbirine bağlanmaları sonrasında login olup root parolasını değiştirip
     #insserv sshd·
     #rcsshd start komutlarıyla ssh ı çalışır hale getirdik.

     # insserv -r obsworker 
     # rcobsworker stop

     Yukarıdaki komutlar makine üzerindeki obs - server' ı durdurur. Eğer sen küçük bir sistem ya da başlangıç testleri yürütüyorsan bu gerekli değildir. 

     edit /usr/lib/obs/server/BSConfig.pm 
     If you have the line :- our $obsname = $hostname;
     # unique identifier for this Build Service instance replace it with our 
     $obsname = "your-obs-server-name.yourDomain.com";

     Yukarıdaki komutlarla dosya içine girerek gereken bahsedilen değişiklikler yapıldı.


     # find /etc/init.d -name \*obs\* -exec {} stop \;
     # rcmysql stop

     SSH ile obs sunucusuna bağlanıp yukarıdaki komutlar ile oluşan servisleri çalışır hale getirdik. Bunun sonrasında artk obs.comu.edu.tr adresiyle web arayüzüne erişim sağlamayı başardık. Aşağıdaki adreslerden çalıştırmayı başardığımız uygulamanın belirli kısımlarına erişilebilir.

     webui  -> http://hostname.domain/
     api       -> http://hostname.domain:81/
     repo    -> http://hostname.domain:82/

[1] - http://en.opensuse.org/openSUSE:Build_Service_private_installation#

     Şu an repo kısmı çalışır halde değil, bu konu nasıl halledilir bunun üzerinde çalışmalarıma devam edeceğim. Ve bu arada varolan örnek build service uygulamasını inceliyorum. Kullandığı uygulamalar neye ne kadar etkili bunları anlamaya çalışıyorum. Yapacağımız işin varolan kısımlardan ne kadarını içereceğini ve nelerin eksik olduğunu anlamama yardımcı olacağını düşünüyorum. Tekrar belirtmek isterim [1] deki linkte bu aşmaların daha ayrıntılı haline ulaşabilirsiniz.

     Herkese iyi çalışmalar