Firewalld nedir, yenir mi ?
Firewalld, önceki sürümlerde kullandığımız, script tabanlı çalışan Iptables’ın tahtını ele alan, RHEL 7 ve türevlerinde kullanılmaya başlanan yeni nesil bir firewall uygulamasıdır. Firewalld, kendisiyle birlikte getirmiş olduğu yeni güvenlik kurallarını, varolan bağlantıları kesme gereksinimi duymadan aktif hale getirme imkanı sunmaktadır. Ağ arayüzlerini birazdan bahsedeceğimiz bölgeler (zone) ile ilişkilendirerek, farklı güvenlik seviyesindeki bu bölgeler için tanımlamalar oluşturmakta ve sistem yöneticisine bu yönde bir esneklik sağlamaktadır.
Firewalld’nin yönetimi, firewalld servisi tarafından sağlanmaktadır. Bazı kaynaklarda bunun için “daemon” veya “process” tanımlaması yapıldığı da görülmektedir. Tabi ki aralarında çok keskin farklar olmamasından ve çalışma prensibinden ötürü, servis denilmesinde bir sakınca olmadığı kanaatindeyim. Iptables, bir daemon kullanmak yerine, script mantığıyla çalışıyordu ve yeni tanımlanan kuralların, sistemi yeniden başlattıktan sonra dahi kalıcı olarak aktif olması için bir yeniden başlatma işlemi gerekiyordu. Çünkü her eklenen yeni kural, geçici olarak bellekte tutulmaktaydı. Yazının başında da belirttiğimiz gibi, Firewalld bu noktada dinamik bir şekilde hareket edebilmekte ve bağlantıyı koparma zorunluluğunun önüne geçerek, yeni kuralların anında aktif edilmesi imkanını bizlere sunmaktadır. Uptime mantığıyla düşündüğümüzde, bunun yüksek sayıda sunucuların barındığı bir ortam için nimet olduğunu söylemek yanlış olmaz sanıyorum.
Firewalld ayarları, /etc/firewalld/ dizini altında bulunur ve yapılan değişikliklere göre, bu ayar dosyaları otomatik olarak veya el ile güncellenebilir.
Iptables aracında, grafik arayüzü olarak system-config-firewall uygulaması bulunuyordu. Buradan komut bazlı yapabildiğimiz işlemleri, bu arayüzden yapabiliyorduk. Firewalld’de ise, birçok işlemi yapabildiğimiz firewall-cmd komutunu kullanabilmekle birlikte, grafiksel bir arayüz isteniyorsa firewall-config aracı ile de aynı işlemler yapılabilmektedir.
Bölge (Zone) Kavramı
Firewalld, firewall yönetimini basitleştirmek ve ağ trafiğini sınıflandırmak için, gelen istekleri bölgelere ayırmaktadır. Bu bölgeler, ağ trafiğinin kaynak olarak kullandığı bir IP adresi ve / veya ağ arayüzden gelen istekleri, güvenlik seviyelerine göre ayırmakta, böylece farklı tipteki trafikler için farklı kurallar bir küme mantığıyla oluşturulmaktadır. Her bir bölge, kendi özel kural tanımlamalarını, servisleri ve port ayarlarını barındırır. Sistemde birden çok ağ arayüzü bulunuyorsa (ethernet de dahil), her bir arayüzü ayrı bir bölgeye tanımlayabilir, bu arayüzler için ayrı ayrı kural dizileri tanımlayabiliriz. Firewalld, varsayılan olarak dokuz farklı bölge sunmaktadır. Bu bölgelerin ayar dosyaları, /usr/lib/firewalld/zones/ dizini altında, XML formatı ile bulunur. Kullanıcılar da kendi özel bölge tanımlamalarını yapabilir. Böyle bir durumda kullanıcı tarafından oluşturulan bir bölgenin ayar dosyaları ise /etc/firewalld/zones/ dizini altında oluşturulacaktır. Yani sistem tarafından oluşturulan XML dosyalarıyla kullanıcı tarafından oluşturulanlar, kolaylık olması açısından bu şekilde birbirinden ayrılmış durumdadır.
Bölgeleri gelen bağlantılara yaklaşım şekline göre “en güvenilmez” ve “en güvenilir” şeklinde sınıflandıracak olursak, en katı kuralları uygulayandan en esnek olanına doğru, sıralama şu şekildedir:
Drop: Gelen bütün paketler reddedilir, karşı tarafa bir ICMP paketi gönderilmez. Sadece giden paketlere izin verilir.
Block: Gelen bütün paketler reddedilir ancak Drop bölgesine göre bu bölgede karşı tarafa bir IPv4 için ICMP, IPv6 için ise ICMPv6 paketi gönderilir.
Public: Sadece seçili olarak belirlenmiş olan kaynaklardan gelen bağlantılara izin verilir. Ön tanımlı bölge budur. Sisteme yeni bir ağ arayüzü tanımlandığında, otomatik olarak Public bölgesi bu arayüzüne atanır. Ortak kullanım alanları için idealdir.
External: Dışarı çıkan trafiğin referans aldığı ağ arayüzüne göre bu trafik üzerinde maskeleme yapar. Gelen bağlantılarda ise belirtilmiş kurallara göre hareket eder.
DMZ: İç ağda erişimi sınırlandırılmış alanların ortak kullanımı için aktif edilir.
Work Karşı taraftan herhangi bir zarar gelme durumunun olmadığını bildiğiniz iç ağlarda kullanılır. Özellikle iş ortamlarında tercih edilebilir.
Home: Ev ağı için oluşturulmuş bölgedir. Çalışma prensibi olarak Work bölgesiyle hemen hemen aynıdır. Work bölgesine samba-client için gelen istekler reddedilirken, Home bölgesine Samba için gelen isteklerde bir reddetme durumu olmamaktadır.
Internal: Home bölgesi ile aynı mantıkta düşünülebilir. İç ağlarda tercih edilir.
Trusted: Bir kısıtlama olmaksızın bütün gelen / giden bağlantılar kabul edilir. Sadece tamamen güvenilir ortamlar için kullanılmalıdır.
Public: Firewalld tarafından varsayılan bölge olarak kullanılmaktadır.
XML dosyasına baktığımızda, ayarların gayet anlaşılabilir yapıda olduğunu görebilmekteyiz. <service name=” “/> tagleri, gelen DHCPv6 ve SSH bağlantılarına izin verildiğini belirtmektedir. Bu ayar dosyası manuel olarak değiştirilebilir, yeni bağlantı tanımlamaları yapılabillir veya varolan kurallar silinebilir. Tabi ki el ile müdahale etmek yerine, birazdan değineceğimiz firewall-cmd ve firewall-config araçları ile de aynı işlemler daha kolay bir şekilde yapılabilmektedir.
Her bir bölge, bir veya birden çok ağ arayüzüyle ilişkilendirilmiş olabilir. Bir istek geldiğinde, Firewalld gelen bu istek için bir IP adresi veya ağ arayüzünün ilişkili olduğu, hali hazırda bir bölge tanımlaması yapılıp yapılmadığını kontrol eder. Ön tanımlı bir bölge varsa, istek buraya yönlendirilir, yok ise varsayılan bölgeye devredilir.
Kural tanımlamaları geçiçi ve kalıcı olarak ikiye ayrılmaktadır. Geçici olan kurallar tanımlandığı andan itibaren aktif hale gelmektedir fakat bellekte tutuldukları için, firewalld sürecinin yeniden başlatılması (restart) veya yeniden yüklenilmesi (reload) durumunda bu kurallar işlevlerini kaybeder. Kalıcı kurallarda ise böyle bir durum söz konusu değildir. Bu tipteki kurallar ilgili dosyalara yazılır fakat servis yeniden başlatılana veya yeniden yüklenene kadar aktif hale gelmezler. Özetle geçici ve kalıcı kuralların çalışma prensibi birbirlerine zıt gibi düşünülebilir. Bu noktada restart ve reload işlemlerine değinmekte de fayda var. Restart sürecinde, Firewalld’nin yönettiği trafikteki bağlantılar kesilir, geçici kurallar silinir ve öncesinde kalıcı kurallar belirlendiyse, bu kurallar aktif edilir. Reload sürecinde ise hali hazırda devam etmekte olan bağlantılara müdahale edilmez, geçici kurallar silinir, son restart veya reload işleminden sonra belirtilmiş olan kalıcı kurallar aktif edilir.
Firewalld yönetiminde, zone yönetimi, servislerin ve portların ayarlanması gibi birden çok işlem firewall-cmd komutu ile gerçekleştirilebilir. Servisin çalışma durumunu kontrol etmek için:
firewall-cmd –state
komutu veya daha kontrol ile birlikte detay alabilmek için systemctl kullanılabilir.
Bölge (Zone) Yönetimi
Yazının başında bahsetmiş olduğum bölge kavramıyla ilgili birkaç örnek yapmakta fayda var.
Gelen bağlantılar için varsayılan bölge ayarını
firewall-cmd –get-default-zone
komutu ile görebiliriz.
firewall-cmd –get-active-zones
komutu ise, aktif olan bölgeler ile birlikte bunların ilişkili olduğu ağ arayüzlerini göstermektedir. –list-all parametresi kullanıldığında, aktif olan bölgeler için tanımlanmış ayarları da görebiliriz.
Firewalld tarafından ön tanımlı olarak sistemde yer alan bölgeleri görmek için –get-zones, özellikle bir bölge hakkında detay almak için –list-all –zone [zone_adı] parametresi kullanılabilir.
Yeni bir bölge tanımlamak için, –new-zone parametresi kullanılır.
Resimde görüldüğü üzere, /etc/firewalld/zones/ dizini altında bulunan XML dosyaları arasına, test1.xml dosyası da otomatik olarak eklenmiş durumdadır. XML dosyası görüntülendiğinde, şu an için herhangi bir tanımlama yapılmadığı görülmektedir.
Yeni bir bölge oluşturmak kadar silmek de oldukça basittir. Bu işlem –delete-zone parametresi ile yapılabilir.
Örnekte varsayılan bölge olarak “public” kullanıldığını görmüştük. Bunu “work” olarak –set-default-zone parametresi ile şu şekilde değiştirebiliriz.
Daha önce kullandığımız -get-default-zone parametresi ile doğrulama yapılmıştır. Doğrulama yapmak için bir başka metod ise, varsayılan Zone bilgisinin kayıt edildiği /etc/firewalld/firewalld.conf dosyasında bulunan DefaultZone değişkenini görüntülemek olabilir.
Servisler
Servisler, Firewalld bölgelerinin temel parçalarından birisidir. Firewalld yönetiminde servislerin kullanılması, tercih edilen bir yöntemdir. Bir servis kendi içerisinde bir port numarası, protokol ve IP adresi barındırır. Servislerin bağlı bulunduğu ayar dosyaları, yine XML formatında /usr/lib/firewalld/services/ dizininde bulunur. Bölgelerde olduğu gibi, burada da yine kullanıcı tarafından tanımlı olan servislerin ayar dosyaları da /etc/firewalld/services/ dizini altında bulunmaktadır.
Resimdeki sistemde kullanıcı tarafından oluşturulmuş bir servis yapılandırması bulunmadığı için, /etc/firewalld/services/ dizini boş görülmektedir. Buradaki servis tanımlamaları, bir bölgede bulunan ağ servisleri için ön tanımlı olarak kullanılabilir.
Servis Yönetimine Dair Örnekler
Servis yönetiminde sık yapılabilecek işlemlere örnek olarak, bütün kullanılabilir veya bölgeler için ayrılmış servislerin listelenmesi, bir servisin bir bölge için atanmış olup olmadığını öğrenme, yeni bir servisin özel bir bölge için oluşturulması, silinmesi gibi işlemler örnek olarak gösterilebilir.
Yeni bir servis eklendiğinde veya var olan bir servis kaldırıldığında, /etc/firewalld/services/ dizini altındaki ilgili dosyalarda güncellemeler yapılır.
firewalld-cmd komutu ile servis yönetiminde parametreler şunlardır:
–get-services : Erişilebilir servisleri listeler.
–list-services : Bir bölgede tanımlı olan servisleri listeler.
–query-service : Bir servisin tanımlı olup olmadığını sorgular.
–add-service : Bir servisi istenilen bölgeye atar.
–remove-service : Seçilen bölgeden bir servisi kaldırır.
–new-service : Yeni bir servis tanımı oluşturur.
–delete-service : Var olan bir servis tanımını siler.
–permanent : –add-service veya –remove-service parametreleri kullanılarak bir işlem yapılacağı zaman, –permanent parametresinin kullanılması da zorunlu olur.
–zone : Varsayılan bölge haricindeki özel bir bölge için bir işlem yapılacağı zaman kullanılır.
Ön tanımlı olarak erişilebilir servisleri listelemek :
Varsayılan bölge için ekstra bir parametre kullanmaya gerek yoktur, özel bir bölgeyi seçmek için ise –zone parametresi kullanılır.
Bir servisin varsayılan veya özel bir bölge için tanımlanıp tanımlanmadığını –query-service parametresi ile öğrenebiliriz.
Resimdeki örnekte, ilk komutta varsayılan (public) bölgesi için samba servisi, sonraki komutlarda ise mysql & ntp servislerinin ayrı ayrı work, trusted ve internal bölgelerinde tanımlı olup olmadıları kontrol edilmiştir.
Yeni bir servis için şablon oluşturabilir veya hali hazırda mevcut olan bir servisin ayarlarını da değiştirebiliriz.
Kullanıcı tarafından oluşturulan servis dosyalarının, /etc/firewalld/services/ dizini altında oluşturulduklarını söylemiştik. Örnekte testservis adında yeni bir servis şablonu oluşturulmuştur, dosyanın da ilgili dizin altında yer aldığı görülmektedir.
Bu servisin ayar dosyası oluşturulmuş fakat bir bölgeye atanmamıştır.
Resimdeki kodları incelediğimizde, –add-service parametresi ile testservis’in internal bölgesine atanmasına rağmen, –query-service parametresi ile bunu sorguladığımızda “no” çıktısının alındığını görmekteyiz. Bunun sebebi, Firewalld üzerinde restart veya reload işlemi yapılmamasından ötürüdür. Sonrasında görüldüğü gibi –reload parametresi girilmiş, tekrar sorgulama yapıldığında testservis’in artık internal bölgesi tarafından tanındığı kesinleşmiştir.
Servisi dahil olduğu bölgeden silmek ve tamamen kaldırmak için, –remove-service ve –delete-service parametreleri kullanılır.
Resimde bu işlemler yapıldıktan sonra, son sorgulama işleminde testservis adında bir servis yapılandırmasının bulunamadığı hatası alınmaktadır, bu da işlemin başarılı olduğu anlamına gelir.
Yazının diğer bölümünde, Port yönetimi, Firewalld’nin offline tarafındaki ayarları, Log takibi konularına değineceğim.