FUTIA
GÜVENLIK8 dk okuma

Linux Dosya Bütünlüğü İzleme: Bash + Telegram Uyarı Sistemi

Sunucundaki kritik dosyalar değiştiğinde 30 saniye içinde Telegram'dan haberdar olabilirsin. Bash script + inotify ile basit ama etkili bir çözüm.

Linux Dosya Bütünlüğü İzleme: Bash + Telegram Uyarı Sistemi
Miraç Eroğlu
8 Mayıs 2026

Sunucunda kritik bir dosya değiştiğinde ne kadar sürede fark ediyorsun? Bir saat? Bir gün? Yoksa hiç mi fark etmiyorsun? 2023'te kamupersonelhaber.com'da ilan.gov.tr API'sinden çektiğimiz verileri işlerken .env dosyasının birisi tarafından değiştirildiğini 6 saat sonra fark ettim. API key rotasyonu yapmıştık, eski key'i birisi manuel olarak geri yazmış. 6 saat boyunca sistemimiz eski, geçersiz bir key ile istek atmaya çalışmış. O günden sonra kritik dosyalar için otomatik bir izleme sistemi kurdum. Bash script + inotify + Telegram. Toplam 87 satır kod. Herhangi bir dosya değiştiğinde 30 saniye içinde telefonumda bildirim. Şu an FUTIA'nın tüm production sunucularında çalışıyor. Bu yazıda aynı sistemi nasıl kuracağını, hangi dosyaları izlemen gerektiğini ve Telegram entegrasyonunu adım adım göstereceğim.

Neden Dosya Bütünlüğü İzleme Önemli?

Çoğu küçük-orta ölçekli proje sunucu güvenliğini firewall + SSH key ile halleder. Yeterli mi? Hayır. Sunucuna erişim sağlayan birisi (yetkili veya yetkisiz) kritik dosyaları değiştirebilir. Senaryolar:

  • Bir ekip arkadaşın yanlışlıkla production .env dosyasını staging ile karıştırır
  • Bir saldırgan SSH key'ini ele geçirir, cron job'a backdoor ekler
  • Otomatik güncelleme sistemi nginx.conf'u bozar
  • Docker container'ı yeniden başlatılınca volume mount yanlış yapılandırma yüzünden eski config dosyasını yükler

Bu senaryoların hepsini yaşadım. En kötüsü: fark etmemek. Sistem sessizce hatalı çalışır, sen de nedenini anlamaya çalışırsın. Dosya bütünlüğü izleme bu sessiz hataları sesli hale getirir. Bir dosya değiştiğinde anında haberdar olursun. Manuel değişiklikse "tamam, bendim" dersin. Değilse hemen müdahale edersin.

FUTIA'da izlediğimiz dosyalar:

  • .env (API key'ler, database credential'lar)
  • nginx.conf ve site-specific config dosyaları
  • crontab dosyaları
  • systemd service dosyaları
  • Docker Compose YAML'ları
  • SSH authorized_keys
  • /etc/hosts (DNS poisoning tespiti için)

Bu dosyaların herhangi biri değiştiğinde Telegram'dan bildirim alıyorum. Değişiklik bekliyorsam görmezden geliyorum. Beklemiyorsam sunucuya bağlanıp loglara bakıyorum.

inotify Nedir ve Nasıl Çalışır?

inotify, Linux kernel'ın dosya sistemi olaylarını izlemek için sunduğu bir API. Bir dosya veya dizin üzerinde değişiklik olduğunda (create, modify, delete, move) kernel userspace'e event gönderir. Polling yapmana gerek yok, olay olduğunda haberdar olursun.

Bash'te inotify kullanmak için inotify-tools paketi gerekli:

# Ubuntu/Debian
sudo apt install inotify-tools

# CentOS/RHEL
sudo yum install inotify-tools

Temel kullanım:

inotifywait -m -e modify,create,delete /path/to/file
  • -m: monitor mode, sürekli izle (tek seferlik değil)
  • -e: event türleri (modify, create, delete, move, attrib)
  • Son parametre: izlenecek dosya veya dizin

Örnek output:

/home/user/.env MODIFY
/home/user/.env ATTRIB

Bu output'u bash script içinde yakalayıp Telegram'a gönderebiliriz.

inotify Limitlerini Artırma

Varsayılan inotify limitleri küçük projeler için yeterli, ama çok sayıda dosya izliyorsan limitlerle karşılaşabilirsin. Kontrol etmek için:

cat /proc/sys/fs/inotify/max_user_watches

Varsayılan genelde 8192. Artırmak için:

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Ben 524288 kullanıyorum, hiç limite takılmadım.

Telegram Bot Kurulumu

Telegram'a bildirim göndermek için bir bot oluşturman ve chat ID'ni alman gerekiyor.

1. Telegram'da @BotFather'ı aç 2. /newbot komutunu gönder 3. Bot için bir isim ver (örn: "Sunucu İzleme Bot") 4. Benzersiz bir username ver (örn: "myserver_monitor_bot") 5. BotFather sana bir token verecek (örn: 123456789:ABCdefGHIjklMNOpqrsTUVwxyz)

Şimdi chat ID'ni bul:

1. Oluşturduğun bot'a herhangi bir mesaj gönder 2. Browser'da şu URL'yi aç: https://api.telegram.org/bot<TOKEN>/getUpdates 3. JSON response içinde "chat":{"id":123456789} şeklinde chat ID'ni göreceksin

Bu iki değeri (token ve chat ID) not et. Script içinde kullanacağız.

Bash Script: Dosya İzleme + Telegram Uyarı

İşte tam çalışan script. /usr/local/bin/file-monitor.sh olarak kaydedebilirsin:

#!/bin/bash

# Telegram config
TELEGRAM_BOT_TOKEN="123456789:ABCdefGHIjklMNOpqrsTUVwxyz"
TELEGRAM_CHAT_ID="123456789"

# İzlenecek dosyalar (her satırda bir dosya)
WATCH_FILES=(
    "/home/user/.env"
    "/etc/nginx/nginx.conf"
    "/etc/nginx/sites-enabled/mysite.conf"
    "/var/spool/cron/crontabs/root"
    "/etc/systemd/system/myapp.service"
    "/home/user/docker-compose.yml"
    "/root/.ssh/authorized_keys"
)

# Telegram mesaj gönderme fonksiyonu
send_telegram() {
    local message="$1"
    curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
        -d chat_id="${TELEGRAM_CHAT_ID}" \
        -d text="${message}" \
        -d parse_mode="HTML" > /dev/null
}

# Sunucu hostname'ini al
HOSTNAME=$(hostname)

# Script başladığında bildir
send_telegram "🟢 <b>Dosya izleme başladı</b>\n\nSunucu: ${HOSTNAME}\nİzlenen dosya sayısı: ${#WATCH_FILES[@]}"

# Her dosya için inotifywait başlat
for file in "${WATCH_FILES[@]}"; do
    if [ ! -e "$file" ]; then
        send_telegram "⚠️ <b>Uyarı</b>\n\nDosya bulunamadı: ${file}\nSunucu: ${HOSTNAME}"
        continue
    fi
    
    # Arka planda izlemeye başla
    inotifywait -m -e modify,create,delete,move,attrib "$file" 2>/dev/null | while read path action file_name; do
        # Değişiklik bilgisini hazırla
        timestamp=$(date '+%Y-%m-%d %H:%M:%S')
        
        # Son 5 satır log (varsa)
        if [ -f "$path" ]; then
            last_lines=$(tail -n 5 "$path" 2>/dev/null | sed 's/</\&lt;/g; s/>/\&gt;/g')
        else
            last_lines="(Dosya silindi)"
        fi
        
        # Telegram mesajı
        message="🔴 <b>DOSYA DEĞİŞİKLİĞİ TESPİT EDİLDİ</b>\n\n"
        message+="📁 Dosya: ${path}\n"
        message+="⚡ İşlem: ${action}\n"
        message+="🖥 Sunucu: ${HOSTNAME}\n"
        message+="🕐 Zaman: ${timestamp}\n\n"
        message+="📄 Son 5 satır:\n<code>${last_lines}</code>"
        
        send_telegram "${message}"
    done &
done

# Script sonlanırsa bildir
trap 'send_telegram "🔴 <b>Dosya izleme durdu</b>\n\nSunucu: ${HOSTNAME}"' EXIT

# Sonsuz döngü (script'in kapanmaması için)
while true; do
    sleep 3600
done

Script'in yaptıkları:

1. Belirtilen dosyaları inotify ile izler 2. Herhangi bir değişiklik olduğunda Telegram'a mesaj gönderir 3. Mesajda dosya yolu, işlem türü, sunucu adı ve son 5 satır yer alır 4. Script başladığında ve durduğunda bildirim gönderir 5. İzlenecek dosya yoksa uyarı verir

Script'i çalıştırılabilir yap:

chmod +x /usr/local/bin/file-monitor.sh

Systemd Service Olarak Çalıştırma

Script'in sürekli çalışması için systemd service oluştur. /etc/systemd/system/file-monitor.service:

[Unit]
Description=File Integrity Monitor with Telegram Alerts
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/file-monitor.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Service'i aktif et:

sudo systemctl daemon-reload
sudo systemctl enable file-monitor.service
sudo systemctl start file-monitor.service

Durum kontrolü:

sudo systemctl status file-monitor.service

Logları görmek için:

journalctl -u file-monitor.service -f

Gerçek Dünya Senaryosu: kamupersonelhaber.com

kamupersonelhaber.com'da günde 50+ kamu ilanı otomatik yayınlıyoruz. İlan verisi ilan.gov.tr API'sinden geliyor. API key'i .env dosyasında. Bir gün sistemin ilan çekmediğini fark ettim. Loglara baktım: 401 Unauthorized. API key rotasyonu yapmıştık, yeni key'i .env'ye yazmıştım. Ama birisi (ekipten biri) eski .env'yi yedekten geri yüklemiş. Manuel müdahale. Yeni key kaybolmuş, eski key geçersiz.

Dosya izleme sistemi olsaydı: 1. .env değiştiğinde Telegram'dan bildirim alırdım 2. "Ben değiştirmedim" derdim 3. Hemen kontrol ederdim 4. 5 dakika içinde düzeltirdim

Gerçekte: 6 saat sonra fark ettim. 6 saat veri kaybı. O günden sonra tüm production sunuculara dosya izleme kurdum.

Gelişmiş Özellikler

Hash Tabanlı Değişiklik Tespiti

inotify her değişiklikte tetiklenir. Ama bazen dosya değişmez, sadece touch edilir veya metadata güncellenir. Gerçek içerik değişikliğini tespit etmek için hash kullanabilirsin:

# Dosyanın hash'ini sakla
OLD_HASH=$(md5sum "$file" | awk '{print $1}')

# İzleme döngüsü içinde
NEW_HASH=$(md5sum "$file" | awk '{print $1}')
if [ "$OLD_HASH" != "$NEW_HASH" ]; then
    send_telegram "Hash değişti: $file"
    OLD_HASH="$NEW_HASH"
fi

Bu yaklaşım false positive'leri azaltır.

Dizin İzleme

Tek dosya yerine tüm dizini izleyebilirsin:

inotifywait -m -r -e modify,create,delete /etc/nginx/

-r parametresi recursive izleme sağlar. Ama dikkatli ol: çok fazla event gelirse Telegram rate limit'e takılabilir. Bu durumda event'leri grupla, 1 dakikada bir özet gönder.

Slack veya Discord Entegrasyonu

Telegram yerine Slack veya Discord kullanmak istersen webhook URL'lerini kullanabilirsin:

# Slack
curl -X POST -H 'Content-type: application/json' \
    --data '{"text":"Dosya değişti: /etc/nginx/nginx.conf"}' \
    YOUR_SLACK_WEBHOOK_URL

# Discord
curl -X POST -H 'Content-type: application/json' \
    --data '{"content":"Dosya değişti: /etc/nginx/nginx.conf"}' \
    YOUR_DISCORD_WEBHOOK_URL

Ben Telegram'ı tercih ediyorum çünkü bot API'si daha esnek ve rate limit'ler daha yüksek.

Performans ve Kaynak Kullanımı

inotify çok hafif. FUTIA sunucularında 15-20 dosya izliyorum, CPU kullanımı %0.1'in altında, RAM kullanımı 5-10 MB. Kernel-level bir mekanizma olduğu için polling yapan çözümlerden çok daha verimli.

Dikkat edilmesi gerekenler:

  • Çok fazla dosya izlerken max_user_watches limitini artır
  • Yüksek frekansta değişen dosyaları izleme (log dosyaları gibi), Telegram rate limit'e takılırsın
  • İzlenen dosyalar silinip yeniden oluşturulursa inotify watch'ı kaybedebilir, script'i restart et

Alternatif Araçlar

Bash script dışında başka çözümler de var:

AIDE (Advanced Intrusion Detection Environment): Dosya bütünlüğü kontrolü için industry-standard araç. Hash tabanlı, periyodik tarama yapar. Ama real-time değil, cron job ile çalışır.

Tripwire: Ticari, enterprise-grade dosya bütünlüğü izleme. Çok güçlü ama küçük projeler için overkill.

Osquery: Facebook'un açık kaynak araç. SQL ile sunucu state'ini sorgularsın. Dosya değişikliklerini de izleyebilirsin. Ama kurulumu ve konfigürasyonu karmaşık.

Auditd: Linux audit subsystem. Kernel-level, çok detaylı loglar. Ama log volume'ü yüksek, analiz etmek zor.

Ben basit bash script'i tercih ediyorum çünkü:

  • Kurulumu 5 dakika
  • Anlaşılır, özelleştirilebilir
  • Bağımlılığı minimal (inotify-tools + curl)
  • Real-time bildirim

Enterprise ortam için AIDE veya Tripwire kullanırdım. Küçük-orta ölçekli projeler için bash script yeterli.

Güvenlik Notları

Dosya izleme sistemi güvenlik katmanlarından biri, tek başına yeterli değil. Ek önlemler:

  • SSH key-based authentication kullan, password authentication'ı kapat
  • Sudo yetkilerini sınırla, her kullanıcıya root verme
  • Firewall kurallarını sıkı tut, sadece gerekli portları aç
  • Otomatik güvenlik güncellemelerini aktif et
  • Kritik dosyaların yedeğini al (git repo'da tut veya S3'e yükle)

Dosya izleme bu katmanların üzerine eklenen bir erken uyarı sistemi. Bir şey ters gittiğinde hızlı fark etmeni sağlar.

FUTIA'da Kullanım

FUTIA'nın tüm production sunucularında bu sistem çalışıyor. Hollanda'daki VPS'lerde, Türkiye'deki müşteri sunucularında. Ayda ortalama 3-4 gerçek uyarı alıyorum. Çoğu beklenen değişiklikler (ben veya ekip arkadaşım config güncellemesi yapıyor). Ama geçen ay bir garip durum oldu: diolivo.com.tr sunucusunda nginx.conf değişmiş. Ben değiştirmedim, müşteri de değiştirmedi. Sunucuya bağlandım, log'lara baktım. Otomatik güncelleme sistemi nginx'i güncellerken varsayılan config dosyasını yazmış. Backup'tan geri yükledim, 10 dakika downtime oldu. Dosya izleme olmasaydı müşteri "site açılmıyor" diyene kadar fark etmezdim.

Başka bir örnek: kamupersonelhaber.com'da crontab dosyası değişmiş. Telegram'dan bildirim aldım, kontrol ettim. Yeni bir cron job eklenmiş: her gece 3'te database dump alıp S3'e yükle. Ben eklemiştim, unutmuşum. Bildirim sayesinde hatırladım, doğru çalıştığını kontrol ettim.

Bu tür küçük ama kritik değişiklikleri takip etmek sistem güvenilirliğini artırıyor.

Linux sunucu yönetiyorsan dosya bütünlüğü izleme kurmanı öneririm. 1 saatlik kurulum, uzun vadede çok zaman kazandırır. FUTIA olarak müşterilerimizin sunucularına da bu sistemi kuruyoruz. Eğer kendi sunucun için özel bir izleme veya otomasyon çözümü istersen benimle iletişime geçebilirsin: WhatsApp +90 532 491 17 05 veya info@futia.net. Bash script'ten çok daha gelişmiş, Python tabanlı, multi-sunucu destekli sistemler de kurabiliriz.

Sıkça Sorulanlar

inotify yerine cron job ile periyodik kontrol yapsam olmaz mı?

Olur ama real-time olmaz. Cron job 5 dakikada bir çalışsa bile, değişikliği 5 dakika sonra fark edersin. inotify anında tetiklenir, 30 saniye içinde bildirim alırsın. Ayrıca cron job her seferinde dosyaları okuyup hash hesaplar, CPU ve disk I/O kullanır. inotify kernel-level, çok daha verimli. Kritik dosyalar için real-time izleme şart, cron job yedek çözüm olarak kullanılabilir.

Telegram rate limit'e takılır mıyım?

Normal kullanımda takılmazsın. Telegram bot API limiti saniyede 30 mesaj, dakikada 20 farklı chat'e mesaj. Dosya izleme sistemi çok sık mesaj göndermez, sadece değişiklik olduğunda. Ama yüksek frekansta değişen dosyaları (log dosyaları gibi) izlersen rate limit'e takılabilirsin. Bu durumda mesajları grupla: 1 dakikada bir özet gönder, her değişiklik için ayrı mesaj gönderme. Ben 2 yıldır kullanıyorum, hiç rate limit sorunu yaşamadım.

Hangi dosyaları izlemeliyim?

Kritik konfigürasyon dosyalarını izle: .env (API key'ler, credential'lar), web server config (nginx.conf, apache2.conf), crontab dosyaları, systemd service dosyaları, Docker Compose YAML'ları, SSH authorized_keys. Ayrıca /etc/hosts (DNS poisoning tespiti), /etc/passwd ve /etc/shadow (kullanıcı değişiklikleri) izlenebilir. Log dosyalarını izleme, çok fazla event gelir. Uygulama kodunu izleme, git ile versiyonlanıyor zaten. Sadece production'da manuel değişmemesi gereken dosyaları izle.

Script kapanırsa ne olur?

Systemd service olarak çalıştırırsan otomatik restart olur. Script'te Restart=always ve RestartSec=10 ayarladık, kapanırsa 10 saniye sonra yeniden başlar. Ayrıca script EXIT trap ile kapandığında Telegram'a bildirim gönderir, fark edersin. Sunucu reboot olursa systemd service otomatik başlar (enable ile aktif ettik). Yine de haftada bir systemctl status ile kontrol etmeni öneririm.

Birden fazla sunucuda nasıl kullanırım?

Her sunucuya ayrı script kurabilirsin, aynı Telegram bot'u kullanabilirsin. Mesajlarda sunucu hostname'i olduğu için hangi sunucudan geldiğini anlarsın. Daha gelişmiş çözüm: merkezi bir sunucudan tüm sunucuları izle. Her sunucuda lightweight bir agent çalıştır, değişiklikleri merkezi sunucuya gönder, oradan Telegram'a bildirim at. FUTIA'da 8 sunucu var, her birinde ayrı script çalışıyor, aynı Telegram chat'ine mesaj geliyor. Karışıklık olmuyor, hostname sayesinde ayırt ediyorum.

YAZAR HAKKINDA
Miraç Eroğlu

Hacettepe mezunu, 6 yıldır sosyal medya, 2 yıldır AI otomasyon.

Daha fazla bilgi →

Bu yazıdaki tekniklerden birini uygulamak ister misiniz? Kısa bir form doldurun, 48 saat içinde ücretsiz ön inceleme raporu mailinize düşsün.