İçindekiler
Bir sunucunun IP adresini bir apartmanın adresi gibi düşünürseniz, portlar da o apartmandaki dairelerin kapı numaralarıdır. Web sunucusu 80 ve 443 numaralı kapıda, SSH 22'de, MySQL 3306'da bekler. Güvenlik duvarı ise hangi kapının kime açılacağına karar veren kapıcıdır.
Sık kullanılan portlar
22 SSH
25 SMTP (sunucular arası e-posta)
53 DNS
80 HTTP
443 HTTPS
465 SMTPS (şifreli e-posta gönderimi)
587 Submission (e-posta istemcilerinden gönderim)
993 IMAPS
3306 MySQL / MariaDB
6379 Redis
Hangi servis hangi portu dinliyor?
Güvenlik duvarına dokunmadan önce sunucuda gerçekte neyin çalıştığına bakın:
ss -tulpn
Netid State Local Address:Port Process
tcp LISTEN 0.0.0.0:22 users:(("sshd",pid=812))
tcp LISTEN 0.0.0.0:443 users:(("httpd",pid=1022))
tcp LISTEN 127.0.0.1:3306 users:(("mariadbd",pid=930))
tcp LISTEN 0.0.0.0:6379 users:(("redis-server",pid=1188))
Burada önemli olan Local Address sütunudur:
127.0.0.1:3306→ MariaDB yalnızca sunucunun kendisinden gelen bağlantıları kabul ediyor. Dışarıdan erişilemez. Doğru olan budur.0.0.0.0:6379→ Redis bütün ağ arayüzlerinde dinliyor. Güvenlik duvarı da engellemiyorsa internetten erişilebilir. Şifresiz bir Redis'in internete açık olması, sunucuların ele geçirilmesinin bilinen yollarından biridir.
İlk savunma hattı güvenlik duvarı değil, servisin yalnızca ihtiyaç duyduğu adreste dinlemesidir. Veritabanı ve önbellek servislerini 127.0.0.1 adresine bağlayın.
firewalld (RHEL, AlmaLinux, Rocky, Fedora)
firewalld, bölge (zone) kavramıyla çalışır. Sunucuların çoğunda tek bir bölge, genellikle public, kullanılır.
firewall-cmd --state
firewall-cmd --list-all
Bir servisi ya da portu açmak:
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
Burada --permanent parametresine dikkat edin. Bu parametre olmadan yapılan değişiklikler hemen uygulanır ama bir sonraki reload ya da yeniden başlatmada kaybolur. Parametreyle yapılanlar ise kalıcıdır ama --reload çalıştırılana kadar etkinleşmez. İkisini karıştırmak "açtım ama açılmadı" ya da "açılmıştı, kapandı" sürprizlerinin kaynağıdır.
Bir portu kapatmak:
firewall-cmd --permanent --remove-port=8080/tcp
firewall-cmd --reload
Yalnızca belirli bir IP'ye izin vermek (örneğin yönetim paneli ya da veritabanı için):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.7" port port="3306" protocol="tcp" accept'
firewall-cmd --reload
ufw (Ubuntu, Debian)
ufw, adından da anlaşılacağı gibi (Uncomplicated Firewall) daha sade bir arayüz sunar.
ufw status verbose
Etkinleştirmeden önce SSH'ye izin verin. Aksi hâlde uzaktaki sunucuyla bağlantınızı kesebilirsiniz:
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
Belirli bir IP'ye izin vermek:
ufw allow from 198.51.100.7 to any port 3306 proto tcp
Kuralları numaralarıyla listeleyip silmek:
ufw status numbered
ufw delete 4
Docker uyarısı
Docker, konteynerlerin portlarını yayınlarken güvenlik duvarı kurallarını kendi yönetir. Bu kurallar ufw ve firewalld'nin kurallarından önce uygulanabilir. Yani ufw deny 3306 kuralınız olsa bile -p 3306:3306 ile başlatılmış bir konteyner internetten erişilebilir olabilir. Konteyner portlarını yalnızca yerel ağda yayınlamak için -p 127.0.0.1:3306:3306 biçimini kullanın.
Dışarıdan kontrol edin
Kuralları yazdıktan sonra sunucunun dışındaki bir makineden kontrol edin:
nc -vz sunucu-ip 3306
nmap -Pn -p 22,80,443,3306,6379 sunucu-ip
Yalnızca açık olmasını istediğiniz portları görmelisiniz. nmap komutunu yalnızca kendi sunucularınızda çalıştırın; başkasının sistemini izinsiz taramak pek çok ülkede suçtur.
Bulut sağlayıcılarında ikinci katman
AWS, Google Cloud, Hetzner ve benzeri sağlayıcıların çoğunda sunucunun önünde ayrı bir güvenlik duvarı (security group, cloud firewall) bulunur. Port, sunucunun güvenlik duvarında açık olsa bile bu katmanda kapalıysa erişim olmaz. "Her şeyi açtım, yine bağlanamıyorum" diyorsanız sağlayıcınızın panelindeki ağ ayarlarına bakın.
Kısa kural
Varsayılan olarak her şeyi kapatın. Yalnızca gerçekten ihtiyaç duyduğunuz portları açın. Yönetim amaçlı portları (veritabanı, panel, önbellek) internetin tamamına değil, yalnızca bildiğiniz IP adreslerine açın. Ve her değişiklikten sonra dışarıdan kontrol edin.
Yorumlar
Henüz yorum yok. İlk yorumu siz yazın.