Merhabalar;
Geçen ay başladığımız "Güvenlik Duvarları ve Vekil Sunucu - NASIL?" adlı yazı dizimizin ikinci sayısıyla karşınızdayız. Geçen sayımızda kısaca güvenlik duvarı nedir, niye ihtiyacımız vardır, vekil sunucu nedir, bulunduğumuz kuruma ve konuma göre bunlardan hangilerine ihtiyacımız vardır, gibi sorulara biraz sistem yöneticisi gözünden giriş yapmaya çalışmıştık. Şimdi ise biraz daha teknik anlamda ele almaya çalışacağız..
Filtreleme güvenlik duvarı kurulacak makineler ağır donanımlara ihtiyaç duymazlar. Basit yönlendiricilerden(router) biraz daha fazlasına ihtiyacınız olacaktır. 32 MB ram'i, 250m harddisk'i (tercihen 500) olan eski bir pentium II bile işinizi görecektir. Hatta ayrı bir makineye bile ihtiyaç duymayabilirsiniz.
Çok trafik kaldırması düşünülen bir vekil sunucusu içinse gelişmiş bir işlemciye sahip olan, logların tutulması için yeterli harddisk alanı bulunan bir makine işinizi görecektir. Gelişmiş bir işlemci gerekliliği, sağlanan her bağlantıda ayrı bir işlem(process) üretilmesidir.
Filtreleme güvenlik duvarı kurmak için herhangi özel bir yazılıma ihtiyaç duymazsınız. Linux çekirdeği 2.2 sürümünden itibaren ipchains, 2.4 sürümünden itibaren de iptables programlarını içinde barındırır halde gelmektedir. Ayrıca iptables programını yapılandırmaya yarayan firestarter, shoreline, fwbuilder gibi programları da kullanabilirsiniz.
Kullandığınız dağıtıma göre iptables programının kurulu olup olmadığını kontrol edebilirsiniz.
ör: redhat temelli dağıtımlar için rpm -q iptables, pardus için pisi info iptables
Sisteminizde iptables'ın yüklü olduğunu öğrendikten sonra start, stop, restart komutlarıyla iptables'ın durumunu değiştirebilirsiniz. Debian temelli dağıtımlarda /etc/init.d/iptables start vb. komutlarla, redhat ve pardus'ta service iptables restart vb. komutları kullanabilirsiniz.
Iptables temelde ip adresleri, ağ protokolleri(tcp, udp, icmp) ve portları kullanarak iş görmektedir. Bu konularda derinlemesine bilgi sahibi olmamıza gerek yok, ama iptables'ın genel çalışma düzeneğini anlamamızda bize yardımcı olacak kaynaklardır bunlar.
Iptables paketleri filtrelemek için 3 ayrı öntanımlı zincir kullanmaktadır: INPUT, OUTPUT ve FORWARD. Ağdan gelen ve ağa giden paketler bu kural zincirlerine göre nasıl bir işleme sokulacaklarına, paketlerin kabul edilip(accept) edilmeyeceklerine(drop) karar verilir.
Filtre tablosunda bulunan zincirler, şu işe yaramaktadır:
Yazı boyunca daha çok INPUT zinciri üzerinde duracağız, yani bilgisayarımıza gelen paketleri filtrelemekle (kötü adamları içeri sokmamakla :) ) uğraşacağız.
Kurallar her zincir için bir liste içine eklenmektedir. Paketler de kontrol sırası kendilerine geldiğinde baştan başlayarak her kurala göre kontrol edilirler. Eğer paket bu kurallardan birine uyuyorsa, paketi kabul etmek(accept) ya da paketi düşürmek(drop) gibi seçeneklerden biri uygulanır. Bir paket, kurallardan birine uyuyorsa, o kurala uygun bir şekilde işlenir ve o paketle ilgili işlem biter. Devamında zincirdeki diğer kurallara uyup uymadığı kontrol edilmez. Peki paket zincir boyunca hiçbir kurala uymazsa ne olur? O zaman da bu zincir için öntanımlı seçenek neyse, pakete o işlem uygulanır. Bu ön tanımlı işlem de ya paketi kabul etmek ya da paketi düşürmektir.
Zincirlerdeki öntanımlı davranışların belirlenmesi, güvenlik duvarımızı nasıl organize edeceğimize karar vermeden önce üzerinde dikkatli düşünmemiz gereken iki temel seçeneğin üzerinde durmaktadır:
Bu iki yaklaşımdan, sizin de tahmin edeceğiniz gibi; 1. durumun INPUT zincirine gelecek paketler üzerinde, 2. durumun ise OUTPUT zincirinden geçip, makinadan dışarıya çıkarılacak paketler üzerinde kullanılmakta olduğu, beklenen bir davranıştır.
!! Dikkat !! bu noktadan itibaren öntanımlı kural kümesini bozacağız. SSH'la bağlandığınız uzak bir makinede, şimdi anlatacaklarımı deniyorsanız, kendinizi dışarıda bırakma ihtimaliniz bulunmaktadır. Bu yüzden başlangıçta, içeri girmenizi sağlayacak, dışarıda kalmanıza izin vermeyecek bir kuralı mutlaka eklemeniz gerekmektedir.
Örnekler üzerinden devam edeceğimiz yazımızda ilk örneğimizde Stateful Packet Inspection(SPI) (durumsal paket denetleme) türü bir güvenlik duvarı için basit bir kural kümesi yaratacağız. Bu küme sayesinde bütün giden paketlere izin verilecek ama gelen paketler arasında istenmeyenlerin hepsi engellenmiş olacak:
# iptables -F # iptables -A INPUT -p tcp --dport 22 -j ACCEPT # iptables -P INPUT DROP # iptables -P FORWARD DROP # iptables -P OUTPUT ACCEPT # iptables -A INPUT -i lo -j ACCEPT # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -L -v
bu kural kümesinin aşağıdaki çıktıyı vermesi lazım:
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
şimdi teker teker bu 8 komutun ne işe yaradığına bakıp ne yaptığımızı daha iyi anlamaya çalışalım:
Bütün bunları yaptıktan sonra yapmamız gereken şey, bu ayarları kaydetmektir. Redhat temelli bir dağıtım kullanıyorsanız;
# /sbin/service iptables save
komutuyla ayarlarınızı kaydedebilirsiniz; ki bilgisayarınızı yeniden başlattığınızda yeni ayarlarınız otomatik olarak uygulanmaya başlansın..
Bu komut redhat tabanlı sistemlerde iptables init betiğini çalıştırır, bu betik /sbin/iptables-save komutunu çalıştırır ve mevcut iptables konfigürasyonunu /etc/sysconfig/iptables altına yazar. Yeniden başlatmanın ardından iptables init betiği /etc/sysconfig/iptables altında kaydedilmiş olan kuralları /sbin/iptables-restore komutunu kullanarak yeniden uygular.
Tabi ki bu yukarıdaki komutların hepsini tek tek elle girmek oldukça yorucu ve gereksiz bir iş. Bu yüzden verdiğimiz komutları aşağıdaki gibi bir betikle çalıştırmamız da mümkün:
#!/bin/bash # # iptables ornek konfigurasyon betigi # # Yuklu olan butun kurallardan kurtul (Flush) # iptables -F # # 22. port uzerinden SSH baglantilarina izin ver # Ozellikle uzak baglanti kurulan sunuculara SSH'la baglanabilmeyi engellememek icin onemli bu satir. # iptables -A INPUT -p tcp --dport 22 -j ACCEPT # # INPUT, FORWARD ve OUTPUT zincirleri icin ontanimli davranislari belirle # iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # # localhost'a erisimi sagla # iptables -A INPUT -i lo -j ACCEPT # # ESTABLISHED ya da RELATED baglantilara ait olan paketleri kabul et # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # # Ayarlari kaydet # /sbin/service iptables save # # Kurallari listele # iptables -L -v
Bu betiği bilgisayarınıza indirip, en sevdiğiniz metin düzenleyicinizle açarak kaydedip, çalıştırma hakkı verdiğinizde (chmod x firewall_dosyamiz) ./firewall_dosyamiz komutuyla çalıştırabilirsiniz.
Bir önceki örneğimizde belirli bir arayüze gelen bütün paketleri nasıl kabul edebileceğimiz öğrenmiştik:
iptables -A INPUT -i lo -j ACCEPT
İki ayrı arayüzümüz olduğunu düşünelim şimdi de, eth0 ve ppp0(ya da nic için eth1 de olabilir). eth0 içeriye dönük olan yerel ağ bağlantımız için, ppp0 ise dışarıya dönük olan çevirmeli ağ bağlantımız için kullanılıyor olsun. Yerel ağımızdan gelen bütün paketleri kabul etmek ama dış ağdan gelen paketleri filtrelemeye devam etmek isteyebiliriz. Bunun için önce şunu yapmalıyız:
iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -i eth0 -j ACCEPT
!! DİKKAT !! Eğer dış internet bağlantımızı sağlayan arayüzden(misal ppp0 çevirmeli ağ modemi) gelen paketlerin hepsini kabul etmek isteyip de
iptables -A INPUT -i ppp0 -j ACCEPT
yazmış olsaydık, güvenlik duvarımızı tamamen kaldırmış olacaktık :)
Bütün bir arayüzü gelen paketlere açmak yeterli miktarda kısıtlayıcılıkta olmayabilir tabi ki. Gelen paketleri kabul etmek ve reddetmek konusunda daha seçici davranabilmek için ip adresleri üzerinden kısıtlamalara da gidebilmemiz gerekir. 192.168.0.x gizli alt ağını kullanan küçük bir bilgisayar ağı oluşturduğumuzu varsayalım. Güvenlik duvarımızı güvenli bir adresten (misal 192.168.0.4) gelen paketlere açabiliriz:
# Guvenilir IP adreslerinden gelen paketleri kabul et iptables -A INPUT -s 192.168.0.4 -j ACCEPT # IP adresini ihtiyaciniza gore degistirin.
Bu komutu açıklamaya çalışırsak, -A ile INPUT zincirine kuralımızı eklemeye karar veriyoruz. -s ile 192.168.0.4 ip adresini kaynak olarak gösteriyoruz. komut olarak da -j ile ACCEPT komutunu veriyoruz ki bu adresten gelen bütün paketleri güvenlik duvarımız kabul etsin.
Peki sadece bir adres değil birden çok adrese izin vermek istiyorsak? Hepsini elle ekleyebiliriz tabi ki, ama bunun için bir başka yol daha var. Alt ağ maskesini ya da standart bölü işaretini kullanabiliriz bunun için(ayrıntılı bilgi için bkz: [1] ve [2]). Mesela 192.168.0.x(1'den 254'e kadar) aralığındaki ip adreslerinden gelen paketlere izin vermek için aşağıdaki kodların ikisini de kullanabiliriz:
# Guvenilir IP adreslerinden gelen paketleri kabul et iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT # standard bolu isaretini kullanarak iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT # alt ag maskesi kullanarak
Peki ip adresine göre, belli bir ip aralığına göre filtreleme yapabiliyoruz, neden belirli bir MAC adresine göre filtreleme yapmayalım? Bunun için mac modülünü yüklememiz gerekli. Hatırlarsanız daha önce ESTABLISHED ve RELATED paketlerinin karşılaştırılması için state modülünü yüklemiştik. Şimdi de mac modülünü kullanarak ip adresinin yanında belirli bir MAC adresine sahip bir bilgisayardan gelen paketlerin kabul edilmesini nasıl sağlayabiliriz, ona bir bakalım:
# Guvenilir IP adreslerinden gelen paketleri kabul et iptables -A INPUT -s 192.168.0.4 -m mac --mac-source 00:50:8D:FD:E6:32 -j ACCEPT
Gördüğünüz üzere --mac-source parametresiyle filtreden geçmesini istediğimiz bilgisayarın ağ kartının adresini verebiliyoruz. Hatırlatmakta yarar var, bilgisayarınızın MAC adreslerini görebilmeniz için ifconfig (kablosuz ağ kartları içinse iwconfig) komutlarını kullanabilirsiniz.
IP adresinin üzerinden yapılabilecek aldatmalara karşı mac adresini de filtre kuralları içinde belirtmek daha fazla güvenlik sağlamaktadır. Tabi dikkat etmeniz gereken bir diğer nokta, MAC adresi filtreleme internet üzerinden işinize yaramayabilir, ama yerel ağ'da oldukça iyi çalışmaktadır.
Yukarıda ip adreslerine ve belli arayüzlere göre filtrelemeyi nasıl yapacağımızı gördük. Bu sayede belirli güvenilir kaynaklara güvenlik duvarımız üzerinden tam erişimi sağlamaktayız. Şimdi belirli protokollere ve portlara göre nasıl filtreleme yapacağımızı göreceğiz.
Başlamadan önce filtrelemek istediğimiz servisin hangi ağ protokolü ve hangi portları kullandığını bilmemiz lazım. Mesela bittorent tcp protokolünü 6881 nolu port üzerinden kullanmaktadır, yani tcp protokolünü kullanıp bilgisayarımızın 6881 nolu portuna gelen bütün paketlere izin vermemiz gerekmektedir:
# Guvenilir IP adreslerinden gelen paketleri kabul et iptables -A INPUT -p tcp --dport 6881 -j ACCEPT
Bu örnekte INPUT zincirine (-A) tcp protokolünü (-p ) kullanıp makinemize 6881 nolu porta gelen (--dport) [destination port] paketleri kabul etme kuralını ekliyoruz.
!! Dikkat !! : makinemize giriş yapılan portlar(destination) ve makinemize belirli bir kaynaktan gelen(source) portlar için filtre kuralı düzenlerken (--dport veya --sport komutlarını kullanırken) önce hangi protokolün kullanılacağını belirtmemiz gerekmektedir (tcp, udp, icmp, all).
Sadece tek bir port değil de bir port aralığı kullanabilmek içinse yukarıdaki örneği şu şekilde değiştirebiliriz:
# Guvenilir IP adreslerinden gelen paketleri kabul et iptables -A INPUT -p tcp --dport 6881:6890 -j ACCEPT
Bu komut, 6881-6890 port aralığından gelen tcp paketlerine izin vermektedir.
Temelleri gördükten sonra bu kuralları birleştirmeye başlayabiliriz. En popüler Linux/Unix hizmetlerinden biri olan güvenli kabuk(SSH) uzak bağlantılara izin veren bir programdır. SSH, öntanımlı olarak 22 nolu portu ve tcp protokolünü kullanmaktadır. Eğer makinemize dışarıdan bağlantılar yapılmasına izin vermek istiyorsak, 22. porta gelen tcp bağlantılarına izin vermemiz gereklidir:
# 22. porta gelen tcp paketlerine izin ver (SSH) iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Bu kural 22. porta gelen bütün tcp bağlantılarının açık olmasını sağlar ki bu durum büyük bir potansiyel tehlike arz etmektedir. Çünkü hackerlar kaba kuvvet yöntemiyle(brute force) kolay parola konulmuş hesapları kırabilirler. Ama makinemize bağlanacak bilgisayarların ip adreslerini bilirsek, hangi adreslere güvenebileceğimizi biliriz ve SSH için yazacağımız kuralda bu kısıtlamayı yansıtabiliriz. Mesela sadece yerel ağ adresimizden(192.168.0.x) SSH bağlantısı yapılmasına izin vermek istiyorsak:
# 22. porta yerel ağdan gelen tcp paketlerine izin ver (SSH) iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 22 -j ACCEPT
bu sayede port tarama yapan hackerlardan kendinizi korumuş olursunuz.
Bu yazımızda paket filtreleme konusuna değinmeye çalıştık. Iptables programının temelde nasıl çalıştığını, filtreleme için kullanılan zincirleri, bu zincirlere nasıl kural eklendiğini ve kuralların neler içerdiklerini anlatmaya çalıştık. Bunun dışında TCP başlık değişikliği ve Ağ Adres Çeviricisi(NAT) üzerinde yapılacak güvenlik duvarı değişiklikleri de mümkündür, ama bu yazımızda bunlara yer vermedik.
Günümüzde güvenlik duvarı olarak her dağıtım özelleşmiş seçenekler sunmakta.. Ayrıca güvenlik duvarı olarak kullanılan ya da iptables kurallarını daha kolay yazmayı sağlayan programlar da mevcut. Internetin yaygınlaşmasıyla beraber güvenlik açıklarına dikkat etmeyen kullanıcı sayısı da artmakta. Bunun farkında olan kötü niyetli kullanıcılar ve hackerlar da sizin bilgisayarınıza sızıp bilgisayarınızı kötü emellerine alet etmekten çekinmemektedirler. Gerek kişisel bilgisayarınız olsun, gerekse yerel ağınızı kontrol eden bilgisayar olsun, güvenlik duvarı kullanmalısınız.
Güvenli ve özgür günlere..
| Yazarın Üslubunu Beğendiniz mi?: | ||
| Yazının İçeriği Yeterli mi?: | ||
| Konu İlginizi Çekti mi?: |
Bu derginin içeriği, Creative Commons lisansı ile korunmaktadır.
Kaynak göstermek ve link vermek şartıyla ticari olmayan amaçlarla yazılarımızı kullanabilirsiniz.
©2007-2008 ODTÜ Bilgisayar Topluluğu