Web Programlamasında Güvenlik
İlk üç adımı uygulamanıza rağmen hala sisteminizde programlamadan kaynaklanan açıklar olabilir. Bunlarıda bir kaç başlık altında toplayalım.
a)Hazır portal ve forumlarda güvenlik
Web sitenizde hazır portal veya forum kullanıyorsanız sürekli olarak kullandığınız portalın/forumun sitesini ziyaret edin ve güncellemeleri elinizden geldiğince yapmaya çalışın. Çünkü genelde bir çok versiyonda sitenizin ele geçirilmesini sağlayacak açıklar mevcuttur. Bunların yamalarını ve açıkları yazılımın kendi sitesinden öğrenebilirsiniz. Ayrıca b-2 deki database güvenliğinede bakınız.
b)Kendi Yazdığınız Sistemlerde Güvenlik
b-1) Kodlama Hataları
Sisteminizi yazdınız ve sorunsuz çalışıyor. Herşey yolunda ama yaptığınız veya eklemeyi unuttuğunuz bir kaç kod yüzünden sitenizde bazı açıklar mevcuttur. Ve malesef saldırganlar bu açıkları kullanarak sisteminize girebilirler ve zarar verebilirler. Peki bunlar nelerdir?
b-1-1) Login Panelleri
Saldırgan öncelikle login panellerinde bir kaç kod deneyerek database’inizin yonu bulabilir ve sızıntılarla datebase’den sizin veya üyelerinizin bilgilerini ele geçirebilir. Genelde ‘or 1=1 tarzında kodlamaları bu panellerde deneyerek SQL injection yapmaya çalışırlar. O yüzden bu tür kodları kabul etmeyen ayıklan bir sistem yazmalısınız. Bu tarz kodlamaları girince sisteminizin iç hata vermemesi lazım. Ayrıca login panellerinde deneme yanılma yöntemleriyle kullanıcı adı ve şifrenizi ele geçeribilirler. Bunu önlemek için mümkünse güvenlik kodu uygulaması yapmanız iyi olacaktır. Ayrıca birkaç yanlış denemeden sonra ip adresini banlarsanız buda işe yarar.
b-1-2) Haber/Yorum Ekleme
Login panellerinde olduğu gibi haber ve yorum ekleme scriptlerinde sızıntıları önlemeniz gerekir. Asla bu bölümler kod kabul etmemelidir.Yoksa kullanıcı yorum yada haber olarak bir kod ekleyerek sitenizin o sayfasını başka bir sayfaya yönlendirebilir. Burdada yapmanız gereken bu tür kodları kabul etmeyen bir sistem yazmaktır.
b-2) Database Güvenliği
Database’iniz mutlaka şifre korumalı olsun. Eğer access veritabanı kullanıyorsanız. Veritabanınızı hostinginizde bulunan db klasörü içine koyun. Bu klasörden database’inizi indiremezler. Hazır kullandığınız scriptlerdeki dblerin adlarını ve yollarını mutlaka değiştirn. Bu saldırganın db yolunuzu öğrenmesini ve sızmasını engeller.
Evet bu yukarda yazılanları yaptıkdan sonra tahminimce siteniz %90 güvende olur. Ama asla %100 olmaz. Çünkü hack için mutlaka bir yol vardır. Tabi bunu yapabilecek kişilerde sayılıdır. Asla bütün üyeliklerinizde aynı şifreyi kullanmayın. Ayrıca eğer sitenizde sizden başka yönetici / editör varsa onlarıda mail güvenliği konusunda uyarın. Ben bu yazılanlarının bir kısmını uygulamıyorum. Kendinize düşman edinmemeye çalışın ve saldırganlara sitenizi ele geçirmek için bir sebeb vermemeye gayret gösterin. Mutlaka bu yazılanlarada eklenmesi gereken şeyler vardır. Sizde bildiklerinizi bu postun altına eklerseniz güzel bir kaynak olur.
Genel Server Güvenliği
%100 server güvenliğini sağlamanın tek yolu o serverın fişinden geçmektedir. En güvenli server fişi çekik serverdır.Bunun dışındaki tüm methotlar sadece server güvenliğini arttırmak içindir. Aşağıda server güvenliği ile ilgili verilmiş bilgiler genel bilgiler olup kullanıcıya göre değişebilmektedir.
vi, pico vb editorler kullanılarak aşağıdaki satırlar /etc/sysctl.conf içine eklenmelidir
# disable packet forwarding net.ipv4.ip_forward = 0 # enable source route verification
net.ipv4.conf.all.rp_filter = 1 # ignore broadcast pings
net.ipv4.icmp_echo_ignore_broadcasts = 1 # enable syn cookies
net.ipv4.tcp_syncookies = 1 # size of syn backlog
net.ipv4.tcp_max_syn_backlog = 512 # disable automatic defragmentation #
set max files fs.file-max = 32768 # Enable IP spoofing protection, turn on
Source Address Verification net.ipv4.conf.all.rp_filter = 1
# Enable TCP SYN Cookie Protection net.ipv4.tcp_syncookies = 1
# Enable ignoring ping request net.ipv4.icmp_echo_ignore_all = 1
Bu ne yapar?
Bu kodlar linux işletim sisteminin kendisi tarafından kullanılmaktadır. Bu kodlar sisteme ping, icmp, isteklerini
redetmesini ve SYN korumasını devreye alınmasını, network forwarding in engellenmesini sağlar. Ancak bu değişiklik
yapıldıktan sonra server reboot edilmelidir.
/etc/rc.local, içine aşağıdaki kod eklenmelidir
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > done
echo 1 > /proc/sys/net/ipv4/tcp_syncookies for f in /proc/sys/net/ipv4/conf/*/accept_source_route;
do echo 0 > done echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
Bu kısım bir önceki kısımla aynıdır ve bu isteklerin rededilmesi işlemini tekrar, başka bir guvenlik katmanıdır.
/etc/host.conf, içine aşağıdaki kodlar eklenmelidir , tabi içinde yoksa
# Lookup names via DNS first then fall back to /etc/hosts.
order bind,hosts
# We have machines with multiple IP addresses.
multi on
# Check for IP address spoofing.
nospoof on
/etc/hosts.deny içine aşağıdaki kod eklenmelidir
ALL: PARANOID
Burada bir önceki işlemde yapılan spoofing korumasını arttırılması sağlanır.
Firewall linux server için en önemli ihtiyaçtır. Firewall olmaksızın linux server tamamı ile tehlike altındadır
denilebilir , firewall ile server güvenlik altındadır ve korunabilir diyebiliriz ancak unutlmamalıdır ki hiç bir firewall %100 güvenlik sağlamaz.
Kernel bilgilerini aramalı ve bulmalısnız. Hatta kişisel kernel derlemeside yapabilirsiniz, (eğer linuxde çok iyi bir kullanıcı değilseniz kesinlikle bu işlem önerilmez) veya RPM kullanabilrsiniz.Kernel derlemesi local olmayan makinalarda kesinlikle önerilmeyen bir işlemdir. Sebebi ise , eğer bir şeyler ters giderse sizin power düğmesine basıp kapatacak şansınız olmayacak ve tek kullanıcı modunda serverı başlatamayaaksınız.Data Center ı beklemeli bir destek isteğinde bulunmalı ve onların yanıt vermesini beklemek zorunda kalacaksınız.Buda hem büyük zaman kaybı, hem oldukça yavaş hem de çok maliyetli bir işlemdir. Diğer uygulamalar yapılan konfigurasyon değişiklikleri sistem aşırı yükünü vb sorunları engelleyecektir.
Örnek
proftpd:
/etc/proftpd.conf, içine aşağıdaki kod eklenebilir
TimeoutIdle 600 TimeoutNoTransfer 600 TimeoutLogin 300 MaxInstances 30 MaxClientsPerHost 2
mysql için:
/etc/my.cnf
[mysqld] port = 3306 skip-locking
set-variable = max_connections=100
set-variable = max_user_connections=20
set-variable = key_buffer=16M
set-variable = join_buffer=4M
set-variable = record_buffer=4M
set-variable = sort_buffer=6M
set-variable = table_cache=1024
set-variable = myisam_sort_buffer_size=32M
set-variable = interactive_timeout=100
set-variable = wait_timeout=100
set-variable = connect_timeout=10
set-variable = thread_cache_size=128
ve son olarak, /etc/rc.local, içine aşağıdaki kod eklenebilir.
TMOUT=180 export TMOUT
Bu kısım serverda 3 dk hareketsiz duran herkesle bağlantısını kesecektir.Bu rakamı değiştirerek zamanı da değiştirilebilir, örnek 300 yapıldığında bu 5 dk olacaktır Güvenliğin bir seviye daha artırılması için aşağıdaki gibi bir uygulama yapılabilir ssh erişimi kısıtlaması
in /etc/hosts.deny
sshd: ALL
in /etc/hosts.allow
Code:
sshd: host.ip.number.1,host.ip.number.2,etc