Güvenli Kod Yazımı

Evet arkadaşlar uzun zamandır yazamıyordum. Bunun nedeni uzun zamandır projelerle uğraşıyor olmam. Bugün sizlerle projelerimi yaparken rapor olarak yazdığım nasıl güvenli kod yazılır adlı raporumu paylaşacağım. Verilen örnekler biraz .NET platformu üzerinden ama herkes için yararlı olacağını düşünüyorum.


Güvenlik çok yönlü bir olaydır ve güvenlik riskleri her yerde olabilir. Belki kötü bir hata denetim kodu, belki çok geniş bir yetkilendirme, belki de server üzerinde hangi servislerin çalıştığının unutulması  Bu liste böyle uzar gider ve yazımızın amacı da buradan çıkar Burada bizim amacımız en çok yapılan yazılım hatalarını incelemek ve bu hatalara karşı ne gibi önlemler alabileceğimizi öğrenmektir. Unutmayalım ki bunlar sadece güvenli kod yazabilmek için ilk adımlarımızdır. Bunların dışında yüzlerce farklı saldırı tekniği ve korunma metodu vardır. Bunların hepsini uygulasak dahi aklımızdan çıkarmamız gereken bir husus daha vardır. Asla güvenli kod yoktur. Çünkü saldırganlar her geçen gün saldırı tekniklerini değiştirmekte ve farklı saldırılarla sistemlerimize ve kodlarımıza saldırmaktadırlar.

Olası Güvenlik Riskleri

1)SQL Injection

SQL Injection hala daha görülebilecek en büyük açıklıklardan biridir. Kullanıcı verisine dayanan bir atak türüdür. Bu atak türü genellikle kod yazanların SQL Injectionı tam anlamıyla anlamadıkları için başlarına gelir. Peki nedir bu SQL injection. Bunu anlayabilmemiz için once SQL in ne olduğunu bilmemiz gerekir. SQL veritabanıyla anlaşmamızı ve verileri veritabanından çekip üzerlerinde işlem yapmamızı sağlayan bir dildir. Bir nevi biz insanların veritabanıyla konuşup anlaşma şeklidir. SQL Injectionı ise kullanıcının söylediği sözlerin veritabanına biraz değiştirilmiş şekliyle yansıtılması olarak tanımlarsak yanlış tanımlamış olmayız. Buna gore de veri tabanının bize vereceği değer değişecektir ki kötü niyetli son kullanıcılar bu yapıdan faydalanarak istenmeyen olaylara maruz bırakabilir bizi. SQL Injectionı biraz kavradıktan sonra bir tane gerçek örnek üzerinde durumu konuşalım.
Aşağıdaki gibi bir SQL sorgumuz olsun

Select * from kullanıcılar where username=$uname AND password=$pass

$uname ve $pass kısımlarını kullanıcıdan alıyoruz. Burada eğer kullanıcı bize gerçek değerleri verip giriş yaparsa bunda hiçbir sorun yok. Ama eğer kullanıcı adı ve şifre yerine özel bir takım karakterler yazarak girişi sağlayabilirsek işte o anda yetkisiz olarak verilere ulaşabiliriz. Username ve pass için bir SQL injection denemesi yaparak neler olabileceğini inceleyelim. Eğer usename ya da pass yerine “OR” yazarsak yetkisiz olarak giriş yapabiliriz ve system içerisinde kullanıcı yetkilere gore gönlümüzce dolaşabilriz.

Select * from kullanıcılar where uname =”OR”=” AND pass=”OR”=”

2)Cross Side Scripting

Cross Side Scripting kısaca, HTML ve Javascript yardımıyla bir sitede, siteye giren kullanıcıya tehlike arz edecek şekilde kod çalıştırmaya denir. Temel olarak kullanıcıların bilgilerini çalmayı amaçlar. Cross Side Scripting de SQL Injection gibi kullanıcı verilerine dayanan bir saldırı türüdür.

3)Broken Authentication and Session Management
   
Tam olarak güvenliği sağlanmamış ( örneğin md5 veya benzeri bir algoritma ile korunmamış) oturum nesnenleri ve çerezlerinin ele geçirilip kötü amaçlar için kullanılmasıdır. Organizasyonlar için önerilen şeyse developerlarına güçlü authentication ve session management control sağlamasıdır.

4)Insecure Direct Object References
   
Herhangi bir kontrol mekanızması olmadan kod içerisinden bir dosyanın include edilmesi, direk veritabanı erişim bilgilerinin saklanması ve çağrılması ve benzeri public fonksiyon erişimleri gibi hatalardır. Korunmak içinse indirect objeler kullanılmalı ve objelere erişim control altında tutulmalıdır.

5)Cross Site Request Forgery (CSRF)
   
CSRF ataklarından bir sisteme login olmuş kullanıcı tekrardan login request göndermesi için zorlanır fakat bu sefer login requestindeki bilgileri istemciye değil saldırgana aittir.
Konuyu daha iyi anlayabilmek için yine bir banka örneği vererek açıklayalım. Saldırganın amacı banka hesabımızı boşaltmaktır. Bu amaç için bir web sitesi hazırlar ve bir resim içerisine bir kod aşağıdaki gibi bir kod gömer.

http://example.com/transferFunds? amount=1500&destinationAccount=attackersAcct#“ width="0" height="0" />

Eğer kullanıcı önce bankasında bir işlem yapıp daha sonar banka sayfasını kapatmadan bu siteye girip yukarıdaki imajın bulunduğu linke tıklarsa saldırgan kurbanın bilgisayarındaki cookie bilgilerinden yararlanarak amacına ulaşabilir.

6)Security Misconfiguration
   
Güvenlik ile ilgili tanımların zayıf, yanlış veya varsayılan olarak bırakılmasından kaynaklanan saldırılardır. Örneğin evinizdkei ADSL modemleri şifrelerinin değiştirilmemesi gibi. Her cihazın default şifrelerine ( bunlara cisco, juniper vb güçlü cihazlar dahil) internetten 15 saniyede ulaşabilirsiniz.

7)Insecure Cryptographic Storage
   
Kriptolonamamış verilerin zayıf sunucularda korunması(maması). Günümüzde pek çok e-ticaret sitesi müşterilerinin bilgilerini şifrelemeden saklamaktadır. Kötü niyetli Host sahibi veya saldırgan bu bilgilere ulaşabilir. Korunmak için verytabanına kaydettiğimiz özellikle şifre gibi veriler kriptolanmış bir şekilde kaydedilmelidir.

8)Failure to Restrict URL Access
   
Erişimi kısıtlanmış sayfalara erişimlerin kontrol edilmemesidir, bu sayafalara erişen diğer sayfa ve modüllerin iyi bir şekilde izlenmemesi veya kodlama hataları vb.
Örneğin bir admin paneline bir kısıtlama koymadan link yardımıyla ulaşılabilyorsa bu çok büyük bir güvenlik riskidir.

9)Insufficient Transport Layer Protection

Uygulamalar genelde hassas mesajlar gönderilirken network trafiğini kriptolamayı başramayabilirler. Başarsalar bile zayıf algoritmalar vb şeylerle yaparlar. Burada eğer network trafiğini dinlemeyi başaran birileri varsa bizim network üzerinden ulaştırmaya çalıştığımız bütün bilgileri çalabilir.   
Bu ataklardan korunmak için böyle hassas verilerimizi güçlü bir kriptolama işleminden sonra yollamalıyız.

10)Unvalidated Redirects and Forwards
   
Bir çok web uygulamasında ilk ve son veri kontrolü yapılmaksızın yönlendirmeler yapılmaktadır. Buna en güzel örnek yıllar önce alışveriş sitelerinde ödeme sayfasına geçmeden bir önceki sayfalarda fiyatlar ve miktalar değiştirilerek ödeme sayfasına yönlendirme işlemleri idi. Kısaca uygun bir kontrol yapılmadan saldırganın bizi pishing ya da malware sitesine yönlendirmesidir.
Korunmak içinse yönlendirmelerden kaçınmalıyız. Eğer yapmak zorundaysak kullanıcılardan aldığımız veriler doğrultusunda yapmayınız.

Kodlarımızı Daha Güvenli Yapabilmek İçin 7 Öneri

1)Asla Kullanıcı Girdisine Güvenme

Bu yazıyı okuyorsanız aklınızda kalması gereken en önemli şey budur. Asla kullanıcı girdisine güvenmeyin. Çünkü saldırıların büyük bir çoğunluğu bu taraftan gelir. Eğer dış dünyadan aldığımız her verinin doğru ve kötü niyetsiz olduğuna inanırsak ilk sorunumuz orada başlar. Çünkü saldırganlar tarafından kullanılan bir çok güvenlik açığı sunucuya kendi işlerine yarayacak kötü bir mesaj göndermle kırılır.
Inputlara güvenmek ve bilgilerin doğru formda olduğuna koşulsuca inanmak buffer taşmasına, cross side scriptinge, SQL Injectiona ve bunun gibi bir çok soruna neden olabilir.

2)Buffer Taşmalarından Korunun

Buffer taşması saldırganın programa programın beklediği değerden daha büyük bir değer vermesi  sonucunda değişkenin ayrılmış olan memory alanina sığmamasıdır. Ya da programlama yaparken ufak bir gözden kaçma sonrasında da oluşabilir. Programcı ne kadar tecrübeli olursa olsun bu hatalara dikkat etmelidir. Bir buffer taşması sonucu uzaya gönderilmiş olan bir uzay gemisi parçalanmıştır. Görüldüğü gibi küçük bir olaymış gibi gözüksede sonuçları çok büyük olabiliyor. Bu kadar büyük sorunlara yol açabilmesine ragmen genellikle buffer taşmasının çözümü oldukça basittir. Genelde biraz dikkatli olarak ve alınan değerlerin aralıklarını belirleyerek üstesinden gelinebilir.
Bu olaylara mahal vermemek için yapılması gereken en önecelkli şey unsafe kodlara izin vermemektir.


3)Cross-site Scriptlerden Korunun

Croos side scriptleri webe özel güvenlik açıklarından biridir. Aşağıdaki kod parçasına bakmak istersek;


Böyle masum gibi görünen bir kodun aslında saldırıya açık bir kod bloğudur. Normlde, kullanıcı bu tür bir koda aşağıdaki gibi bir URL ile birlikte ulaşırlar:


C# yukarıdaki script kodundan aldığı verileri iyi formda ve sadece name değerinden başka bir şey almayacakmış gibi düşünür. Fakat saldırganlar bu kodu istismar ederler ve name değeri yerine tıpkı bir name değeriymiş gibi bir script girerler;


Eğer yukarıdaki adresi adres çubuğuna girersek önümüze içeriğinde hi! Yazan bir dialog box ın çıktığını görürüz. Bu ne demek peki. Bu saldırganın bizim web sitemize istediği gibi müdahale edebilmesi anlamına geliyor. Belki böylesine zararsız bir kod için çok bir önemi olmayabilir fakat bir de olaya şu açıdan bakın. Bu web sitesinin bir bankanın web sitesi olduğunu ve yazılan scriptin internet şubesine giriş butonunu etkilediğini düşünelim.




Kullanıcı giriş butonuna tıkladığı zaman aynı bankanın internet şubesi arayüzüne bağlanır gibi fakat saldırganın önceden hazırladığı bir web sitesine yönlendirir.




Web sitesi tıpkı bankanın sitesine benzediğinden kullanıcılar çoğunlukla gerçek web sitesiyle arasındaki farkı anlayamazlar ve güvendikleri için bilgilerini girmeye başlarlar. Bunun sonucunda da girilen bilgiler saldırgan tarafından ele geçirilmiş olur. Elbette bankalarımızın güvenliği bunların çok daha üstünde güvenlik tedbirleri alınarak yapılıyor fakat bu örneks durumun vahammiyetini daha iyi kavrayabilmemiz içindi.
Peki cross side scripting den kodumuzu nasıl koruyacağız. Bu olayın başımıza gelmesini engelleyebilmemiz için iki yöntem öneriliyor. İlki ve yazımızda da ilk olarak değindiğimiz konu olan asla kullanıcı girdisine güvenme ve girdinin ne içermesi gerektiğini katı bir şekilde belirle. Örneğin; bu işi gerçekleştirmek için regular expressionları kullanabiliriz. Regular expressionlarla kullanıcının girdisini kısıtlayarak bu işlemi yaparız. Aşağıdaki c# kodu bu işi nasıl yapabileceğimizi gösteriyor.

Regex r=new Regex(@”^[\w]{1,40}$”);
If(r.Match(strName).Success)
{
         //String Kısıtlara uyar
}
else
{
         //String kısıtlara uymaz
}

Bu kodumuzda regular expressionları kullanarak stringimizin 1 ile 40 alfanumerik karakterler arasında kalmasını sağlıyoruz. Kullanıcının girdisini kontrol etmenin en güvenli yolu budur. Bu işlemi terstende uygulayabilirsiniz. Yani yasak karakterleri teker teker yasaklayarak. Fakat burada unutulmaması gereken bir husus var ki bu işlem yapılırken yapacağımız ufak bir dikkatsizlik saldırı yememize neden olabilir. Bu yüzden izin verilmeyen karakterleri yasaklamak yerine izin verilen karakter olup olmadığına bakmak daha güvenli bir yoldur.
Bu saldırıları önlemenin ikinci yoluysa bu özel karakterleri daha güvenli karakterlerle değiştirme yöntemidir. Ama birinci yöntem kesinlikle daha güvenlidir.

4)Asla sa İzniyle Hareket Etme

Şimdi de biraz SQL Injectionları inceleyelim. Bilindiği gibi birçok yazılım geliştirici kullanıcılardan değer alarak very tabanı üzerinde bu değerlerle birlikte işlem yaparlar.
Aşağıdaki kodu biraz inceleyelim;

void DoQuery(string Id) {
    SqlConnection sql=new SqlConnection(@"data source=localhost;" +"user id=sa;password=password;");
    sql.Open();
    sqlstring= "SELECT hasshipped" +
            " FROM shipping WHERE id='" + Id + "'";
    SqlCommand cmd = new SqlCommand(sqlstring,sql);

Birçoğumuz yukarıdaki gibi bir kod yazmıştır muhtemelen. Fakat bize tanıdık gelen bu kod aslında o kadar da masum değil. 3 kusuru var bize tanıdık gelen bu kodun. İlk olarak, database e ulaşım system administrator(sa) hesabı kullanılarak yapılmaya çalışılmış. Sa hesabı için belirlenen mükemmel şifremiz password olarak belirlenmiş. Ama bunlara rağmen bu koddaki asıl sorun string birleştirme işlemi yaparak SQL statementı oluşturuyor olmasıdır. Bu durumda eğer kullanıcı Id değeri için 1001 yazarsa ve bu string işletilirse hiçbir sorun çıkmaz ve muhtemel olarak aşağıdaki gibi bir kod işletilir.

SELECT hasshipped FROM shipping WHERE id = '1001'

Maalesefki saldırganlar bu kadar iyi niyetli değil. Id=1001 yazmak yerine aşağıdaki gibi bir kod işletmeyi deneyebilirler;
SELECT hasshipped FROM
shipping WHERE id = '1001' 
DROP table shipping -- ';

Yukarıdaki sorgu istediğimiz select işlemini yapıyor olmasına rağmen devamında gelen kodlar sayesinde shipping tablosunuda siliyoruz ki bu istemediğmiz bir olay. – operatorü sayesinde sonrasında gelen kodlar yorumlanmıyor. Biraz once sa olarak veri tabanına bağlanmıştık ve şimdide bir tablo sildik. Peki bu tür bir olay sadece select yetkisi verilmiş bir username ile veritabanına bağlanılmış olsaydı başımıza gelirmiydi. Cevap çok basit tabiki hayır. Bu yüzden veri tabanına bağlanırken dikkat edilmesi gereken en önemli konulardan biri veri tabanına asla system administrator yetkisiyle bağlanmamaktır.
Peki nasıl SQL Injection yemekten koruyabilriz kodumuzu. Bunun için dinamik sql kodları kulanmak yerine stored procedure lar kullanmak en akıllıca olan yollardan biridir. Tabiki yine bir numaralı altın kuralımızı unutmayarak kullanıcı girdilerinin istediğimiz formatta olup olmadığını da control etmeliyiz. Örnek kod;

Regex r = new Regex(@"^\d{4,10}$");
if (!r.Match(Id).Success)
    throw new Exception("Invalid ID");

SqlConnection sqlConn= new SqlConnection(strConn);
string str="sp_HasShipped";
SqlCommand cmd = new SqlCommand(str,sqlConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@ID",Id);

Unutmayalımki cross-side scripting, buffer overruns ve SQL Injection ların hepsi kullanıcı girdisine güvenme sonrasında çıkmıştır. Bu yüzden altın kuralımızı her zaman hatırlamalıyız.

5)Asla Kendi Ürettiğin Encryption Sistemini Kullanma

Eğer bir kriptolama işlemi yapıcaksanız asla kendi ürettiğiniz kripto algoritmasını uygulayarak yapmayın. Pek çok insan kendi ürettikleri kripto algoritmalarının kırılmasının çok zor olduğunu düşünerek bu tür bir yolu seçerler fakat yanıldıkları en büyük nokta kriptoladıkları kodların muhtemelen birkaç dakika içerisinde kırılabilecek düzeyde olmasıdır. Bu yüden c# dilinde kriptolama işlemi yapacaksak kripto kütüphanelerini kullanmamız daha iyi sonuçlar doğuracaktır.


6)Least Privilage Prensibine Uyun

İşletim sistemleri ve common language runtime(C# kodumuzun makine diline çevirildiği yer) bir çok nedenden dolayı güvenlik prensiplerine sahiptir. Bunun da temel amacı kullanıcıların erişime yetkisi olmayan yerlerde verilere ulaşmalarını engellemek ve kötü niyetli kişilerin veriliremizle oynamasını engellemektir ve genellikle bunu serilization işlemlerini engelleyerek yaparlar. Güvenlik prensiplerini kodumuzu çevreleyen bir duvar şeklinde düşünebiliriz. Erişime izni olanları içeriye alır, izni olmayanları duvar dışında bırakır.
Yukarıda söylediğim güvenlik prensipleri dışında bize düşen bazı görevler daha vardır. Burada asıl amaç hiçbir zaman gereğinden fazla yetkiyi vermemektir. Şöyle bir örnek düşünelim;
Elimizde veritabanımızdaki verileri gösteren bir yapı olsun. Burada amacımızı gerçekleştirebilmemiz için bize sadece vritabanımızdan select yetkisi almış olan bir connection yetecektir. Çünkü tüm yapmak istediğimiz verileri veritabanından çekmektir. Eğer bir şekilde kötü niyetli bir kişi web sayfamızın diger açıklarından faydalanıp oynamalar yapmaya çalışıyorsa tek yapabileceği bizim kullanıcılara göstermiş olduğumuz verileri alabilmektir. Asla veriler üzerinde değişiklik yapamaz. Ama bu örneğimizde veritabanına erişim yetkimizi sadece select olarak değilde update ve delete de dahil olacak şekilde bir yetki vermiş olsaydık işte o zaman kötü niyetli saldırgan verilerimizi değiştirebilr ve bizim istediğimiz verilerimizi sergilememizi engeleyebilirdi. Hatta ve hatta daha ileriye giderek veritabanımızdaki verilerimizi silebilirdi bile.
İşte yukarıdaki gibi durumlara maruz kalmamak için her zaman işlerimizi yapabileceğimiz en düşük yetki seviyesinde yapmalıyız. Her zaman least privilege ilkesine uymalıyız.

7)Hata Denetimine Yeterli Önemi Ver

Bu yazıyı okuduğunuza gore kod yazma işine bir tarafından dahil olduğunuzu düşünüyorum. Hepimiz kod yazıyoruz öyle değil mi? Peki kaçımız bu yazdığımız kodların test kısmına gerekli önemi veriyoruz ya da error handling mekanizmalarını yeterince kullanıyoruz. Bu üzerinde genellikle yüzeysel olarak durduğumuz konulardan. Oysaki en az yukarıda konuştuğumuz durumlar kadar önemli bir durum bu.
Test edilmeden kullanılan programlar genelde büyük güvenlik açıklarına sahiptirler. Bu güvenlik açıklarına maruz kalmamak için kodlarımızın test bölümüne yeterli önemi vermeliyiz. Elbetteki bütün şartlar için test edemeyiz fakat ne kadar çok test yaparsak ileride programımızın çökme olasılığı da o derecede iner. Ne kadar az test yaparsakta güvenliğin temel ilkelerinden olan sürdürülebilirliği sağlamamız da o derece zorlaşır.
Bir de kodlarımızı yazarken error handling sağlayabilmemiz için gerekli yerlerde try-catch bloklarını koymaya özen göstermeliyiz. Olağan dışı oluşan durumlarda ya da olası olusabilecek hatalarda programımızın çökmesi ya da yanlış çalışması yerine bir uyarı mesajı vererek progamımızın güvenilirliğini artırmamızı sağlar.

Kaynaklar








30 Aralık 2010

Posted In: Gezegen, Guncel ve Teknoloji, microsoft

Ubuntu LAMP

Giriş
LAMP, Linux Apache Mysql PHP kısaltması olarak aklımızda kalıyor. Bazı yerlerde P yerine PHP'den başka bir dil gelebilir ama bu yazıda PHP'yi anlatacağız. Günümüzde çoğu Linux dağıtımı temel ayarlarla gelmektedir, ben Ubuntu 10.04 LTS kullanıyorum ve temel Birkaç ayarı burada anlatmaya çalışmayacağım, uzmanlar anlatsın :) Aslında kendime not almak için yazıyorum bu yazıyı ama belki ihtiyacı olan vardır diye blogda yayınlıyorum tutorial kıvamında, yanlışım varsa şimdiden affola, yorumlarla bana düzelttirile!

Apache Web Sunucusu Kurulumu ve Ayarları
Apache günümüzde en yaygın olarak kullanılan web sunucularından birisidir. Bu yüzden apache ile ilgili bir çok doküman bulmak mevcut bu kısımda ayrıntıya girmeden apache kurulumu ve yapılandırılmasından bahsedeceğim. Öncelikle sisteminizde ki paketleri güncelleyin.
apt-get update
apt-get upgrade --show-upgraded
Ubuntu üzerinde apache’yi kurmak için aşağıdaki komutu kullanın. Bu komut apache version 2 serisini bilgisayarınıza kuracaktır.
apt-get install apache2
Bu işlemi tamamladıktan sonra sanal konaklama(Virtual Hosting) ayarlarını yapacağız.

Sanal Konaklamayı Ayarlamak
Öncelikle /etc/apache2/ports.conf dosyamızı kontrol edelim. Ben bu dökümanı hazırlarken içersinde
NameVirtualHost *:80
Listen 80
değerleri yazılmış ve hazır şekildeydi. Burada 80. portu dinlediğimizden ve sunucumuzun tüm ipleri dinlediğiden emin oluyoruz. Ardından açacağımız site için /etc/apache2/sites-available/ dizinine bir dosya oluşturuyoruz. Örnek olarak:
touch siteminadi.com
Bu dosyayı vim ile açıyor ve düzenlemeye başlıyoruz:
VirtualHost *:80>
ServerName www.siteminadi.com
ServerAlias siteminadi.com
DocumentRoot /srv/www/siteminadi.com/dosyalarhangidizindeyse/
ErrorLog /srv/www/siteminadi.com/logs/error.log
CustomLog /srv/www/siteminadi.com/logs/custom.log
/VirtualHost> (VirtualHostların başında < şu işaret var ama burada yazınca blogger sapıtıyor)

ServerAlias kullanıcılarınızın sitenize erişmek için kullandığı adresleri içerir, Log dosyaları sitenizin kayıtlarını tutar, document root sitenizi barındırdığınız dizini adresler, servername hangi barınağın hangi adrese gideceğini belirler. Elbette bunları buraya yazmanız direkt çalışacağı anlamına gelmez, DNS'lerini düzggün bir şekilde sunucunuzun IP'sine yönlendirmeniz gerekir. Bundan böyle sunucunuza bir istek geldiğinde önce izin verilen iplerden birisi olup olmadığına bakılır ardından uygun servername aranmaya başlanır ve bulunduğunda bu documentrootta bulunan içeriğe yönlendirilir. Bu dosyayı oluşturduktan sonra ya da önce belirttiğiniz dizinleri oluşturmanız gerekir, yoksa apache hata verir.

mkdir -p /srv/www/siteminadi.com/dosyalarhangidizindeyse
mkdir /srv/www/siteminadi.com/dosyalarhangidizindeyse/logs

Eğer dosyalar zaten ayarlıysa şu komut ile siteyi aktif hale getirirsiniz
a2ensite siteminadi.com
Bu komutla dosyanız sites-enabled dizine kopyalanır ardından apache'yi restart ederek ya da reload ederek siteyi açarsınız.

/etc/init.d/apache2 restart
/etc/init.d/apache2 reload
Mysql Kurulumu ve Ayarları
Öncelikle şu komutu çalıştırın

apt-get install mysql-server

Kurulum sırasında sizden root şifrenizi ayarlamanız istenir, bir şifre belirleyip not ediniz.
Mysql başlı başına bir konudur ama biz sadece bir veritabanı oluşturacağız şu komutla mysql sistemine giriş yaparsınız

mysql -u root -p

Şifrenizi girmenizi isteyecek root şifrenizi girip giriş yapınız.
Database oluşturmak için aşağıdaki komutu kullanın, sonuna ; işareti koymayı unutmayın, mysql'de komutlar ; işareti ile biter.

create database benimdb;

Database oluştu üzerinde bir kullanıcı oluşturup tüm haklarını bu kullanıcıya vermek için aşağıdaki komutu yazınız kullanıcı adı dbadmin şifre 12345 yaptım, siz daha düzgün bir şey seçersiniz.

grant all on benimdb.* to 'dbadmin' identified by '12345';

Flush komutuyla ayrıcalıkları güncelliyoruz.

flush privileges;

İşimiz bitince çıkış yapıyoruz

quit
PHP Kurulumu ve Ayarları
PHP bir programlama dilidir ve LAMP rehberinde onun kurulumunu anlatacağız. Şu komutla kurulumu yaparsınız.

apt-get install php5 php-pear

İsterseniz şu adresteki ayar dosyasını güncelleyebilirsiniz, başlangıç seviyesi kullanıcılar gerekmedikçe bu dosyayı güncellemek zorunda değildir. Çoğu ayar standart şekilde zaten yapılmıştır. Bir değişiklik yaparsanız Apache'yi restart etmeniz gerekir.

/etc/php5/apache2/php.ini

Mysql desteği için şu paketi kurunuz böylece PHP ile Mysql güzelce anlaşmaya başlar, Apache ise zaten PHP'nin dilinden çok iyi anlar ve kısaca LAMP kısmını geride bırakırız.

apt-get install php5-mysql libapache2-mod-auth-mysql

Grafiksel araçlar, çeşitli ayarlar bunların hepsi sonra yapılabilir ama öncelikli olarak sunucunuz artık bu bileşenlere sahiptir. Ayrıntılar vakit bulursam belki ileride burada yayınlanır. Okuduğunuz için teşekkürler

Kaynakça:

http://httpd.apache.org/docs/2.0/en/vhosts/name-based.html

http://library.linode.com/lamp-guides/ubuntu-10.04-lucid/

https://help.ubuntu.com/community/ApacheMySQLPHP

24 Aralık 2010

Posted In: apache, lamp, linux, MySQL, php, ubuntu

Google Chrome OS Kotu

Vallaha ben Richard Stallman`in yalancisiyim. Kendileri GNU foundation in kurucusu olmaktalar. Stallman`a gore Google Chrome OS ya da bu tur cloud mantigini kullanan uygulamalar, isletim sistemleri aslinda kullanicilarin iyiligi yonunde gorunselerde kullanicilar icin kotu durumlar soz konusu. Dosyalarimizin cloud uzerinde bulunmasinin dosya gizliligimizi tehlikeye attigini soyluyor. Ayrica dosylarimiz uzerindeki butun insiyatiflerimizde ayni zamanda service providerin eline gecmis bulunuyor. Iznimiz disinda bu dosyalari okuyabilir, degistirebilir, silebilir ya da baska makamlara servis edebilirler. (Buradan sonrasi benim yorumum:) Bana oyle geliyorki eskiden sadece kimlik bilgilerimiz sirketlerin degerlerine deger katarken artik kisisel dosyalarimizda zenginlik katacak.

21 Aralık 2010

Posted In: Geyik ve Ben, Gezegen, linux

Linux’u kimler geliştiriyor

Linux çekirdeğinin kimler tarafından geliştirildiğini elbet merak etmişsinizdir. Şahsen ben ediyordum Linux Vakfı her yıl yaptığı gibi Linux çekirdeği'ne katkıda bulunanlar ile ilgili bir rapor yayınladı. Kernel geliştiricilerinden Joe Corbet, Greg-Kroah Hartman ve Linux Vakfından Amanda McPherson tarafından hazırlanan rapor göze çarpan detaylardan biri de taşınabilir cihazlar/gömülü sistemlerin çekirdek geliştirme sürecinin önemli parçaları haline gelmeleriydi.
İlk beşe geçmeden önce iki farklı çekirdek sürümü (2.6.12 ve 2.6.30) için verildiğini belirteyim.
Ve İlk Beşimiz 
(Özgün Yazı bağımsız geliştiricileri 1. kabul etmeden şirketler arası bir karşılaştırmaya gitmiş değiştirmeyeceğimi belirtmek isterim )
Pastadan en büyük payı %20 ile her zaman ki bağımsız geliştiriciler alıyor. Üzgünüz troller bağımsız geliştiriciler hala bolca mevcut. İyi ki varlar.
RedHat 2.6.12 için %12.4 ve 2.6.30 içinse %12 ile ikinci sırada aslında her sürümde geliştirici sayısının %10 civarlarında arttığını düşünürsek RedHat 'in pastadan alacağı pay düşmeyecek gibi duruyor.
İşlerin Novell için iyi gitmediğini söyleyebiliriz 2.6.12'de katkı oranı %7 iken 2.6.30'da %5'e düşerek yerini İntel'e (%7.8) kaptırıyor ve üçüncü sıraya düşüyor.Bunu da İntel'in X.org ve MeeGo üzerindeki çalışmalarına rahatlıkla bağlayabiliriz.
İntel'in yerinden ettiği başka bir isimde IBM ki o da İntel'in eski sırası olan dördüncü sıraya yerleşiyor.
Beşincilikte sürpriz bir firma olarak Nokia'yı görüyoruz ki kendileri 2009'ta  SGI, Parallels, ve Fujitsu'nun gerisindeydi.


Kişisel olarak bakarsak 2.6.30 için ilk beşi Paul Mundt (Reneseas),Johannes Berg (İntel),Peter Zijilstra (RedHat),Bartlomiej Zolnierkiewicz (Varşova Teknik Üniversitesi),Greg Kroah-Hartman (Novell)
olarak sıralayabiliriz.
Torvalds niye bu listede yok diye sorarsanız.Torvalds kendisi kod yazmaktan çok başkaları tarafından girilenlerle ilgileniyor.Önemli bir iş ancak ölçülmesi biraz zor.


Açık kaynak Java'ya ve Google'a karşı olan antagonizmi ve Sun'dan aldığı özgür yazılım projelerindeki yanlış politikalarıyla ağırca eleştirilen Oracle'a gelirsek oranlar biraz düşse (2.6.12'de %2.3'tü) de %1.9 ile çekirdek gelişimine saygıdeğer bir katkıda bulunuyorlar.
En yaygın masaüstü Linux dağıtıcısı Canonical çekirdeğe kayıtlara geçebilecek bir katkıda bulunmadığını görüyoruz.Görünüşe göre Canonical Linux çekirdeğine katkı vermeden de başarılı olabiliyor ancak gene de Canonical'in başka alanlarda da olsa Linux'a değerli katkılarda bulunduğunu vurgulamakta fayda görüyorum.
Nokia'nın yükselişinde gömülü sistemler üzerindeki çalışmalarının büyük rol oynadığını görüyoruz.
Sunucu piyayasının ardından gömülü sistemler piyasasının da Linux ile ilgilenmesi elbette ki güzel bir gelişme.
Nokia'nın katkı miktarını ikiye katlamasının ardından gömülü sistemler konusunda çalışma yapan Wolfson MikroElektronik ve Reneseas teknoloji de ilk defa ilk 20'ye girdi.Listeye giren firmalardan biri de Texas Insruments. Linux'la çalışan hesap makinesi güzel değil mi sizce de.  Broadcom ve Atheros'da ilk 20'ye girdi .Bu güzel bir gelişme çünkü Linux'un donanım desteğinin gün geçtikçe artabileceğı anlamına da geliyor.
Düş kırıklığına uğradığımız bir nokta ise bir internet devi olan Google'ın (2.6.30 sürümünde) ilk 20'ye girememesi oldu (%0.7). Bu oran 2.6.12'de %0.8'di. Google'ın Pengutronix'in bile altında Allah aşkına daha önce Pengutronix'i duyanınız var mı ? Hayır mı ? Ben de duymadım. Linux'tan en çok faydalanan (Linux tabanlı iki işletim sistemi geliştiren büyük olasılıkla yer yüzünde en çok Linux sunucusu bulunan) bir firmanın Linux'a bu kadar önemsiz katkılarda bulunması üzücü.


Bu gelişmelerin ardından 2011 ilginç bir yıl olacağa benziyor eğer Google Android için yaptığı değişiklikleri çekirdeğe eklerse sıralamadaki yeri ciddi bir biçimde artacağa benziyor.Novell'i geride bırakan İntel'in bu konu da geleceği parlak gözüküyor. Nokia'nın sırasının yükselmesiyle İntel Nokia ortaklığıyla geliştirilen MeeGo gücüne güç katacak gibi gözüküyor.
Son olarak Linux çekirdek gelişimi sağlıklı bir şekilde sürüyor.Çekirdek her ne kadar çok önemli de olsa özgür yazılım ekosistemin sadece bir parçası. GNU araçları Apache gibi diğer kritik sistemler ile ilgili benzer raporlar görmek için sabırsızlanıyorum


Kaynak: Linux Dergisinin 7 Aralık'ta yaptığı haber
Dipnot:Çeviri konusunda pek deneyimli değilim zaten yazıya birebir bağlı kalmaya da çalışmadım hatalarım için uyarabilirseniz sevinirim

12 Aralık 2010

Posted In: Gezegen, gnu/linux

Droid Draw

Merhaba arkadaslar. Bugun sizlere Android programlama yaparken işinize yarayabılecek ufak bır programcıktan bahsedeceğim. Programın adı droid draw. Program bizlere kolaylıkla, sürükle bırak yontemiyle gui yapabilmemizi sağlıyor. Tüm yapmanız gereken ekranınızın nasıl göründüğünü ayarladıktan sonra Generate butonuna basmak ve uretılen kodu Main.xml dosyasının içerisine yapıştırmak:)

Yukarıda da programın ekran görüntüsü bulunmaktadır. Programı indirmek için web sitesine göz atabilirsiniz.

8 Aralık 2010

Posted In: android, Gezegen

Versiyon yönetim sistemi olarak GiT kurulumu ve kullanımı

Uzun süredir şirket ve kişisel projelerimde Subversion'u (SVN) kullanıyorum. Genel anlamda SVN'den oldukça memnundum fakat branching ve merging işlemlerinin sıkıntılı olması ve projeler büyüdükçe önemli ölçüde yavaşlama yaşandığı için SVN'i GiT ile değiştirme ve var olan SVN repository'lerini GiT'e taşıma kararı aldım. GiT'in diğer versiyon yönetim sistemlerinden iyi olduğu noktaları http://whygitisbetterthanx.com/ adresinden detaylıca inceleyebilirsiniz. Benim açımdan önemli olanlarını şu şekilde sıralayabilirim;

  • GiT gerçekten ama gerçekten çok hızlı
  • GiT kaynak depoları disk üzerinde çok az yer kaplıyor
  • GiT ile branching ve merging işlemleri kolay ve hızlı
  • GiT offline olarak kullanılabiliyor
  • GiT distributed (dağıtık) olduğu için her bir geliştiricinin makinesinde proje bütün geçmişi ile birlikte tutulabiliyor. İlk bakışta bunun işlemleri yavaşlattığı ve disk israfı olduğu düşünülebilir fakat GiT'in oldukça etkin algoritmalar kullanması sayesinde bu sorunlar hiç yaşanmıyor. 
GiT komutlarıyla ve genel yapısı ile ilgili detaylı bigiye GiT'in resmi dokümantasyonundan veya ücretsiz Pro GiT  kitabından ulaşabilirsiniz. Bu makalede Linux Ubuntu yüklü bir sunucu üzerinde özel bir GiT repository'sini nasıl oluşturabileceğinizi ve bunu diğer geliştiricilerle nasıl paylaşabileceğinizi anlatmaya çalışacağım. Buradaki komutlar veya işlemler diğer Linux sürümlerinde veya Windows üzerinde cygwin yardımıyla ufak değişiklikler ile çalıştırılabilir.

GiT'i ve GiT üzerinde repository oluşturulması ve yönetilmesi işlemlerini kolaylaştıran gitosis programını kurmak için sırasıyla sudo apt-get install git (veya git-core) ve sudo apt-get install gitosis komutlarını çalıştırmamız gerekiyor. Kurulumlar tamamlandıktan sonra sudo add user --system --shell /bin/sh --gecos ‘git user’ --group --disabled-password --home /home/git komutunu çalıştırdığımızda gitosis'in çalışması için gerekli olan git kullanıcısı sisteme eklenecektir. 

Kendi GiT repository'imizi oluşturmaya başlamadan önce sunucu üzerinde yapmamız gereken son işlem ise gitosis'e GiT projelerini yönetecek geliştiricinin ssh public anahtarını tanıtmak.  İlk olarak GiT repository'lerini yönetecek geliştiricinin makinesi üzerinde ssh-keygen -t rsa komutunu çalıştırmamız ve oluşturulan public anahtarı sunucuya kopyalamamız (/tmp klasörünü tavsiye edilir) gerekiyor. Daha sonra ise sunucu üzerinde sudo -H -u git gitosis-init < /tmp/rsa_key.pub komutunu çalıştırdıktan sonra tanıttığımız ssh public anahtara sahip olan bilgisayar üzerinden bütün GiT repository işlemlerimizi yapabiliriz. (Sunucudan ayrılmadan önce /home/git/repositories/gitosis-admin.git/hooks/post-update dosyasının çalıştırılabilir olduğunu mutlaka kontrol edin)

Geliştirme için kullandığınız bilgisayar Linux ise GiT'i kurmak için kullandığımız komutları kullanarak, eğer Windows veya Mac os x ise http://git-scm.com/ adresinden ilgili programları kullanarak GiT'i kurabilirsiniz. 

Gitosis oldukça akıllı bir şekilde bize GiT kullanarak GiT repository'lerini yönetme imkanı sağlıyor. Bunun için gitosis-admin repository'sini aşağıdaki komutlarla kendi makinemize almamız gerekiyor.

cd /home/mhazer
mkdir gitosis-admin
git clone git@sunucu_ismi:gitosis-admin.git

Sonraki aşamada gitosis-admin klasörü altında gitosis.conf dosyasına aşağıdaki şekilde değiştirip sunucuya göndermemiz gerekiyor.

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = mhazer@Bim247

[repo myRepo]
gitweb = yes
daemon = yes
description = myRepo GiT
owner = Murat HAZER

[group myRepo_group]
members = mhazer@Bim247
writable = myRepo

gitosis.conf dosyasını yukarıdaki şekilde değiştirip kaydettikten sonra gitosis-admin klasörü altında 

git commit -am "yeni myRepo tanımları" 
git push .

komutlarını çalıştırdıktan sonra GiT sunucusu üzerindeki ilk değişikliğimizi de yapmış olacağız. Bu komutlardan sonra hâlâ yeni GiT repository'imiz sunucu üzerinde oluşturulmamış olacak.  Bunun için;

mkdir /home/mhazer/myRepo
cd /home/mhazer/myRepo
git init
git remote add origin git@sunucu_ismi:myRepo.git
git push origin

komutlarını çalıştırmamız gerekiyor. GiT push işleminden sonra sunucu üzerinde /home/git/repositories/myRepo klasöründe GiT repository'si gitosis tarafından oluşturulacak. Bundan sonra /home/mhazer/myRepo klasörü altında oluşturduğunuz veya değiştirdiğiniz dosyaları git commit ve git push komutlarıyla sunucuya gönderip diğer geliştiricilerle paylaşabilirsiniz.

Yeni geliştiricilere myRepo repository'sine erişim hakkı vermek için yeni geliştiricilerin makinelerinde ssh-keygen -t rsa komutunu çalıştırdıktan sonra oluşan ssh public anahtarlarını daha önce gitosis-admin altındaki keydir klasörüne kopyalamamız ve gitosis.conf dosyasını aşağıdaki şekilde değiştirip GiT sunucusuna göndermemiz gerekiyor. (yeni geliştiricinin ssh public anahtarının yeniDev@Bim211 olduğunu farz edersek)

copy yeniDev@Bim211.pub /home/mhazer/gitosis-admin/keydir 

[group myRepo_group]
members = mhazer@Bim247 yeniDev@Bim211
writable = myRepo

cd /home/mhazer/gitosis-admin
git commit -am "yeni geliştirici tanımı"
git push .

SVN repository'lerinin GiT'e taşınması ve online GiT repository sunucularından olan github üzerine ilerleyen günlerde ilerleyen günlerde bahsetmeye çalışacağım.

4 Aralık 2010

Posted In: Gezegen, git, linux, Versiyon Kontrol

Twitter Auto Publish Powered By : XYZScripts.com