{"id":31661,"date":"2025-10-12T12:31:32","date_gmt":"2025-10-12T09:31:32","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/"},"modified":"2025-10-12T12:31:32","modified_gmt":"2025-10-12T09:31:32","slug":"2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/","title":{"rendered":"2 Saniyede Dosya De\u011fi\u015fikli\u011fi Tespiti: Python ile Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zleme"},"content":{"rendered":"<p><body><\/p>\n<style>\n        body {\n            font-family: Arial, sans-serif;\n            line-height: 1.6;\n            color: #333;\n            max-width: 800px;\n            margin: 0 auto;\n            padding: 20px;\n        }\n        h2 {\n            color: #2c3e50;\n            border-bottom: 2px solid #3498db;\n            padding-bottom: 10px;\n            margin-top: 30px;\n        }\n        h3 {\n            color: #34495e;\n            margin-top: 25px;\n        }\n        pre {\n            background-color: #ecf0f1;\n            padding: 15px;\n            border-radius: 5px;\n            overflow-x: auto;\n            white-space: pre-wrap;\n            word-wrap: break-word;\n        }\n        code {\n            font-family: \"Consolas\", \"Monaco\", monospace;\n            font-size: 0.9em;\n        }\n        .expert-tip {\n            background-color: #e8f6f3;\n            border-left: 5px solid #1abc9c;\n            padding: 15px;\n            margin: 20px 0;\n            border-radius: 4px;\n            font-style: italic;\n        }\n        .case-study {\n            background-color: #f8f9fa;\n            border: 1px solid #dee2e6;\n            padding: 20px;\n            margin: 20px 0;\n            border-radius: 5px;\n        }\n        table {\n            width: 100%;\n            border-collapse: collapse;\n            margin: 20px 0;\n        }\n        th, td {\n            border: 1px solid #ddd;\n            padding: 8px;\n            text-align: left;\n        }\n        th {\n            background-color: #f2f2f2;\n        }\n        ul {\n            list-style-type: disc;\n            margin-left: 20px;\n        }\n        ol {\n            list-style-type: decimal;\n            margin-left: 20px;\n        }\n        .faq-question {\n            font-weight: bold;\n            color: #2c3e50;\n        }\n        .faq-answer {\n            margin-bottom: 15px;\n        }<\/p>\n<p>        \/* Mobil Uyumlu HTML \u00d6rne\u011fi *\/\n        @media (max-width: 600px) {\n            body {\n                padding: 10px;\n            }\n            h2 {\n                font-size: 1.5em;\n            }\n            h3 {\n                font-size: 1.2em;\n            }\n            table, thead, tbody, th, td, tr {\n                display: block;\n            }\n            thead tr {\n                position: absolute;\n                top: -9999px;\n                left: -9999px;\n            }\n            tr { border: 1px solid #ccc; }\n            td {\n                border: none;\n                border-bottom: 1px solid #eee;\n                position: relative;\n                padding-left: 50%;\n            }\n            td:before {\n                position: absolute;\n                top: 6px;\n                left: 6px;\n                width: 45%;\n                padding-right: 10px;\n                white-space: nowrap;\n                content: attr(data-label); \/* Etiketi buraya \u00e7ekeriz *\/\n                font-weight: bold;\n            }\n        }\n    <\/style>\n<p>Siber sald\u0131r\u0131lar her ge\u00e7en g\u00fcn daha sofistike hale gelirken, sistem dosyalar\u0131n\u0131zda veya kritik verilerinizde meydana gelen yetkisiz de\u011fi\u015fiklikleri saniyeler i\u00e7inde tespit etmek hayati \u00f6nem ta\u015f\u0131r. Bu makale, Python kullanarak dosya b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ger\u00e7ek zamanl\u0131ya yak\u0131n bir h\u0131zda nas\u0131l izleyebilece\u011finizi, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 nas\u0131l kapatabilece\u011finizi ve olas\u0131 veri ihlallerini nas\u0131l \u00f6nleyebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dijital d\u00fcnyas\u0131nda siber g\u00fcvenlik tehditleri s\u00fcrekli evrim ge\u00e7irmekte ve bu durum, kurumlar\u0131n savunma stratejilerini g\u00f6zden ge\u00e7irmesini zorunlu k\u0131lmaktad\u0131r. Bir sunucuya s\u0131zan k\u00f6t\u00fc ama\u00e7l\u0131 bir yaz\u0131l\u0131m, kritik sistem dosyalar\u0131n\u0131 de\u011fi\u015ftirebilir, veri taban\u0131 yap\u0131lar\u0131n\u0131 bozabilir veya hassas verilerin bulundu\u011fu dizinlerde yeni dosyalar olu\u015fturabilir. Bu t\u00fcr yetkisiz de\u011fi\u015fiklikler, genellikle fark edilmeden uzun s\u00fcre sistemde kalabilir ve ciddi g\u00fcvenlik ihlallerine yol a\u00e7abilir. \u0130\u015fte tam da bu noktada Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zleme (File Integrity Monitoring &#8211; FIM) devreye girer. FIM, belirli dosyalar\u0131n veya dizinlerin \u00fczerinde yap\u0131lan her t\u00fcrl\u00fc de\u011fi\u015fikli\u011fi (olu\u015fturma, silme, de\u011fi\u015ftirme) tespit eden ve bu de\u011fi\u015fiklikler hakk\u0131nda uyar\u0131 veren bir g\u00fcvenlik kontrol mekanizmas\u0131d\u0131r. Temel olarak, bir dosyan\u0131n veya dizinin &#8220;sa\u011fl\u0131kl\u0131&#8221; durumdaki parmak izini (hash de\u011ferini) kaydeder ve periyodik olarak veya ger\u00e7ek zamanl\u0131 olarak bu parmak izini kontrol ederek herhangi bir sapmay\u0131 bildirir.<\/p>\n<p>Peki, FIM&#8217;in bu kadar kritik olmas\u0131n\u0131n nedenleri nelerdir? \u0130lk olarak, g\u00fcvenlik ihlallerinin erken tespiti i\u00e7in vazge\u00e7ilmezdir. Bir sald\u0131rgan sisteme s\u0131zd\u0131\u011f\u0131nda, izlerini \u00f6rtmek veya kal\u0131c\u0131 eri\u015fim sa\u011flamak i\u00e7in genellikle sistem dosyalar\u0131n\u0131 de\u011fi\u015ftirir veya yeni k\u00f6t\u00fc ama\u00e7l\u0131 dosyalar yerle\u015ftirir. FIM, bu de\u011fi\u015fiklikleri an\u0131nda tespit ederek g\u00fcvenlik ekiplerine potansiyel bir sald\u0131r\u0131 hakk\u0131nda erken uyar\u0131 sa\u011flar. Bu erken uyar\u0131, sald\u0131r\u0131n\u0131n yay\u0131lmas\u0131n\u0131 engellemek veya geri d\u00f6n\u00fclemez zararlar vermesini \u00f6nlemek i\u00e7in kritik \u00f6neme sahiptir. \u0130kinci olarak, d\u00fczenleyici uyumluluk gereksinimlerini kar\u015f\u0131lamak i\u00e7in FIM \u015fartt\u0131r. \u00d6zellikle HIPAA, PCI DSS, GDPR gibi d\u00fczenlemeler, hassas verilerin korunmas\u0131 ve sistem b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fcn s\u00fcrd\u00fcr\u00fclmesi konusunda kat\u0131 kurallar getirir. FIM \u00e7\u00f6z\u00fcmleri, bu d\u00fczenlemelerin denetim izi (audit trail) ve b\u00fct\u00fcnl\u00fck kontrol\u00fc gereksinimlerini kar\u015f\u0131layarak kurulu\u015flar\u0131n yasal y\u00fck\u00fcml\u00fcl\u00fcklerini yerine getirmesine yard\u0131mc\u0131 olur. \u00d6rne\u011fin, PCI DSS, \u00f6deme kart\u0131 verileri ortam\u0131ndaki t\u00fcm sistem dosyalar\u0131nda FIM uygulanmas\u0131n\u0131 a\u00e7\u0131k\u00e7a talep eder.<\/p>\n<p>\u00dc\u00e7\u00fcnc\u00fc bir neden ise, i\u00e7 tehditlere kar\u015f\u0131 korunmad\u0131r. G\u00fcvenlik ihlalleri her zaman d\u0131\u015far\u0131dan gelmez; bazen k\u00f6t\u00fc niyetli \u00e7al\u0131\u015fanlar veya yetkisini a\u015fan personel taraf\u0131ndan da tetiklenebilir. FIM, i\u00e7eriden kaynaklanan yetkisiz de\u011fi\u015fiklikleri de tespit ederek, bir \u00e7al\u0131\u015fan\u0131n hassas bir yap\u0131land\u0131rma dosyas\u0131n\u0131 de\u011fi\u015ftirmeye \u00e7al\u0131\u015fmas\u0131 gibi durumlarda uyar\u0131 verebilir. Bu, hem veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korur hem de operasyonel riskleri azalt\u0131r. Son olarak, sistemin orijinal durumuna d\u00f6nmesini kolayla\u015ft\u0131r\u0131r. Bir g\u00fcvenlik ihlali ya\u015fand\u0131\u011f\u0131nda veya bir sistem hatas\u0131 meydana geldi\u011finde, FIM taraf\u0131ndan tutulan b\u00fct\u00fcnl\u00fck kay\u0131tlar\u0131, hangi dosyalar\u0131n de\u011fi\u015fti\u011fini ve ne zaman de\u011fi\u015fti\u011fini g\u00f6sterir. Bu bilgiler, sistemin h\u0131zl\u0131 bir \u015fekilde \u00f6nceki sa\u011fl\u0131kl\u0131 durumuna geri d\u00f6nd\u00fcr\u00fclmesine yard\u0131mc\u0131 olur ve felaket kurtarma (disaster recovery) s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r. \u00d6zetle, FIM sadece bir g\u00fcvenlik arac\u0131 olmaktan \u00f6te, modern IT altyap\u0131lar\u0131n\u0131n temel bir bile\u015fenidir ve proaktif bir savunma stratejisi i\u00e7in olmazsa olmazd\u0131r. Bu sayede, &#8220;2 saniyede dosya de\u011fi\u015fikli\u011fi tespiti&#8221; gibi iddial\u0131 hedeflere ula\u015farak, olas\u0131 zararlar\u0131 en aza indirebilir ve i\u015fletmelerin s\u00fcrekli operasyonunu g\u00fcvence alt\u0131na alabilirsiniz.<\/p>\n<div class=\"case-study\">\n<h3>Vaka Analizi: B\u00fcy\u00fck Bir Perakende Zincirinin PCI DSS Uyum S\u00fcreci<\/h3>\n<p>B\u00fcy\u00fck bir perakende zinciri, \u00f6deme kart\u0131 verilerini i\u015fledi\u011fi i\u00e7in PCI DSS (\u00d6deme Kart\u0131 Sekt\u00f6r\u00fc Veri G\u00fcvenli\u011fi Standard\u0131) uyumlulu\u011funu sa\u011flamak zorundayd\u0131. Zincir, POS sistemlerinden sunucular\u0131na kadar y\u00fczlerce cihazda dosya b\u00fct\u00fcnl\u00fc\u011f\u00fc izleme \u00e7\u00f6z\u00fcm\u00fc olmadan d\u00fczenli denetimlerde sorunlar ya\u015f\u0131yordu. Bir denetimde, bir POS cihaz\u0131ndaki kritik sistem dosyas\u0131n\u0131n yetkisizce de\u011fi\u015ftirildi\u011fi fark edildi. De\u011fi\u015fiklik, k\u00f6t\u00fc ama\u00e7l\u0131 bir yaz\u0131l\u0131m\u0131n s\u0131zma giri\u015fimi sonucuydu, ancak standart loglama mekanizmalar\u0131 bu kadar h\u0131zl\u0131 tespit edememi\u015fti. Zincir, Python tabanl\u0131 bir FIM \u00e7\u00f6z\u00fcm\u00fc entegre ederek bu sorunu \u00e7\u00f6zd\u00fc. Yeni sistem, kritik dizinlerdeki her t\u00fcrl\u00fc dosya de\u011fi\u015fikli\u011fini an\u0131nda tespit ediyor ve merkezi bir SIEM (Security Information and Event Management) sistemine iletiyordu. Bu sayede, potansiyel tehditler saniyeler i\u00e7inde belirlenip m\u00fcdahale edilebilir hale geldi. Bu entegrasyon, sadece uyumlulu\u011fu sa\u011flamakla kalmad\u0131, ayn\u0131 zamanda genel g\u00fcvenlik duru\u015funu \u00f6nemli \u00f6l\u00e7\u00fcde g\u00fc\u00e7lendirdi.<\/p>\n<\/p><\/div>\n<h2>Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zlemenin Temel Ta\u015flar\u0131 Nelerdir?<\/h2>\n<p>Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zleme (FIM) sistemi kurarken anlamam\u0131z gereken birka\u00e7 temel kavram bulunmaktad\u0131r. Bu kavramlar, sistemin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, neden etkili oldu\u011funu ve Python ile nas\u0131l uygulanaca\u011f\u0131n\u0131 anlamak i\u00e7in kritik \u00f6neme sahiptir. \u0130lk ve belki de en \u00f6nemli kavram, &#8220;hash fonksiyonlar\u0131&#8221;d\u0131r. Hash fonksiyonlar\u0131, herhangi bir boyuttaki veriyi (\u00f6rne\u011fin, bir dosyan\u0131n i\u00e7eri\u011fini) al\u0131p sabit boyutlu, benzersiz bir karakter dizisine d\u00f6n\u00fc\u015ft\u00fcren matematiksel algoritmalard\u0131r. Bu \u00e7\u0131kt\u0131ya &#8220;hash de\u011feri&#8221; veya &#8220;\u00f6zet&#8221; denir. \u00d6rne\u011fin, SHA-256 (Secure Hash Algorithm 256-bit) gibi pop\u00fcler bir hash algoritmas\u0131, bir dosyan\u0131n i\u00e7eri\u011fi ne olursa olsun, 256 bit uzunlu\u011funda tek bir hash de\u011feri \u00fcretir. Bu hash de\u011ferlerinin en \u00f6nemli \u00f6zelli\u011fi, girdideki en ufak bir de\u011fi\u015fikli\u011fin bile (tek bir karakterin de\u011fi\u015fmesi gibi) tamamen farkl\u0131 bir hash de\u011feri \u00fcretmesidir. Ayr\u0131ca, ayn\u0131 hash de\u011ferini veren iki farkl\u0131 girdi bulmak (\u00e7ak\u0131\u015fma) teorik olarak \u00e7ok zordur; bu da hash&#8217;leri dosya b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc kontrol etmek i\u00e7in ideal k\u0131lar.<\/p>\n<p>\u0130kinci temel ta\u015f &#8220;izleme mekanizmalar\u0131&#8221;d\u0131r. FIM sistemleri genellikle iki ana y\u00f6ntemden birini kullanarak dosya de\u011fi\u015fikliklerini alg\u0131lar: &#8220;polling&#8221; (sorgulama) ve &#8220;event-driven&#8221; (olay tabanl\u0131). Polling, belirli bir dizindeki dosyalar\u0131n hash de\u011ferlerini periyodik olarak (\u00f6rne\u011fin, her 5 saniyede bir veya her 1 dakikada bir) yeniden hesaplay\u0131p daha \u00f6nce kaydedilen hash de\u011ferleriyle kar\u015f\u0131la\u015ft\u0131rma y\u00f6ntemidir. E\u011fer mevcut hash de\u011feri kay\u0131tl\u0131 olandan farkl\u0131ysa, bu bir de\u011fi\u015fiklik oldu\u011funu g\u00f6sterir. Bu y\u00f6ntem kolay uygulanabilir olsa da, y\u00fcksek frekansta polling yapmak sistem kaynaklar\u0131n\u0131 t\u00fcketebilirken, d\u00fc\u015f\u00fck frekansta polling yapmak de\u011fi\u015fikliklerin tespitinde gecikmelere yol a\u00e7abilir. Hedefimiz olan &#8220;2 saniyede dosya de\u011fi\u015fikli\u011fi tespiti&#8221; i\u00e7in polling tek ba\u015f\u0131na yeterli olmayabilir veya \u00e7ok yo\u011fun kaynak gerektirebilir. Di\u011fer yandan, event-driven izleme, i\u015fletim sisteminin dosya sistemi olaylar\u0131n\u0131 (dosya olu\u015fturma, silme, de\u011fi\u015ftirme, izin de\u011fi\u015fikli\u011fi vb.) dinlemesi anlam\u0131na gelir. Linux&#8217;ta <code>inotify<\/code>, macOS&#8217;ta <code>FSEvents<\/code> ve Windows&#8217;ta <code>ReadDirectoryChangesW<\/code> gibi sistem API&#8217;leri bu t\u00fcr olaylar\u0131 an\u0131nda bildirir. Bu y\u00f6ntem, de\u011fi\u015fiklikleri ger\u00e7ek zamanl\u0131ya yak\u0131n bir h\u0131zda tespit etme yetene\u011fi sunar ve sistem kaynaklar\u0131n\u0131 daha verimli kullan\u0131r, \u00e7\u00fcnk\u00fc yaln\u0131zca bir olay meydana geldi\u011finde tetiklenir.<\/p>\n<p>\u00dc\u00e7\u00fcnc\u00fc \u00f6nemli bile\u015fen &#8220;veritaban\u0131 veya depolama&#8221;d\u0131r. FIM sisteminin d\u00fczg\u00fcn \u00e7al\u0131\u015fabilmesi i\u00e7in, ba\u015flang\u0131\u00e7taki &#8220;sa\u011fl\u0131kl\u0131&#8221; dosya durumlar\u0131n\u0131n (hash de\u011ferleri, boyutu, son de\u011fi\u015ftirilme tarihi gibi meta veriler) g\u00fcvenli bir \u015fekilde saklanmas\u0131 gerekir. Bu veriler genellikle bir veritaban\u0131nda (SQLite, PostgreSQL, MySQL gibi) veya yap\u0131land\u0131r\u0131lm\u0131\u015f dosyalarda (JSON, YAML) depolan\u0131r. Depolama alan\u0131, hem ilk taramadan elde edilen referans verileri hem de her kontrol sonras\u0131nda tespit edilen de\u011fi\u015fiklikleri (audit trail) tutar. Bu sayede, hangi dosyan\u0131n ne zaman, kim taraf\u0131ndan ve nas\u0131l de\u011fi\u015fti\u011fine dair kapsaml\u0131 bir kay\u0131t tutulabilir. Son olarak, &#8220;uyar\u0131 ve raporlama&#8221; mekanizmalar\u0131 FIM sisteminin etkinli\u011fini art\u0131r\u0131r. Bir de\u011fi\u015fiklik tespit edildi\u011finde, sistemin y\u00f6neticilere e-posta, SMS, anl\u0131k mesajla\u015fma veya merkezi bir g\u00fcvenlik olay y\u00f6netimi (SIEM) sistemine log g\u00f6nderme gibi yollarla an\u0131nda uyar\u0131 vermesi gerekir. Bu sayede g\u00fcvenlik ekipleri duruma h\u0131zl\u0131ca m\u00fcdahale edebilir. T\u00fcm bu temel ta\u015flar bir araya geldi\u011finde, Python ile g\u00fc\u00e7l\u00fc ve h\u0131zl\u0131 bir dosya b\u00fct\u00fcnl\u00fc\u011f\u00fc izleme sistemi in\u015fa edilebilir. Bu sistem, hem siber g\u00fcvenlik duru\u015funuzu g\u00fc\u00e7lendirir hem de d\u00fczenleyici gereksinimlere uyum sa\u011flaman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h2>Python ile Temel Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc Kontrol\u00fc Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Python, dosya i\u015flemleri ve kriptografik hash fonksiyonlar\u0131 i\u00e7in zengin bir standart k\u00fct\u00fcphane deste\u011fi sunar. Bu b\u00f6l\u00fcmde, Python kullanarak belirli bir dizindeki dosyalar\u0131n hash de\u011ferlerini nas\u0131l hesaplayaca\u011f\u0131n\u0131z\u0131 ve bu de\u011ferleri bir veritaban\u0131nda (\u00f6rne\u011fin, SQLite) saklayarak periyodik b\u00fct\u00fcnl\u00fck kontrolleri yapaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m g\u00f6sterece\u011fiz. Amac\u0131m\u0131z, basit ama i\u015flevsel bir FIM \u00e7ekirde\u011fi olu\u015fturmak.<\/p>\n<p>\u0130lk ad\u0131m, bir dosyan\u0131n hash de\u011ferini hesaplamakt\u0131r. <code>hashlib<\/code> mod\u00fcl\u00fc, SHA-256 gibi \u00e7e\u015fitli hash algoritmalar\u0131n\u0131 destekler. B\u00fcy\u00fck dosyalarla \u00e7al\u0131\u015f\u0131rken, dosyan\u0131n tamam\u0131n\u0131 belle\u011fe y\u00fcklemek yerine, par\u00e7alar halinde okuyup hash fonksiyonuna beslemek daha verimlidir. Bu yakla\u015f\u0131m, sistem kaynaklar\u0131n\u0131 korurken performans\u0131 da optimize eder.<\/p>\n<pre><code class=\"language-python\">\nimport hashlib\nimport os\n\ndef calculate_file_hash(filepath, hash_algo='sha256', block_size=65536):\n    \"\"\"\n    Belirtilen dosyan\u0131n hash de\u011ferini hesaplar.\n    :param filepath: Hash de\u011feri hesaplanacak dosyan\u0131n yolu.\n    :param hash_algo: Kullan\u0131lacak hash algoritmas\u0131 (\u00f6rn. 'sha256', 'md5').\n    :param block_size: Dosyan\u0131n okunaca\u011f\u0131 blok boyutu.\n    :return: Dosyan\u0131n hex format\u0131ndaki hash de\u011feri.\n    \"\"\"\n    if not os.path.exists(filepath) or not os.path.isfile(filepath):\n        return None\n\n    hasher = hashlib.new(hash_algo)\n    with open(filepath, 'rb') as f:\n        for block in iter(lambda: f.read(block_size), b''):\n            hasher.update(block)\n    return hasher.hexdigest()\n\n# \u00d6rnek kullan\u0131m:\n# test_file_path = \"test_document.txt\"\n# with open(test_file_path, \"w\") as f:\n#     f.write(\"Bu bir test dosyas\u0131d\u0131r.\")\n#\n# print(f\"'{test_file_path}' dosyas\u0131n\u0131n SHA256 hash de\u011feri: {calculate_file_hash(test_file_path)}\")\n    <\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi, bu hash de\u011ferlerini saklayacak bir mekanizmaya ihtiyac\u0131m\u0131z var. SQLite, Python'un standart k\u00fct\u00fcphanesinde yer alan hafif, sunucusuz bir veritaban\u0131 oldu\u011fu i\u00e7in ba\u015flang\u0131\u00e7 i\u00e7in harika bir se\u00e7enektir. Her dosya i\u00e7in yolu, ad\u0131n\u0131, hash de\u011ferini ve son kontrol tarihini saklayabiliriz. Bu bilgiler, bir sonraki kontrolde de\u011fi\u015fiklik olup olmad\u0131\u011f\u0131n\u0131 anlamam\u0131z\u0131 sa\u011flayacakt\u0131r. Ayr\u0131ca, veritaban\u0131 y\u00f6netimini basitle\u015ftiren <code>sqlite3<\/code> mod\u00fcl\u00fc ile kolayca etkile\u015fime ge\u00e7ebiliriz.<\/p>\n<pre><code class=\"language-python\">\nimport sqlite3\nimport time\n\nDATABASE_NAME = \"file_integrity.db\"\n\ndef initialize_database():\n    \"\"\"Veritaban\u0131n\u0131 ve 'files' tablosunu olu\u015fturur.\"\"\"\n    conn = sqlite3.connect(DATABASE_NAME)\n    cursor = conn.cursor()\n    cursor.execute('''\n        CREATE TABLE IF NOT EXISTS files (\n            id INTEGER PRIMARY KEY AUTOINCREMENT,\n            filepath TEXT UNIQUE NOT NULL,\n            filename TEXT NOT NULL,\n            initial_hash TEXT NOT NULL,\n            last_checked TIMESTAMP,\n            last_modified TIMESTAMP\n        )\n    ''')\n    cursor.execute('''\n        CREATE TABLE IF NOT EXISTS changes (\n            id INTEGER PRIMARY KEY AUTOINCREMENT,\n            filepath TEXT NOT NULL,\n            change_type TEXT NOT NULL, -- 'modified', 'added', 'deleted'\n            old_hash TEXT,\n            new_hash TEXT,\n            change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n        )\n    ''')\n    conn.commit()\n    conn.close()\n\ndef record_file_state(filepath, hash_value):\n    \"\"\"Bir dosyan\u0131n hash de\u011ferini ve meta verilerini veritaban\u0131na kaydeder.\"\"\"\n    conn = sqlite3.connect(DATABASE_NAME)\n    cursor = conn.cursor()\n    filename = os.path.basename(filepath)\n    last_modified = os.path.getmtime(filepath)\n    \n    cursor.execute('''\n        INSERT OR REPLACE INTO files \n        (filepath, filename, initial_hash, last_checked, last_modified) \n        VALUES (?, ?, ?, ?, ?)\n    ''', (filepath, filename, hash_value, time.time(), last_modified))\n    conn.commit()\n    conn.close()\n\ndef get_file_state(filepath):\n    \"\"\"Bir dosyan\u0131n kaydedilmi\u015f hash de\u011ferini ve di\u011fer meta verilerini getirir.\"\"\"\n    conn = sqlite3.connect(DATABASE_NAME)\n    cursor = conn.cursor()\n    cursor.execute('SELECT initial_hash, last_modified FROM files WHERE filepath = ?', (filepath,))\n    result = cursor.fetchone()\n    conn.close()\n    return result\n\ndef log_change(filepath, change_type, old_hash=None, new_hash=None):\n    \"\"\"Dosya de\u011fi\u015fikliklerini 'changes' tablosuna kaydeder.\"\"\"\n    conn = sqlite3.connect(DATABASE_NAME)\n    cursor = conn.cursor()\n    cursor.execute('''\n        INSERT INTO changes (filepath, change_type, old_hash, new_hash) \n        VALUES (?, ?, ?, ?)\n    ''', (filepath, change_type, old_hash, new_hash))\n    conn.commit()\n    conn.close()\n\n    print(f\"UYARI: Dosya '{filepath}' {change_type}!\")\n    if old_hash and new_hash:\n        print(f\"Eski Hash: {old_hash[:10]}... Yeni Hash: {new_hash[:10]}...\")\n\n# Veritaban\u0131n\u0131 ba\u015flat\ninitialize_database()\n    <\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Hash fonksiyonu se\u00e7imi performans ve g\u00fcvenlik dengesi a\u00e7\u0131s\u0131ndan \u00f6nemlidir. SHA-256 g\u00fcvenlik i\u00e7in genellikle yeterliyken, daha eski ve zay\u0131f algoritmalar (MD5) \u00e7ak\u0131\u015fma riski ta\u015f\u0131yabilir ve \u00fcretim ortamlar\u0131nda kullan\u0131lmamal\u0131d\u0131r.\n    <\/div>\n<h3>Dizinleri Tarama ve De\u011fi\u015fiklikleri Alg\u0131lama<\/h3>\n<p>\u015eimdi, belirli bir dizindeki t\u00fcm dosyalar\u0131 tarayacak ve bunlar\u0131 veritaban\u0131m\u0131zdaki kay\u0131tlarla kar\u015f\u0131la\u015ft\u0131racak ana fonksiyonu yazal\u0131m. Bu fonksiyon, hem yeni eklenen dosyalar\u0131, hem de\u011fi\u015ftirilen dosyalar\u0131 hem de silinen dosyalar\u0131 tespit edecektir. Bu d\u00f6ng\u00fc, polling tabanl\u0131 FIM sisteminin temelini olu\u015fturur. <code>os.walk<\/code> fonksiyonu, bir dizindeki t\u00fcm alt dizinleri ve dosyalar\u0131 gezmek i\u00e7in olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-python\">\ndef monitor_directory_polling(directory_to_monitor):\n    \"\"\"\n    Belirtilen dizindeki dosya de\u011fi\u015fikliklerini (polling y\u00f6ntemiyle) izler.\n    :param directory_to_monitor: \u0130zlenecek dizinin yolu.\n    \"\"\"\n    print(f\"Dizin izleniyor: {directory_to_monitor}\")\n    \n    # Mevcut veritaban\u0131ndaki dosyalar\u0131 al\n    conn = sqlite3.connect(DATABASE_NAME)\n    cursor = conn.cursor()\n    cursor.execute('SELECT filepath, initial_hash FROM files')\n    db_files = {row[0]: row[1] for row in cursor.fetchall()}\n    conn.close()\n\n    current_files = {} # Mevcut dosyalar\u0131n hash'lerini tutacak\n    \n    # Dizini tara ve mevcut dosyalar\u0131n hash'lerini hesapla\n    for root, _, files in os.walk(directory_to_monitor):\n        for filename in files:\n            filepath = os.path.join(root, filename)\n            current_hash = calculate_file_hash(filepath)\n            if current_hash:\n                current_files[filepath] = current_hash\n\n    # Yeni eklenen veya de\u011fi\u015ftirilen dosyalar\u0131 bul\n    for filepath, current_hash in current_files.items():\n        if filepath not in db_files:\n            log_change(filepath, 'added', new_hash=current_hash)\n            record_file_state(filepath, current_hash) # Yeni dosyay\u0131 kaydet\n        elif db_files[filepath] != current_hash:\n            log_change(filepath, 'modified', old_hash=db_files[filepath], new_hash=current_hash)\n            record_file_state(filepath, current_hash) # De\u011fi\u015fen dosyan\u0131n hash'ini g\u00fcncelle\n\n    # Silinen dosyalar\u0131 bul\n    for filepath in db_files:\n        if filepath not in current_files:\n            log_change(filepath, 'deleted', old_hash=db_files[filepath])\n            # Veritaban\u0131ndan silinen dosyay\u0131 kald\u0131r\n            conn = sqlite3.connect(DATABASE_NAME)\n            cursor = conn.cursor()\n            cursor.execute('DELETE FROM files WHERE filepath = ?', (filepath,))\n            conn.commit()\n            conn.close()\n\n    print(\"Kontrol tamamland\u0131.\")\n\n# \u00d6rnek kullan\u0131m:\n# if __name__ == \"__main__\":\n#     # \u0130zlenecek bir dizin olu\u015fturun\n#     monitoring_dir = \"monitor_test_dir\"\n#     os.makedirs(monitoring_dir, exist_ok=True)\n#     \n#     # Ba\u015flang\u0131\u00e7 durumu i\u00e7in bir dosya olu\u015fturun\n#     with open(os.path.join(monitoring_dir, \"config.ini\"), \"w\") as f:\n#         f.write(\"[Settings]\\nparam=value\")\n#\n#     # Ba\u015flang\u0131\u00e7ta t\u00fcm dosyalar\u0131 kaydet\n#     monitor_directory_polling(monitoring_dir)\n#     print(\"\\n\u0130lk tarama tamamland\u0131. \u015eimdi de\u011fi\u015fiklik yapal\u0131m...\\n\")\n#\n#     # De\u011fi\u015fiklikler yap\u0131n\n#     time.sleep(2)\n#     with open(os.path.join(monitoring_dir, \"config.ini\"), \"a\") as f:\n#         f.write(\"\\nnew_param=new_value\")\n#     with open(os.path.join(monitoring_dir, \"new_file.txt\"), \"w\") as f:\n#         f.write(\"Bu yeni bir dosya.\")\n#     os.remove(os.path.join(monitoring_dir, \"config.ini\")) # Dosyay\u0131 sil\n#\n#     # Yeniden kontrol et ve de\u011fi\u015fiklikleri g\u00f6r\n#     monitor_directory_polling(monitoring_dir)\n#     \n#     # Temizlik (iste\u011fe ba\u011fl\u0131)\n#     # os.remove(os.path.join(monitoring_dir, \"new_file.txt\"))\n#     # os.rmdir(monitoring_dir)\n#     # os.remove(DATABASE_NAME)\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu temel polling tabanl\u0131 sistem, belirli aral\u0131klarla \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda dosya de\u011fi\u015fikliklerini tespit edebilir. Ancak, \"2 saniyede\" gibi h\u0131zl\u0131 tespitler i\u00e7in event-driven (olay tabanl\u0131) izleme y\u00f6ntemlerine ge\u00e7memiz gerekecektir.<\/p>\n<h2>Ger\u00e7ek Zamanl\u0131ya Yak\u0131n \u0130zleme: Olay Tabanl\u0131 Yakla\u015f\u0131mlar (inotify\/watchdog)<\/h2>\n<p>Polling y\u00f6ntemi basit olsa da, \"2 saniyede dosya de\u011fi\u015fikli\u011fi tespiti\" gibi hedefler i\u00e7in yetersiz kalabilir. Daha h\u0131zl\u0131 ve verimli bir yakla\u015f\u0131m i\u00e7in i\u015fletim sistemi d\u00fczeyindeki olay tabanl\u0131 izleme mekanizmalar\u0131n\u0131 kullanmak \u015fartt\u0131r. Linux sistemlerinde <code>inotify<\/code> API'si, dosya sistemi olaylar\u0131n\u0131 (olu\u015fturma, silme, de\u011fi\u015ftirme, ta\u015f\u0131ma vb.) an\u0131nda bildirerek bu ihtiyac\u0131 kar\u015f\u0131lar. Python i\u00e7in <code>inotify<\/code>'nin kullan\u0131m\u0131 biraz karma\u015f\u0131k olabilir, ancak <code>watchdog<\/code> gibi k\u00fct\u00fcphaneler bu i\u015flemi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir ve platformlar aras\u0131 uyumluluk sa\u011flar.<\/p>\n<p><code>watchdog<\/code> k\u00fct\u00fcphanesi, dosya sistemi olaylar\u0131n\u0131 izlemek i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. Arka planda i\u015fletim sisteminin native event API'lerini (Linux'ta <code>inotify<\/code>, macOS'ta <code>FSEvents<\/code>, Windows'ta <code>ReadDirectoryChangesW<\/code>) kullanarak \u00e7al\u0131\u015f\u0131r. Bu sayede, biz polling yapmak zorunda kalmadan, bir dosya veya dizinde bir de\u011fi\u015fiklik oldu\u011funda an\u0131nda bildirim al\u0131r\u0131z.<\/p>\n<p>\u0130lk olarak, <code>watchdog<\/code> k\u00fct\u00fcphanesini kurman\u0131z gerekir:<\/p>\n<pre><code class=\"language-bash\">\npip install watchdog\n    <\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi, <code>watchdog<\/code> kullanarak dosya de\u011fi\u015fikliklerini nas\u0131l izleyece\u011fimize bakal\u0131m. Bir <code>FileSystemEventHandler<\/code> s\u0131n\u0131f\u0131 olu\u015fturarak, hangi dosya sistemi olaylar\u0131na tepki verece\u011fimizi tan\u0131mlar\u0131z. Bu olaylar aras\u0131nda <code>on_created<\/code>, <code>on_deleted<\/code>, <code>on_modified<\/code> ve <code>on_moved<\/code> gibi metotlar bulunur. Bu metotlar\u0131n i\u00e7ine, de\u011fi\u015fikli\u011fi alg\u0131lad\u0131\u011f\u0131m\u0131zda yap\u0131lmas\u0131 gereken i\u015flemleri (\u00f6rne\u011fin, hash de\u011ferini yeniden hesaplamak, veritaban\u0131na kaydetmek, uyar\u0131 g\u00f6ndermek) yerle\u015ftirece\u011fiz.<\/p>\n<pre><code class=\"language-python\">\nfrom watchdog.observers import Observer\nfrom watchdog.events import FileSystemEventHandler\nimport time\nimport os\nimport hashlib\nimport sqlite3 # \u00d6nceki b\u00f6l\u00fcmden import ediyoruz\n\n# Global de\u011fi\u015fkenler veya konfig\u00fcrasyonlar\nDATABASE_NAME = \"file_integrity.db\"\nMONITORED_DIR = \"monitor_realtime_dir\" # \u0130zlenecek dizin\n\ndef calculate_file_hash(filepath, hash_algo='sha256', block_size=65536):\n    \"\"\"Daha \u00f6nceki b\u00f6l\u00fcmdeki hash hesaplama fonksiyonu.\"\"\"\n    if not os.path.exists(filepath) or not os.path.isfile(filepath):\n        return None\n    hasher = hashlib.new(hash_algo)\n    try:\n        with open(filepath, 'rb') as f:\n            for block in iter(lambda: f.read(block_size), b''):\n                hasher.update(block)\n    except IOError:\n        return None # Dosya kilitli veya eri\u015filemezse hata vermemesi i\u00e7in\n    return hasher.hexdigest()\n\ndef initialize_database():\n    \"\"\"Veritaban\u0131 ba\u015flatma fonksiyonu.\"\"\"\n    conn = sqlite3.connect(DATABASE_NAME)\n    cursor = conn.cursor()\n    cursor.execute('''\n        CREATE TABLE IF NOT EXISTS files (\n            id INTEGER PRIMARY KEY AUTOINCREMENT,\n            filepath TEXT UNIQUE NOT NULL,\n            filename TEXT NOT NULL,\n            initial_hash TEXT NOT NULL,\n            last_checked TIMESTAMP,\n            last_modified TIMESTAMP\n        )\n    ''')\n    cursor.execute('''\n        CREATE TABLE IF NOT EXISTS changes (\n            id INTEGER PRIMARY KEY AUTOINCREMENT,\n            filepath TEXT NOT NULL,\n            change_type TEXT NOT NULL, -- 'modified', 'added', 'deleted'\n            old_hash TEXT,\n            new_hash TEXT,\n            change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n        )\n    ''')\n    conn.commit()\n    conn.close()\n\ndef record_file_state(filepath, hash_value):\n    \"\"\"Bir dosyan\u0131n hash de\u011ferini ve meta verilerini veritaban\u0131na kaydeder.\"\"\"\n    conn = sqlite3.connect(DATABASE_NAME)\n    cursor = conn.cursor()\n    filename = os.path.basename(filepath)\n    try:\n        last_modified = os.path.getmtime(filepath)\n    except FileNotFoundError:\n        last_modified = time.time() # Dosya silinmi\u015fse veya anl\u0131k eri\u015filemezse\n    \n    cursor.execute('''\n        INSERT OR REPLACE INTO files \n        (filepath, filename, initial_hash, last_checked, last_modified) \n        VALUES (?, ?, ?, ?, ?)\n    ''', (filepath, filename, hash_value, time.time(), last_modified))\n    conn.commit()\n    conn.close()\n\ndef get_file_state(filepath):\n    \"\"\"Bir dosyan\u0131n kaydedilmi\u015f hash de\u011ferini ve di\u011fer meta verilerini getirir.\"\"\"\n    conn = sqlite3.connect(DATABASE_NAME)\n    cursor = conn.cursor()\n    cursor.execute('SELECT initial_hash FROM files WHERE filepath = ?', (filepath,))\n    result = cursor.fetchone()\n    conn.close()\n    return result[0] if result else None\n\ndef delete_file_state(filepath):\n    \"\"\"Veritaban\u0131ndan dosya durumunu siler.\"\"\"\n    conn = sqlite3.connect(DATABASE_NAME)\n    cursor = conn.cursor()\n    cursor.execute('DELETE FROM files WHERE filepath = ?', (filepath,))\n    conn.commit()\n    conn.close()\n\ndef log_change(filepath, change_type, old_hash=None, new_hash=None):\n    \"\"\"Dosya de\u011fi\u015fikliklerini 'changes' tablosuna kaydeder.\"\"\"\n    conn = sqlite3.connect(DATABASE_NAME)\n    cursor = conn.cursor()\n    cursor.execute('''\n        INSERT INTO changes (filepath, change_type, old_hash, new_hash) \n        VALUES (?, ?, ?, ?)\n    ''', (filepath, change_type, old_hash, new_hash))\n    conn.commit()\n    conn.close()\n\n    print(f\"UYARI: Dosya '{filepath}' {change_type}!\")\n    if old_hash and new_hash:\n        print(f\"Eski Hash: {old_hash[:10]}... Yeni Hash: {new_hash[:10]}...\")\n    elif new_hash:\n        print(f\"Yeni Hash: {new_hash[:10]}...\")\n\n\nclass FileChangeHandler(FileSystemEventHandler):\n    \"\"\"watchdog olaylar\u0131n\u0131 i\u015fleyen s\u0131n\u0131f.\"\"\"\n\n    def on_created(self, event):\n        if event.is_directory:\n            print(f\"Dizin olu\u015fturuldu: {event.src_path}\")\n            # Yeni dizindeki mevcut dosyalar\u0131 da ilk taramaya dahil et\n            for root, _, files in os.walk(event.src_path):\n                for filename in files:\n                    filepath = os.path.join(root, filename)\n                    current_hash = calculate_file_hash(filepath)\n                    if current_hash:\n                        log_change(filepath, 'added', new_hash=current_hash)\n                        record_file_state(filepath, current_hash)\n            return\n        # Dosya olu\u015fturuldu\u011funda\n        filepath = event.src_path\n        current_hash = calculate_file_hash(filepath)\n        if current_hash:\n            log_change(filepath, 'added', new_hash=current_hash)\n            record_file_state(filepath, current_hash)\n\n    def on_deleted(self, event):\n        if event.is_directory:\n            print(f\"Dizin silindi: {event.src_path}\")\n            # Dizin i\u00e7indeki t\u00fcm dosyalar\u0131 da veritaban\u0131ndan sil\n            conn = sqlite3.connect(DATABASE_NAME)\n            cursor = conn.cursor()\n            cursor.execute('SELECT filepath FROM files WHERE filepath LIKE ?', (event.src_path + '%',))\n            deleted_files = [row[0] for row in cursor.fetchall()]\n            conn.close()\n            for filepath in deleted_files:\n                log_change(filepath, 'deleted', old_hash=get_file_state(filepath))\n                delete_file_state(filepath)\n            return\n        # Dosya silindi\u011finde\n        filepath = event.src_path\n        old_hash = get_file_state(filepath)\n        if old_hash:\n            log_change(filepath, 'deleted', old_hash=old_hash)\n            delete_file_state(filepath)\n\n    def on_modified(self, event):\n        if event.is_directory:\n            return # Dizin modifikasyonlar\u0131 genellikle bizi ilgilendirmez\n        # Dosya de\u011fi\u015ftirildi\u011finde\n        filepath = event.src_path\n        old_hash = get_file_state(filepath)\n        current_hash = calculate_file_hash(filepath)\n\n        if old_hash and current_hash and old_hash != current_hash:\n            log_change(filepath, 'modified', old_hash=old_hash, new_hash=current_hash)\n            record_file_state(filepath, current_hash) # Yeni hash'i kaydet\n        elif not old_hash and current_hash:\n             # Dosya ba\u015flang\u0131\u00e7ta izlenmiyorsa ama modifiye edildiyse\n            log_change(filepath, 'modified (initial add)', new_hash=current_hash)\n            record_file_state(filepath, current_hash)\n\n\n    def on_moved(self, event):\n        # Dosya ta\u015f\u0131nd\u0131\u011f\u0131nda veya yeniden adland\u0131r\u0131ld\u0131\u011f\u0131nda\n        old_filepath = event.src_path\n        new_filepath = event.dest_path\n        \n        old_hash = get_file_state(old_filepath)\n        \n        # Eski dosya kayd\u0131n\u0131 sil\n        if old_hash:\n            delete_file_state(old_filepath)\n            log_change(old_filepath, 'moved_from', old_hash=old_hash)\n        \n        # Yeni dosya kayd\u0131n\u0131 olu\u015ftur\n        current_hash = calculate_file_hash(new_filepath)\n        if current_hash:\n            record_file_state(new_filepath, current_hash)\n            log_change(new_filepath, 'moved_to', new_hash=current_hash)\n\ndef initial_scan_and_populate(directory):\n    \"\"\"\u0130zlemeye ba\u015flamadan \u00f6nce dizindeki t\u00fcm dosyalar\u0131 tarar ve veritaban\u0131na kaydeder.\"\"\"\n    print(f\"Ba\u015flang\u0131\u00e7 taramas\u0131 yap\u0131l\u0131yor: {directory}\")\n    for root, _, files in os.walk(directory):\n        for filename in files:\n            filepath = os.path.join(root, filename)\n            current_hash = calculate_file_hash(filepath)\n            if current_hash:\n                record_file_state(filepath, current_hash)\n    print(\"Ba\u015flang\u0131\u00e7 taramas\u0131 tamamland\u0131.\")\n\nif __name__ == \"__main__\":\n    initialize_database()\n    os.makedirs(MONITORED_DIR, exist_ok=True)\n    \n    # \u0130zlenecek dizini ba\u015flang\u0131\u00e7ta doldur\n    with open(os.path.join(MONITORED_DIR, \"system_config.conf\"), \"w\") as f:\n        f.write(\"setting=true\\nversion=1.0\")\n    with open(os.path.join(MONITORED_DIR, \"important_data.csv\"), \"w\") as f:\n        f.write(\"id,name\\n1,test\")\n\n    initial_scan_and_populate(MONITORED_DIR)\n\n    event_handler = FileChangeHandler()\n    observer = Observer()\n    observer.schedule(event_handler, MONITORED_DIR, recursive=True)\n    observer.start()\n    print(f\"'{MONITORED_DIR}' dizini ger\u00e7ek zamanl\u0131 olarak izleniyor. \u00c7\u0131kmak i\u00e7in Ctrl+C.\")\n    \n    try:\n        while True:\n            time.sleep(1) # Observer'\u0131n \u00e7al\u0131\u015fmaya devam etmesini sa\u011flar\n    except KeyboardInterrupt:\n        observer.stop()\n    observer.join()\n    print(\"\u0130zleme durduruldu.\")\n\n    # Temizlik (iste\u011fe ba\u011fl\u0131)\n    # import shutil\n    # shutil.rmtree(MONITORED_DIR)\n    # os.remove(DATABASE_NAME)\n    <\/pre>\n<p><\/code><\/p>\n<div class=\"case-study\">\n<h3>Vaka Analizi: Web Sunucusu B\u00fct\u00fcnl\u00fck Kontrol\u00fc<\/h3>\n<p>K\u00fc\u00e7\u00fck bir e-ticaret sitesi, daha \u00f6nce bir SQL enjeksiyon sald\u0131r\u0131s\u0131 sonucu web sayfalar\u0131n\u0131n k\u00f6t\u00fc ama\u00e7l\u0131 kodlarla de\u011fi\u015ftirilmesiyle b\u00fcy\u00fck kay\u0131p ya\u015fam\u0131\u015ft\u0131. Bu durumun tekrarlanmas\u0131n\u0131 engellemek i\u00e7in <code>watchdog<\/code> tabanl\u0131 bir FIM \u00e7\u00f6z\u00fcm\u00fc entegre etmeye karar verdiler. Web sunucusunun <code>public_html<\/code> dizini ve <code>wp-config.php<\/code> gibi kritik PHP dosyalar\u0131n\u0131n bulundu\u011fu dizinler <code>watchdog<\/code> ile izlemeye al\u0131nd\u0131. Herhangi bir PHP dosyas\u0131nda yap\u0131lan bir de\u011fi\u015fiklik an\u0131nda tespit edilip y\u00f6neticilere e-posta ile bildiriliyordu. Bir g\u00fcn, gece yar\u0131s\u0131 bir <code>index.php<\/code> dosyas\u0131nda beklenmedik bir de\u011fi\u015fiklik alg\u0131land\u0131. FIM sistemi an\u0131nda bir uyar\u0131 g\u00f6nderdi ve g\u00fcvenlik ekibi m\u00fcdahale ederek de\u011fi\u015fikli\u011fin yetkisiz oldu\u011funu ve bir zay\u0131f eklentiden kaynakland\u0131\u011f\u0131n\u0131 tespit etti. Sald\u0131r\u0131 daha fazla yay\u0131lmadan engellendi ve site h\u0131zl\u0131ca eski haline getirildi. Bu, <code>watchdog<\/code> ile elde edilen ger\u00e7ek zamanl\u0131ya yak\u0131n tespitin somut bir \u00f6rne\u011fidir.<\/p>\n<\/p><\/div>\n<h2>Performans Optimizasyonu ve Geli\u015fmi\u015f \u00d6zellikler<\/h2>\n<p>\"2 saniyede dosya de\u011fi\u015fikli\u011fi tespiti\" hedefine ula\u015fmak i\u00e7in sadece event-driven izleme yeterli olmayabilir; ayn\u0131 zamanda performans optimizasyonlar\u0131na ve sisteminizi daha dayan\u0131kl\u0131 hale getirecek geli\u015fmi\u015f \u00f6zelliklere de ihtiyac\u0131m\u0131z var. \u00d6zellikle \u00e7ok say\u0131da dosyan\u0131n bulundu\u011fu sistemlerde veya y\u00fcksek I\/O y\u00fck\u00fc olan ortamlarda bu optimizasyonlar kritik hale gelir.<\/p>\n<h3>Veritaban\u0131 Performans\u0131 ve \u00d6l\u00e7eklenebilirlik<\/h3>\n<p>K\u00fc\u00e7\u00fck sistemler i\u00e7in SQLite yeterli olsa da, binlerce, hatta milyonlarca dosyan\u0131n izlendi\u011fi b\u00fcy\u00fck ortamlar i\u00e7in daha g\u00fc\u00e7l\u00fc veritaban\u0131 \u00e7\u00f6z\u00fcmlerine y\u00f6nelmek gerekebilir. PostgreSQL veya MySQL gibi ili\u015fkisel veritabanlar\u0131, concurrent (e\u015fzamanl\u0131) i\u015flemlerde daha iyi performans sunar ve daha geli\u015fmi\u015f indeksleme, replikasyon ve yedekleme \u00f6zellikleri sa\u011flar. \u00d6rne\u011fin, PostgreSQL'de dosya yollar\u0131n\u0131 indekslemek, sorgular\u0131n \u00e7ok daha h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayacakt\u0131r:<\/p>\n<pre><code class=\"language-sql\">\nCREATE INDEX idx_files_filepath ON files (filepath);\nCREATE INDEX idx_changes_filepath ON changes (filepath);\n    <\/pre>\n<p><\/code><\/p>\n<p>Ayr\u0131ca, veritaban\u0131 ba\u011flant\u0131 havuzlar\u0131 (connection pools) kullanmak, her dosya de\u011fi\u015fikli\u011fi olay\u0131nda yeni bir ba\u011flant\u0131 a\u00e7ma ve kapatma y\u00fck\u00fcn\u00fc ortadan kald\u0131rarak performans\u0131 art\u0131rabilir. Python'da <code>SQLAlchemy<\/code> gibi ORM k\u00fct\u00fcphaneleri bu t\u00fcr optimizasyonlar\u0131 kolayla\u015ft\u0131r\u0131r. SQLite kullanmaya devam ediyorsan\u0131z, WAL (Write-Ahead Logging) modunu etkinle\u015ftirmek, e\u015fzamanl\u0131 okuma ve yazma i\u015flemlerini iyile\u015ftirerek performans\u0131 art\u0131rabilir.<\/p>\n<h3>Filtreleme ve \u0130stenmeyen Olaylar\u0131 Engelleme<\/h3>\n<p>Ger\u00e7ek zamanl\u0131 izleme, \u00e7o\u011fu zaman sistem taraf\u0131ndan olu\u015fturulan ge\u00e7ici dosyalar, log dosyalar\u0131 veya s\u00fcrekli de\u011fi\u015fen \u00f6nbellek dosyalar\u0131 gibi bizi ilgilendirmeyen bir\u00e7ok olay\u0131 da yakalar. Bu \"g\u00fcr\u00fclt\u00fcy\u00fc\" filtrelemek, hem performans a\u00e7\u0131s\u0131ndan \u00f6nemlidir hem de gereksiz uyar\u0131larla yorulmay\u0131 engeller. <code>watchdog<\/code> k\u00fct\u00fcphanesi, <code>PatternMatchingEventHandler<\/code> gibi s\u0131n\u0131flar sunarak belirli dosya desenlerini veya dizinleri dahil etme\/hari\u00e7 tutma yetene\u011fi sa\u011flar. \u00d6rne\u011fin, <code>.log<\/code> veya <code>.tmp<\/code> uzant\u0131l\u0131 dosyalar\u0131 veya belirli dizinleri izleme d\u0131\u015f\u0131 b\u0131rakabilirsiniz.<\/p>\n<pre><code class=\"language-python\">\n# Sadece .conf ve .txt dosyalar\u0131n\u0131 izle, .log dosyalar\u0131n\u0131 g\u00f6rmezden gel\nfrom watchdog.events import PatternMatchingEventHandler\n\nclass CustomEventHandler(PatternMatchingEventHandler):\n    def __init__(self, patterns=None, ignore_patterns=None, ignore_directories=False, case_sensitive=False):\n        super().__init__(patterns, ignore_patterns, ignore_directories, case_sensitive)\n        self.file_integrity_monitor = FileChangeHandler() # Kendi event handler'\u0131m\u0131z\u0131 \u00e7a\u011f\u0131r\u0131yoruz\n\n    def on_modified(self, event):\n        if not event.is_directory:\n            print(f\"Filtrelenmi\u015f de\u011fi\u015fiklik: {event.src_path}\")\n            self.file_integrity_monitor.on_modified(event)\n\n# \u00d6rnek kullan\u0131mda:\n# event_handler = CustomEventHandler(\n#     patterns=[\"*.conf\", \"*.txt\"],\n#     ignore_patterns=[\"*.log\", \"*.tmp\"],\n#     ignore_directories=True\n# )\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u015fekilde, yaln\u0131zca ger\u00e7ekten \u00f6nemli olan dosya de\u011fi\u015fikliklerine odaklanabilir, sistemin gereksiz y\u00fck\u00fcn\u00fc azaltabilir ve \"2 saniye\" hedefine daha yak\u0131n kalabilirsiniz.<\/p>\n<h3>Da\u011f\u0131t\u0131k Ortamlar ve Merkezi Y\u00f6netim<\/h3>\n<p>Tek bir sunucuyu izlemek nispeten kolayd\u0131r, ancak y\u00fczlerce sunucu veya konteynerden olu\u015fan da\u011f\u0131t\u0131k bir ortamda FIM uygulamak daha karma\u015f\u0131kt\u0131r. Bu senaryolarda, her sunucuda \u00e7al\u0131\u015fan Python FIM ajanlar\u0131n\u0131n, tespit ettikleri de\u011fi\u015fiklikleri merkezi bir sisteme (\u00f6rne\u011fin, bir mesaj kuyru\u011fu (Kafka, RabbitMQ) veya do\u011frudan bir SIEM\/log y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fcne) g\u00f6ndermesi gerekir. Bu merkezi sistem, t\u00fcm uyar\u0131lar\u0131 toplar, korelasyon analizleri yapar ve y\u00f6neticilere konsolide bir g\u00f6r\u00fcn\u00fcm sunar. Python'daki <code>requests<\/code> k\u00fct\u00fcphanesi ile basit API \u00e7a\u011fr\u0131lar\u0131 yaparak veya <code>pika<\/code> gibi k\u00fct\u00fcphanelerle mesaj kuyruklar\u0131na entegre olarak bu da\u011f\u0131t\u0131k yap\u0131y\u0131 kurabilirsiniz.<\/p>\n<h3>G\u00fcvenlik ve Kimlik Do\u011frulama<\/h3>\n<p>FIM sisteminin kendisi de g\u00fcvenli olmal\u0131d\u0131r. Veritaban\u0131 ba\u011flant\u0131 bilgileri, API anahtarlar\u0131 gibi hassas bilgiler a\u00e7\u0131k metin olarak depolanmamal\u0131, bunun yerine ortam de\u011fi\u015fkenleri veya g\u00fcvenli bir s\u0131r y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fc (Vault, AWS Secrets Manager) kullan\u0131lmal\u0131d\u0131r. Ayr\u0131ca, FIM ajan\u0131n\u0131n \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 kullan\u0131c\u0131 hesab\u0131, sadece izlemesi gereken dosyalara okuma eri\u015fimi olan ve sistemde minimum ayr\u0131cal\u0131klara sahip bir kullan\u0131c\u0131 olmal\u0131d\u0131r. Bu, FIM ajan\u0131 ele ge\u00e7irilse bile potansiyel zarar\u0131n minimize edilmesini sa\u011flar.<\/p>\n<h3>Hata Y\u00f6netimi ve Dayan\u0131kl\u0131l\u0131k<\/h3>\n<p>FIM uygulamalar\u0131, dosya kilitleri, disk hatalar\u0131, a\u011f sorunlar\u0131 gibi bir\u00e7ok beklenmedik durumla kar\u015f\u0131la\u015fabilir. Uygulaman\u0131z\u0131n bu durumlar\u0131 gracefully (zarafetle) ele almas\u0131 ve \u00e7\u00f6kmek yerine loglama yap\u0131p \u00e7al\u0131\u015fmaya devam etmesi \u00f6nemlidir. <code>try-except<\/code> bloklar\u0131 ile olas\u0131 hatalar\u0131 yakalamak, yeniden deneme mekanizmalar\u0131 (retries) eklemek ve ayr\u0131nt\u0131l\u0131 hata loglamas\u0131 yapmak, sistemin dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. \u00d6rne\u011fin, bir dosyay\u0131 hash'lemeye \u00e7al\u0131\u015f\u0131rken <code>PermissionError<\/code> al\u0131rsan\u0131z, bunu loglay\u0131p sonraki dosyaya ge\u00e7melisiniz. T\u00fcm bu geli\u015fmi\u015f yakla\u015f\u0131mlar, FIM sisteminizin sadece h\u0131zl\u0131 de\u011fil, ayn\u0131 zamanda sa\u011flam ve g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar, b\u00f6ylece \"2 saniyede dosya de\u011fi\u015fikli\u011fi tespiti\" vaadini ger\u00e7ek bir g\u00fcvenlik avantaj\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu makalede, dosya b\u00fct\u00fcnl\u00fc\u011f\u00fc izlemenin (FIM) neden modern siber g\u00fcvenlik stratejilerinin temel bir bile\u015feni oldu\u011funu derinlemesine inceledik. Python'un g\u00fc\u00e7l\u00fc yeteneklerini kullanarak, hem polling tabanl\u0131 basit bir FIM sistemi nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 hem de <code>watchdog<\/code> k\u00fct\u00fcphanesi arac\u0131l\u0131\u011f\u0131yla ger\u00e7ek zamanl\u0131ya yak\u0131n, olay tabanl\u0131 izlemenin nas\u0131l uygulanaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6\u011frendiniz. Ayr\u0131ca, sisteminizin \u00f6l\u00e7eklenebilirli\u011fini ve g\u00fcvenilirli\u011fini art\u0131rmak i\u00e7in veritaban\u0131 optimizasyonlar\u0131, filtreleme teknikleri ve da\u011f\u0131t\u0131k ortamlar i\u00e7in stratejiler gibi geli\u015fmi\u015f konulara da de\u011findik.<\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, \"2 saniyede dosya de\u011fi\u015fikli\u011fi tespiti\" sadece bir hedef de\u011fil, do\u011fru ara\u00e7lar ve yakla\u015f\u0131mlarla ula\u015f\u0131labilir bir g\u00fcvenlik seviyesidir. Python'un esnekli\u011fi ve zengin k\u00fct\u00fcphane ekosistemi sayesinde, kurulu\u015flar kendi \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re uyarlanm\u0131\u015f, maliyet-etkin FIM \u00e7\u00f6z\u00fcmleri geli\u015ftirebilirler. Bu, siber sald\u0131r\u0131lara kar\u015f\u0131 erken uyar\u0131 mekanizmalar\u0131 olu\u015fturarak potansiyel zararlar\u0131 en aza indirmek, d\u00fczenleyici uyumlulu\u011fu sa\u011flamak ve genel sistem b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korumak i\u00e7in kritik bir ad\u0131md\u0131r.<\/p>\n<p>Unutmay\u0131n ki bir FIM \u00e7\u00f6z\u00fcm\u00fcn\u00fcn ba\u015far\u0131s\u0131 sadece teknik uygulamas\u0131na de\u011fil, ayn\u0131 zamanda do\u011fru izleme kapsam\u0131n\u0131n belirlenmesine, elde edilen uyar\u0131lar\u0131n d\u00fczg\u00fcn bir \u015fekilde analiz edilmesine ve h\u0131zl\u0131 m\u00fcdahale planlar\u0131n\u0131n olmas\u0131na da ba\u011fl\u0131d\u0131r. Proaktif bir g\u00fcvenlik duru\u015fu, s\u00fcrekli iyile\u015ftirme ve teknolojik yenilikleri takip etmeyi gerektirir. Python ile geli\u015ftirece\u011finiz FIM sistemi, bu yolculukta size \u00f6nemli bir avantaj sa\u011flayacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ol>\n<li>\n<p class=\"faq-question\">Python ile FIM kurmak, ticari bir FIM \u00e7\u00f6z\u00fcm\u00fcne g\u00f6re daha m\u0131 iyi?<\/p>\n<p class=\"faq-answer\">Python ile kendi FIM \u00e7\u00f6z\u00fcm\u00fcn\u00fcz\u00fc kurmak, size maksimum esneklik ve \u00f6zelle\u015ftirme imkan\u0131 sunar. Ticari \u00e7\u00f6z\u00fcmler genellikle daha kapsaml\u0131 \u00f6zellikler ve haz\u0131r entegrasyonlar sa\u011flarken, \u00f6zel ihtiya\u00e7lara g\u00f6re uyarlama zor olabilir ve maliyetli olabilir. Python \u00e7\u00f6z\u00fcm\u00fc, belirli dosya tiplerine, dizinlere veya i\u015f ak\u0131\u015flar\u0131na odaklanarak daha hafif ve h\u0131zl\u0131 bir yap\u0131 olu\u015fturman\u0131za olanak tan\u0131r. Ancak, bak\u0131m, destek ve geli\u015fmi\u015f raporlama gibi konularda daha fazla efor gerektirebilir.<\/p>\n<\/li>\n<li>\n<p class=\"faq-question\">Hangi dosyalar\u0131 izlemeliyim? Her \u015feyi izlemek gerekli mi?<\/p>\n<p class=\"faq-answer\">Hay\u0131r, her \u015feyi izlemek genellikle ne gerekli ne de verimlidir. Genellikle, i\u015fletim sistemi dosyalar\u0131, uygulama yap\u0131land\u0131rma dosyalar\u0131, kritik veri dizinleri (\u00f6rne\u011fin, web sunucusu <code>public_html<\/code> veya veritaban\u0131 dosyalar\u0131), g\u00fcvenlik ayarlar\u0131 ve log dosyalar\u0131n\u0131 izlemelisiniz. S\u00fcrekli de\u011fi\u015fen ve kritik olmayan dosyalar\u0131 (ge\u00e7ici dosyalar, \u00f6nbellekler, kullan\u0131c\u0131n\u0131n ki\u015fisel belgeleri) izlemek, gereksiz g\u00fcr\u00fclt\u00fcye ve performans d\u00fc\u015f\u00fc\u015f\u00fcne neden olabilir. \u0130zlenecek dosyalar\u0131n kapsam\u0131, sistemin kritikli\u011fi ve d\u00fczenleyici uyumluluk gereksinimlerine g\u00f6re belirlenmelidir.<\/p>\n<\/li>\n<li>\n<p class=\"faq-question\">FIM, bir sald\u0131r\u0131y\u0131 tamamen engelleyebilir mi?<\/p>\n<p class=\"faq-answer\">FIM, bir sald\u0131r\u0131y\u0131 do\u011frudan engellemez; ancak bir sald\u0131r\u0131n\u0131n ger\u00e7ekle\u015fti\u011fini veya sistemde yetkisiz bir de\u011fi\u015fikli\u011fin yap\u0131ld\u0131\u011f\u0131n\u0131 \u00e7ok h\u0131zl\u0131 bir \u015fekilde tespit ederek g\u00fcvenlik ekiplerine erken uyar\u0131 sa\u011flar. Bu erken tespit, sald\u0131r\u0131n\u0131n daha fazla yay\u0131lmas\u0131n\u0131 veya daha b\u00fcy\u00fck zararlar vermesini engellemek i\u00e7in kritik \u00f6neme sahiptir. FIM, bir savunma katman\u0131 olarak di\u011fer g\u00fcvenlik kontrolleri (g\u00fcvenlik duvarlar\u0131, IDS\/IPS, antivir\u00fcs vb.) ile birlikte \u00e7al\u0131\u015fmal\u0131d\u0131r.<\/p>\n<\/li>\n<li>\n<p class=\"faq-question\">\u00c7ok say\u0131da dosya olan bir sistemde performans sorunlar\u0131 ya\u015famamak i\u00e7in ne yapmal\u0131y\u0131m?<\/p>\n<p class=\"faq-answer\">B\u00fcy\u00fck sistemlerde performans\u0131 optimize etmek i\u00e7in birka\u00e7 strateji izleyebilirsiniz: yaln\u0131zca kritik dizinleri ve dosya tiplerini izleyin, <code>watchdog<\/code> gibi olay tabanl\u0131 izleme k\u00fct\u00fcphaneleri kullan\u0131n (polling yerine), hash de\u011ferlerini bir veritaban\u0131nda saklay\u0131n ve veritaban\u0131 indekslerini do\u011fru bir \u015fekilde kullan\u0131n. Ayr\u0131ca, izleme g\u00f6revini daha k\u00fc\u00e7\u00fck par\u00e7alara b\u00f6lerek birden fazla Python s\u00fcreci veya thread ile paralel \u00e7al\u0131\u015ft\u0131rmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<\/li>\n<li>\n<p class=\"faq-question\">Tespit edilen de\u011fi\u015fiklikler hakk\u0131nda nas\u0131l uyar\u0131 almal\u0131y\u0131m?<\/p>\n<p class=\"faq-answer\">Uyar\u0131 mekanizmas\u0131, tespit s\u00fcresi kadar \u00f6nemlidir. Python ile e-posta (<code>smtplib<\/code>), SMS (\u00fc\u00e7\u00fcnc\u00fc parti API'ler), anl\u0131k mesajla\u015fma (Slack, Telegram gibi platformlar\u0131n API'leri) veya merkezi bir SIEM\/log y\u00f6netimi sistemine (Splunk, ELK Stack) log g\u00f6nderme gibi \u00e7e\u015fitli yollarla uyar\u0131lar g\u00f6nderebilirsiniz. En iyi yakla\u015f\u0131m, g\u00fcvenlik operasyonlar\u0131 ekibinizin kulland\u0131\u011f\u0131 mevcut ara\u00e7lara entegrasyon sa\u011flamakt\u0131r. Bu entegrasyon, uyar\u0131lar\u0131n daha h\u0131zl\u0131 g\u00f6r\u00fclmesini ve m\u00fcdahale edilmesini sa\u011flar.<\/p>\n<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Siber sald\u0131r\u0131lar her ge\u00e7en g\u00fcn daha sofistike hale gelirken, sistem dosyalar\u0131n\u0131zda veya kritik verilerinizde meydana gelen yetkisiz de\u011fi\u015fiklikleri&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1403],"tags":[],"class_list":{"0":"post-31661","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>2 Saniyede Dosya De\u011fi\u015fikli\u011fi Tespiti: Python ile Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zleme<\/title>\n<meta name=\"description\" content=\"Siber sald\u0131r\u0131lar her ge\u00e7en g\u00fcn daha sofistike hale gelirken, sistem dosyalar\u0131n\u0131zda veya kritik verilerinizde meydana gelen yetkisiz de\u011fi\u015fiklikleri saniyeler i\u00e7inde tespit etmek hayati \u00f6nem ta\u015f\u0131r. Bu makale, Python kullanarak dosya b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ger\u00e7ek zamanl\u0131ya yak\u0131n bir h\u0131zda nas\u0131l izleyebilece\u011finizi, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 nas\u0131l kapatabilece\u011finizi ve olas\u0131 veri ihlallerini nas\u0131l \u00f6nleyebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"2 Saniyede Dosya De\u011fi\u015fikli\u011fi Tespiti: Python ile Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zleme\" \/>\n<meta property=\"og:description\" content=\"Siber sald\u0131r\u0131lar her ge\u00e7en g\u00fcn daha sofistike hale gelirken, sistem dosyalar\u0131n\u0131zda veya kritik verilerinizde meydana gelen yetkisiz de\u011fi\u015fiklikleri saniyeler i\u00e7inde tespit etmek hayati \u00f6nem ta\u015f\u0131r. Bu makale, Python kullanarak dosya b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ger\u00e7ek zamanl\u0131ya yak\u0131n bir h\u0131zda nas\u0131l izleyebilece\u011finizi, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 nas\u0131l kapatabilece\u011finizi ve olas\u0131 veri ihlallerini nas\u0131l \u00f6nleyebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-12T09:31:32+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"2 Saniyede Dosya De\u011fi\u015fikli\u011fi Tespiti: Python ile Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zleme\",\"datePublished\":\"2025-10-12T09:31:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/\"},\"wordCount\":3761,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/\",\"name\":\"2 Saniyede Dosya De\u011fi\u015fikli\u011fi Tespiti: Python ile Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zleme\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-12T09:31:32+00:00\",\"description\":\"Siber sald\u0131r\u0131lar her ge\u00e7en g\u00fcn daha sofistike hale gelirken, sistem dosyalar\u0131n\u0131zda veya kritik verilerinizde meydana gelen yetkisiz de\u011fi\u015fiklikleri saniyeler i\u00e7inde tespit etmek hayati \u00f6nem ta\u015f\u0131r. Bu makale, Python kullanarak dosya b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ger\u00e7ek zamanl\u0131ya yak\u0131n bir h\u0131zda nas\u0131l izleyebilece\u011finizi, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 nas\u0131l kapatabilece\u011finizi ve olas\u0131 veri ihlallerini nas\u0131l \u00f6nleyebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"2 Saniyede Dosya De\u011fi\u015fikli\u011fi Tespiti: Python ile Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zleme\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"2 Saniyede Dosya De\u011fi\u015fikli\u011fi Tespiti: Python ile Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zleme","description":"Siber sald\u0131r\u0131lar her ge\u00e7en g\u00fcn daha sofistike hale gelirken, sistem dosyalar\u0131n\u0131zda veya kritik verilerinizde meydana gelen yetkisiz de\u011fi\u015fiklikleri saniyeler i\u00e7inde tespit etmek hayati \u00f6nem ta\u015f\u0131r. Bu makale, Python kullanarak dosya b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ger\u00e7ek zamanl\u0131ya yak\u0131n bir h\u0131zda nas\u0131l izleyebilece\u011finizi, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 nas\u0131l kapatabilece\u011finizi ve olas\u0131 veri ihlallerini nas\u0131l \u00f6nleyebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/","og_locale":"tr_TR","og_type":"article","og_title":"2 Saniyede Dosya De\u011fi\u015fikli\u011fi Tespiti: Python ile Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zleme","og_description":"Siber sald\u0131r\u0131lar her ge\u00e7en g\u00fcn daha sofistike hale gelirken, sistem dosyalar\u0131n\u0131zda veya kritik verilerinizde meydana gelen yetkisiz de\u011fi\u015fiklikleri saniyeler i\u00e7inde tespit etmek hayati \u00f6nem ta\u015f\u0131r. Bu makale, Python kullanarak dosya b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ger\u00e7ek zamanl\u0131ya yak\u0131n bir h\u0131zda nas\u0131l izleyebilece\u011finizi, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 nas\u0131l kapatabilece\u011finizi ve olas\u0131 veri ihlallerini nas\u0131l \u00f6nleyebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-12T09:31:32+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"2 Saniyede Dosya De\u011fi\u015fikli\u011fi Tespiti: Python ile Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zleme","datePublished":"2025-10-12T09:31:32+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/"},"wordCount":3761,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/","url":"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/","name":"2 Saniyede Dosya De\u011fi\u015fikli\u011fi Tespiti: Python ile Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zleme","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-12T09:31:32+00:00","description":"Siber sald\u0131r\u0131lar her ge\u00e7en g\u00fcn daha sofistike hale gelirken, sistem dosyalar\u0131n\u0131zda veya kritik verilerinizde meydana gelen yetkisiz de\u011fi\u015fiklikleri saniyeler i\u00e7inde tespit etmek hayati \u00f6nem ta\u015f\u0131r. Bu makale, Python kullanarak dosya b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ger\u00e7ek zamanl\u0131ya yak\u0131n bir h\u0131zda nas\u0131l izleyebilece\u011finizi, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 nas\u0131l kapatabilece\u011finizi ve olas\u0131 veri ihlallerini nas\u0131l \u00f6nleyebilece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/2-saniyede-dosya-degisikligi-tespiti-python-ile-dosya-butunlugu-izleme\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"2 Saniyede Dosya De\u011fi\u015fikli\u011fi Tespiti: Python ile Dosya B\u00fct\u00fcnl\u00fc\u011f\u00fc \u0130zleme"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31661","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31661"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31661\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31661"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31661"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31661"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}