Dovecot ile Prometheus Metrik İzleme

Mail sunucularında ne olup bittiğini bilmek, sorunları önceden yakalamak ve kapasite planlaması yapabilmek için metrik izleme vazgeçilmez bir ihtiyaç. Dovecot, uzun süredir production ortamlarında güvenilir şekilde çalışan bir IMAP/POP3 sunucusu olsa da varsayılan kurulumda metrik görünürlüğü oldukça sınırlı. Bu yazıda Dovecot’u Prometheus ile entegre ederek mail sunucunuzu gerçek anlamda izlenebilir hale getireceğiz.

Neden Prometheus ile Dovecot İzleme?

Klasik log analizi reactive bir yaklaşım. Bir şeyler patladıktan sonra log dosyalarına bakıyorsunuz. Prometheus ise size proactive bir izleme imkanı tanıyor. Bağlantı sayıları anormal yükseliyor mu? Kimlik doğrulama hataları artıyor mu? Belirli bir kullanıcı sunucuyu kasıyor mu? Bunları gerçek zamanlı görmek, uyarı almak ve Grafana ile görselleştirmek mail yönetimini bambaşka bir seviyeye taşıyor.

Dovecot’un built-in statistics sistemi oldukça güçlü. dovecot_exporter ya da Dovecot’un kendi HTTP stats endpoint’i üzerinden bu verileri Prometheus’a taşımak mümkün. Her iki yaklaşımı da ele alacağız.

Ön Gereksinimler

Başlamadan önce ortamınızın hazır olduğundan emin olun:

  • Dovecot 2.3.x veya üzeri (tercihen 2.3.14+)
  • Prometheus 2.x
  • Linux sunucu (Debian/Ubuntu veya RHEL/CentOS)
  • Temel Dovecot yapılandırması çalışır durumda

Dovecot sürümünüzü kontrol etmek için:

dovecot --version
# Çıktı örneği: 2.3.21 (9b044b2f8)

# Servis durumunu da kontrol edelim
systemctl status dovecot
doveadm stats dump

doveadm stats dump komutu boş veya hatalı çıktı veriyorsa stats modülü aktif değil demektir. Bunu düzelteceğiz.

Dovecot Stats Modülünü Aktifleştirme

Dovecot 2.3 ile birlikte gelen stats modülü, mail sunucusunun iç durumunu ayrıntılı şekilde ortaya koyuyor. Bu modülü yapılandırmak için önce ilgili konfigürasyon dosyasını oluşturun.

# Stats konfigürasyon dosyasını oluşturun
cat > /etc/dovecot/conf.d/10-stats.conf << 'EOF'
service stats {
  net_listener http-stats {
    port = 9900
    inet_listener http {
      port = 9900
    }
  }
}

metric auth_successes {
  event_name = auth_request_finished
  filter {
    success = yes
  }
}

metric auth_failures {
  event_name = auth_request_finished
  filter {
    success = no
  }
}

metric imap_commands {
  event_name = imap_command_finished
  group_by = cmd_name tagged_reply_state
}

metric imap_connections {
  event_name = imap_connected
}

metric mail_deliveries {
  event_name = mail_delivery_finished
}

metric lmtp_commands {
  event_name = lmtp_command_finished
  group_by = cmd_name tagged_reply_state
}
EOF

Dovecot’u yeniden başlatmadan önce konfigürasyonu doğrulayın:

doveconf -n 2>&1 | grep -i stats
dovecot -n | grep stats

# Syntax kontrolü
dovecot --config-file=/etc/dovecot/dovecot.conf -n

Konfigürasyon geçerliyse servisi yeniden başlatın:

systemctl restart dovecot
systemctl status dovecot

# HTTP endpoint'in ayakta olup olmadığını kontrol edin
curl -s http://localhost:9900/metrics | head -50

Eğer endpoint çalışıyorsa Prometheus formatında metrikler görmeye başlarsınız.

Dovecot Exporter ile Gelişmiş Metrik Toplama

Dovecot’un yerleşik HTTP endpoint’i temel metrikleri sağlıyor ancak dovecot_exporter daha zengin ve Prometheus ekosistemine daha iyi entegre metrikler sunuyor. Bu exporter’ı Dovecot’un Unix socket’i üzerinden iletişim kurarak çalışıyor.

# Go ortamı yoksa önce kurun
apt install golang-go -y  # Debian/Ubuntu
# veya
yum install golang -y  # RHEL/CentOS

# Exporter'ı kaynak koddan derleyin
cd /opt
git clone https://github.com/dovecot/dovecot_exporter.git
cd dovecot_exporter
go build -o dovecot_exporter .

# Binary'yi uygun yere taşıyın
cp dovecot_exporter /usr/local/bin/
chmod +x /usr/local/bin/dovecot_exporter

# Test çalıştırması
/usr/local/bin/dovecot_exporter --help

Alternatif olarak önceden derlenmiş binary’yi kullanabilirsiniz:

# GitHub releases sayfasından binary indirin
EXPORTER_VERSION="0.1.4"
wget https://github.com/dovecot/dovecot_exporter/releases/download/v${EXPORTER_VERSION}/dovecot_exporter_linux_amd64
mv dovecot_exporter_linux_amd64 /usr/local/bin/dovecot_exporter
chmod +x /usr/local/bin/dovecot_exporter

Exporter’ı systemd servisi olarak kaydedin:

cat > /etc/systemd/system/dovecot-exporter.service << 'EOF'
[Unit]
Description=Dovecot Prometheus Exporter
After=network.target dovecot.service
Requires=dovecot.service

[Service]
Type=simple
User=nobody
Group=nogroup
ExecStart=/usr/local/bin/dovecot_exporter 
  --dovecot.socket-path=/var/run/dovecot/stats-writer 
  --web.listen-address=:9166 
  --web.telemetry-path=/metrics
Restart=on-failure
RestartSec=5s
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now dovecot-exporter
systemctl status dovecot-exporter

Dovecot Unix Socket İzinlerini Ayarlama

Exporter’ın Dovecot stats socket’ine erişebilmesi için socket izinlerini doğru ayarlamak şart:

# Mevcut socket durumunu kontrol edin
ls -la /var/run/dovecot/
stat /var/run/dovecot/stats-writer

# Dovecot konfigürasyonunda socket izinlerini ayarlayın
cat >> /etc/dovecot/conf.d/10-stats.conf << 'EOF'

service stats {
  unix_listener stats-reader {
    user = nobody
    group = nogroup
    mode = 0660
  }

  unix_listener stats-writer {
    user = nobody
    group = nogroup
    mode = 0660
  }
}
EOF

systemctl restart dovecot

# Socket'e erişimi test edin
sudo -u nobody doveadm stats dump

Prometheus Konfigürasyonu

Prometheus’un Dovecot metriklerini toplaması için scrape konfigürasyonunu ekleyin:

# /etc/prometheus/prometheus.yml dosyasına ekleyin

scrape_configs:
  # Mevcut konfigürasyonlarınızın altına ekleyin
  
  - job_name: 'dovecot'
    static_configs:
      - targets: ['localhost:9166']
    scrape_interval: 30s
    scrape_timeout: 10s
    relabel_configs:
      - source_labels: [__address__]
        target_label: instance
        replacement: 'mail-server-01'
    metric_relabel_configs:
      - source_labels: [__name__]
        regex: 'dovecot_(auth|imap|lmtp|mail).*'
        action: keep

  # Dovecot'un yerleşik HTTP stats endpoint'i için (opsiyonel)
  - job_name: 'dovecot-native'
    static_configs:
      - targets: ['localhost:9900']
    scrape_interval: 60s
    metrics_path: /metrics

Prometheus’u yeniden yükleyin ve hedefleri kontrol edin:

# Konfigürasyonu doğrulayın
promtool check config /etc/prometheus/prometheus.yml

# Prometheus'u yeniden yükleyin (restart gerekmez)
systemctl reload prometheus
# veya
curl -X POST http://localhost:9090/-/reload

# Hedeflerin aktif olduğunu kontrol edin
curl -s http://localhost:9090/api/v1/targets | python3 -m json.tool | grep -A5 dovecot

Temel Prometheus Sorguları (PromQL)

Dovecot metriklerini anlamlı şekilde sorgulamak için bazı temel PromQL örnekleri:

# Aktif IMAP bağlantı sayısı
dovecot_imap_connections_total

# Son 5 dakikadaki kimlik doğrulama başarı oranı
rate(dovecot_auth_successes_total[5m])

# Kimlik doğrulama başarısızlık oranı (dakika başına)
rate(dovecot_auth_failures_total[5m]) * 60

# Toplam kimlik doğrulama başarı oranı (%)
(
  rate(dovecot_auth_successes_total[5m])
  /
  (rate(dovecot_auth_successes_total[5m]) + rate(dovecot_auth_failures_total[5m]))
) * 100

# IMAP komut latency (95. persentil)
histogram_quantile(0.95, rate(dovecot_imap_command_duration_seconds_bucket[5m]))

# Kullanıcı başına bağlantı sayısı (eğer user label varsa)
topk(10, dovecot_imap_connections_total by (user))

Alertmanager ile Uyarı Kuralları

Production ortamında sadece metrik toplamak yeterli değil. Kritik durumlar için uyarı kuralları tanımlamak gerekiyor:

# Dovecot uyarı kuralları dosyası oluşturun
cat > /etc/prometheus/rules/dovecot-alerts.yml << 'EOF'
groups:
  - name: dovecot_alerts
    interval: 30s
    rules:
      # Yüksek kimlik doğrulama başarısızlık oranı
      - alert: DovecotHighAuthFailureRate
        expr: |
          rate(dovecot_auth_failures_total[5m]) > 10
        for: 2m
        labels:
          severity: warning
          service: dovecot
        annotations:
          summary: "Dovecot yüksek auth hatası"
          description: "Dakikada {{ $value | humanize }} auth hatası var. Brute force saldırısı olabilir."

      # Dovecot servisi down
      - alert: DovecotDown
        expr: up{job="dovecot"} == 0
        for: 1m
        labels:
          severity: critical
          service: dovecot
        annotations:
          summary: "Dovecot servisi erişilemiyor"
          description: "Dovecot exporter {{ $labels.instance }} hedefine ulaşılamıyor."

      # Çok yüksek bağlantı sayısı
      - alert: DovecotTooManyConnections
        expr: |
          dovecot_imap_connections_total > 500
        for: 5m
        labels:
          severity: warning
          service: dovecot
        annotations:
          summary: "Dovecot aşırı bağlantı yükü"
          description: "Aktif IMAP bağlantı sayısı {{ $value }}'ye ulaştı."

      # Auth başarı oranı düşük
      - alert: DovecotLowAuthSuccessRate
        expr: |
          (
            rate(dovecot_auth_successes_total[10m])
            /
            (rate(dovecot_auth_successes_total[10m]) + rate(dovecot_auth_failures_total[10m]))
          ) < 0.7
        for: 5m
        labels:
          severity: critical
          service: dovecot
        annotations:
          summary: "Dovecot auth başarı oranı kritik seviyede"
          description: "Auth başarı oranı %{{ $value | humanizePercentage }}'ye düştü."
EOF

Uyarı kuralını Prometheus’a dahil edin:

# prometheus.yml dosyasına rule_files ekleyin
# rule_files:
#   - "rules/*.yml"

# Kural dosyasını doğrulayın
promtool check rules /etc/prometheus/rules/dovecot-alerts.yml

# Prometheus'u yeniden yükleyin
systemctl reload prometheus

Grafana Dashboard Hazırlama

Prometheus verilerini görselleştirmek için Grafana’ya bağlanın ve bir dashboard oluşturun. Dovecot için temel panel sorgularını aşağıda bulabilirsiniz.

Grafana’da yeni dashboard oluştururken şu panelleri ekleyin:

  • Auth Başarı/Başarısızlık Oranı: rate(dovecot_auth_successes_total[5m]) ve rate(dovecot_auth_failures_total[5m]) karşılaştırması
  • Aktif IMAP Bağlantıları: dovecot_imap_connections_total zaman serisi
  • IMAP Komut Latency: Histogram quantile sorgusu
  • Mail Teslimat Hızı: rate(dovecot_mail_deliveries_total[5m])

Grafana Dovecot dashboard’unu JSON olarak import etmek için Grafana Marketplace’de “Dovecot” araması yapabilir, hazır dashboard template’lerinden yararlanabilirsiniz (Dashboard ID: 7961 iyi bir başlangıç noktası).

Gerçek Dünya Senaryosu: Brute Force Tespiti

Production ortamında karşılaşılan en yaygın sorunlardan biri IMAP brute force saldırıları. Prometheus metrikleri ile bunu gerçek zamanlı tespit edebilirsiniz.

# Gerçek zamanlı auth hata oranını izleyin
watch -n 5 'curl -s http://localhost:9166/metrics | grep auth_failures'

# Yüksek hata üreten IP'leri Dovecot loglarından çekin
tail -f /var/log/dovecot.log | grep "auth failed" | 
  awk '{print $NF}' | sort | uniq -c | sort -rn | head -20

# Fail2ban ile entegrasyon - Prometheus alert geldiğinde Fail2ban'ı tetikleyin
# /etc/fail2ban/filter.d/dovecot-auth.conf dosyasına bakın
fail2ban-client status dovecot

Prometheus uyarısı geldiğinde çalışacak bir script yazabilirsiniz:

#!/bin/bash
# /usr/local/bin/dovecot-auth-check.sh

THRESHOLD=20
CURRENT_RATE=$(curl -s http://localhost:9166/metrics | 
  grep 'dovecot_auth_failures_total' | 
  awk '{print $2}')

LOG_FILE="/var/log/dovecot-monitor.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

echo "${TIMESTAMP} - Auth failure total: ${CURRENT_RATE}" >> ${LOG_FILE}

# Dovecot stats özeti
doveadm stats dump global | while read line; do
  echo "${TIMESTAMP} - STATS: ${line}" >> ${LOG_FILE}
done

# Aktif bağlantıları listele
doveadm who | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn >> ${LOG_FILE}

Dovecot Director ve Cluster İzleme

Birden fazla backend sunucusu olan Dovecot Director kurulumlarında her backend’i ayrı ayrı izlemek gerekiyor:

# Çoklu backend için prometheus.yml konfigürasyonu
scrape_configs:
  - job_name: 'dovecot-backends'
    static_configs:
      - targets:
          - 'backend-01.example.com:9166'
          - 'backend-02.example.com:9166'
          - 'backend-03.example.com:9166'
    relabel_configs:
      - source_labels: [__address__]
        regex: '([^:]+):.*'
        target_label: hostname
        replacement: '$1'

Backend’ler arası yük dengesini kontrol etmek için:

# Backend başına bağlantı dağılımı
sum by (hostname) (dovecot_imap_connections_total)

# En yüklü backend
topk(1, sum by (hostname) (dovecot_imap_connections_total))

# Backend başına auth hata oranı
sum by (hostname) (rate(dovecot_auth_failures_total[5m]))

Sorun Giderme

Exporter’ın metrik üretmediği durumda şu adımları izleyin:

# Exporter loglarını kontrol edin
journalctl -u dovecot-exporter -n 50 --no-pager

# Manuel test
curl -v http://localhost:9166/metrics 2>&1 | head -30

# Dovecot stats socket'inin varlığını kontrol edin
ls -la /var/run/dovecot/stats*

# Socket izinlerini test edin
sudo -u nobody nc -U /var/run/dovecot/stats-writer << 'EOF'
EXPORTtglobaln
EOF

# Dovecot event sistemi çalışıyor mu?
doveadm log reopen
doveadm stats reset
sleep 5
doveadm stats dump global

# Port çakışması var mı kontrol edin
ss -tlnp | grep -E '9166|9900'
netstat -tlnp | grep -E '9166|9900'

Yaygın hata ve çözümleri:

  • “connection refused” hatası: Dovecot’un stats socket’i oluşturmadığını gösterir. 10-stats.conf konfigürasyonunu ve Dovecot log’larını kontrol edin.
  • “permission denied” hatası: Socket izinleri yanlış ayarlanmış. stats-writer socket’inin nobody kullanıcısı tarafından okunabilir olduğundan emin olun.
  • Boş metrik listesi: doveadm stats dump komutu ile stats modülünün aktif olduğunu doğrulayın.
  • Prometheus’ta “up” metriği 0: Exporter çalışıyor ama Prometheus’un ona ulaşamadığını gösterir. Firewall kurallarını ve port erişimini kontrol edin.

Kapasite Planlaması için Metrik Kullanımı

Uzun vadede toplanan Dovecot metrikleri kapasite planlaması için çok değerli. Prometheus’un uzun süreli veri saklama özelliği ile aylık trendleri analiz edebilirsiniz:

# Günlük ortalama bağlantı sayısı (son 30 gün)
avg_over_time(dovecot_imap_connections_total[30d])

# Haftalık auth işlem hacmi
increase(dovecot_auth_successes_total[7d])

# Büyüme oranı tahmini (linear regression)
predict_linear(dovecot_imap_connections_total[14d], 86400 * 30)

Bu sorgular sayesinde “önümüzdeki 30 günde bağlantı kapasitemiz dolacak mı?” sorusuna veri odaklı yanıt verebilirsiniz.

Sonuç

Dovecot ile Prometheus entegrasyonu, mail sunucunuzu reaktif yönetimden proaktif yönetime geçirmenin en etkili yolu. Bu yazıda ele aldığımız temel adımlar şunlardı:

  • Dovecot stats modülünü aktifleştirme ve HTTP endpoint yapılandırması
  • dovecot_exporter kurulumu ve systemd entegrasyonu
  • Socket izinlerinin doğru ayarlanması
  • Prometheus scrape konfigürasyonu
  • Kritik uyarı kurallarının tanımlanması
  • Brute force tespiti gibi gerçek dünya senaryolarının ele alınması
  • Çoklu backend ortamlarında izleme

Production’a almadan önce bir test ortamında tüm bu adımları denemenizi, özellikle uyarı eşik değerlerini kendi trafik profilinize göre ayarlamanızı öneririm. Her mail sunucusu farklı yük altında çalışır; 10 auth hatası/dakika bir kurumsal sunucu için normal olabilirken küçük bir hosting ortamında alarm zili çalmalıdır. Metriklerinizi birkaç hafta izleyin, baseline değerleri belirleyin ve uyarı kurallarınızı buna göre fine-tune edin. İyi izlemeler!

Yorum yapın