İçeriğe Atla
Mustafa Erbay
Yaşam · 10 dk okuma · görüntülenme Read in English

Kernel CVE Yanıtı: Hızlı Yama mı, Derin Savunma mı?

Yıllardır edindiğim tecrübelerle, bir Kernel CVE'si çıktığında sadece yama yapmak mı yoksa sistemi katmanlı savunmayla güçlendirmek mi gerektiğine dair…

100%

Sistem yöneticisi ve yazılımcı olarak geçirdiğim yıllarda, karşılaştığım en stresli durumlardan biri hep bir Kernel CVE’si çıktığında ne yapacağımız sorusu olmuştur. Herkesin ilk refleksi “Hemen yama yapalım!” olsa da, benim bu konuda biraz farklı bir bakış açım ve zamanla geliştirdiğim bir karar verme sürecim var. Çünkü sadece yama yapmak her zaman en doğru veya en sürdürülebilir çözüm olmuyor, özellikle büyük ve kritik sistemlerde.

Bir Kernel CVE’si alarmı düştüğünde, benim için mesele sadece teknik bir problemden ibaret değil, aynı zamanda bir operasyonel risk yönetimi ve kişisel sorumluluk alanı. Bu yazıda, bu tür durumlarda nasıl bir yol izlediğimi, hangi trade-off’ları değerlendirdiğimi ve “derin savunma” yaklaşımının benim için neden bu kadar önemli olduğunu anlatacağım. Hedefim, sadece bir rehber sunmak değil, aynı zamanda bu sürecin getirdiği zihinsel yükü ve kişisel yaklaşımımı da paylaşmak.

Bir CVE Alarmı ve İlk Reflekslerim: Semptomlar ve Anlık Gerilim

Sabahın erken saatleri, o bildiğiniz “kernel update var, kritik bir CVE” maili… Benzer bir durumu hatırlıyorum, bir algif_aead türü zafiyet çıktığında yaşadığım gerilimi. Üretim sistemlerimde bu modülün kullanılıp kullanılmadığını veya istismar edilebilirliğini hızlıca anlamam gerekiyordu. İlk refleksim tabii ki paniklemek oldu, ama önce sakin kalmayı ve durumu analiz etmeyi öğrenmiştim.

O anki ilk adımlarım hep aynıdır: CVE’nin detaylarını öğrenmek, etkilenen kernel versiyonlarını kontrol etmek ve bizim sistemlerdeki mevcut kernel versiyonlarını karşılaştırmak. Bir üretim firmasının ERP’sinde çalışırken, bu tür bir zafiyetin üretim hatlarını durdurma potansiyeli olması, uyku kaçıran bir senaryoydu. Hızlıca bir risk değerlendirmesi yaptım: zafiyetin exploit kodu açıkta mıydı, uzaktan erişim gerektiriyor muydu, yoksa sadece yerel yetki yükseltme miydi? Bu soruların cevapları, sonraki adımlarımı belirliyor.

Hatırlıyorum, bir keresinde düşen kritik bir CVE için, ilgili kernel modülünün benim yönettiğim bir sunucuda yüklü olmadığını lsmod çıktısıyla hızlıca tespit etmiştim. Bu bana nefes alma alanı sağlamış, acil yama baskısını biraz olsun hafifletmişti. Ancak bu, sorunun olmadığı anlamına gelmiyordu; sadece anlık riski düşürmüştü. Benim için önemli olan, bu anlık durumu yönetirken uzun vadeli stratejiyi de gözden kaçırmamaktı.

# Örnek: Belirli bir kernel modülünün yüklü olup olmadığını kontrol etme
lsmod | grep algif_aead
# Eğer çıktı boşsa, modül yüklü değil demektir.
# Eğer çıktı varsa, modül ve onu kullananlar listelenir.

Hızlı Yama: Avantajlar ve Gözden Kaçan Riskler

Hızlı yama yapmak, kulağa en mantıklı ve en güvenli çözüm gibi gelir, değil mi? Zafiyet var, yama çıktı, uygulayalım ve sorun çözülsün. Birçok durumda da öyle olur. Özellikle kritik bir RCE (Remote Code Execution) zafiyeti söz konusuysa, yama yapmak birincil önceliğim haline gelir. Ağa açık bir serviste RCE potansiyeli olan bir kernel zafiyeti çıktığında, deployment pipeline’larını durdurup acil bir yama süreci başlatmak gerekir. Bu tür durumlarda, SLA’ları ve potansiyel finansal kayıpları düşündüğümde, hızlı yama neredeyse tek seçenektir.

Ancak hızlı yamanın gözden kaçan riskleri de var. Kernel güncellemesi sonrası bir depolama sürücüsünün kernel panic vermesi, sebebi de yeni kernel’in eski sürücü modülüyle uyumsuz olması — bu tür senaryolar mümkün. Bu tür beklenmedik regresyonlar, özellikle özel donanım veya eski sistemlerle çalışan ortamlarda karşıma çıkmıştır.

Bir başka risk de, yamanın yeterince test edilmeden production’a uygulanmasıdır. Kernel yaması, örneğin bir systemd unit’inin cgroup limitlerini farklı yorumlamasına ve uygulamanın beklenenden fazla hafıza tüketip OOM-killed olmasına yol açabilir. Bu tür sorunları tespit etmek uzun zaman alabilir ve üretim ortamında ciddi kesintilere neden olabilir. Benim için hızlı yama, çoğu zaman bir geçici çözüm veya ilk savunma hattıdır; nihai çözüm değildir.

Derin Savunma Katmanları: Kernel’in Ötesine Bakış

Benim güvenlik felsefem, “derin savunma” (defense-in-depth) prensibine dayanır. Sadece kernel’i yamalamak yetmez, çünkü hiçbir sistem %100 güvenli değildir. Bir zafiyetin istismar edilme ihtimali her zaman vardır. Önemli olan, bir katman delindiğinde diğer katmanların saldırıyı durduracak veya yavaşlatacak olmasıdır. Bu yaklaşım, sadece teknik bir tercih değil, aynı zamanda kişisel olarak bana daha fazla iç huzur veren bir yaşam felsefesidir. Tıpkı kendi finansal hesaplayıcılarımı yaparken sadece verileri korumakla kalmayıp, aynı zamanda erişim kontrolünü ve ağ segmentasyonunu da düşünmem gibi.

Kernel’in ötesinde düşündüğümde, aklıma gelen ilk şey, sistemin genel güvenlik duruşudur. Bir Kernel CVE’si çıktığında, kendime şu soruları sorarım: Bu zafiyetten etkilenen modül veya servis, zaten erişim kısıtlamalarına tabi mi? En düşük yetki prensibi uygulanıyor mu? Ağ segmentasyonumuz ne kadar sağlam? Örneğin, bir VPN topolojisi tasarlarken, sadece tüneli kurup bırakmam, aynı zamanda VPN kullanıcılarının hangi iç ağlara erişebileceğini VLAN segmentasyonu ile kısıtlarım.

Uygulama Katmanı Güvenliği ve Network Segmentasyonu

Uygulama katmanında, JWT/OAuth2 pattern’leri ile kimlik doğrulama ve yetkilendirme mekanizmaları kullanırım. Ayrıca, rate limiting uygulayarak brute-force saldırılarını veya aşırı kaynak tüketimini engellerim. Örneğin kimlik doğrulama endpoint’lerine istek sınırı koymak, bir Kernel CVE’si istismar edilse bile saldırganın uygulama katmanında ilerlemesini zorlaştırır.

# Nginx ile rate limiting örneği
limit_req_zone $binary_remote_addr zone=login_ratelimit:10m rate=10r/s;

server {
    listen 80;
    server_name myapp.com;

    location /api/v1/auth {
        limit_req zone=login_ratelimit burst=20 nodelay;
        proxy_pass http://my_backend_service;
    }
    # Diğer lokasyonlar...
}

Network katmanında ise, DHCP snooping, DAI (Dynamic ARP Inspection) ve IP source guard gibi switch hardening tekniklerini aktif olarak kullanırım. Bunlar, ağdaki kötü niyetli cihazların sahte IP veya MAC adresleriyle trafiği yönlendirmesini engeller. ARP cache poisoning gibi bir saldırıda trafiğin başka bir cihaza yönlendirilme girişimi, DAI ve IP source guard ile daha başlamadan engellenebilir. Bu durum, sadece bir Kernel CVE’sinin ötesinde, genel ağ güvenliğinin ne kadar kritik olduğunu gösterir.

Uygulamalı Savunma Mekanizmaları: Benim Yaklaşımlarım

Derin savunma, soyut bir kavramdan ibaret değil; somut adımlar gerektirir. Benim için bu adımlar, kernel module blacklist’lerinden, SELinux/AppArmor profillerine, auditd ile izlemeye kadar geniş bir yelpazeyi kapsar. Bu mekanizmalar, bir Kernel CVE’sinin potansiyel etkisini azaltmak veya tamamen engellemek için tasarlanmıştır.

Kernel Modül Blacklist’i

Bazı kernel modülleri, belirli servisler için gereksiz olabilir ve potansiyel bir saldırı yüzeyi oluşturabilir. Özellikle yeni keşfedilen bir CVE, belirli bir modülü hedef alıyorsa ve o modül sizin için kritik değilse, onu blacklist’e almak hızlı ve etkili bir savunma sağlar. Örneğin, 2026’da ortaya çıkan bir zafiyet, algif_aead modülü üzerinden istismar edilebiliyorsa ve ben bu modülü kullanmıyorsam, onu engellemek mantıklı bir adımdır.

# /etc/modprobe.d/blacklist.conf dosyasına ekle
echo "blacklist algif_aead" | sudo tee -a /etc/modprobe.d/blacklist.conf
# Değişiklikleri uygulamak için initramfs'i yeniden oluştur
sudo update-initramfs -u
# Sistemi yeniden başlatmak gerekebilir, emin olmak için kontrol et
lsmod | grep algif_aead

Bu, bir Kernel CVE’sinin neden olduğu anlık riski azaltırken, yama sürecinin tamamlanması için bana zaman kazandırır. Tabii ki, bu adımı atmadan önce ilgili modülün bağımlılıklarını ve sistem üzerindeki potansiyel etkisini dikkatlice değerlendiririm. Yanlış bir modülü blacklist’e almak, sistemin kararlılığını bozabilir.

SELinux/AppArmor Profilleri

Linux güvenlik modülleri olan SELinux ve AppArmor, uygulamaların kernel ile etkileşimini kısıtlayarak ek bir savunma katmanı sunar. Bir uygulama veya servis, bir Kernel CVE’si üzerinden yetkisini yükseltmeye çalışsa bile, SELinux veya AppArmor profili bu davranışı engelleyebilir. Bir üretim ERP’sinde, PostgreSQL sunucusunun sadece belirli dizinlere yazma izni olmasını AppArmor ile sağlamıştım. Bu sayede, PostgreSQL’deki bir zafiyet istismar edilse bile, saldırganın sistemin diğer bölümlerine yayılması büyük ölçüde kısıtlanmış oluyordu.

# AppArmor profil örneği (basitleştirilmiş)
# /etc/apparmor.d/usr.sbin.postgresql gibi bir dosyada
# Bu profil, postgresql'in sadece belirli yollara erişmesine izin verir.
/usr/sbin/postgresql {
  # PostgreSQL binary'sine izin ver
  /usr/sbin/postgresql ix,

  # Kendi veri dizinine erişim
  /var/lib/postgresql/** rwk,
  /var/log/postgresql/** rwk,

  # Diğer her şeye erişimi kısıtla
  deny /etc/** rwk,
  deny /dev/** rwk,
  # ...
}

Bu profillerin oluşturulması ve bakımı zaman alıcı olabilir, ancak uzun vadede sağladıkları güvenlik faydası paha biçilmezdir. Benim için bu, sadece bir teknik uygulama değil, aynı zamanda sistemlerime duyduğum güveni artıran bir yatırımdır.

Auditd ile Dosya Bütünlüğü ve Olay İzleme

auditd (Linux Audit Subsystem), sistemdeki olayları detaylı bir şekilde kaydetmemi sağlar. Özellikle dosya bütünlüğünü izlemek ve şüpheli kernel veya modül yükleme girişimlerini tespit etmek için kullanırım. Bir Kernel CVE’si istismar edildiğinde, saldırgan genellikle sistem dosyalarını değiştirmeye veya yeni modüller yüklemeye çalışır. auditd kuralları ile bu tür eylemleri anında tespit edebilir ve alarm üretebilirim.

# auditd kuralı örneği: kritik kernel modül dizinindeki değişiklikleri izle
# /etc/audit/rules.d/kernel-modules.rules
-w /lib/modules/ -p wa -k kernel_modules_change
-w /usr/lib/modules/ -p wa -k kernel_modules_change
-w /boot/ -p wa -k boot_integrity

Bu kuralları uyguladıktan sonra, auditd loglarını (genellikle /var/log/audit/audit.log veya journald üzerinden) düzenli olarak izlerim. Bir Kernel CVE’si aktif olarak istismar edildiğinde, bu loglarda anormal modül yükleme girişimleri veya dosya değişiklikleri görebilirim. Bu, bana hem saldırının tespitinde hem de sonrasında adli analizde çok yardımcı olur.

Otomasyon ve Gözlem: Yorgunluk Yönetimi

Güvenlik, sürekli bir süreçtir ve manuel olarak her şeyi takip etmek imkansızdır. Bu yüzden otomasyon ve gözlem, benim için derin savunma stratejisinin ayrılmaz bir parçasıdır. Kendi yan ürünlerimde veya müşteri projelerinde, bu süreçleri otomatikleştirmek için çok çaba sarf ettim. Amacım, insan faktöründen kaynaklanan hataları minimize etmek ve olası bir saldırı durumunda hızlıca yanıt verebilmek.

CVE Takibi ve Otomatik Bildirimler

Yeni çıkan CVE’leri manuel olarak takip etmek yerine, çeşitli kaynaklardan otomatik bildirimler alacak sistemler kurdum. Örneğin, CVEfeed veya NVD gibi kaynakları takip eden bir script, belirli anahtar kelimelerle (örneğin “kernel”, “linux”, “privilege escalation”) ilgili CVE’ler çıktığında bana anında e-posta veya Slack üzerinden bildirim gönderir. Bu, benim ilk reflekslerimi tetikleyen mekanizmanın temelini oluşturur.

# Basit bir CVE takip scripti taslağı (gerçekte daha karmaşık)
import requests
import json
import time

NVD_API_URL = "https://services.nvd.nist.gov/rest/json/cves/2.0"
KEYWORDS = ["kernel", "linux", "privilege escalation", "rce"]

def get_latest_cves():
    # Burada NVD API'den en son CVE'leri çekme mantığı olacak
    # Örnek: Son 24 saatteki CVE'ler
    response = requests.get(NVD_API_URL, params={"pubStartDate": "2026-05-26T00:00:00.000"})
    response.raise_for_status()
    return response.json()

def notify_if_relevant(cves):
    for cve_item in cves.get("vulnerabilities", []):
        cve = cve_item["cve"]
        description = cve["descriptions"][0]["value"].lower()
        if any(keyword in description for keyword in KEYWORDS):
            print(f"KRİTİK CVE BULUNDU: {cve['id']} - {description[:100]}...")
            # Burada e-posta veya Slack bildirimi gönderme kodu olacak
            # send_notification(cve['id'], description)

if __name__ == "__main__":
    while True:
        try:
            latest_cves = get_latest_cves()
            notify_if_relevant(latest_cves)
        except Exception as e:
            print(f"Hata oluştu: {e}")
        time.sleep(3600) # Her saat başı kontrol et

Bu tür sürekli çalışan bir script’in zamanla hafıza tüketip OOM-killed olması mümkün; bu yüzden background worker’lar için memory limit’leri ve dikkatli bir polling-wait yaklaşımı kullanıyorum. Bu, otomasyonun bile kendi içinde riskleri olduğunu ve sürekli öğrenmem gerektiğini gösteren bir konu.

Observability ve Anomali Tespiti

Sistemlerimde Prometheus ve Grafana gibi araçlarla kapsamlı metrik toplarım. Bu metrikler, CPU kullanımı, bellek tüketimi, ağ trafiği ve disk I/O gibi temel performans göstergelerinin yanı sıra, auditd loglarından çekilen güvenlik metriklerini de içerir. Bir Kernel CVE’si istismar edilmeye çalışıldığında, sistem kaynaklarında ani ve anormal yükselişler gözlemleyebilirim.

Örneğin, normalde algif_aead modülü hiç kullanılmayan bir sunucuda, bu modülün aniden yüklenmeye çalışılması veya yüksek CPU tüketmesi bir anomali sinyalidir. Bu tür anomalileri tespit etmek için Prometheus alert kuralları tanımladım.

# Prometheus alert kuralı örneği
groups:
- name: kernel-security-alerts
  rules:
  - alert: HighKernelModuleLoadAttempts
    expr: sum(rate(node_auditd_messages_total{type="SYSCALL", a0="load_module"}[5m])) by (instance) > 5
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Yüksek kernel modül yükleme girişimi algılandı"
      description: "Son 5 dakikada {{ $labels.instance }} üzerinde 5'ten fazla kernel modül yükleme girişimi tespit edildi. CVE istismarı olabilir."

Bu tür bir anomali tespit edildiğinde, otomatik olarak bir uyarı tetiklenir ve ben veya ekibim hızlıca duruma müdahale edebiliriz. Bu, sadece bir Kernel CVE’si için değil, genel sistem güvenliği için de hayati öneme sahiptir. Observability, operasyonel yorgunluğu azaltır ve bana daha proaktif olma imkanı tanır.

Trade-off’lar ve Karar Verme Süreci: Ne Zaman Ne Yapmalı?

Kernel CVE’lerine yanıt verirken, her zaman bir denge arayışındayım. Hızlı yama yapmak ve derin savunma katmanları oluşturmak arasında bir seçim yapmak zorunda kalırım. Bu karar, sistemin kritikliği, zafiyetin türü, mevcut kaynaklar ve potansiyel riskler gibi birçok faktöre bağlıdır.

Bir örnek vermek gerekirse: Eğer çok kritik bir üretim sisteminde, uzaktan istismar edilebilir bir RCE Kernel CVE’si çıkarsa ve exploit kodu kamuya açıksa, benim önceliğim hızlı yama olur. Bu durumda, yamanın potansiyel yan etkilerini göze alarak, test süreçlerini hızlandırır ve kontrollü bir acil durum deploy’u yaparım. Çünkü bu senaryoda, yama yapmamanın maliyeti çok daha yüksek olacaktır. Kritik bir yama sürecinde sonradan performans regresyonları çıkabilir, ama yine de yama yapmamak çok daha kötü sonuçlar doğurabilir.

Diğer yandan, eğer bir yerel yetki yükseltme (LPE) CVE’si ise ve zaten SELinux/AppArmor profilleriyle sıkı bir uygulama izolasyonu sağlamışsam, o zaman derin savunma katmanlarına güvenerek yama sürecini daha sakin ve planlı bir şekilde yönetebilirim. Bu durumda, yama öncesi daha kapsamlı testler yapar, bir blue-green deployment stratejisi ile riski minimize ederim. Bu, bana hem güvenliği sağlamak hem de operasyonel kararlılığı korumak için gerekli esnekliği sağlar.

Benim için bu kararlar, sadece teknik bir analiz değil, aynı zamanda kişisel bir sorumluluk ve vicdan meselesidir. Yaptığım her seçimin, sistemlerin istikrarı ve kullanıcıların güvenliği üzerinde doğrudan bir etkisi olduğunu biliyorum. Bu yüzden, her zaman en iyi trade-off’u bulmaya çalışırım.

Sonuç: Güvenlik, Bir Süreç ve Kişisel Sorumluluk

Kernel CVE’lerine verilen yanıt, basit bir “yükle ve unut” işlemi değildir; karmaşık bir problem çözme, risk yönetimi ve sürekli öğrenme sürecidir. Pratikte gördüğüm kadarıyla, sadece hızlı yama yapmak yeterli değil. Derin savunma katmanları oluşturmak, sistemlerimi daha dirençli hale getiriyor ve bana daha fazla huzur veriyor. Bu, benim “olur o kadar” tarzımdaki pragmatik yaklaşımımın bir yansıması. Hiçbir zaman %100 güvenli bir sistem vaat edemem, ama her zaman en iyi savunmayı inşa etmeye çalışırım.

Güvenlik, bir varış noktası değil, sürekli bir yolculuktur. Yeni zafiyetler her zaman ortaya çıkacak, yeni saldırı yöntemleri geliştirilecektir. Bu yüzden, sistem yöneticisi ve yazılımcı olarak bizlerin görevi, sürekli öğrenmek, sistemlerimizi güçlendirmek ve en önemlisi, bu süreçte sorumluluk almaktır. Ben kendi adıma, bu yolculuğa devam ediyor ve her yeni CVE’den bir ders çıkarmaya çalışıyorum. Gelecekte ZTNA mimarisinin detayları üzerine bir yazı ile bu katmanlı güvenlik yaklaşımlarımı daha da açacağım.

Paylaş:

Bu yazı faydalı oldu mu?

Yükleniyor...

Bu yazı nasıldı?

Sıkça Sorulanlar

Bu makale ile ilgili okurların sorduğu yaygın sorular.

Bir Kernel CVE alarmı geldiğinde, ilk adımım ne olmalıdır?
Ben, ilk olarak paniklemeyerek sakin kalmaya çalışırım. Sonra, CVE'nin detaylarını öğrenmek, etkilenen kernel versiyonlarını kontrol etmek ve bizim sistemlerdeki mevcut kernel versiyonlarını karşılaştırmak için harekete geçerim. Bu adım, durumun ciddiyetini anlamamı ve sonraki adımları planlamamı sağlar.
Yama yapmak ile derin savunma arasında bir trade-off var mıdır?
Evet, benim deneyimime göre, sadece yama yapmak ile derin savunma arasında bir trade-off vardır. Yama yapmak hızlı bir çözüm olabilir, ancak uzun vadeli güvenlik ve sürdürülebilirlik açısından derin savunma daha önemli olabilir. Ben, her iki yaklaşımın avantajlarını ve dezavantajlarını değerlendirerek, sistemimin özel ihtiyaçlarına göre bir karar veririm.
Bir üretim sisteminde kritik bir CVE zafiyeti ortaya çıktığında, üretim hatlarını durdurma kararı nasıl verilir?
Ben, bu tür bir karar verirken, zafiyetin ciddiyetini, sistemdeki diğer güvenlik önlemlerini ve üretim hatlarının durdurulmasının getireceği maliyetleri değerlendiririm. Ayrıca, üretim firmasının ERP sistemi gibi kritik sistemlerde, zafiyetin producciónü durdurma potansiyeli olması, uyku kaçıran bir durum olabilir. Ben, bu kararları alırken, sistemimin güvenliğini ve üretim sürecinin sürekliliğini dengelerim.
Kernel CVE alarmı geldiğinde, hata oranı yüksek ise ne yapılır?
Ben, hata oranı yüksek olduğunda, öncelikle sistemimin güvenirliğini sağlamak için gerekli önlemleri alırım. Sonra, hataların nedenlerini analiz eder ve gerekli düzeltmeleri yaparım. Eğer hatalar devam ederse, üretim sistemini geçici olarak durdurabilir veya alternatif çözümler ararım. Ben, bu gibi durumlarda, sistemimin güvenliğini ve üretim sürecinin sürekliliğini koruma konusunda çok hassas davranırım.
ME

Mustafa Erbay

Sistem Mimarisi · Network Uzmanı · Altyapı, Güvenlik ve Yazılım

2006'dan bu yana sistem mimarisi, network, sunucu altyapıları, büyük yapıların kurulumu, yazılım ve sistem güvenliği ekseninde çalışıyorum. Bu blogda sahada karşılığı olan teknik deneyimlerimi paylaşıyorum.

Kişisel Notlar

Bu notlar sadece sizde saklanır. Tarayıcınızda yerel olarak tutulur.

Hazır 0 karakter

Yorumlar

Sunucu Taraflı AI Moderasyon

Yorumlar sunucuda yapay zeka ile denetlenir ve kalıcı olarak saklanır.

?
0/2000

Sunucu taraflı AI denetim

✉️ Ücretsiz · Spam yok · İstediğin an çık

Yeni yazılardan haberdar olun

Yeni içerikler ve teknik notlar e-postanıza gelsin.

  • 📌
    Haftanın en iyisi Sadece okumaya değer tek yazı
  • 🔧
    Alet çantası Bu hafta kullandığım araçlar
  • 🧠
    Perde arkası Blog'a girmeyen notlar

Spam yapmıyoruz. İstediğiniz zaman ayrılabilirsiniz. · Sadece Umami (self-hosted, Google yok) ile takip.

Okuma İstatistikleriniz

0

Yazı Okundu

0dk

Okuma Süresi

0

Gün Serisi

-

Favori Kategori

İlgili Yazılar