CMD ile Dosya İzinleri ve Güvenlik Yönetimi: icacls ve cacls Kullanımı

Windows ortamında dosya izinlerini yönetmek, sistem yöneticilerinin günlük hayatının ayrılmaz bir parçası. Özellikle büyük kurumsal ortamlarda yüzlerce kullanıcı, onlarca paylaşımlı klasör ve karmaşık güvenlik gereksinimleri söz konusu olduğunda, GUI üzerinden tıklaya tıklaya izin yönetmek hem zaman kaybı hem de hata kaynağı haline gelir. İşte tam bu noktada icacls ve cacls komutları devreye giriyor. Bu yazıda, Windows komut satırından dosya ve dizin izinlerini nasıl yöneteceğinizi, gerçek dünya senaryolarıyla birlikte ele alacağız.

cacls mi, icacls mi?

Önce kısa bir tarih. cacls (Change Access Control Lists), Windows NT döneminden beri var olan eski bir araç. Temel işleri görmek için yeterliydi ama sınırlıydı. Microsoft, Windows Vista ile birlikte icacls komutunu tanıttı ve cacls‘ı deprecated olarak işaretledi.

Bugün Windows Server 2008 ve üzeri bir ortamda çalışıyorsanız, icacls kullanın. cacls hâlâ sistemde bulunuyor ama geriye dönük uyumluluk için oraya bırakılmış durumda. Bazı eski scriptlerde göreceksiniz, anlayın ama yazmayın.

icacls‘ın cacls‘a göre başlıca avantajları şunlar:

  • Miras (inheritance) kurallarını çok daha ince ayarlayabiliyor
  • Birden fazla kullanıcı için aynı anda işlem yapabiliyor
  • ACL’leri dosyaya kaydedip geri yükleyebiliyor
  • Daha tutarlı çıktı formatı sunuyor
  • Integrity level (bütünlük düzeyi) ayarlamalarını destekliyor

icacls Temel Kullanımı

icacls komutunun genel sözdizimi şu şekilde:

icacls <dosya_veya_dizin> [parametreler]

En basit kullanım, bir dosya veya klasörün mevcut izinlerini görüntülemek:

icacls C:ProjeKlasoru

Bu komutun çıktısı şöyle görünür:

C:ProjeKlasoru BUILTINAdministrators:(I)(F)
                NT AUTHORITYSYSTEM:(I)(F)
                BUILTINUsers:(I)(RX)
                NT AUTHORITYAuthenticated Users:(I)(M)

Buradaki kısaltmaları açıklayalım:

  • (I): Inherit, üst klasörden miras alınmış izin
  • (F): Full Control, tam denetim
  • (M): Modify, değiştirme izni
  • (RX): Read & Execute, okuma ve çalıştırma
  • (R): Read, sadece okuma
  • (W): Write, yazma
  • (D): Delete, silme
  • (OI): Object Inherit, nesnelere (dosyalara) miras ver
  • (CI): Container Inherit, kaplara (alt klasörlere) miras ver
  • (NP): No Propagate, alt öğelere yayma
  • (IO): Inherit Only, sadece miras için geçerli, doğrudan uygulanmaz

İzin Ekleme ve Değiştirme

Bir kullanıcıya belirli bir klasör üzerinde izin vermek için /grant parametresini kullanıyoruz:

icacls C:ProjeKlasoru /grant "mehmet.yilmaz:(OI)(CI)M"

Bu komutla mehmet.yilmaz kullanıcısına klasör üzerinde ve tüm alt öğeler üzerinde (OI ve CI sayesinde) Modify izni vermiş olduk.

Şimdi daha gerçekçi bir senaryo düşünelim. Diyelim ki bir departman klasörünüz var ve bu klasöre üç farklı grubun farklı düzeylerde erişmesi gerekiyor:

icacls C:DepartmanMuhasebe /grant "DOMAINMuhasebe-Okuma:(OI)(CI)R"
icacls C:DepartmanMuhasebe /grant "DOMAINMuhasebe-Yazma:(OI)(CI)M"
icacls C:DepartmanMuhasebe /grant "DOMAINMuhasebe-Yoneticiler:(OI)(CI)F"

Eğer mevcut izinleri değiştirmek istiyorsanız (eklemek değil, var olanın üzerine yazmak), /grant:r kullanın:

icacls C:ProjeKlasoru /grant:r "mehmet.yilmaz:(OI)(CI)R"

Bu komut, mehmet.yilmaz için daha önce verilmiş tüm izinleri kaldırıp sadece okuma iznini atar.

İzin Kaldırma

İzin kaldırmak için /deny veya /remove kullanılır. Bu ikisi arasında önemli bir fark var:

  • /deny: Kullanıcıya açıkça erişimi reddeder, ACL listesinde “Deny” girişi oluşturur
  • /remove: Kullanıcının ACL girdisini tamamen siler
icacls C:GizliDosya.txt /deny "DOMAINali.veli:(R)"

Bu komut, ali.veli‘nin okuma iznini açıkça reddeder. Dikkat edin, Deny girişleri her zaman Allow girişlerinden önce uygulanır. Yani kullanıcı bir gruptan R izni alıyor olsa bile, doğrudan Deny’ı varsa okuyamaz.

Tamamen kaldırmak için:

icacls C:GizliDosya.txt /remove "DOMAINali.veli"

Sadece Deny girdilerini kaldırmak istiyorsanız:

icacls C:GizliDosya.txt /remove:d "DOMAINali.veli"

Sadece Allow girdilerini kaldırmak için:

icacls C:GizliDosya.txt /remove:g "DOMAINali.veli"

Sahipliği Değiştirme

Bir dosyanın veya klasörün sahibini değiştirmek için /setowner parametresini kullanıyoruz:

icacls C:ProjeKlasoru /setowner "DOMAINAdministrators" /t /c
  • /t: Alt dizin ve dosyalara da uygula (traverse)
  • /c: Hataları atla ve devam et (continue on error)

Gerçek hayatta bu komutu çok işe yarar buluyorum. Özellikle bir kullanıcı hesabı silindiğinde “orphan” kalan sahipsiz dosyalar sorun çıkarır. Bu komutla sahipliği hızlıca yeniden atayabilirsiniz.

Miras Ayarları

Miras yönetimi, icacls‘ın en güçlü özelliklerinden biri. Bir klasörde miras almayı kapatmak veya açmak için /inheritance parametresini kullanıyoruz:

icacls C:KritikKlasor /inheritance:d
  • /inheritance:e: Miras almayı etkinleştir (enable)
  • /inheritance:d: Miras almayı devre dışı bırak ama mevcut izinleri koru
  • /inheritance:r: Miras almayı devre dışı bırak ve miras alınan izinleri sil (remove)

Örneğin kritik bir klasörü izole etmek istiyorsunuz. Önce mirası kapatıp sonra sıfırdan izin atayabilirsiniz:

icacls C:KritikKlasor /inheritance:r
icacls C:KritikKlasor /grant "DOMAINKritikErisim:(OI)(CI)F"
icacls C:KritikKlasor /grant "BUILTINAdministrators:(OI)(CI)F"

ACL Kaydetme ve Geri Yükleme

Bu özellik gerçekten çok kullanışlı. Bir klasörün izin yapısını dosyaya kaydedip sonra geri yükleyebiliyorsunuz. Sistem değişiklikleri yapmadan önce mutlaka ACL yedeği alın:

icacls C:OnemliKlasor /save acl_yedek.txt /t

Bu komut, C:OnemliKlasor ve tüm alt öğelerin ACL’lerini acl_yedek.txt dosyasına kaydeder. Geri yüklemek için:

icacls C: /restore acl_yedek.txt

Dikkat edin, restore komutunu klasörün üst dizininde çalıştırmanız gerekiyor. Yani C:OnemliKlasor‘u kaydettiyseniz, geri yüklemeyi C: üzerinden yapıyorsunuz.

Bu özelliği şöyle bir senaryoda sık kullanıyorum: Sunucu göçü veya büyük güvenlik değişikliği öncesinde tüm kritik klasörlerin ACL’lerini bir script ile yedekliyorum. Sorun çıkarsa tek komutla geri dönebiliyorum.

Gerçek Dünya Senaryosu: Toplu İzin Yönetimi

Diyelim ki 50 kullanıcılık bir şirkette çalışıyorsunuz ve IT departmanı bir klasör yapısı kurguladı. Her departmanın kendi klasörü var ve belirli erişim kuralları uygulanması gerekiyor. Bunu GUI ile yapmak yerine bir batch script yazalım:

@echo off
setlocal

set BASE=C:Sirket

:: Klasörleri oluştur
mkdir %BASE%Muhasebe
mkdir %BASE%Insan-Kaynaklari
mkdir %BASE%BilgiTeknolojileri
mkdir %BASE%Genel

:: Her klasör için önce mirası kapat
icacls %BASE%Muhasebe /inheritance:r /c
icacls %BASE%Insan-Kaynaklari /inheritance:r /c
icacls %BASE%BilgiTeknolojileri /inheritance:r /c
icacls %BASE%Genel /inheritance:r /c

:: Yöneticilere her yere tam erişim
icacls %BASE% /grant "BUILTINAdministrators:(OI)(CI)F" /t /c

:: Muhasebe klasörü izinleri
icacls %BASE%Muhasebe /grant "DOMAINGRP_Muhasebe:(OI)(CI)M" /c
icacls %BASE%Muhasebe /grant "DOMAINGRP_Muhasebe_Mudur:(OI)(CI)F" /c

:: İnsan Kaynakları - HR verisi hassas!
icacls %BASE%Insan-Kaynaklari /grant "DOMAINGRP_IK:(OI)(CI)M" /c
icacls %BASE%Insan-Kaynaklari /grant "DOMAINGRP_IK_Yonetici:(OI)(CI)F" /c

:: BT klasörü
icacls %BASE%BilgiTeknolojileri /grant "DOMAINGRP_BT:(OI)(CI)F" /c

:: Genel klasör - tüm çalışanlar okuyabilir
icacls %BASE%Genel /grant "DOMAINDomain Users:(OI)(CI)R" /c

echo Izin yapilandirmasi tamamlandi.
endlocal

Bu script, tekrar çalıştırılabilir ve idempotent bir yapıda. Yeni klasörler eklemek de kolay.

Hata Ayıklama: Kimin Erişimi Var?

Bir kullanıcının belirli bir dosyaya neden erişemediğini veya neden erişebildiğini anlamak için icacls‘ı güzel kullanabilirsiniz. Önce mevcut izin yapısını tam olarak görün:

icacls C:GizliRapor.xlsx

Eğer birden fazla dosya veya klasörün izinlerini kontrol etmek istiyorsanız ve çıktıyı kaydetmek istiyorsanız:

icacls C:Muhasebe* /t > muhasebe_izinleri.txt

Bu şekilde tüm Muhasebe klasörü içeriğinin izin raporunu bir dosyaya aktarabilirsiniz. Güvenlik denetimleri için bunu çok kullanıyorum.

cacls ile Eski Script Desteği

Eski sistemlerde veya eski scriptlerde cacls görebilirsiniz. Temel kullanımı şöyle:

cacls C:EskiKlasor /e /g "DOMAINkullanici:R"
  • /e: ACL’yi değiştir, silme (edit)
  • /g: İzin ver (grant)
  • /r: İzinleri kaldır
  • /p: İzinleri değiştir (replace)
  • /d: Erişimi reddet
  • /t: Alt dizinlere de uygula

Dikkat: cacls izin seviyelerini farklı notasyonla alıyor: R (Read), W (Write), C (Change yani Modify), F (Full Control).

Eski bir scripti icacls‘a geçirirken dikkat etmeniz gereken temel fark, miras kurallarının farklı işlenmesi. cacls‘ta alt dizinlere uygulama için /t yeterliydi ama miras kontrolü çok kısıtlıydı.

Özel Senaryo: Paylaşımlı Klasör Güvenliği

Şimdi biraz daha ileri seviye bir senaryo. Bir departman paylaşımlı klasörünüz var ve şunları sağlamanız gerekiyor:

  • Kullanıcılar kendi oluşturdukları dosyaları silebilir ama başkalarınınkileri silemez
  • Yöneticiler her şeyi yapabilir
  • Bir “arşiv” alt klasörüne ise sadece yöneticiler yazabilir
@echo off
:: Ana paylaşım klasörü
set KLASOR=C:PaylasimDepartman

:: Mirası kapat
icacls %KLASOR% /inheritance:r

:: Yöneticiler tam kontrol
icacls %KLASOR% /grant "BUILTINAdministrators:(OI)(CI)F"

:: Kullanıcılar: klasörleri listele, dosya oluştur, kendi oluşturdukları dosyayı yönet
:: "Creator Owner" ile kullanıcı kendi dosyasını kontrol eder
icacls %KLASOR% /grant "DOMAINDepartman-Kullanicilari:(OI)(CI)(M)"
icacls %KLASOR% /grant "CREATOR OWNER:(OI)(CI)(IO)F"

:: Arşiv klasörü - sadece okuma
mkdir %KLASOR%Arsiv
icacls %KLASOR%Arsiv /inheritance:r
icacls %KLASOR%Arsiv /grant "BUILTINAdministrators:(OI)(CI)F"
icacls %KLASOR%Arsiv /grant "DOMAINDepartman-Kullanicilari:(OI)(CI)R"

echo Paylasilim klasoru yapilandirmasi tamamlandi.

CREATOR OWNER burada kritik rol oynuyor. Bu özel sistem kimliği sayesinde bir dosyayı oluşturan kullanıcı, o dosya üzerinde Full Control alıyor. Böylece başkasının dosyasına dokunamıyor ama kendi dosyasını silebiliyor.

İzin Doğrulama ve Raporlama

Yapılandırdıktan sonra doğrulama yapmak şart. Büyük ortamlarda şöyle bir doğrulama scripti işe yarıyor:

@echo off
echo ===== IZIN RAPORU =====
echo Tarih: %date% %time%
echo.

set HEDEF=C:Sirket

echo Muhasebe klasoru izinleri:
icacls %HEDEF%Muhasebe
echo.

echo IK klasoru izinleri:
icacls %HEDEF%Insan-Kaynaklari
echo.

echo BT klasoru izinleri:
icacls %HEDEF%BilgiTeknolojileri
echo.

echo Genel klasor izinleri:
icacls %HEDEF%Genel
echo.

echo ===== RAPOR TAMAMLANDI =====

Bu scripti zamanlanmış görev olarak haftalık çalıştırıp çıktısını bir log dosyasına yönlendirirseniz, izin değişikliklerini takip edebilirsiniz.

Sık Yapılan Hatalar

Yıllar içinde gördüğüm en yaygın hataları paylaşayım:

Deny’ı gereksiz kullanmak: Birçok sysadmin bir kullanıcıya erişimi engellemek için Deny ekliyor. Oysa çoğu zaman o kullanıcıya hiç izin vermemek yeterli. Deny, kullanıcı grup üyeliği üzerinden izin alıyorsa gerekli oluyor, yoksa gereksiz karmaşıklık yaratıyor.

Mirası yanlış anlamak: /inheritance:r ile miras kaldırıldığında, daha önce miras alınmış izinler de siliniyor. Bazı yöneticiler miras kaldırdıktan sonra neden Administrators’ın erişimi olmadığını anlayamıyor. Önce /inheritance:d yapıp mevcut izinleri koruyarak mirası kesmek, sonra gereksizleri kaldırmak daha güvenli.

SYSTEM hesabını unutmak: Bir klasörden SYSTEM hesabının Full Control iznini kaldırırsanız, Windows bileşenleri o klasöre erişemez hale gelebilir. Her zaman NT AUTHORITYSYSTEM:(F) iznini koruyun.

Büyük/küçük harf: Kullanıcı ve grup adları büyük/küçük harf duyarsız olsa da, özellikle scriptlerde tutarlı olmak okunabilirliği artırıyor.

PowerShell ile Entegrasyon

icacls çok güçlü ama PowerShell ile birlikte kullanıldığında daha da esnek hale geliyor. Örneğin icacls’ı PowerShell’den çağırabilirsiniz:

$klasorler = @("C:Muhasebe", "C:IK", "C:BT")
foreach ($klasor in $klasorler) {
    Write-Host "Kontrol ediliyor: $klasor"
    & icacls $klasor
    Write-Host "---"
}

Ya da PowerShell’in kendi Get-Acl ve Set-Acl cmdlet’lerini kullanarak icacls‘ın yerini doldurabilirsiniz. Ama icacls hâlâ bazı senaryolarda daha hızlı ve pratik kalıyor, özellikle basit scriptlerde.

Sonuç

icacls, Windows ortamında dosya güvenliği yönetiminin temel taşlarından biri. GUI üzerinden yapabildiğiniz her şeyi komut satırından yapabiliyorsunuz, hem de çok daha hızlı ve scriptlenebilir bir şekilde. Özellikle büyük ortamlarda, sistem değişikliklerinde ve güvenlik denetimlerinde bu araç olmadan iş yapmak gerçekten zor.

Özetlemek gerekirse: icacls kullanın, cacls‘ı sadece eski sistemlerde görmek için tanıyın. Büyük değişikliklerden önce mutlaka /save ile ACL yedeği alın. Deny kullanırken iki kez düşünün, çoğu zaman gereksiz. SYSTEM ve Administrators izinlerini asla silmeyin. Ve her şeyi scriptleyin, çünkü altı ay sonra ne yaptığınızı GUI’den anlayamazsınız ama script konuşur.

Windows izin yönetimi karmaşık görünse de, icacls‘ı sindirdiğinizde elinizdeki kontrolün ne kadar güçlü olduğunu anlıyorsunuz. Denemekten çekinmeyin ama test ortamında başlayın, üretim sunucusunda direkt denemek için biraz cesaret lazım.

Yorum yapın