Netdata Güvenliği: Erişim Kontrolü ve SSL Sertifikası Yapılandırması
Sunucularınızı izlemek için Netdata kurduğunuzda, aklınıza gelen ilk soru genellikle şu oluyor: “Bu dashboard’a herkes erişebilir mi?” Haklı bir endişe. Netdata varsayılan olarak 19999 portunda çalışır ve eğer firewall kurallarınız doğru yapılandırılmamışsa, sunucunuzun tüm metriklerini internete açmış olursunuz. CPU kullanımı, bellek durumu, açık portlar, çalışan processler… Bunların hepsi bir saldırgan için altın değerinde bilgilerdir. Bu yazıda Netdata’yı güvenli hale getirmek için erişim kontrolü ve SSL yapılandırmasını adım adım ele alacağız.
Neden Netdata Güvenliği Önemli?
Netdata dashboard’ı çok güzel görünüyor, gerçek zamanlı grafikler harika. Ama bu dashboard şu bilgileri açığa çıkarıyor:
- Çalışan tüm servisler ve processler
- Ağ bağlantıları ve trafik detayları
- Disk kullanımı ve dosya sistemi yapısı
- Sistem kullanıcıları ve grupları
- Uygulama performans metrikleri
- Veritabanı bağlantı sayıları
Bu bilgilerin yanlış ellere geçmesi, bir saldırının ilk keşif aşamasını neredeyse tamamlar. Dolayısıyla Netdata’yı “sadece iç ağda kullanıyorum” diye bırakmak da yeterli değil. Savunma katmanlı olmalı.
Temel Güvenlik Mimarisi
Netdata güvenliğini üç katmanda düşünmek gerekiyor:
- Ağ seviyesi: Kimler bu porta ulaşabilir?
- Uygulama seviyesi: Kimler authentication geçebilir?
- Şifreleme seviyesi: Trafik şifreli mi aktarılıyor?
Bu üç katmanı birlikte uyguladığınızda gerçek anlamda güvenli bir izleme altyapısına sahip olursunuz.
Adım 1: Firewall ile Port Kısıtlaması
İlk ve en kritik adım, 19999 portunun dışarıya kapalı olduğundan emin olmak. UFW kullanıyorsanız:
# 19999 portunu varsayılan olarak kapat
sudo ufw deny 19999
# Sadece belirli bir IP'ye izin ver (örneğin yönetim makineniz)
sudo ufw allow from 192.168.1.100 to any port 19999
# Ya da belirli bir subnet'e izin ver
sudo ufw allow from 10.0.0.0/24 to any port 19999
# Kuralları kontrol et
sudo ufw status numbered
iptables kullanıyorsanız daha granüler kontrol yapabilirsiniz:
# Önce tüm erişimi engelle
sudo iptables -A INPUT -p tcp --dport 19999 -j DROP
# Sonra belirli IP'ye izin ver
sudo iptables -I INPUT -p tcp --dport 19999 -s 192.168.1.100 -j ACCEPT
# Kuralı kalıcı hale getir
sudo iptables-save > /etc/iptables/rules.v4
Gerçek dünya senaryosu: Bir müşterimizin sunucusunda Netdata kurulu olduğunu ve 19999 portunun herkese açık olduğunu keşfettik. Shodan üzerinde arama yaptığımızda onlarca Türk sunucusunun aynı durumda olduğunu gördük. Bu sunucuların sahipleri muhtemelen habersizdi.
Adım 2: Netdata’nın Kendi Erişim Kontrol Mekanizması
Netdata, netdata.conf dosyası üzerinden IP tabanlı erişim kısıtlaması yapmanıza izin veriyor. Bu, firewall’un yanına ek bir savunma katmanı ekler.
# netdata.conf dosyasını düzenle
sudo nano /etc/netdata/netdata.conf
[web]
# Sadece localhost ve belirli IP'lerden erişim
allow connections from = localhost 192.168.1.* 10.0.0.*
# Dashboard erişimini kısıtla
allow dashboard from = localhost 192.168.1.*
# API erişimini kısıtla
allow badges from = *
allow streaming from = *
# Management API'yi kısıtla (önemli!)
allow management from = localhost
# Bind sadece localhost'a (reverse proxy kullanıyorsanız)
bind to = 127.0.0.1
bind to = 127.0.0.1 satırı çok kritik. Eğer Nginx veya Apache ile reverse proxy kuruyorsanız, Netdata’nın sadece localhost’ta dinlemesini sağlamak en iyi pratik.
Değişiklikleri uygulamak için Netdata’yı yeniden başlatın:
sudo systemctl restart netdata
sudo systemctl status netdata
Adım 3: Nginx ile Reverse Proxy ve SSL Kurulumu
Netdata’ya SSL eklemek için en pratik yol Nginx reverse proxy kullanmak. Böylece hem HTTPS erişimi hem de HTTP Basic Authentication ekleyebilirsiniz.
Nginx ve Certbot Kurulumu
# Nginx kur
sudo apt update
sudo apt install nginx certbot python3-certbot-nginx -y
# Let's Encrypt ile SSL sertifikası al
sudo certbot --nginx -d netdata.sirketiniz.com
# Sertifika yenileme testini yap
sudo certbot renew --dry-run
Nginx Konfigürasyonu
sudo nano /etc/nginx/sites-available/netdata
# HTTP'den HTTPS'e yönlendirme
server {
listen 80;
server_name netdata.sirketiniz.com;
return 301 https://$server_name$request_uri;
}
# HTTPS sunucu bloğu
server {
listen 443 ssl http2;
server_name netdata.sirketiniz.com;
# SSL sertifikaları (Certbot tarafından eklenir)
ssl_certificate /etc/letsencrypt/live/netdata.sirketiniz.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/netdata.sirketiniz.com/privkey.pem;
# Güvenli SSL parametreleri
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# HSTS (6 ay)
add_header Strict-Transport-Security "max-age=15768000" always;
# Diğer güvenlik başlıkları
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
# Basic Authentication
auth_basic "Netdata Monitoring";
auth_basic_user_file /etc/nginx/.netdata_htpasswd;
# Proxy ayarları
location / {
proxy_pass http://127.0.0.1:19999;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket desteği (Netdata için gerekli)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Timeout ayarları
proxy_read_timeout 3600;
proxy_connect_timeout 3600;
}
}
Konfigürasyonu aktifleştirin:
sudo ln -s /etc/nginx/sites-available/netdata /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Adım 4: HTTP Basic Authentication Kurulumu
# apache2-utils kur (htpasswd için)
sudo apt install apache2-utils -y
# İlk kullanıcıyı oluştur (-c flag yeni dosya oluşturur)
sudo htpasswd -c /etc/nginx/.netdata_htpasswd admin
# İkinci kullanıcı ekle (-c olmadan)
sudo htpasswd /etc/nginx/.netdata_htpasswd devops_team
# Dosya içeriğini kontrol et
sudo cat /etc/nginx/.netdata_htpasswd
# Doğru izinleri ver
sudo chmod 640 /etc/nginx/.netdata_htpasswd
sudo chown root:www-data /etc/nginx/.netdata_htpasswd
Önemli not: Basic Authentication şifreler base64 ile encode edilir ama SSL olmadan plaintext olarak gider. Bu yüzden HTTPS olmadan Basic Auth kullanmak anlamsız. İkisi birlikte olmalı.
Adım 5: Netdata Cloud ve Signed In Access
Eğer birden fazla sunucuyu yönetiyorsanız, Netdata Cloud üzerinden erişim daha pratik olabilir. Bu durumda yerel erişimi tamamen kapatıp sadece Netdata Cloud agent bağlantısına izin verebilirsiniz.
sudo nano /etc/netdata/netdata.conf
[web]
# Web arayüzünü tamamen kapat, sadece agent iletişimine izin ver
mode = none
[cloud]
# Netdata Cloud bağlantısını aktifleştir
enabled = yes
Ancak self-hosted tercih edenler için yerel kurulum daha mantıklı. Veri gizliliği açısından da daha kontrollü.
Adım 6: Netdata’nın Native SSL Desteği
Reverse proxy kullanmak istemiyorsanız, Netdata’nın kendi SSL desteğini de aktifleştirebilirsiniz. Bu özellikle agent-to-agent iletişimde kullanışlı.
Önce sertifikayı hazırlayın:
# Sertifika dizinini oluştur
sudo mkdir -p /etc/netdata/ssl
# Self-signed sertifika oluştur (test için)
sudo openssl req -newkey rsa:2048 -nodes
-keyout /etc/netdata/ssl/key.pem
-x509 -days 365
-out /etc/netdata/ssl/cert.pem
-subj "/C=TR/ST=Istanbul/L=Istanbul/O=Sirketiniz/CN=netdata.sirketiniz.com"
# Doğru izinleri ver
sudo chown -R netdata:netdata /etc/netdata/ssl
sudo chmod 700 /etc/netdata/ssl
sudo chmod 600 /etc/netdata/ssl/key.pem
sudo chmod 644 /etc/netdata/ssl/cert.pem
Netdata konfigürasyonuna SSL ekleyin:
sudo nano /etc/netdata/netdata.conf
[web]
ssl key = /etc/netdata/ssl/key.pem
ssl certificate = /etc/netdata/ssl/cert.pem
# Artık HTTPS üzerinden 19999 portuna erişim
bind to = *=dashboard|registry|badges|management|streaming^SSL!
Yeniden başlatın ve test edin:
sudo systemctl restart netdata
# HTTPS bağlantısını test et
curl -k https://localhost:19999/api/v1/info
Adım 7: Streaming Güvenliği (Parent-Child Mimarisi)
Birden fazla sunucu izliyorsanız ve streaming/parent-child mimarisi kullanıyorsanız, bu bağlantıları da güvenli hale getirmeniz gerekiyor.
Parent sunucuda (merkezi toplayıcı):
sudo nano /etc/netdata/stream.conf
[stream]
# Child'lardan gelen bağlantıları kabul et
enabled = yes
# Her child için API key tanımla
[API_KEY_BURAYA]
enabled = yes
# Sadece belirli IP'lerden kabul et
allow from = 10.0.0.*
# Veri saklama süresi
default history = 3600
# SSL zorunlu kıl
ssl skip certificate verification = no
Child sunucuda:
sudo nano /etc/netdata/stream.conf
[stream]
enabled = yes
destination = ssl:parent-sunucu.sirketiniz.com:19999
api key = API_KEY_BURAYA
timeout seconds = 60
# SSL doğrulaması
ssl skip certificate verification = no
API key oluşturmak için:
uuidgen
# Çıktı: 550e8400-e29b-41d4-a716-446655440000 gibi bir UUID
Güvenlik Denetimi: Her Şey Yolunda mı?
Kurulum sonrası güvenlik testlerini yapmak iyi bir alışkanlık. İşte kullandığım kontrol listesi:
# Portun dışarıdan erişilebilir olup olmadığını kontrol et
nmap -p 19999 SUNUCU_IP
# SSL sertifikasını kontrol et
openssl s_client -connect netdata.sirketiniz.com:443 -showcerts
# HTTP başlıklarını kontrol et (güvenlik başlıkları)
curl -I https://netdata.sirketiniz.com
# Authentication olmadan erişimi test et
curl -v https://netdata.sirketiniz.com/api/v1/info
# Log dosyalarını kontrol et
sudo tail -f /var/log/nginx/access.log | grep 19999
sudo journalctl -u netdata -f
SSL Labs üzerinden de güvenlik skorunuzu kontrol edebilirsiniz: https://www.ssllabs.com/ssltest/analyze.html?d=netdata.sirketiniz.com
Yaygın Hatalar ve Çözümleri
Sahada sıkça karşılaştığım birkaç durum:
WebSocket bağlantı hatası: Netdata gerçek zamanlı veri için WebSocket kullanıyor. Nginx konfigürasyonunda Upgrade ve Connection başlıklarını eksik bırakırsanız dashboard donup kalır. Yukarıdaki konfigürasyonda bu başlıklar dahil edildi.
502 Bad Gateway: Netdata sadece localhost’a bind olduktan sonra Nginx’in proxy_pass adresini kontrol edin. 127.0.0.1:19999 olmalı, localhost:19999 bazen IPv6 sorunu çıkarabilir.
Sertifika yenileme sorunları: Certbot otomatik yenileme için bir cron veya systemd timer kurmalı:
# Mevcut yenileme timerını kontrol et
sudo systemctl status certbot.timer
# Manuel test
sudo certbot renew --dry-run
# Nginx'in yeniden yüklenmesi için certbot hook ekle
sudo nano /etc/letsencrypt/renewal-hooks/post/reload-nginx.sh
#!/bin/bash
systemctl reload nginx
sudo chmod +x /etc/letsencrypt/renewal-hooks/post/reload-nginx.sh
Rate limiting eksikliği: Brute force saldırılarına karşı Nginx’e rate limiting eklemek iyi bir fikir:
# nginx.conf'a veya site konfigürasyonuna ekle
http {
limit_req_zone $binary_remote_addr zone=netdata:10m rate=10r/s;
}
server {
location / {
limit_req zone=netdata burst=20 nodelay;
# ... diğer ayarlar
}
}
İleri Seviye: IP Whitelist ile Coğrafi Kısıtlama
Eğer sadece belirli ülkelerden erişime izin vermek istiyorsanız, Nginx’in GeoIP modülünü kullanabilirsiniz:
sudo apt install libnginx-mod-http-geoip2 -y
# nginx.conf
http {
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
$geoip2_data_country_code country iso_code;
}
map $geoip2_data_country_code $allowed_country {
default no;
TR yes;
DE yes;
}
}
# Site konfigürasyonu
server {
location / {
if ($allowed_country = no) {
return 403;
}
# ... diğer ayarlar
}
}
Monitoring Altyapısını Monitör Etmek
İzleme sistemini izlemek biraz paradoksal geliyor ama önemli. Netdata servisinin durumunu ve erişim loglarını takip etmek için:
# Netdata sağlık durumu için systemd alarm
sudo nano /etc/systemd/system/netdata-health-check.service
[Unit]
Description=Netdata Health Check
After=netdata.service
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'curl -sf http://127.0.0.1:19999/api/v1/info > /dev/null || systemctl restart netdata'
# Loglardan başarısız authentication girişimlerini izle
sudo grep "401" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
Bu komut size en çok başarısız giriş denemesi yapan IP adreslerini gösterir. Şüpheli IP’leri fail2ban ile otomatik olarak engelleyebilirsiniz.
Fail2ban için Netdata jail konfigürasyonu:
sudo nano /etc/fail2ban/jail.local
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 3600
findtime = 600
sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-http-auth
Sonuç
Netdata güvenliğini doğru yapılandırmak birkaç aşamalı bir süreç ama her adım önemli ve birbirini tamamlıyor. Özetlemek gerekirse:
- Firewall ile 19999 portunu dışa kapatın, Netdata’yı sadece localhost’a bind edin
- Nginx reverse proxy ile HTTPS ve HTTP Basic Auth ekleyin
- SSL sertifikasını otomatik yenileme ile Let’s Encrypt’ten alın
- Streaming bağlantılarında SSL kullanın ve API key’leri güvenli saklayın
- Fail2ban ile brute force koruması ekleyin
- Periyodik olarak güvenlik denetimi yapın
Bu yapılandırmaları uyguladıktan sonra Netdata’nız hem işlevsel hem de güvenli olacak. Monitoring altyapısı ne kadar güçlü olursa olsun, güvenliği göz ardı edilirse sistemin kendisi bir güvenlik açığına dönüşür. Savunma her zaman katmanlı olmalı ve monitoring araçları bu kuralın dışında tutulmamalı.
Sorularınız veya farklı senaryolarınız varsa yorum bölümünde paylaşabilirsiniz. Özellikle kurumsal ortamlarda LDAP veya OAuth entegrasyonu yapanlar olursa, o konuyu ayrı bir yazıda ele alabiliriz.
