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.

Benzer Konular

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir