CentOS 7 Üzerinde Docker Swarm İçin Linux Güvenlik Duvarı Yapılandırması
Dağıtık sistemler ve konteyner teknolojileri günümüzün modern uygulama mimarilerinin temel taşlarından biri haline gelmiştir. Docker Swarm, bu teknolojilerin en popüler orkestrasyon araçlarından biridir ve birden fazla sunucu üzerinde konteynerize edilmiş uygulamaların dağıtımını, ölçeklendirilmesini ve yönetimini kolaylaştırır. Ancak, bu tür dağıtık sistemlerin güvende olması, özellikle dış dünyaya açık portların ve ağ trafiğinin doğru bir şekilde yönetilmesiyle mümkündür. CentOS 7 işletim sistemi, varsayılan olarak firewalld adında güçlü bir güvenlik duvarı servisi ile gelir. Bu makalede, CentOS 7 üzerinde çalışan bir Docker Swarm kümesi için firewalld‘ı nasıl yapılandıracağımızı, gerekli portları nasıl açacağımızı ve güvenlik en iyi uygulamalarını nasıl uygulayacağımızı detaylı bir şekilde inceleyeceğiz.
Docker Swarm Temelleri ve Ağ Mimarisi
Docker Swarm, Docker motorlarının yerel kümeleme özelliğidir. Bir Swarm kümesi, yönetici (manager) ve çalışan (worker) düğümlerden oluşur. Yönetici düğümler, kümenin durumunu korur, görevleri planlar ve worker düğümlerin sağlıklı çalışmasını sağlar. Worker düğümler ise uygulamaların çalıştırıldığı yerlerdir. Swarm’ın düzgün çalışabilmesi için düğümler arasında belirli portlar üzerinden iletişim kurulması gerekmektedir.
Swarm Kümesi Bileşenleri ve İletişim Portları
Swarm kümesindeki düğümler, kendi aralarında güvenli ve verimli bir şekilde iletişim kurmak için belirli portları kullanır:
* TCP 2377 (Swarm Yönetim Portu): Swarm yöneticisi düğümlerinin birbirleriyle iletişim kurduğu ve Swarm CLI komutlarının yönetici düğümlerine gönderildiği porttur. Bu port, yalnızca yönetici düğümler arasında ve Swarm CLI’yı çalıştıran güvenilir makinelerden erişilebilir olmalıdır.
* TCP 7946 ve UDP 7946 (Kapsayıcı Ağ Keşfi): Tüm Swarm düğümleri (hem yönetici hem de çalışan) bu portları, diğer düğümlerin IP adreslerini ve durumlarını keşfetmek için kullanır. Bu portlar, Swarm kümesindeki tüm düğümler arasında açık olmalıdır.
* UDP 4789 (Overlay Ağ Veri Yolu – VXLAN): Docker’ın overlay ağ sürücüsü tarafından kullanılan porttur. Bu, konteynerler arasında ağ trafiğinin taşınmasını sağlar ve servislerin küme genelinde iletişim kurmasına olanak tanır. Bu port da tüm Swarm düğümleri arasında açık olmalıdır.
Bu temel portlara ek olarak, Docker uygulamalarınızın dış dünyaya açılması gereken portlar da olacaktır (örneğin, bir web sunucusu için 80/TCP ve 443/TCP). Bu portlar, uygulamanızın türüne ve gereksinimlerine göre değişir.
CentOS 7 ve Firewalld’a Genel Bakış
CentOS 7, varsayılan güvenlik duvarı olarak firewalld servisini kullanır. firewalld, iptables‘ın bir soyutlama katmanı olup, dinamik bir güvenlik duvarı yönetimi sağlar. Bu, kuralları yeniden yüklemek için güvenlik duvarını tamamen kapatıp açmaya gerek kalmadan değişiklik yapabileceğiniz anlamına gelir. firewalld, “bölgeler” (zones) kavramını kullanarak ağ arayüzlerini ve kaynak IP’leri farklı güvenlik seviyelerine ayırmanıza olanak tanır.
Firewalld Bölgeleri ve Servisleri
* Bölgeler (Zones): firewalld, farklı güven seviyelerini temsil eden önceden tanımlanmış bölgelere sahiptir (örn. public, home, internal, trusted, drop). Her bölge, belirli bir ağ arayüzüne veya kaynak IP adresine atanabilir ve kendi kurallar kümesine sahip olabilir. Varsayılan olarak, çoğu dışa dönük arayüz public bölgesine atanır.
* Servisler (Services): firewalld, HTTP, HTTPS, SSH gibi yaygın servisler için önceden tanımlanmış kurallar içerir. Bu servisleri kullanarak port numaralarını ezberlemek yerine isimleriyle güvenlik duvarı kuralları ekleyebilirsiniz.
* Portlar (Ports): Belirli TCP veya UDP portlarını doğrudan açabilirsiniz.
* Zengin Kurallar (Rich Rules): Daha karmaşık senaryolar için, kaynak IP kısıtlamaları, günlük kaydı veya port yönlendirme gibi gelişmiş özellikler sağlayan “zengin kurallar” kullanabilirsiniz.
Firewalld Komutlarının Temelleri
firewall-cmd komutu, firewalld ile etkileşim kurmak için kullanılan ana araçtır.
* firewall-cmd --get-active-zones: Hangi bölgelerin aktif olduğunu gösterir.
* firewall-cmd --list-all --zone=public: public bölgesindeki tüm kuralları listeler.
* firewall-cmd --add-port=PORT/protocol --permanent: Belirli bir portu kalıcı olarak açar.
* firewall-cmd --add-service=SERVICE --permanent: Belirli bir servisi kalıcı olarak açar.
* firewall-cmd --reload: Kalıcı kuralları yükler ve güvenlik duvarını yeniden yapılandırır.
* firewall-cmd --permanent --remove-port=PORT/protocol: Kalıcı bir port kuralını kaldırır.
Unutmayın, firewall-cmd komutlarıyla yapılan değişikliklerin kalıcı olması için --permanent bayrağını kullanmalı ve ardından firewall-cmd --reload komutunu çalıştırmalısınız. --permanent bayrağı kullanılmazsa, kurallar yalnızca bir sonraki firewalld yeniden başlatılmasına veya sistemin yeniden başlatılmasına kadar geçerli olur.
Güvenlik İlkeleri ve En İyi Uygulamalar
Bir Docker Swarm kümesini güvence altına alırken dikkate almanız gereken bazı temel güvenlik ilkeleri ve en iyi uygulamalar şunlardır:
* En Az Ayrıcalık Prensibi: Yalnızca kesinlikle gerekli olan portları açın. Her açık port, potansiyel bir güvenlik açığıdır.
* İç ve Dış Ağ Ayrımı: Swarm kümenizin düğümleri arasındaki iletişimi (yönetim ve overlay ağ trafiği) dış dünyadan izole edin. Mümkünse, bu trafiği özel bir ağ arayüzü veya VLAN üzerinden yönlendirin.
* Kaynak IP Kısıtlamaları: Yönetim portları gibi hassas portlara erişimi, yalnızca güvenilir IP adresleriyle kısıtlayın. Örneğin, Swarm yönetim portu (2377/TCP) sadece diğer yönetici düğümlerden ve yönetim istasyonunuzdan erişilebilir olmalıdır.
* Güvenli Yönetim: Docker Swarm CLI’ya erişimi VPN veya SSH tünelleme gibi güvenli kanallar üzerinden yapmayı düşünün.
Docker Swarm için Gerekli Portları Firewalld ile Yapılandırma
Şimdi, Docker Swarm kümeniz için firewalld‘ı nasıl yapılandıracağımızı adım adım inceleyelim. Bu adımları her bir Swarm düğümünde, rolüne (yönetici veya çalışan) göre uygulamanız gerekecektir.
Ön Hazırlık
Her şeyden önce, firewalld servisinin çalıştığından emin olun:
sudo systemctl status firewalld
Eğer çalışmıyorsa veya devre dışı bırakılmışsa, başlatın ve önyüklemede otomatik başlaması için etkinleştirin:
sudo systemctl start firewalld
sudo systemctl enable firewalld
CentOS 7’de varsayılan bölge genellikle public‘tir. Bu makalede, public bölgesini kullanacağız. Eğer farklı bir bölge kullanıyorsanız, komutlara --zone=your_zone_name eklemeniz gerekecektir.
1. Swarm Yönetim Portu (Manager Düğümler İçin)
Sadece yönetici düğümlerinde, Swarm yönetim portu olan TCP 2377’yi açın. Bu port, diğer yönetici düğümlerin ve Swarm CLI’dan gelen komutların alınması için kullanılır.
Tüm Swarm Yöneticileri Arası İletişim İçin:
sudo firewall-cmd --add-port=2377/tcp --permanent
Daha Güvenli Bir Yaklaşım (Sadece Belirli IP’lerden Erişim):
Eğer Swarm yöneticisi düğümlerinizin IP adresleri belirli bir aralıkta ise (örneğin, 192.168.1.0/24), bu portu yalnızca o aralıktan gelen trafiğe açmak daha güvenlidir.
# Sadece belirli bir IP adresinden erişime izin vermek için
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port port="2377" protocol="tcp" accept' --permanent
Sadece belirli bir ağ aralığından erişime izin vermek için
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="2377" protocol="tcp" accept' --permanent
Bu kuralı, Swarm yöneticisi düğümlerinizin IP’lerini veya yönetim istasyonunuzun IP’sini içerecek şekilde özelleştirin.
2. Kapsayıcı Ağ Keşif Portları (Tüm Swarm Düğümleri İçin)
Tüm Swarm düğümlerinde (hem yönetici hem de çalışan), TCP 7946 ve UDP 7946 portlarını açın. Bu portlar, düğümlerin birbirlerini keşfetmesi ve küme durumunu senkronize etmesi için gereklidir.
sudo firewall-cmd --add-port=7946/tcp --permanent
sudo firewall-cmd --add-port=7946/udp --permanent
3. Overlay Ağ Veri Yolu Portu (Tüm Swarm Düğümleri İçin)
Tüm Swarm düğümlerinde, overlay ağ trafiği için kullanılan UDP 4789 portunu açın. Bu port, Docker servislerinin konteynerleri arasında iletişimi sağlar.
sudo firewall-cmd --add-port=4789/udp --permanent
4. Uygulama Portları (Uygulamanızın İhtiyacına Göre)
Uygulamalarınızın dışarıdan erişilebilir olması için gereken portları açmanız gerekecektir. Örneğin, bir web uygulamanız varsa ve HTTP (80/TCP) ile HTTPS (443/TCP) kullanıyorsa:
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
Veya belirli bir özel port kullanıyorsanız:
sudo firewall-cmd --add-port=8080/tcp --permanent
Bu portları, genellikle Swarm kümenizin dış dünyaya açık olan yönetici veya belirli çalışan düğümlerinde açmanız gerekir. Docker Swarm’ın ingress ağını kullanıyorsanız, bu portları tüm yönetici düğümlerinde açmak en iyisidir, çünkü ingress yönlendirme tüm yönetici düğümleri üzerinden çalışır.
5. Docker Daemon Uzaktan Erişim Portu (İsteğe Bağlı ve Güvenlik Riski İçerir)
Docker daemon’a uzaktan erişmek için genellikle TCP 2375 (şifresiz) veya TCP 2376 (TLS ile) portları kullanılır. Ancak, bu portları doğrudan internete açmak şiddetle tavsiye edilmez ve büyük bir güvenlik riski oluşturur. Yönetim için SSH tünelleme veya VPN kullanmak çok daha güvenlidir. Eğer kesinlikle uzaktan erişime ihtiyacınız varsa, bunu sadece güvenilir IP adresleriyle kısıtlamalı ve TLS ile şifrelemelisiniz.
Eğer yine de açmanız gerekiyorsa (örneğin, bir yönetim aracı için iç ağda):
# Şifresiz erişim (ASLA Dışarıya Açmayın!)
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="2375" protocol="tcp" accept' --permanent
TLS ile şifreli erişim (Hala dikkatli olunmalı)
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="2376" protocol="tcp" accept' --permanent
6. Kuralları Yükleme
Tüm --permanent bayraklı komutları çalıştırdıktan sonra, firewalld‘ın bu yeni kuralları etkinleştirmesi için yeniden yüklenmesi gerekir:
sudo firewall-cmd --reload
Bu komut, firewalld servisini yeniden başlatmadan mevcut bağlantıları kesmeden kuralları günceller.
Docker’ın Firewalld Etkileşimi ve Potansiyel Sorunlar
Docker, kendi iptables kurallarını yönetme eğilimindedir. Bu, firewalld ile birlikte çalışırken bazı karmaşıklıklara yol açabilir. Varsayılan olarak, Docker, DOCKER adında özel bir iptables zinciri oluşturur ve konteynerler arası ve dış dünya ile konteynerler arasındaki ağ trafiğini bu zincir üzerinden yönlendirir.
Docker’ın iptables kuralları genellikle firewalld‘dan önce işlenir, bu da bazen firewalld‘da açtığınız portların Docker tarafından göz ardı edilmesine veya Docker’ın kendi kurallarının firewalld kurallarını geçersiz kılmasına neden olabilir.
* Host Network Mode: Eğer bir servisi host ağ modunda çalıştırıyorsanız (--network host), Docker bu servisin portlarını doğrudan host makineye bağlar ve iptables kurallarını daha az etkiler. Bu durumda, firewalld kurallarınız doğrudan geçerli olur.
* Bridge Network Mode ve Port Yayımlama: Çoğu durumda, Docker servisleri varsayılan bridge ağında veya overlay ağında çalışır ve portları yayımlanır (-p veya ports direktifi). Docker bu durumda kendi iptables kurallarını oluşturarak gelen trafiği konteynere yönlendirir. Genellikle, firewalld‘da portu açmak yeterlidir, çünkü Docker’ın kuralları firewalld‘ın izin verdiği trafiği yönlendirecektir.
* --iptables=false: Docker daemon’ı --iptables=false seçeneğiyle başlatmak, Docker’ın kendi iptables kurallarını oluşturmasını engeller. Bu durumda, tüm ağ ve port yönlendirme kurallarını manuel olarak (örn. firewalld veya iptables ile) yönetmeniz gerekir ki bu oldukça karmaşıktır ve genellikle önerilmez.
Özetle, çoğu durumda firewalld‘da gerekli portları açmak yeterlidir ve Docker’ın kendi iptables kuralları bu trafiği konteynerlere doğru bir şekilde yönlendirecektir. Eğer bir sorunla karşılaşırsanız, iptables -L -n -v komutu ile Docker’ın oluşturduğu iptables kurallarını incelemek faydalı olabilir.
İleri Düzey Güvenlik İpuçları
Docker Swarm kümenizin güvenliğini artırmak için ek adımlar atabilirsiniz:
* VPN veya SSH Tünelleme: Yönetici düğümlerine veya Swarm CLI’ya erişmek için her zaman VPN veya SSH tünelleme kullanın. Bu, yönetim portlarını dış dünyaya açma ihtiyacını ortadan kaldırır ve trafiği şifreler.
* Fail2ban Kullanımı: SSH veya diğer yönetim servisleri için brute-force saldırılarını engellemek amacıyla Fail2ban gibi araçları kurun.
* SELinux Entegrasyonu: CentOS 7’nin güçlü güvenlik aracı olan SELinux’u etkin ve doğru yapılandırılmış tutun. Docker ve SELinux’un birlikte sorunsuz çalışması için bazen özel SELinux politikaları gerekebilir, ancak varsayılan yapılandırma çoğu zaman yeterlidir.
* Güvenlik Duvarı Kurallarını Otomatikleştirmek: Büyük veya dinamik bir Swarm kümesinde, güvenlik duvarı kurallarını manuel olarak yönetmek yerine Ansible, Puppet veya Chef gibi yapılandırma yönetim araçları kullanarak otomatikleştirmeyi düşünün. Bu, tutarlılık sağlar ve insan hatasını azaltır.
* Ağ Segmentasyonu: Mümkünse, Swarm düğümlerinizi ve arka uç servislerinizi (veritabanları vb.) farklı ağ segmentlerine ayırın ve aralarındaki trafiği sıkı güvenlik duvarı kurallarıyla kontrol edin.
Yapılandırmanın Doğrulanması ve Sorun Giderme
Güvenlik duvarı kurallarını uyguladıktan sonra, her şeyin beklendiği gibi çalıştığından emin olmak için doğrulama adımları atmak önemlidir.
Yapılandırmayı Doğrulama
1. Firewalld Kurallarını Listeleme:
sudo firewall-cmd --list-all --zone=public
Bu komut, public bölgesinde açtığınız tüm portları ve servisleri listelemelidir.
2. Açık Portları Kontrol Etme:
sudo netstat -tulnp | grep -E '2377|7946|4789|80|443|8080' # Kullandığınız portlara göre düzenleyin
sudo ss -tulnp | grep -E '2377|7946|4789|80|443|8080' # netstat yerine ss de kullanılabilir
Bu komutlar, sisteminizde dinleyen servisleri ve portları gösterir. Açtığınız Swarm ve uygulama portlarının LISTEN durumunda olması gerekir.
3. Swarm Servislerinin Durumunu Kontrol Etme:
docker node ls
docker service ls
Swarm düğümlerinin Ready ve Active durumda olduğunu, servislerin ise Running olduğunu doğrulayın.
4. Uygulama Erişimi Testi:
Uygulamanızın dışarıdan erişilebilir olup olmadığını bir web tarayıcısı veya curl komutu ile test edin.
curl http://:
Sorun Giderme
Eğer bir sorunla karşılaşırsanız (örneğin, port açık görünse de erişim yoksa):
* Firewalld Loglarını Kontrol Edin: firewalld‘ın engellediği trafiği görmek için sistem günlüklerini (/var/log/messages veya journalctl -xe) kontrol edin.
* SELinux Durumunu Kontrol Edin: Bazen SELinux, güvenlik duvarı kurallarından bağımsız olarak bağlantıları engelleyebilir. getenforce komutu ile SELinux’un durumunu kontrol edin ve gerekirse setenforce 0 ile geçici olarak devre dışı bırakarak test edin (ancak üretim ortamında devre dışı bırakmak önerilmez).
* Docker Ağını İnceleyin: Docker’ın kendi ağ yapılandırmasını incelemek için docker network ls ve docker network inspect komutlarını kullanın.
* Iptables Kurallarını İnceleyin: sudo iptables -L -n -v komutu, firewalld ve Docker tarafından oluşturulan tüm iptables kurallarını detaylı bir şekilde gösterir. Bu, trafiğin nerede engellendiğini veya yanlış yönlendirildiğini anlamanıza yardımcı olabilir.
* Bağlantıyı Test Edin: telnet veya nc (netcat) gibi araçlarla belirli bir porttan bağlantı kurmayı deneyin. Örneğin: telnet .
Sonuç
CentOS 7 üzerinde Docker Swarm kümesi kurarken güvenlik duvarı yapılandırması kritik bir adımdır. firewalld kullanarak Swarm düğümleri arasında gerekli iletişimi sağlarken, aynı zamanda kümenizi dış tehditlerden koruyabilirsiniz. Bu makalede belirtilen portları doğru bir şekilde yapılandırmak, en az ayrıcalık prensibini uygulamak ve ileri düzey güvenlik ipuçlarını takip etmek, Docker Swarm ortamınızın hem işlevsel hem de güvenli olmasını sağlayacaktır. Güvenliğin sürekli bir süreç olduğunu unutmayın; sistemlerinizi düzenli olarak gözden geçirmeli ve güvenlik duvarı kurallarınızı değişen ihtiyaçlarınıza göre güncellemelisiniz. Bu sayede, konteynerize edilmiş uygulamalarınızın CentOS 7 tabanlı Docker Swarm kümenizde güvenle çalışmaya devam etmesini sağlayabilirsiniz.