Zabbix Güvenlik Sertleştirme ve TLS Yapılandırması

Zabbix kurulumu tamamlandı, dashboard’lar hazır, alertler çalışıyor… Ve sonra birisi sana “bu sistemi güvenlik ekibine göstereceğiz” dediğinde için sıkışıyor. Çünkü default Zabbix kurulumu güvenlik açısından bir felaket senaryosu olabilir. Bunu bizzat yaşadım: müşteri ortamında Zabbix agent’larının plaintext iletişim kurduğunu, server’ın 10051 portunun dünyaya açık olduğunu ve database şifresinin zabbix.conf içinde düz metin halinde durduğunu gördüğümde, önce bir iç çektim, sonra kolları sıvadım.

Bu yazıda Zabbix güvenliğini katman katman ele alacağız. Sadece TLS değil, database güvenliği, kullanıcı yetkilendirmesi, network segmentasyonu ve audit logging konularını da kapsayacağız.

Neden Default Zabbix Kurulumu Güvensiz?

Zabbix’in varsayılan kurulumu “çalışır hale gel” mantığıyla tasarlanmış. Güvenlik sonradan eklenmesi gereken bir katman olarak bırakılmış. Birkaç somut sorun:

  • Zabbix agent’ları default olarak unencrypted iletişim kurar
  • Web arayüzü HTTP üzerinden servis verebilir
  • Default “Admin” kullanıcısı tahmin edilebilir şifrelerle açık kalabilir
  • Zabbix database kullanıcısının gereksiz geniş yetkileri olabilir
  • zabbix_server.conf dosyasında database parolası düz metin olarak durur

Prodüksiyon ortamında, özellikle birden fazla datacenter veya bulut sağlayıcısı arasında koşan Zabbix altyapılarında bu sorunlar kritik hale gelir.

Ön Gereksinimler ve Ortam

Bu yazıdaki örnekler Rocky Linux 8/9 ve Ubuntu 22.04 üzerinde test edilmiştir. Zabbix 6.x ve 7.x için geçerlidir. Mimarimiz şu şekilde:

  • Zabbix Server: 192.168.10.10
  • Zabbix Agent (örnek host): 192.168.10.50
  • Zabbix Proxy (DMZ’de): 10.0.1.5

1. TLS Sertifika Altyapısını Kurma

Zabbix, TLS için üç seçenek sunar: unencrypted, PSK (Pre-Shared Key) ve certificate-based TLS. Kurumsal ortamlarda certificate tabanlı yaklaşım tercih edilmeli. PSK daha hızlı kurulur ama key yönetimi zamanla karmaşıklaşır.

Önce kendi CA’mızı oluşturalım. Production ortamında bunu HashiCorp Vault veya internal CA’nıza entegre edebilirsiniz, ama basit bir başlangıç için:

# CA dizini oluştur
mkdir -p /etc/zabbix/ssl/{ca,certs,private}
cd /etc/zabbix/ssl

# CA private key
openssl genrsa -aes256 -out ca/ca.key 4096

# CA sertifikası (10 yıl geçerli)
openssl req -new -x509 -days 3650 -key ca/ca.key 
  -out ca/ca.crt 
  -subj "/C=TR/ST=Istanbul/O=SirketAdi/CN=Zabbix-CA"

# Zabbix Server için key ve CSR
openssl genrsa -out private/zabbix-server.key 2048
openssl req -new -key private/zabbix-server.key 
  -out certs/zabbix-server.csr 
  -subj "/C=TR/ST=Istanbul/O=SirketAdi/CN=zabbix-server"

# Server sertifikasını CA ile imzala
openssl x509 -req -days 365 -in certs/zabbix-server.csr 
  -CA ca/ca.crt -CAkey ca/ca.key 
  -CAcreateserial -out certs/zabbix-server.crt

# İzinleri ayarla
chown -R zabbix:zabbix /etc/zabbix/ssl
chmod 700 /etc/zabbix/ssl/private
chmod 600 /etc/zabbix/ssl/private/*.key
chmod 644 /etc/zabbix/ssl/certs/*.crt
chmod 644 /etc/zabbix/ssl/ca/ca.crt

2. Zabbix Server TLS Yapılandırması

Server tarafında zabbix_server.conf dosyasını düzenleyelim:

# /etc/zabbix/zabbix_server.conf

# TLS sertifika ayarları
TLSCAFile=/etc/zabbix/ssl/ca/ca.crt
TLSCertFile=/etc/zabbix/ssl/certs/zabbix-server.crt
TLSKeyFile=/etc/zabbix/ssl/private/zabbix-server.key

# Agent bağlantılarında TLS'i zorunlu kıl
# Bu satırı eklemezseniz unencrypted bağlantılar da kabul edilir
# Host bazlı ayar Zabbix web arayüzünden yapılır

Servisi yeniden başlatmadan önce sertifika dosyalarını doğrulayalım:

# Sertifika zincirini doğrula
openssl verify -CAfile /etc/zabbix/ssl/ca/ca.crt 
  /etc/zabbix/ssl/certs/zabbix-server.crt

# Sertifika bilgilerini görüntüle
openssl x509 -in /etc/zabbix/ssl/certs/zabbix-server.crt 
  -noout -text | grep -E "(Subject|Issuer|Not After)"

systemctl restart zabbix-server
systemctl status zabbix-server

3. Zabbix Agent TLS Yapılandırması

Her agent için ayrı sertifika üretmek en güvenli yaklaşım, ama 200 sunucunuz varsa bu süreci otomatize etmeniz gerekir. Önce manual yöntemi gösterelim, sonra toplu yapılandırmaya geçelim.

# Agent host üzerinde çalıştırılacak (192.168.10.50)
# Sertifika üretimini server üzerinde yapıp kopyalayabilirsiniz

# Agent için key ve CSR (server üzerinde veya agent üzerinde)
openssl genrsa -out /tmp/agent-web01.key 2048
openssl req -new -key /tmp/agent-web01.key 
  -out /tmp/agent-web01.csr 
  -subj "/C=TR/ST=Istanbul/O=SirketAdi/CN=web01"

# Server üzerinde CA ile imzala
openssl x509 -req -days 365 
  -in /tmp/agent-web01.csr 
  -CA /etc/zabbix/ssl/ca/ca.crt 
  -CAkey /etc/zabbix/ssl/ca/ca.key 
  -CAcreateserial 
  -out /tmp/agent-web01.crt

# Agent'a kopyala
scp /tmp/agent-web01.{key,crt} [email protected]:/etc/zabbix/ssl/
scp /etc/zabbix/ssl/ca/ca.crt [email protected]:/etc/zabbix/ssl/

Agent konfigürasyon dosyası:

# /etc/zabbix/zabbix_agentd.conf veya zabbix_agent2.conf

Server=192.168.10.10
ServerActive=192.168.10.10

# TLS ayarları
TLSConnect=cert
TLSAccept=cert
TLSCAFile=/etc/zabbix/ssl/ca.crt
TLSCertFile=/etc/zabbix/ssl/agent-web01.crt
TLSKeyFile=/etc/zabbix/ssl/agent-web01.key

# Agent CN'i (sertifikadaki CN ile eşleşmeli)
# Bu Zabbix web arayüzünde host TLS ayarlarında belirtilecek

Agent’ı yeniden başlatıp bağlantıyı test edelim:

systemctl restart zabbix-agent2

# Server'dan agent'a TLS bağlantısını test et
zabbix_get -s 192.168.10.50 -p 10050 
  --tls-connect=cert 
  --tls-ca-file=/etc/zabbix/ssl/ca/ca.crt 
  --tls-cert-file=/etc/zabbix/ssl/certs/zabbix-server.crt 
  --tls-key-file=/etc/zabbix/ssl/private/zabbix-server.key 
  -k system.uptime

4. PSK Tabanlı TLS (Hızlı Alternatif)

Certificate altyapısı kurmak istemiyorsanız veya IoT/embedded cihazlar için daha basit bir çözüm gerekiyorsa PSK kullanabilirsiniz. Ancak PSK key’lerini güvenli bir yerde sakladığınızdan emin olun.

# PSK key üret (agent üzerinde)
openssl rand -hex 32 > /etc/zabbix/zabbix_agentd.psk
chmod 640 /etc/zabbix/zabbix_agentd.psk
chown root:zabbix /etc/zabbix/zabbix_agentd.psk

# PSK değerini görüntüle (web arayüzüne girilecek)
cat /etc/zabbix/zabbix_agentd.psk

Agent konfigürasyonuna eklenecekler:

# zabbix_agentd.conf içine
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=web01-psk-identity
TLSPSKFile=/etc/zabbix/zabbix_agentd.psk

Web arayüzünde ilgili host’un Encryption sekmesine gidip PSK Identity ve PSK değerini girmeniz gerekiyor.

5. Web Arayüzü HTTPS Yapılandırması

Zabbix frontend’i Apache veya Nginx üzerinde çalışır. HTTPS olmadan tüm web trafiği, kullanıcı adı ve şifre dahil, açık gezer.

# Self-signed yerine Let's Encrypt kullanıyorsanız
# certbot --nginx -d zabbix.sirketiniz.com

# Manuel sertifika için Nginx konfigürasyonu
cat > /etc/nginx/conf.d/zabbix.conf << 'EOF'
server {
    listen 80;
    server_name zabbix.sirketiniz.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name zabbix.sirketiniz.com;

    ssl_certificate /etc/ssl/zabbix-web.crt;
    ssl_certificate_key /etc/ssl/private/zabbix-web.key;
    ssl_trusted_certificate /etc/ssl/ca.crt;

    # Güvenli TLS ayarları
    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 10m;

    # HSTS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-XSS-Protection "1; mode=block";

    root /usr/share/zabbix;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ .php$ {
        fastcgi_pass unix:/run/php-fpm/zabbix.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
EOF

nginx -t && systemctl reload nginx

6. Database Güvenliği

Zabbix server’ının database’e bağlantısı genellikle göz ardı edilen bir güvenlik noktası. Birkaç temel kural:

# MySQL/MariaDB üzerinde minimum yetki prensibi
mysql -u root -p << 'EOF'
-- Mevcut zabbix kullanıcısını kaldır ve yeniden oluştur
DROP USER IF EXISTS 'zabbix'@'localhost';

-- Sadece gerekli yetkilerle yeni kullanıcı
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'guclu-parola-buraya';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON zabbix.* TO 'zabbix'@'localhost';

-- Super yetkilerini VERME
-- GRANT ALL PRIVILEGES yerine yukarıdaki spesifik yetkiler

FLUSH PRIVILEGES;
EOF

Şifreyi zabbix_server.conf içinde düz metin olarak saklamak yerine, basit bir şifreleme katmanı ekleyebilirsiniz. Zabbix 6.2+ ile birlikte vault entegrasyonu da mümkün, ama en azından dosya izinlerini düzeltelim:

# zabbix_server.conf dosya izinleri
chmod 640 /etc/zabbix/zabbix_server.conf
chown root:zabbix /etc/zabbix/zabbix_server.conf

# Diğer kullanıcıların okuyamaması için
ls -la /etc/zabbix/zabbix_server.conf
# Çıktı: -rw-r----- 1 root zabbix ... zabbix_server.conf

Eğer Zabbix ve database farklı sunuculardaysa, database bağlantısını da şifreleyin:

# zabbix_server.conf içinde MySQL SSL ayarları
DBHost=db.internal.sirket.com
DBName=zabbix
DBUser=zabbix
DBPassword=guclu-parola

# MySQL SSL
DBTLSConnect=required
DBTLSCAFile=/etc/zabbix/ssl/ca/ca.crt
DBTLSCertFile=/etc/zabbix/ssl/certs/zabbix-db-client.crt
DBTLSKeyFile=/etc/zabbix/ssl/private/zabbix-db-client.key

7. Firewall ve Network Sertleştirme

TLS’i yapılandırdınız ama port’lar hala her yerden erişilebiliyorsa güvenlik yarım kalır.

# firewalld ile Zabbix portlarını sadece belirli subnet'e aç
# Zone: internal - sadece monitoring ağından erişim

# Mevcut zone'ları listele
firewall-cmd --list-all-zones

# Zabbix server için özel zone oluştur
firewall-cmd --permanent --new-zone=zabbix-monitoring
firewall-cmd --permanent --zone=zabbix-monitoring 
  --add-source=192.168.10.0/24

# Zabbix server portları (10051 = trapper, 10050 agent'dan gelen)
firewall-cmd --permanent --zone=zabbix-monitoring 
  --add-port=10051/tcp

# Web arayüzü (sadece management networkünden)
firewall-cmd --permanent --zone=zabbix-monitoring 
  --add-service=https

# Public zone'da Zabbix portlarını kapat
firewall-cmd --permanent --zone=public 
  --remove-port=10051/tcp 2>/dev/null || true

firewall-cmd --reload
firewall-cmd --list-all --zone=zabbix-monitoring

Zabbix Agent tarafında da benzer kısıtlama yapalım:

# Agent sunucuda, sadece Zabbix server ve proxy'den gelen bağlantılara izin ver
firewall-cmd --permanent --zone=public 
  --add-rich-rule='rule family="ipv4" source address="192.168.10.10/32" port port="10050" protocol="tcp" accept'

# Diğer tüm 10050 bağlantılarını reddet
firewall-cmd --permanent --zone=public 
  --add-rich-rule='rule family="ipv4" port port="10050" protocol="tcp" reject'

firewall-cmd --reload

8. Zabbix Kullanıcı Yönetimi ve Yetkilendirme

Web arayüzü güvenliği sıklıkla ihmal edilir. “Admin” kullanıcısını default şifre ile bırakmak, güvenli TLS kurulumunu anlamsız kılar.

Yapılması gerekenler:

  • Admin kullanıcısının adını değiştirin: “Admin” yerine organizasyonunuza özgü bir kullanıcı adı kullanın
  • Güçlü parola politikası uygulayın: Zabbix web arayüzünde Administration > Authentication bölümünden
  • LDAP/AD entegrasyonu yapın: Merkezi kimlik yönetimi için
  • Rol tabanlı erişim kontrolü: Read-only kullanıcılar için sadece görüntüleme yetkisi verin
  • Session timeout: Administration > General > GUI bölümünden oturum süresini sınırlayın

API erişimini de düşünmeniz gerekiyor. Otomasyonlar için ayrı bir API kullanıcısı oluşturun ve bu kullanıcıya minimum yetki verin:

# Zabbix API ile kullanıcı oluşturma örneği
curl -s -X POST http://localhost/zabbix/api_jsonrpc.php 
  -H "Content-Type: application/json" 
  -d '{
    "jsonrpc": "2.0",
    "method": "user.create",
    "params": {
      "username": "api-readonly",
      "passwd": "cok-guclu-bir-sifre-123!",
      "roleid": "4",
      "usrgrps": [{"usrgrpid": "8"}]
    },
    "auth": "ADMIN_TOKEN_BURAYA",
    "id": 1
  }'

9. Audit Log ve İzleme

Güvenliği yapılandırdınız, şimdi kimin ne yaptığını izlemeniz gerekiyor. Zabbix’in yerleşik audit log’u var, onu aktif hale getirin:

# zabbix_server.conf içinde
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=100
DebugLevel=3

# Audit log için ayrı bir syslog entegrasyonu
# rsyslog konfigürasyonu
cat >> /etc/rsyslog.d/zabbix.conf << 'EOF'
# Zabbix loglarını merkezi log sunucusuna gönder
:programname, isequal, "zabbix_server" @siem.sirket.com:514
:programname, isequal, "zabbix_agentd" @siem.sirket.com:514
EOF

systemctl restart rsyslog

Zabbix web arayüzünde Administration > Audit Log bölümüne gidin. Burada kullanıcı giriş/çıkışları, konfigürasyon değişiklikleri ve diğer kritik işlemleri görebilirsiniz. Bu log’ları bir SIEM’e göndermeniz kurumsal ortamlarda zorunluluk haline gelebilir.

10. Sertifika Yenileme Otomasyonu

Manuel sertifika yönetimi zaman içinde kaosa dönüşür. Basit bir script ile sertifika yenileme sürecini otomatize edelim:

#!/bin/bash
# /usr/local/bin/renew-zabbix-certs.sh

CERT_DIR="/etc/zabbix/ssl"
CA_KEY="${CERT_DIR}/ca/ca.key"
CA_CERT="${CERT_DIR}/ca/ca.crt"
DAYS=365
RENEWAL_THRESHOLD=30  # 30 gün kala yenile

renew_cert() {
    local name=$1
    local cert_file="${CERT_DIR}/certs/${name}.crt"
    local key_file="${CERT_DIR}/private/${name}.key"

    # Sertifikanın ne zaman dolacağını kontrol et
    days_left=$(openssl x509 -in "$cert_file" -noout -checkend $((RENEWAL_THRESHOLD * 86400)) 2>/dev/null; echo $?)

    if [ "$days_left" -ne 0 ]; then
        echo "[INFO] ${name} sertifikası ${RENEWAL_THRESHOLD} gün içinde doluyor, yenileniyor..."

        # Yeni CSR ve sertifika üret
        openssl req -new -key "$key_file" 
          -out "/tmp/${name}.csr" 
          -subj "/C=TR/ST=Istanbul/O=SirketAdi/CN=${name}"

        openssl x509 -req -days $DAYS 
          -in "/tmp/${name}.csr" 
          -CA "$CA_CERT" 
          -CAkey "$CA_KEY" 
          -CAcreateserial 
          -out "$cert_file"

        echo "[OK] ${name} sertifikası yenilendi"
        rm -f "/tmp/${name}.csr"
    else
        echo "[OK] ${name} sertifikası henüz geçerli"
    fi
}

# Server sertifikasını kontrol et ve gerekirse yenile
renew_cert "zabbix-server"

# Servis yeniden başlatma (sadece yenileme yapıldıysa)
systemctl reload zabbix-server 2>/dev/null || systemctl restart zabbix-server

echo "[DONE] Sertifika kontrolü tamamlandı: $(date)"

Cron ile aylık çalıştırın:

chmod +x /usr/local/bin/renew-zabbix-certs.sh
echo "0 2 1 * * root /usr/local/bin/renew-zabbix-certs.sh >> /var/log/zabbix-cert-renewal.log 2>&1" >> /etc/cron.d/zabbix-cert-renewal

Yapılandırmayı Doğrulama

Tüm bu değişiklikleri yaptıktan sonra bir doğrulama listesi geçmekte fayda var:

  • TLS bağlantısı testi: zabbix_get komutu ile agent bağlantısını doğrulayın
  • Sertifika geçerliliği: openssl verify ile zinciri kontrol edin
  • Port taraması: nmap -sV -p 10050,10051 192.168.10.10 ile açık portları gözden geçirin
  • Log kontrolü: /var/log/zabbix/zabbix_server.log içinde TLS hata mesajı olmadığından emin olun
  • Web arayüzü: HTTPS yönlendirmesini ve HTTP strict transport security header’ını test edin
  • Firewall kuralları: İzin verilmemesi gereken IP’lerden bağlantı denemesi yapın
# Hızlı sağlık kontrolü scripti
echo "=== Zabbix TLS Durum Kontrolü ==="
echo "Server sertifikası:"
openssl x509 -in /etc/zabbix/ssl/certs/zabbix-server.crt -noout -enddate

echo "Agent bağlantı testi:"
zabbix_get -s 192.168.10.50 -p 10050 
  --tls-connect=cert 
  --tls-ca-file=/etc/zabbix/ssl/ca/ca.crt 
  --tls-cert-file=/etc/zabbix/ssl/certs/zabbix-server.crt 
  --tls-key-file=/etc/zabbix/ssl/private/zabbix-server.key 
  -k agent.ping

echo "Port erişilebilirlik:"
nc -zv 192.168.10.50 10050 && echo "10050 ACIK" || echo "10050 KAPALI"

Sonuç

Zabbix güvenlik sertleştirmesi bir kerelik yapılan bir iş değil, sürekli bakım gerektiren bir süreç. Anlattıklarımı özetleyecek olursam: TLS altyapısını kur, sertifika yenilemeyi otomatize et, web arayüzünü HTTPS arkasına al, database bağlantısını şifrele, firewall kurallarını sıkıştır ve audit log’larını bir yerde topla.

Özellikle dikkat etmeniz gereken nokta şu: TLS’i Zabbix server tarafında yapılandırmak yetmez, web arayüzünde her host için encryption seçeneğini de “Certificate” veya “PSK” olarak ayarlamanız gerekiyor. Aksi halde server TLS’i desteklese de o host ile unencrypted iletişim kurabilir.

Büyük ortamlarda sertifika yönetimi için HashiCorp Vault, cert-manager (Kubernetes ortamında) veya en azından basit bir Ansible playbook kullanmanızı öneririm. 50 sunucudan fazlası olan ortamlarda manual yönetim kaçınılmaz olarak hataya açık hale gelir.

Son olarak, tüm bu değişiklikleri staging ortamında test ettikten sonra prodüksiyona almayı unutmayın. Yanlış yapılandırılmış bir TLS ayarı, tüm monitoring altyapınızı sessizce çökertebilir ve farkında olmadan saatlerce körleşebilirsiniz.

Bir yanıt yazın

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