chattr ve lsattr Komutları ile Linux Dosya Sistemi Özniteliklerini Yönetme
Sistem yöneticiliğinde dosya izinleri denince akla hemen chmod ve chown gelir. Oysa Linux’un dosya güvenliği katmanları bunlardan çok daha derine iner. chattr ve lsattr komutları, ext2/ext3/ext4 ve bazı diğer dosya sistemlerinde dosyalara düşük seviyeli öznitelikler atamanıza olanak tanır. Bu öznitelikler, root kullanıcısı dahil kimsenin kolayca değiştiremeyeceği korumalar sağlar. Yıllarca sistem yöneticiliği yapıp da bu komutları hiç kullanmamış ya da yüzeysel geçmiş insanlar var. Bu yazıda hem teorik altyapıyı hem de sahadan gelen gerçek kullanım senaryolarını ele alacağız.
chattr ve lsattr Nedir?
chattr (change attribute) komutu, Linux dosya sistemlerinde dosya ve dizinlere özel öznitelikler atamak için kullanılır. lsattr (list attributes) ise bu öznitelikleri görüntüler. İkisi birlikte düşünülmeli, çünkü biri yazmadan diğeri okumak için var.
Bu öznitelikler, dosya sistemi seviyesinde işler. Yani standart POSIX izin modeline ek bir katman oluşturuyorlar. chmod 000 yapsanız bile dosyaya erişilemez ama siz chattr +i yaptığınızda bu dosyayı root bile silemez, taşıyamaz, değiştiremez. Bu fark kritik.
Hangi dosya sistemleri destekler diye soracak olursanız: ext2, ext3, ext4 tam destek sunar. btrfs kısmen destekler. XFS bazı öznitelikleri destekler. ZFS ise kendi öznitelik sistemine sahip olduğu için chattr burada çalışmaz. Özellikle RHEL/CentOS sistemlerde XFS varsayılan dosya sistemi olduğu için bazı özniteliklerin çalışmayabileceğini aklınızın bir köşesinde tutun.
lsattr ile Öznitelikleri Görüntüleme
Önce mevcut durumu görmekle başlayalım. lsattr komutu oldukça basit ama bazı parametreleri işinizi kolaylaştırır.
# Mevcut dizindeki dosyaların özniteliklerini listele
lsattr
# Belirli bir dosyanın özniteliklerini göster
lsattr /etc/passwd
# Bir dizini özyinelemeli olarak listele
lsattr -R /etc/
# Dizinlerin kendisini de dahil et (içeriğini değil)
lsattr -d /etc/
# Sayısal değerleri göster
lsattr -v /etc/passwd
lsattr çıktısı şöyle görünür:
$ lsattr /etc/passwd
----i--------e-- /etc/passwd
Bu çıktıdaki harfler, aktif öznitelikleri temsil eder. Tire işaretleri o özniteliğin pasif olduğunu gösterir. Öznitelik yoksa tire görürsünüz. Yukarıdaki örnekte i ve e öznitelikleri aktif.
lsattr parametrelerine bakalım:
- -R: Alt dizinleri de dahil ederek özyinelemeli listeler
- -a: Gizli dosyaları da gösterir (nokta ile başlayanlar dahil)
- -d: Dizinin içeriğini değil, dizinin kendisini listeler
- -v: Dosyanın sürüm/nesil numarasını da gösterir
- -l: Özniteliklerin uzun isimlerini gösterir (bazı sistemlerde)
chattr ile Öznitelik Atama
chattr komutunun genel sözdizimi şöyle:
chattr [seçenekler] [operatör][öznitelik] dosya/dizin
Operatörler üç tanedir:
- +: Öznitelik ekler
- –: Özniteliği kaldırır
- =: Yalnızca belirtilen öznitelikleri atar, geri kalanları kaldırır
chattr parametreleri:
- -R: Dizine özyinelemeli uygular
- -V: Verbose mod, yapılan değişiklikleri gösterir
- -f: Hata mesajlarını bastırır
- -v: Dosyanın sürüm numarasını ayarlar
Temel Öznitelikler ve Kullanımları
i Özniteliği: Değişmezlik (Immutable)
Bu öznitelik, dosya güvenliğinin en güçlü kalkanıdır. Bir dosyaya i özniteliği atadığınızda o dosya silinemez, değiştirilemez, yeniden adlandırılamaz, bağlantı eklenemez. Root kullanıcısı bile bu işlemleri yapamaz.
# /etc/resolv.conf dosyasını değiştirilemez yap
sudo chattr +i /etc/resolv.conf
# Kontrol edelim
lsattr /etc/resolv.conf
----i--------e-- /etc/resolv.conf
# Silmeyi deneyelim (root olarak bile)
sudo rm /etc/resolv.conf
rm: cannot remove '/etc/resolv.conf': Operation not permitted
# Özniteliği kaldır
sudo chattr -i /etc/resolv.conf
Gerçek dünya senaryosu: DHCP kullanan bir sistemde /etc/resolv.conf sürekli üzerine yazılıyordu ve ekibimiz elle konfigüre ettiği DNS sunucularının kaybolduğundan şikayet ediyordu. NetworkManager veya dhclient her IP yenilemesinde bu dosyayı değiştiriyordu. Geçici çözüm olarak chattr +i /etc/resolv.conf uyguladık, kalıcı çözümü kurarken bu öznitelik hayat kurtardı.
a Özniteliği: Yalnızca Ekleme (Append-Only)
a özniteliği özellikle log dosyaları için biçilmiş kaftandır. Bu öznitelik atanmış bir dosyaya yalnızca veri eklenebilir, mevcut içerik değiştirilemez veya silinemez.
# Log dosyasını append-only yap
sudo chattr +a /var/log/uygulama.log
# Normal kullanıcı veri ekleyebilir
echo "yeni log satiri" >> /var/log/uygulama.log # Bu çalışır
# Ama üzerine yazamaz
echo "log silindi" > /var/log/uygulama.log # Operation not permitted
# Root da silemez
sudo rm /var/log/uygulama.log # Operation not permitted
Bu öznitelik, güvenlik ihlali sonrası log manipülasyonunu önlemek için kritiktir. Bir saldırgan sisteme girip izlerini silmek istediğinde a öznitelikli log dosyalarını temizleyemez.
e Özniteliği: Extent Formatı
lsattr çıktısında çoğu dosyada e harfini görürsünüz. Bu öznitelik, dosyanın ext4 extent formatı kullandığını gösterir. Elle atayıp kaldıramazsınız, dosya sistemi tarafından otomatik yönetilir. Ama ne anlama geldiğini bilmek karışıklık yaratmaz.
u Özniteliği: Silinmezlik (Undeletable)
# Dosyayı "geri alınabilir silme" moduna al
sudo chattr +u /home/kullanici/onemli_dosya.txt
Bu öznitelik, dosya silindiğinde içeriğinin saklanmasını sağlar. Teorik olarak kurtarma mümkün olur. Ancak tüm dosya sistemleri ve araçlar bunu tam olarak desteklemez, pratikte u özniteliğine tek başına güvenmemek gerekir.
s Özniteliği: Güvenli Silme
# Dosya silindiğinde disk blokları sıfırlarla doldurulsun
sudo chattr +s /home/kullanici/gizli_belge.txt
s özniteliği atanmış bir dosya silindiğinde, disk bloklarının üzerine sıfır yazılır. Böylece disk kurtarma araçlarıyla içeriğe erişim zorlaşır. Hassas veri içeren dosyalar için düşünülebilir, ama modern SSD’lerde ve TRIM destekli sistemlerde bu garantiyi vermek güçleşiyor.
c Özniteliği: Otomatik Sıkıştırma
# Dosyayı otomatik sıkıştır
sudo chattr +c /var/log/buyuk_log.log
Bu öznitelik, kernel tarafından dosyanın otomatik sıkıştırılmasını sağlar. Disk alanı sıkıntısı yaşanan sistemlerde log dosyaları için kullanılabilir. Ancak ext4’te bu öznitelik tam olarak uygulanmamış durumda, btrfs’de daha iyi çalışır.
D özniteliği: Eşzamanlı Dizin Güncellemeleri
# Dizin değişikliklerinin anında diske yazılmasını sağla
sudo chattr +D /var/db/kritik_veritabani/
Büyük harfle yazılan D özniteliği, bir dizine uygulandığında o dizindeki değişikliklerin eşzamanlı olarak diske yazılmasını sağlar. Veritabanı dizinleri için kritik olabilir.
j Özniteliği: Veri Günlüğü (Data Journaling)
# Dosya için veri journaling aç
sudo chattr +j /var/db/kritik.db
j özniteliği, dosya sistemi data=ordered veya data=writeback modunda mount edilmiş olsa bile o dosyanın verilerinin ext3/ext4 journaling mekanizmasına dahil edilmesini sağlar. Kritik veritabanı dosyaları için güvenlik katmanı ekler.
t Özniteliği: Tail-Merging Kapatma
sudo chattr +t /dosya
Bu öznitelik, dosyanın son bloğunun diğer dosyalarla paylaşılmamasını sağlar. Bazı eski dosya sistemlerindeki tail-merging özelliğini bu dosya için devre dışı bırakır.
Gerçek Dünya Senaryoları
Senaryo 1: Web Sunucusu Güvenlik Sertleştirmesi
Bir web sunucusunu sertleştirirken kritik konfigürasyon dosyalarını korumak istiyorsunuz. Sistem içine sızan bir saldırganın konfigürasyonu değiştirmesini önlemek için:
#!/bin/bash
# web_sunucu_sertlestir.sh
# Kritik nginx konfigürasyon dosyalarını sabitle
sudo chattr +i /etc/nginx/nginx.conf
sudo chattr +i /etc/nginx/conf.d/default.conf
# SSL sertifikalarını koru
sudo chattr +i /etc/ssl/private/site.key
sudo chattr +i /etc/ssl/certs/site.crt
# PHP konfigürasyonunu sabitle
sudo chattr +i /etc/php/8.1/fpm/php.ini
# Log dosyalarını append-only yap
sudo chattr +a /var/log/nginx/access.log
sudo chattr +a /var/log/nginx/error.log
echo "Sertleştirme tamamlandı."
lsattr /etc/nginx/nginx.conf
lsattr /var/log/nginx/access.log
Bu scripti çalıştırdıktan sonra güncelleme yapmak istediğinizde önce chattr -i ile özniteliği kaldırmanız, değişikliği yapmanız, sonra tekrar chattr +i ile korumanız gerekir. Bunu da otomatize etmek mümkün:
#!/bin/bash
# guvenli_guncelle.sh - Korumalı dosyaları güvenle güncelle
DOSYA=$1
YEDEK_DIZIN=/var/backup/config
# Özniteliği kaldır
sudo chattr -i "$DOSYA"
# Yedeği al
cp "$DOSYA" "$YEDEK_DIZIN/$(basename $DOSYA).$(date +%Y%m%d_%H%M%S).bak"
# Editörü aç
${EDITOR:-nano} "$DOSYA"
# Özniteliği geri koy
sudo chattr +i "$DOSYA"
echo "$DOSYA güncellendi ve yeniden korundu."
Senaryo 2: Kritik Sistem Dosyalarının Korunması
Özellikle internete açık sistemlerde /etc/passwd, /etc/shadow, /etc/sudoers gibi dosyaların yetkisiz değişikliğini önlemek için:
# Kullanıcı yönetimi dosyalarını koru
sudo chattr +i /etc/passwd
sudo chattr +i /etc/shadow
sudo chattr +i /etc/group
sudo chattr +i /etc/gshadow
sudo chattr +i /etc/sudoers
# Kontrol
lsattr /etc/passwd /etc/shadow /etc/sudoers
Dikkat: Bu dosyalara +i uyguladıktan sonra yeni kullanıcı ekleyemezsiniz, parola değiştiremezsiniz. Maintenance pencerelerine dikkat edin ve öznitelikleri kaldırıp tekrar ekleme sürecini belgelendirin.
Senaryo 3: Honeypot Dosyası Oluşturma
Saldırganların ilgi çekebileceği isimde bir dosya oluşturun ve izleyin. Dosyayı i ile koruyun ki gerçek içerik olmadığı belli olmasın ama değiştirilemez olsun:
# Tuzak dosyası oluştur
sudo touch /root/passwords_backup.txt
echo "Bu bir tuzak dosyasidur" | sudo tee /root/passwords_backup.txt
sudo chattr +i /root/passwords_backup.txt
# İzleme için inotifywait kullan
sudo inotifywait -m /root/passwords_backup.txt -e access,attrib,open 2>/dev/null |
while read path action file; do
echo "$(date): $action on $path$file" >> /var/log/honeypot.log
# Alarm gönder
echo "Honeypot tetiklendi: $action" | mail -s "Guvenlik Alarmi" [email protected]
done &
Senaryo 4: Toplu Öznitelik Yönetimi
Büyük sistemlerde hangi dosyalara öznitelik atandığını takip etmek zorlaşır. Bunun için basit bir envanter scripti:
#!/bin/bash
# ozitelik_envanter.sh - Öznitelikli dosyaları raporla
RAPOR_DOSYASI="/var/log/chattr_envanter_$(date +%Y%m%d).txt"
echo "=== chattr Öznitelik Envanteri ===" > "$RAPOR_DOSYASI"
echo "Tarih: $(date)" >> "$RAPOR_DOSYASI"
echo "" >> "$RAPOR_DOSYASI"
# /etc altında öznitelikli dosyaları bul
echo "--- /etc Dizini ---" >> "$RAPOR_DOSYASI"
lsattr -R /etc/ 2>/dev/null | grep -v "--------------" >> "$RAPOR_DOSYASI"
echo "--- /var/log Dizini ---" >> "$RAPOR_DOSYASI"
lsattr -R /var/log/ 2>/dev/null | grep -v "--------------" >> "$RAPOR_DOSYASI"
echo "" >> "$RAPOR_DOSYASI"
echo "Rapor tamamlandı: $RAPOR_DOSYASI"
cat "$RAPOR_DOSYASI"
Önemli Uyarılar ve Dikkat Edilmesi Gerekenler
Sistem Güncellemeleri ile Çakışma
apt upgrade veya yum update çalıştırdığınızda paket yöneticisi konfigürasyon dosyalarını güncellemek ister. Eğer bu dosyalar +i ile korunuyorsa güncelleme başarısız olur. Bu durumu yönetmek için güncelleme öncesi ve sonrası çalışan hook scriptleri yazabilirsiniz:
# /etc/apt/apt.conf.d/99-chattr-pre-hook
DPkg::Pre-Invoke {"chattr -i /etc/ssh/sshd_config 2>/dev/null || true";};
DPkg::Post-Invoke {"chattr +i /etc/ssh/sshd_config 2>/dev/null || true";};
Kurtarma Modunda Ne Olur?
chattr +i ile koruma, root kullanıcısını da kapsıyor. Peki sistem kurtarma modunda (single user mode veya live CD) ne olur? Bu öznitelikler, dosya sistemi düzeyinde çalıştığı için chattr -i komutu kurtarma ortamında da çalışır. Fiziksel erişimi olan biri öznitelikleri kaldırabilir. Bu yüzden chattr tek başına fiziksel güvenliğin yerini tutmaz.
Backup Araçları ile Uyumluluk
rsync, tar, cp gibi araçlar dosya özniteliklerini varsayılan olarak kopyalamaz. Öznitelikleri yedeklemek ve geri yüklemek için:
# lsattr ile öznitelikleri kaydet
lsattr -R /etc/ > /backup/etc_attributes.txt
# Geri yükleme için scriptle işle
while IFS= read -r satir; do
ozitelikler=$(echo "$satir" | awk '{print $1}')
dosya=$(echo "$satir" | awk '{print $2}')
# Öznitelikleri uygula
chattr =$(echo $ozitelikler | tr -d '-') "$dosya" 2>/dev/null
done < /backup/etc_attributes.txt
Container ve Sanal Makine Ortamları
Docker container içinde chattr genellikle çalışmaz çünkü container izin modeli bu sistem çağrısına izin vermez. CAP_LINUX_IMMUTABLE capability’sine ihtiyaç vardır:
# Docker'da chattr kullanmak için
docker run --cap-add LINUX_IMMUTABLE ubuntu chattr +i /test_dosyasi
# Kubernetes'te pod güvenlik politikası gerekir
# securityContext altında ilgili capability eklenmelidir
lsattr Çıktısını Anlamak
Tam bir lsattr çıktısındaki öznitelik sırası şöyledir (soldan sağa):
- s: Güvenli silme
- u: Silinmezlik (undeletable)
- c: Sıkıştırılmış
- S: Eşzamanlı güncelleme
- D: Eşzamanlı dizin güncellemesi (sadece dizinler)
- i: Değiştirilemez (immutable)
- a: Yalnızca ekleme
- d: dump ile yedeklenme
- A: atime güncellemelerini engelle
- t: Tail-merging yok
- T: Dizin hiyerarşisinin üstü
- j: Veri journaling
- e: Extent formatı
- C: copy-on-write yok (btrfs)
- N: Veri inline (dosya sistemi inode içinde)
# Örnek kapsamlı çıktı yorumu
$ lsattr -la /etc/
# -la ile uzun format
Flags: Immutable /etc/passwd
Flags: Append_Only /var/log/auth.log
Flags: Extent_Mapped /etc/hosts
Sonuç
chattr ve lsattr komutları, Linux güvenlik araç kutusunun sıkça göz ardı edilen ama çok değerli üyeleri. Özellikle kritik sunucularda, internet’e açık sistemlerde ve compliance gereksinimlerini karşılamak zorunda olduğunuz ortamlarda bu öznitelikleri stratejik olarak kullanmak gerçek anlamda savunma katmanları ekler.
Pratik özet olarak söylemek gerekirse: kritik konfigürasyon dosyalarına +i, log dosyalarına +a, hassas veriler içeren dosyalara +s kombinasyonunu düşünün. Ama her şeyi kilitlemeyin, güncelleme ve bakım süreçlerinizi de hesaba katın. En iyi güvenlik, kullanılabilirliği bozmayan güvenliktir.
Bu araçları ilk kez deniyorsanız, test ortamında başlayın. Production sistemde /etc/passwd dosyasını +i ile kilitleyip sonra yeni kullanıcı eklemeye çalışıp neden olmadığını anlayamamak, zor bir deneyim olabilir. Her özniteliği hem uygulamak hem de geri almak için bir planınız olsun.
