Active Directory Kullanımı: OU, Kullanıcı ve Grup Yönetimi

Active Directory Kullanımı: OU, Kullanıcı ve Grup Yönetimi

İçindekiler

Bir önceki yazıda kurumsal bir Active Directory yapısını sıfırdan kurmuştuk. O yazının sonunda yapı boştu: iki Domain Controller, bir CA ve hogwarts.local domain’i vardı; ama içinde ne bir kullanıcı, ne bir grup, ne de düzenli bir klasör yapısı bulunuyordu. Bu yazıda işte o boş kabuğu gerçek bir okula dönüştüreceğiz.

Kurulu hogwarts.local ortamında OU (Organizational Unit), kullanıcı ve grup yönetimini uygulamalı olarak ele alacağız. Önce bu üç kavramın ne işe yaradığını ve neden önemli olduğunu anlatacak, sonra Hogwarts okulunu (öğrenciler, öğretmenler, görevliler ve dersler) tek bir PowerShell script’iyle baştan sona kuracağız. Son olarak da bu yapının asıl değerini gösteren iki konuya değineceğiz: AD gruplarının firewall ile entegrasyonu ve GPO uygulama stratejisi.

OU (Organizational Unit) Nedir, Ne İşe Yarar?

Organizational Unit (OU), Active Directory içinde kullanıcıları, bilgisayarları ve grupları mantıksal olarak gruplayan bir kapsayıcıdır (container). Dosya sistemindeki klasörlere benzetebilirsiniz: nasıl dosyaları klasörlere ayırıp düzen kuruyorsanız, AD nesnelerini de OU’lara ayırırsınız.

Ancak OU, “sadece düzen için bir klasör” değildir. AD’de OU’ların iki kritik işlevi vardır ve asıl önemi buradan gelir:

  1. GPO (Group Policy Object) bağlama noktasıdır. Grup politikaları kullanıcılara veya bilgisayarlara doğrudan atanmaz; bir site, domain veya OU‘ya bağlanır (link edilir). Yani “tüm öğrencilerin masaüstünü kilitle” demek istiyorsanız, önce öğrencilerin bir OU’da toplanması gerekir. OU yoksa, hedefli GPO da yoktur.
  2. Yetki devrinin (delegation) sınırıdır. Bir OU’nun yönetimini, Domain Admin yetkisi vermeden başka birine devredebilirsiniz. Örneğin “Gryffindor OU’sundaki öğrencilerin parolasını sıfırlama” yetkisini bina sorumlusuna verirsiniz; o kişi domain’in geri kalanına dokunamaz.

Önemli ayrım — OU ≠ Grup: Bu ikisi sık karıştırılır.

  • OU, nesnelerin nerede durduğunu belirler (yönetim ve politika içindir). Bir kullanıcı yalnızca tek bir OU‘da bulunabilir.
  • Grup, nesnelere neye erişebileceğini verir (izin/yetki içindir). Bir kullanıcı aynı anda onlarca grupta olabilir.

Kuralı şöyle hatırlayın: GPO için OU, izin için grup. Bir paylaşıma erişim vermek istiyorsanız OU’yu değil, grubu kullanırsınız.

Neden varsayılan “Users” kapsayıcısını kullanmıyoruz?

Yeni kullanıcılar varsayılan olarak CN=Users kapsayıcısına düşer. Ama buraya GPO bağlanamaz ve yapısı düzdür. Bu yüzden kurumsal pratikte her zaman kendi OU hiyerarşinizi kurar ve nesneleri oraya taşırsınız. Bizim örneğimizde her şey OU=Hogwarts altında, anlamlı alt OU’lara ayrılacak.

Grup (Group) Nedir, Ne İşe Yarar?

Grup, kullanıcıları (veya bilgisayarları) bir araya toplayıp onlara toplu olarak izin/yetki vermenizi sağlayan nesnedir. Mantığı basittir: izinleri tek tek 16 öğrenciye vermek yerine, izni bir gruba verir, öğrencileri o gruba üye yaparsınız. Bir öğrenci ayrıldığında tek yapmanız gereken onu gruptan çıkarmaktır — hiçbir paylaşımın iznine dokunmazsınız.

AD’de gruplar iki eksende sınıflandırılır:

1) Grup tipi (Category):

Tip Ne işe yarar
Security (Güvenlik) İzin ve yetki verir; bir kaynağın ACL’ine (erişim listesi) eklenebilir. Asıl kullandığımız budur.
Distribution (Dağıtım) Yalnızca e-posta dağıtım listesidir (Exchange); izin veremez.

2) Grup kapsamı (Scope): Grubun nereden üye alabileceğini ve nerede izin verebileceğini belirler.

Kapsam Üye alır İzin verebileceği yer Tipik kullanım
Global (GG) Yalnızca kendi domain’inden Forest’taki her yerde Rolleri gruplamak (Öğrenciler, Öğretmenler)
Domain Local (DL) Her domain’den Yalnızca kendi domain’inde Bir kaynağa erişim vermek (paylaşım, yazıcı)
Universal (UG) Her domain’den Forest’taki her yerde Çok domain’li forest’larda köprü

AGDLP: gruplama stratejisinin altın kuralı

Microsoft’un önerdiği klasik strateji AGDLP‘dir: Accounts → Global → Domain Local → Permissions. Yani:

  1. Hesapları (A) rol bazlı bir Global gruba (G) koyarsınız — örn. GG-Teachers.
  2. Kaynağa erişimi bir Domain Local gruba (DL) atarsınız — örn. DL-Share-OgretmenOdasi-Modify.
  3. Global grubu, Domain Local grubun üyesi yaparsınız.
  4. İzni (P) doğrudan kaynağın üzerinde yalnızca Domain Local gruba verirsiniz.

Bu katmanlama sayesinde “kim hangi role sahip” (Global) ile “hangi kaynağa erişiliyor” (Domain Local) birbirinden ayrılır; ileride paylaşım veya rol değişse bile zincirin tamamını dağıtmadan tek bir bağlantıyı düzenlersiniz. Bu yazıdaki örnekte sadeleştirmek için rol ve ders gruplarını Global olarak kurup, gerçek kaynak izinlerini AGDLP’ye nasıl bağlayacağınızı son bölümde göstereceğiz.

Üyelik (Member Of): Bir Kullanıcıyı Gruba Bağlamak

Buraya kadar “kullanıcıyı gruba ekleriz” dedik; peki bu üyelik tam olarak nedir? AD’de bir kullanıcı ile bir grup arasındaki bağ, tek bir ilişkidir ama iki yerden görünür:

  • Grubun “Members (Üyeler)” sekmesi → “bu grupta kimler var?”
  • Kullanıcının “Member Of (Üyesi)” sekmesi → “bu kişi hangi gruplarda?”

Bu ikisi aynı madalyonun iki yüzüdür. Hermione’yi GG-House-Gryffindor grubuna eklediğinizde, hem grubun Members listesinde Hermione belirir, hem de Hermione’nin Member Of listesinde grup belirir. Active Directory bunu tek bir bağlantı (member / memberOf öznitelik çifti) olarak tutar; siz hangi sekmeden eklerseniz ekleyin sonuç aynıdır.

Grafik arayüzde (ADUC): İki yöntem de geçerlidir —

  1. Kullanıcıya çift tıkla → Member Of sekmesi → Add… → grubu seç. (Bir kişiyi birkaç gruba eklerken pratiktir.)
  2. Gruba çift tıkla → Members sekmesi → Add… → kullanıcıyı seç. (Bir gruba toplu üye eklerken pratiktir.)

PowerShell’de de iki yön vardır; script’imiz boyunca kullandığımız budur:

# Grup tarafından bakış: "bu gruba şu üyeleri ekle"
Add-ADGroupMember -Identity "GG-House-Gryffindor" -Members hpotter, rweasley, hgranger

# Kullanıcı tarafından bakış: "bu kullanıcıyı şu gruplara ekle"
Add-ADPrincipalGroupMembership -Identity hpotter -MemberOf "GG-House-Gryffindor","GG-Students-All"

# Kontrol: Harry hangi gruplarda? (Member Of)
Get-ADPrincipalGroupMembership hpotter | Select-Object Name

Neden bu kadar önemli? Çünkü AD’de izin, GPO hedeflemesi ve firewall kuralı dahil neredeyse her şey “üyelik” üzerinden çalışır. Bir kullanıcının neye erişebileceğini OU’su değil, üye olduğu gruplar (memberOf) belirler. Oturum açtığında bu üyelikler kullanıcının erişim jetonuna (access token) yazılır; sistem “bu kişi bu kaynağa girebilir mi?” sorusunu jetondaki gruplara bakarak yanıtlar. İşte bu yüzden “4 binayı birbirinden ayırmak” gibi bir kuralı, herkesi kendi GG-House-* grubuna üye yaparak kuruyoruz.

İç içe gruplar (nesting): Bir grup, başka bir grubun da üyesi olabilir. Örneğin GG-House-Gryffindor‘ı GG-Students-All‘ın üyesi yaparsanız, Gryffindor öğrencileri otomatik olarak “tüm öğrenciler"den de sayılır. AGDLP zincirinde “Global grubu Domain Local grubun üyesi yapmak” tam olarak budur. Bir kullanıcının iç içe gelen tüm üyeliklerini (sadece doğrudan olanları değil) görmek için: Get-ADUser hpotter -Properties memberOf doğrudan üyelikleri, jetona giren etkin (transitive) üyelikler içinse whoami /groups (kullanıcının makinesinde) kullanılır.

Tasarladığımız Yapı

Script’i çalıştırmadan önce ne kuracağımızı görelim. Aşağıdaki ağaç, hogwarts.local içinde oluşturulacak tüm OU ve grupları gösteriyor:

hogwarts.local                              (Domain)
└─ OU=Hogwarts                              (kök OU — her şey burada)
   ├─ OU=Houses                             (öğrenci binaları)
   │  ├─ OU=Gryffindor   →  4 öğrenci
   │  ├─ OU=Slytherin    →  4 öğrenci
   │  ├─ OU=Hufflepuff   →  4 öğrenci
   │  └─ OU=Ravenclaw    →  4 öğrenci
   ├─ OU=Teachers        →  10 öğretmen
   ├─ OU=Staff           →  görevliler (kapıcı, hemşire, kütüphaneci)
   └─ OU=Groups                             (güvenlik grupları)
      ├─ GG-Students-All                    (tüm öğrenciler)
      ├─ GG-Teachers                        (tüm öğretmenler)
      ├─ GG-Staff                           (tüm görevliler)
      ├─ GG-House-<Bina>                    (her bina için bir grup — izolasyon)
      │  ├─ GG-House-Gryffindor
      │  ├─ GG-House-Slytherin
      │  ├─ GG-House-Hufflepuff
      │  └─ GG-House-Ravenclaw
      └─ GG-Course-<Ders>                   (her ders için bir grup)
         ├─ GG-Course-Transfiguration               (Biçim Değiştirme)
         ├─ GG-Course-Potions                       (İksir)
         ├─ GG-Course-Defence-Against-the-Dark-Arts (Kara Sanatlara Karşı Savunma)
         ├─ GG-Course-Charms                        (Tılsım)
         ├─ GG-Course-Herbology                     (Bitkibilim)
         ├─ GG-Course-Care-of-Magical-Creatures     (Sihirli Yaratıkların Bakımı)
         ├─ GG-Course-Divination                    (Kehanet)
         └─ GG-Course-Flying                        (Süpürge Uçuşu)

Mantığı: Kişiler (öğrenci/öğretmen/görevli) OU’larda durur — çünkü onlara GPO uygulayacağız. Roller ve dersler ise gruplarda tutulur — çünkü onlarla izin/yetki vereceğiz. Bir öğretmen, hem GG-Teachers (rol) hem de verdiği dersin grubuna (örn. GG-Course-Potions) üye olur.

“Aynı bina için hem OU=Ravenclaw hem GG-House-Ravenclaw açmak sorun mu?” Hayır — aksine doğru tasarım budur. OU ile grup farklı amaçlara hizmet eden farklı nesnelerdir:

  • OU=Ravenclaw → öğrencilerin nerede durduğunu belirler; GPO bağlama ve yetki devri içindir.
  • GG-House-Ravenclaw → öğrencilerin neye erişebileceğini belirler; izin, GPO filtreleme ve firewall içindir.

İkisi birbirinin yerine geçmez, birbirini tamamlar. İsim çakışması da olmaz: adlar zaten farklı (Ravenclaw OU’su ↔ GG-House-Ravenclaw grubu) ve OU ile grup ayrı nesne sınıfları olduğu için aynı adı taşısalar bile teknik bir sorun çıkmazdı. Bu yüzden dört binanın her biri için ayrı bir GG-House-* grubu açmak tamamen normaldir; hepsi OU=Groups altında, kişilerden ayrı bir yerde durur.

Öğretmenlerin ders eşlemesi şöyle (bir öğretmen birden fazla derse, bir ders birden fazla öğretmene bağlanabilir):

Öğretmen Ders(ler) Grup
Albus Dumbledore Okul Müdürü (eski Biçim Değiştirme) yalnızca GG-Teachers
Minerva McGonagall Biçim Değiştirme GG-Course-Transfiguration
Severus Snape İksir + Kara Sanatlara Karşı Savunma GG-Course-Potions, GG-Course-Defence-Against-the-Dark-Arts
Horace Slughorn İksir GG-Course-Potions
Remus Lupin Kara Sanatlara Karşı Savunma GG-Course-Defence-Against-the-Dark-Arts
Filius Flitwick Tılsım GG-Course-Charms
Pomona Sprout Bitkibilim GG-Course-Herbology
Rubeus Hagrid Sihirli Yaratıkların Bakımı GG-Course-Care-of-Magical-Creatures
Sybill Trelawney Kehanet GG-Course-Divination
Rolanda Hooch Süpürge Uçuşu / Quidditch GG-Course-Flying

Dikkat: GG-Course-Potions (Snape + Slughorn) ve GG-Course-Defence-Against-the-Dark-Arts (Snape + Lupin) ikişer üyeli olur — gerçek hayatta da bir derse birden çok öğretmen girebilir; grup modeli bunu doğal olarak destekler.

Örnek: Hogwarts Okulunu AD’ye Kurmak (PowerShell)

Aşağıdaki tek script, yukarıdaki ağacın tamamını kurar: OU iskeletini, rol ve ders gruplarını, 16 öğrenciyi, 10 öğretmeni ve görevlileri oluşturur; herkesi doğru gruplara üye yapar; en sonunda da kurduğu yapıyı bir ağaç (tree) olarak ekrana yazdırır. Bir Domain Controller üzerinde Domain Admin yetkisiyle çalıştırın.

⚠️ Önemli — adlandırmada Türkçe karakter ve boşluk kullanmayın: AD nesnelerinin oturum açma ve ad alanları (SamAccountName, UserPrincipalName, grup adı ve bilgisayar adı) yalnızca ASCII olmalı; Türkçe karakter (ç, ş, ı, İ, ğ, ü, ö) ve boşluk içermemelidir. Aksi halde:

  • Oturum açma / UPN / e-posta kırılır — özellikle i/Iı/İ büyük-küçük harf dönüşümü her sistemde (Linux, Java, mobil, firewall) aynı çalışmaz; kullanıcı parolası doğru olsa bile giremez.
  • Kerberos, DNS ve LDAP sorguları bozulur (DNS yalnızca ASCII’dir; ö, ş içeren bir makine adı çözümlenmez).
  • PowerShell filtreleri, firewall (User-ID/FSSO) ve üçüncü taraf entegrasyonları kullanıcıyı/grubu eşleştiremez.

Bu yüzden script’te tüm AD değerlerini ASCII tutuyoruz: kullanıcı adları hpotter biçiminde üretiliyor, grup adlarında boşluk yerine tire kullanılıyor (GG-Course-Potions), unvanlar bile Ogrenci / Ogretmen / Kutuphaneci gibi sadeleştiriliyor. Aynı kural bilgisayar adlarında da geçerlidir: OGRETMEN-PC01 olur, Öğretmen-PC 01 olmaz. Yalnızca prosa/yorum satırları Türkçe kalabilir; AD’ye yazılan hiçbir değer Türkçe karakter veya boşluk taşımamalıdır.

# ===========================================================
#  Hogwarts AD Lab — OU, kullanıcı ve grup yönetimi
#  Domain : hogwarts.local
#  Önkoşul: Bir Domain Controller üzerinde, Domain Admin
#           yetkisiyle ve ActiveDirectory modülüyle çalıştırın.
# ===========================================================

Import-Module ActiveDirectory

$DomainDN   = "DC=hogwarts,DC=local"
$BaseOUName = "Hogwarts"
$BaseOUPath = "OU=$BaseOUName,$DomainDN"
$DefaultPwd = ConvertTo-SecureString "Hogwarts2026!" -AsPlainText -Force

# Ad-soyaddan SamAccountName üretir (ör. "Harry Potter" -> "hpotter")
function New-Sam([string]$FullName) {
    $parts = $FullName.Split(" ")
    return ($parts[0].Substring(0,1) + $parts[-1]).ToLower()
}

# -----------------------------------------------------------
# 1) OU iskeleti
# -----------------------------------------------------------
New-ADOrganizationalUnit -Name $BaseOUName -Path $DomainDN `
  -ProtectedFromAccidentalDeletion $false -ErrorAction SilentlyContinue

foreach ($ou in "Houses","Teachers","Staff","Groups") {
    New-ADOrganizationalUnit -Name $ou -Path $BaseOUPath `
      -ProtectedFromAccidentalDeletion $false -ErrorAction SilentlyContinue
}

$HousesOUPath   = "OU=Houses,$BaseOUPath"
$TeachersOUPath = "OU=Teachers,$BaseOUPath"
$StaffOUPath    = "OU=Staff,$BaseOUPath"
$GroupsOUPath   = "OU=Groups,$BaseOUPath"

# -----------------------------------------------------------
# 2) Roller ve dersler için Global Güvenlik Grupları
# -----------------------------------------------------------
foreach ($g in "GG-Students-All","GG-Teachers","GG-Staff") {
    New-ADGroup -Name $g -GroupScope Global -GroupCategory Security `
      -Path $GroupsOUPath -Description "Rol grubu: $g" -ErrorAction SilentlyContinue
}

$Courses = "Transfiguration","Potions","Defence-Against-the-Dark-Arts","Charms",
           "Herbology","Care-of-Magical-Creatures","Divination","Flying"
foreach ($c in $Courses) {
    New-ADGroup -Name "GG-Course-$c" -GroupScope Global -GroupCategory Security `
      -Path $GroupsOUPath -Description "Ders grubu: $c" -ErrorAction SilentlyContinue
}

# Her bina için ayrı bir grup — binaları birbirinden izole etmekte kullanacağız
foreach ($h in "Gryffindor","Slytherin","Hufflepuff","Ravenclaw") {
    New-ADGroup -Name "GG-House-$h" -GroupScope Global -GroupCategory Security `
      -Path $GroupsOUPath -Description "Bina grubu: $h" -ErrorAction SilentlyContinue
}

# -----------------------------------------------------------
# 3) Binalar (house = OU) ve her birine 4 öğrenci
# -----------------------------------------------------------
$Houses = @{
    "Gryffindor" = @("Harry Potter","Ron Weasley","Hermione Granger","Neville Longbottom")
    "Slytherin"  = @("Draco Malfoy","Pansy Parkinson","Vincent Crabbe","Gregory Goyle")
    "Hufflepuff" = @("Cedric Diggory","Hannah Abbott","Susan Bones","Justin Finch")
    "Ravenclaw"  = @("Luna Lovegood","Cho Chang","Padma Patil","Terry Boot")
}

foreach ($house in $Houses.Keys) {
    $houseOUPath = "OU=$house,$HousesOUPath"
    New-ADOrganizationalUnit -Name $house -Path $HousesOUPath `
      -ProtectedFromAccidentalDeletion $false -ErrorAction SilentlyContinue

    foreach ($student in $Houses[$house]) {
        $first = $student.Split(" ")[0]
        $last  = $student.Split(" ")[-1]
        $sam   = New-Sam $student

        New-ADUser -Name $student -GivenName $first -Surname $last `
          -SamAccountName $sam -UserPrincipalName "$sam@hogwarts.local" `
          -Path $houseOUPath -AccountPassword $DefaultPwd `
          -Department $house -Title "Ogrenci" -Enabled $true `
          -ChangePasswordAtLogon $true -ErrorAction SilentlyContinue

        # Her öğrenci hem "tüm öğrenciler" rol grubuna hem de KENDİ binasının grubuna üye olur.
        # İşte bu üyelik (Member Of), aşağıdaki bina izolasyonunun temelidir.
        Add-ADGroupMember -Identity "GG-Students-All" -Members $sam -ErrorAction SilentlyContinue
        Add-ADGroupMember -Identity "GG-House-$house" -Members $sam -ErrorAction SilentlyContinue
    }
}

# -----------------------------------------------------------
# 4) Öğretmenler — rol grubuna + verdikleri ders gruplarına eklenir
#    (bir öğretmen birden fazla ders verebilir -> dizi)
# -----------------------------------------------------------
$Teachers = @{
    "Albus Dumbledore"   = @()                                          # Mudur (eski Bicim Degistirme)
    "Minerva McGonagall" = @("Transfiguration")                         # Bicim Degistirme
    "Severus Snape"      = @("Potions","Defence-Against-the-Dark-Arts") # Iksir + KSKS
    "Filius Flitwick"    = @("Charms")                                  # Tilsim
    "Pomona Sprout"      = @("Herbology")                               # Bitkibilim
    "Rubeus Hagrid"      = @("Care-of-Magical-Creatures")               # Sihirli Yaratiklarin Bakimi
    "Horace Slughorn"    = @("Potions")                                 # Iksir
    "Sybill Trelawney"   = @("Divination")                             # Kehanet
    "Rolanda Hooch"      = @("Flying")                                  # Supurge Ucusu / Quidditch
    "Remus Lupin"        = @("Defence-Against-the-Dark-Arts")           # KSKS
}

foreach ($teacher in $Teachers.Keys) {
    $first = $teacher.Split(" ")[0]
    $last  = $teacher.Split(" ")[-1]
    $sam   = New-Sam $teacher

    New-ADUser -Name $teacher -GivenName $first -Surname $last `
      -SamAccountName $sam -UserPrincipalName "$sam@hogwarts.local" `
      -Path $TeachersOUPath -AccountPassword $DefaultPwd `
      -Title "Ogretmen" -Enabled $true `
      -ChangePasswordAtLogon $true -ErrorAction SilentlyContinue

    Add-ADGroupMember -Identity "GG-Teachers" -Members $sam -ErrorAction SilentlyContinue

    # Verdiği her ders için ilgili ders grubuna ekle
    foreach ($course in $Teachers[$teacher]) {
        Add-ADGroupMember -Identity "GG-Course-$course" -Members $sam -ErrorAction SilentlyContinue
    }
}

# -----------------------------------------------------------
# 5) Görevliler / çalışanlar (Staff)
# -----------------------------------------------------------
$Staff = @{
    "Argus Filch"   = "Kapici"
    "Poppy Pomfrey" = "Hemsire"
    "Irma Pince"    = "Kutuphaneci"
}

foreach ($person in $Staff.Keys) {
    $first = $person.Split(" ")[0]
    $last  = $person.Split(" ")[-1]
    $sam   = New-Sam $person

    New-ADUser -Name $person -GivenName $first -Surname $last `
      -SamAccountName $sam -UserPrincipalName "$sam@hogwarts.local" `
      -Path $StaffOUPath -AccountPassword $DefaultPwd `
      -Title $Staff[$person] -Enabled $true `
      -ChangePasswordAtLogon $true -ErrorAction SilentlyContinue

    Add-ADGroupMember -Identity "GG-Staff" -Members $sam -ErrorAction SilentlyContinue
}

# -----------------------------------------------------------
# 6) Sonuç: kurulan yapıyı ağaç (tree) olarak yazdır
# -----------------------------------------------------------
function Show-OUTree {
    param([string]$Path, [int]$Depth = 0)
    $indent = "│  " * $Depth
    Get-ADOrganizationalUnit -SearchBase $Path -SearchScope OneLevel -Filter * |
      Sort-Object Name | ForEach-Object {
        Write-Host ("$indent├─ [OU] $($_.Name)") -ForegroundColor Yellow
        # Bu OU'nun altındaki kullanıcılar
        Get-ADUser -SearchBase $_.DistinguishedName -SearchScope OneLevel -Filter * |
          Sort-Object Name | ForEach-Object {
            Write-Host ("$indent│   └─ $($_.Name)  ($($_.SamAccountName))")
        }
        # Alt OU'lar (özyineleme)
        Show-OUTree -Path $_.DistinguishedName -Depth ($Depth + 1)
    }
}

Write-Host "`nHogwarts OU ağacı:" -ForegroundColor Cyan
Write-Host "OU=Hogwarts" -ForegroundColor Cyan
Show-OUTree -Path $BaseOUPath -Depth 1

Write-Host "`nGruplar:" -ForegroundColor Cyan
Get-ADGroup -SearchBase $GroupsOUPath -Filter * |
  Sort-Object Name | ForEach-Object {
    $count = (Get-ADGroupMember -Identity $_).Count
    Write-Host ("├─ $($_.Name)  ($count üye)")
}

Write-Host "`nTamamlandı." -ForegroundColor Green

Doğrulama: Script’in sonundaki ağaç çıktısının yanı sıra, yapıyı şu komutlarla da denetleyebilirsiniz:

# Tüm OU'lar
Get-ADOrganizationalUnit -Filter * -SearchBase "OU=Hogwarts,DC=hogwarts,DC=local" |
  Select-Object Name, DistinguishedName

# Bir grubun üyeleri (ör. iksir dersi)
Get-ADGroupMember -Identity "GG-Course-Potions" | Select-Object Name, SamAccountName

# Bir kullanıcının üye olduğu tüm gruplar
Get-ADPrincipalGroupMembership -Identity "ssnape" | Select-Object Name

AD Grupları ve Firewall Entegrasyonu

Buraya kadar kurduğumuz gruplar yalnızca dosya/yazıcı izinleri için değildir; modern ağlarda firewall politikaları da AD gruplarıyla yazılabilir. Buna kimlik tabanlı (identity-based) güvenlik duvarı denir ve mantığı şudur: kuralı bir IP adresine değil, “kim olduğuna” göre yazarsınız.

Geleneksel firewall kuralı 192.168.10.0/24 → İnternet: izin ver der. Ama DHCP yüzünden IP’ler değişir, bir öğrenci başka bir makineye otururdu. Kimlik tabanlı firewall ise kuralı şöyle yazmanıza izin verir:

  • GG-Students-All → öğretmenler odası sunucusuna ve sınav sistemine erişemez.
  • GG-Teachers → not sistemine ve yazıcılara erişebilir.
  • GG-Staff → yalnızca yönetim VLAN’ına erişebilir.

Firewall, AD grup üyeliğini nasıl öğrenir?

Next-generation firewall’lar (NGFW) kullanıcının hangi IP’den oturum açtığını ve hangi AD gruplarında olduğunu bir ajan/konnektör aracılığıyla öğrenir:

Üretici Teknoloji Nasıl çalışır
Palo Alto User-ID DC’lerin Security loglarından (4624 oturum açma) IP↔kullanıcı eşleşmesini okur, LDAP ile grup üyeliğini çeker.
Fortinet FSSO (Fortinet Single Sign-On) DC’ye kurulan ajan veya pollig ile oturum açma olaylarını izler.
Microsoft Windows Firewall + IPsec Kuralın “Authorized users/computers” sekmesinde doğrudan AD gruplarını seçebilirsiniz (Kerberos kimliğiyle).

Yani GG-Course-Potions benzeri bir grup oluşturduğunuzda, bunu sadece bir paylaşıma değil, “iksir laboratuvarı sunucusuna yalnızca bu grup erişsin” gibi bir firewall kuralına da bağlayabilirsiniz. Grubu tek bir yerde yönetir, hem dosya izni hem ağ erişimi otomatik güncellenir.

Çıkarım: İyi tasarlanmış bir grup yapısı yalnızca AD’nin değil, tüm ağ güvenliğinin temelini oluşturur. Bu yüzden grupları baştan rol bazlı (öğrenci/öğretmen/görevli/ders) kurmak, ileride firewall ve diğer entegrasyonlar için sağlam bir zemin sağlar.

GPO Uygulama Stratejisi (OU ve Gruplar Üzerinden)

Bu yapının asıl getirisi Group Policy (GPO) ile ortaya çıkar. GPO; masaüstü kısıtlamaları, parola politikaları, yazılım dağıtımı, sürücü bağlama gibi ayarları merkezî olarak uygular. Stratejinin özü, az önce çizdiğimiz OU ve grup yapısını doğru kullanmaktır.

1) GPO, OU’ya bağlanır (kullanıcıya/gruba değil)

Bir GPO’yu gruba bağlayamazsınız; yalnızca site, domain veya OU‘ya link edilir. Bu yüzden öğrencileri ayrı OU’lara koyduk:

# "Öğrenci Kısıtlamaları" GPO'sunu tüm bina OU'larına bağla
$gpo = New-GPO -Name "Ogrenci-Kisitlamalari"
foreach ($house in "Gryffindor","Slytherin","Hufflepuff","Ravenclaw") {
    New-GPLink -Name $gpo.DisplayName `
      -Target "OU=$house,OU=Houses,OU=Hogwarts,DC=hogwarts,DC=local"
}

İpucu — kalıtım (inheritance): GPO’lar üst OU’dan alt OU’lara miras alınır. “Öğrenci Kısıtlamaları"nı OU=Houses‘a tek seferde bağlarsanız, altındaki dört binaya otomatik uygulanır; her binaya ayrı ayrı bağlamak zorunda kalmazsınız.

2) Grupla hedefleme: Security Filtering

Peki bir GPO’yu OU içindeki belirli bir gruba uygulamak isterseniz? Burada Güvenlik Filtreleme (Security Filtering) devreye girer. GPO, varsayılan olarak Authenticated Users‘a uygulanır; bunun yerine yalnızca bir gruba uygulanmasını sağlayabilirsiniz. Örneğin “Ders Sunumu Kilidi” GPO’su yalnızca GG-Course-Potions üyelerine uygulansın:

# GPO'yu yalnızca iksir dersi grubuna uygula
Set-GPPermission -Name "Ders-Sunumu-Kilidi" -TargetName "GG-Course-Potions" `
  -TargetType Group -PermissionLevel GpoApply

# Varsayılan "Authenticated Users" uygula iznini kaldır
Set-GPPermission -Name "Ders-Sunumu-Kilidi" -TargetName "Authenticated Users" `
  -TargetType Group -PermissionLevel GpoRead -Replace

⚠️ MS16-072 tuzağı (mutlaka bilin): 2016 sonrası bir güvenlik güncellemesiyle GPO’lar artık bilgisayar kimliğiyle işlenir. Eğer Authenticated Users‘ın Read iznini tamamen kaldırırsanız, GPO hiç uygulanmaz — çünkü bilgisayar hesabı GPO’yu okuyamaz. Çözüm: yukarıdaki gibi Authenticated Users‘a (veya Domain Computers‘a) en az Read izni bırakın, uygulamayı (Apply) ise sadece hedef gruba verin.

3) Bilgisayar bazlı hedefleme: WMI filtreleri ve Loopback

  • WMI filtresi: Bir GPO’yu yalnızca belirli koşuldaki makinelere (örn. “yalnızca Windows 11” veya “yalnızca dizüstüler”) uygulamak için kullanılır.
  • Loopback processing: Bilgisayar laboratuvarı gibi ortak kullanılan makinelerde kritik öneme sahiptir. Normalde kullanıcı ayarları, kullanıcının OU’suna göre gelir; loopback ile “bu makineye kim oturursa otursun, makinenin OU’sundaki kullanıcı ayarları geçerli olsun” dersiniz. Böylece kütüphane bilgisayarına oturan bir öğretmen de öğrenci kısıtlamalarına tabi olur.

4) Senaryo: 4 binayı birbirinden izole etmek

Şimdi en baştaki amaca gelelim: bir binanın öğrencileri, başka binanın sınıfına / bilgisayarlarına girememeli. İşte burada her şey birleşiyor — OU + GG-House-* grubu + üyelik (Member Of) + GPO/izin. Hatırlayın: script çalışırken her öğrenciyi kendi binasının grubuna üye yaptık (Add-ADGroupMember -Identity "GG-House-$house"). O üyelik olmadan aşağıdakilerin hiçbiri çalışmaz.

İzolasyonu kuracağınız iki tipik yol vardır:

a) Bilgisayara oturum açmayı kısıtlamak (GPO ile). Her binanın bilgisayarları kendi OU’sunda (örn. OU=Computers,OU=Gryffindor,...) olsun. Bir GPO’da “Allow log on locally” hakkını yalnızca o binanın grubuna verir, ötekileri “Deny log on locally” ile engellersiniz:

Computer Configuration → Policies → Windows Settings → Security Settings
  → Local Policies → User Rights Assignment
     • Allow log on locally  →  HOGWARTS\GG-House-Gryffindor
     • Deny log on locally   →  HOGWARTS\GG-House-Slytherin,
                                HOGWARTS\GG-House-Hufflepuff,
                                HOGWARTS\GG-House-Ravenclaw

Bu GPO Gryffindor bilgisayarlarının OU’suna bağlanır. Sonuç: bir Slytherin öğrencisi Gryffindor sınıfındaki bir makineye otursa bile oturum açamaz — çünkü kimliğinin (access token) içindeki grup, “Deny” listesinde.

b) Sınıf kaynağına (paylaşım) erişimi kısıtlamak (AGDLP ile). “İksir sınıfı” paylaşımına yalnızca ilgili bina/ders erişsin istiyorsanız, başta anlattığımız AGDLP zinciri tam burada işler:

# 1) Kaynak için bir Domain Local grup oluştur (paylaşımın ACL'ine bunu ekleyeceğiz)
New-ADGroup -Name "DL-Share-GryffindorSinif-Modify" -GroupScope DomainLocal `
  -GroupCategory Security -Path "OU=Groups,OU=Hogwarts,DC=hogwarts,DC=local"

# 2) Bina grubunu (Global), kaynak grubunun (Domain Local) ÜYESİ yap  → A-G-DL
Add-ADGroupMember -Identity "DL-Share-GryffindorSinif-Modify" -Members "GG-House-Gryffindor"

# 3) İzni (P) klasör üzerinde YALNIZCA Domain Local gruba ver
$acl = Get-Acl "D:\Shares\GryffindorSinif"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    "HOGWARTS\DL-Share-GryffindorSinif-Modify", "Modify",
    "ContainerInherit,ObjectInherit", "None", "Allow")
$acl.AddAccessRule($rule); Set-Acl "D:\Shares\GryffindorSinif" $acl

Diğer binalara hiçbir izin vermediğiniz için onlar bu paylaşımı zaten göremez; istisnayı netleştirmek isterseniz tek tek Deny kuralı da ekleyebilirsiniz (ama genelde “izin vermemek” yeterlidir — Deny’ı yalnızca gerçekten gerektiğinde kullanın, çünkü Deny tüm Allow’ları ezer).

Bütün resmi görün: Öğrenci OU=Slytherin‘de durur (GPO oraya iner) → GG-House-Slytherin grubuna üyedir (Member Of) → bu üyelik onun erişim jetonuna yazılır → GPO’daki “Deny log on” ve paylaşımdaki ACL bu jetona bakarak kararı verir. OU yerleşimi, grup üyeliği ve izin üçü birden çalıştığında binalar birbirinden temiz biçimde ayrılır. Tek bir öğrenci bina değiştirdiğinde yapmanız gereken tek şey, onu eski GG-House-* grubundan çıkarıp yenisine eklemek ve OU’sunu taşımaktır.

Önerilen GPO tasarım disiplini

  • Kullanıcı ve bilgisayar GPO’larını ayırın (örn. U-Ogrenci-Masaustu, C-Lab-Guvenlik); karışık GPO’lar yönetimi zorlaştırır.
  • Az sayıda, anlamlı GPO kullanın; her ayar için ayrı GPO açmayın.
  • OU yapısı GPO stratejisini belirler — yani bu yazıda kurduğumuz temiz OU ağacı, sağlıklı bir GPO yönetiminin ön koşuludur.

Yetki Devri (Delegation of Control)

Kurduğumuz OU yapısının son faydası yetki devridir. Hogwarts’ta her bina sorumlusunun (prefect) yalnızca kendi binasındaki öğrencilerin parolasını sıfırlayabilmesini istiyoruz — ama onlara Domain Admin yetkisi vermeden. OU bazlı delegasyon tam da bunun içindir:

# Örnek: "Gryffindor-Sorumlulari" grubuna, yalnızca Gryffindor OU'sunda
# parola sıfırlama yetkisi vermek için dsacls kullanılır.
dsacls "OU=Gryffindor,OU=Houses,OU=Hogwarts,DC=hogwarts,DC=local" `
  /I:S /G "HOGWARTS\Gryffindor-Sorumlulari:CA;Reset Password;user"

Grafik arayüzde aynı işi Active Directory Users and Computers → OU’ya sağ tık → Delegate Control… sihirbazıyla da yapabilirsiniz. Devredilen yetki yalnızca o OU (ve seçtiyseniz alt OU’ları) ile sınırlı kalır; bu, bir önceki yazıda bahsettiğimiz katmanlı yönetim (tiering) ilkesinin günlük operasyondaki karşılığıdır.

Sonuç

Bu yazıda boş bir hogwarts.local domain’ini düzenli bir okula dönüştürdük ve üç temel kavramı uygulamalı olarak gördük:

  • OU, nesnelerin nerede durduğunu belirler; GPO bağlama ve yetki devri içindir.
  • Grup, nesnelere neye erişebileceğini verir; izin ve yetki için rol bazlı kurulur (Global → Domain Local / AGDLP).
  • Üyelik (Member Of), bu ikisini birbirine bağlayan kaldıraçtır: izin, GPO filtreleme ve firewall kararı hep kullanıcının üye olduğu gruplara bakar.
  • Tek bir PowerShell script’iyle OU iskeletini; rol, ders ve bina gruplarını; öğrencileri, öğretmenleri ve görevlileri oluşturup üyelikleri kurduk; yapıyı bir ağaç olarak doğruladık.
  • 4 binayı birbirinden izole etmeyi — OU yerleşimi + GG-House-* üyeliği + GPO/izin üçlüsüyle — somut olarak gösterdik.

Asıl kazanım, bu yapının diğer sistemlere zemin olmasıdır: aynı gruplar hem dosya izinlerinde, hem firewall politikalarında, hem de GPO hedeflemesinde yeniden kullanılır. Bir sonraki adım olarak GPO’ları derinlemesine öğrenmek, kurduğunuz bu temelden tam verim almanızı sağlayacaktır.

Paylaş :

İlgili Yazılar

Linux'da Kullanıcı Hesapları ve Yetkileri: Sudo ve Su Komutları

Linux'da Kullanıcı Hesapları ve Yetkileri: Sudo ve Su Komutları

Linux işletim sistemi, güçlü bir çok kullanıcılı ve çok görevli bir yapıya sahiptir. Bu çoklu kullanıcı ortamında, her kullanıcının kendi hesabına ve yetkilerine sahip olması önemlidir. Linux’ta kullanıcı hesapları ve yetkileri, güvenlik ve sistem yönetimi açısından kritik bir rol oynar. Bu yazıda, Linux’ta kullanıcı hesaplarını yönetmek ve yetkileri kontrol etmek için kullanılan sudo ve su komutlarına odaklanacağız.

Linux'da Disk Genişletme İşlemi

Linux'da Disk Genişletme İşlemi

Önceden KVM üstünde ubuntu 22.04 20 GB disk alanına sahip bir VM oluşturdum. Sizin kullanıdığınız sanallaştırma ortamına göre bu işlem değişiklik gösterebilir. KVM için disk genişletme adımları Tecmint.com bu site üzerinden bakabilirsiniz.

Active Directory Nedir ve Neden Gereklidir?

Active Directory Nedir ve Neden Gereklidir?

Günümüzün teknoloji odaklı dünyasında, işletmeler ve organizasyonlar karmaşık bilgi teknolojisi altyapılarına sahiptir. Bu altyapıların yönetimi ve verimliliği, Active Directory gibi kritik bir bileşenle kolaylaştırılır. Active Directory (AD), Microsoft tarafından geliştirilen ve büyük ve küçük organizasyonların kullanımına sunulan bir dizin hizmetidir. Bu yazıda, Active Directory’nin ne olduğunu ve neden gerekliliklerini ele alacağız.