İçeriğe geç
academia.sh

Ders 18 / 18

Yetki Verme ve Alma

Nesne düzeyi izinlerin standart SQL yazımı, yetkili-nesne-izin üçlüsü, aktarım seçeneği ve rol kavramı; en az yetki ilkesinin bir yetki matrisi üzerinde ölçülmesi.

İçindekiler

Önceki ders görünümün ikinci işini yarım bıraktı. Görünüm okuyucuya temel tablonun yalnızca bir bölümünü gösterebilir — ama gösterebilmesi, temel tablonun gizlendiği anlamına gelmez. Görünümü sorgulayan biri, isterse aynı bağlantıda temel tabloyu da sorgular. Eksik olan, kimin neyi görebileceğini söyleyen ayrı bir mekanizmadır.

SQL Dil Aileleri dersinde ayrılan beş aileden dördüncüsü — veri denetim dili — tam olarak bunu yazar. Deyimleri kısadır, kavramları ise şema tasarımı kadar sonuç doğurur: bir sistemdeki en pahalı hataların bir bölümü, gereğinden geniş verilmiş izinlerden çıkar.

Yetki Modelinin Parçaları

Nesne düzeyi yetkilendirme üç şeyi birbirine bağlar.

Yetkili, izni alan taraftır: bir kullanıcı hesabı, bir rol ya da “herkes” anlamına gelen genel bir ad. Nesne, iznin üzerinde tanımlandığı şeydir: tablo, görünüm, sütun, şema ya da veritabanının kendisi. İzin, o nesnede yapılabilecek işlemi adlandırır: okuma, ekleme, güncelleme, silme, başvurma, tanım değiştirme.

Bu üçlünün her bir bileşimi ayrı bir yetkidir. Bir tabloda okuma izni olan bir yetkilinin aynı tabloda yazma izni yoktur; bunun için ayrıca verilmesi gerekir.

Yetkiyi kim verir sorusunun standart yanıtı nesnenin sahibidir: bir tabloyu yaratan taraf, o tablo üzerinde bütün izinlere ve bu izinleri başkalarına verme hakkına baştan sahiptir.

Yetki Vermek ve Geri Almak

Standart SQL’de izinler GRANT ile verilir, REVOKE ile geri alınır.

GRANT SELECT, INSERT, UPDATE ON odunc TO gorevli;
GRANT SELECT ON uye_ozeti TO rapor;
GRANT SELECT (uye_id, ad, soyad) ON uye TO rapor;
GRANT SELECT ON kitap TO katalog WITH GRANT OPTION;

REVOKE DELETE ON odunc FROM gorevli;
REVOKE ALL PRIVILEGES ON uye FROM rapor CASCADE;

Deyimler okunduğu gibi çalışır: hangi izinler, hangi nesne üzerinde, kime. İkinci satırdaki nesne bir tablo değil, önceki derste tanımlanan görünümdür — izin, tablolarda olduğu gibi görünümler üzerinde de verilir. Üçüncü satır izni sütun düzeyinde daraltır: yetkili tabloyu sorgulayabilir ama yalnızca sayılan sütunları görür, e-posta adresine erişemez. Dördüncü satırdaki aktarım seçeneği, yetkiliye aldığı izni başkalarına verme hakkını da tanır.

Geri almanın iki inceliği vardır. ALL PRIVILEGES, o nesnede yetkiliye verilmiş bütün izinleri kapsar. CASCADE ise aktarım seçeneğiyle verilmiş bir iznin dallanmasını izler: yetkili o izni başkalarına dağıttıysa, geri alma o dağıtımları da kaldırır. Bu seçenek yazılmazsa ve dallanma varsa, standart geri almayı reddeder — çünkü sessizce bırakılan bir dal, geri alındığı sanılan bir izin demektir.

Aktarım seçeneği bu yüzden ölçülü kullanılır. Bir izni kimin dağıtabileceği, dağıtılabilecek izinlerin kendisinden daha önemli bir karardır: aktarım hakkı verilen her yetkili, yetki matrisini tek başına genişletebilecek bir noktadır.

Rol kavramı, aynı sorunu daha yönetilebilir kılar. İzinler tek tek kullanıcılara değil role verilir, kullanıcılar role bağlanır. Bir görev tanımı değiştiğinde tek bir rolün izinleri düzenlenir; işe yeni başlayan biri role bağlanarak bütün izinleri devralır. Rol olmadan, izinler kullanıcı sayısıyla çarpılır ve kimsenin tam olarak neye erişebildiği izlenemez olur.

Bu deyimlerin her motorda bulunmadığı vurgulanmalıdır. Kullanıcı hesabı kavramı olmayan motorlar vardır; bu dersin komut satırı aracı da böyledir ve GRANT deyimini ayrıştıramaz. Erişim denetimi orada dosya sistemi izinlerine ve uygulama katmanına bırakılır. Yetkilendirmenin nerede yapıldığı, motor seçilirken sorulacak sorulardandır.

En Az Yetki İlkesini Ölçmek

Linux’a Giriş kursunda tanıtılan en az yetki ilkesi burada da geçerlidir: her yetkiliye, işini yapmak için gereken izinlerden fazlası verilmez. İlkenin uygulandığı iddia edilmez, sayılır. Verilen izinler ve işin gerektirdiği izinler iki küme olarak yazılırsa, fark doğrudan hesaplanabilir.

Aşağıdaki betik kütüphane veritabanı için bu iki kümeyi kurar, matrisi yazdırır ve farkları sayar. Sonra fazla verilmiş izinleri geri alıp matrisi yeniden çıkarır.

cat > yetki.mjs <<'EOF'
// Nesne duzeyi yetki matrisini kurar ve en az yetki ilkesinin ihlallerini sayar.
const izinler  = ["SELECT", "INSERT", "UPDATE", "DELETE"];
const nesneler = ["uye", "kitap", "odunc", "uye_ozeti"];

// GRANT ile verilmis yetkiler: "yetkili nesne izin"
const verilen = new Set([
  "gorevli uye SELECT",   "gorevli uye UPDATE",   "gorevli kitap SELECT",
  "gorevli odunc SELECT", "gorevli odunc INSERT",
  "gorevli odunc UPDATE", "gorevli odunc DELETE", "gorevli uye_ozeti SELECT",
  "rapor uye SELECT",     "rapor kitap SELECT",   "rapor odunc SELECT",
  "rapor odunc DELETE",   "rapor uye_ozeti SELECT",
  "katalog kitap SELECT", "katalog kitap INSERT", "katalog kitap UPDATE",
]);

// Isin gerektirdigi yetkiler.
const gereken = new Set([
  "gorevli uye SELECT",   "gorevli uye UPDATE",   "gorevli kitap SELECT",
  "gorevli odunc SELECT", "gorevli odunc INSERT",
  "gorevli odunc UPDATE", "gorevli uye_ozeti SELECT",
  "rapor uye_ozeti SELECT",
  "katalog kitap SELECT", "katalog kitap INSERT", "katalog kitap UPDATE",
]);

const yetkililer = [...new Set([...verilen].map((k) => k.split(" ")[0]))];

function raporla(baslik, kume) {
  console.log(baslik);
  console.log(("  yetkili  nesne      " + izinler.map((i) => i.padEnd(7)).join("")).trimEnd());
  for (const y of yetkililer) {
    for (const n of nesneler) {
      const hucre = izinler.map((i) => {
        const v = kume.has(`${y} ${n} ${i}`);
        const g = gereken.has(`${y} ${n} ${i}`);
        return (v ? (g ? "var" : "FAZLA") : g ? "EKSIK" : "-").padEnd(7);
      });
      console.log(("  " + y.padEnd(9) + n.padEnd(11) + hucre.join("")).trimEnd());
    }
  }
  const fazla = [...kume].filter((k) => !gereken.has(k));
  const eksik = [...gereken].filter((k) => !kume.has(k));
  console.log(`  fazla verilmis yetki: ${fazla.length}`);
  for (const k of fazla) console.log("    " + k);
  console.log(`  eksik yetki: ${eksik.length}`);
  return fazla;
}

const fazla = raporla("== REVOKE oncesi ==", verilen);
const sonra = new Set([...verilen].filter((k) => !fazla.includes(k)));
raporla("== REVOKE sonrasi ==", sonra);
EOF
node yetki.mjs
== REVOKE oncesi ==
  yetkili  nesne      SELECT INSERT UPDATE DELETE
  gorevli  uye        var    -      var    -
  gorevli  kitap      var    -      -      -
  gorevli  odunc      var    var    var    FAZLA
  gorevli  uye_ozeti  var    -      -      -
  rapor    uye        FAZLA  -      -      -
  rapor    kitap      FAZLA  -      -      -
  rapor    odunc      FAZLA  -      -      FAZLA
  rapor    uye_ozeti  var    -      -      -
  katalog  uye        -      -      -      -
  katalog  kitap      var    var    var    -
  katalog  odunc      -      -      -      -
  katalog  uye_ozeti  -      -      -      -
  fazla verilmis yetki: 5
    gorevli odunc DELETE
    rapor uye SELECT
    rapor kitap SELECT
    rapor odunc SELECT
    rapor odunc DELETE
  eksik yetki: 0
== REVOKE sonrasi ==
  yetkili  nesne      SELECT INSERT UPDATE DELETE
  gorevli  uye        var    -      var    -
  gorevli  kitap      var    -      -      -
  gorevli  odunc      var    var    var    -
  gorevli  uye_ozeti  var    -      -      -
  rapor    uye        -      -      -      -
  rapor    kitap      -      -      -      -
  rapor    odunc      -      -      -      -
  rapor    uye_ozeti  var    -      -      -
  katalog  uye        -      -      -      -
  katalog  kitap      var    var    var    -
  katalog  odunc      -      -      -      -
  katalog  uye_ozeti  -      -      -      -
  fazla verilmis yetki: 0
  eksik yetki: 0

Beş ihlal çıktı ve her biri ayrı bir gerekçeyle açıklanabilir.

gorevli odunc DELETE izni, bir önceki dersin sonucudur: ödünç kaydı silmek geçmişi yok eder, iade işlemi ise kaydı güncelleyerek yapılır. Görevlinin silme iznine gereksinimi yoktur.

rapor yetkilisinin üç temel tabloda okuma izni ise daha ilginçtir. Raporlama işinin gerçekten okumaya gereksinimi vardır — ama temel tablolara değil, uye_ozeti görünümüne. İzin görünümde verildiğinde raporlama yine çalışır, üye tablosundaki e-posta adresleri ise erişilebilir olmaktan çıkar. Önceki dersin yarım kalan düşüncesi burada tamamlanır: görünüm neyin gösterileceğini tanımlar, yetki onu bağlayıcı kılar. İkisi ayrı ayrı eksiktir.

rapor odunc DELETE izni ise hiçbir gerekçeyle açıklanamaz; büyük bir olasılıkla bir kopyalama artığıdır. Yetki matrisleri elle büyüdükçe bu tür artıklar birikir ve kimsenin farkına varmadığı bir yazma yolu bırakır.

Geri alma sonrasındaki ikinci matriste hem fazla hem eksik yetki sıfırdır: her yetkilinin izinleri işinin gerektirdiğine eşittir. Bu sayının düzenli olarak hesaplanması, ilkeye uyulduğunu iddia etmekten farklı bir şeydir.

Özet

  • Nesne düzeyi yetkilendirme yetkili, nesne ve izin üçlüsünü bağlar; her bileşim ayrı bir yetkidir ve ayrıca verilmesi gerekir.
  • GRANT izin verir, REVOKE geri alır; izin sütun düzeyinde daraltılabilir, aktarım seçeneğiyle genişletilebilir ve geri alma dallanmayı izleyecek biçimde yazılabilir.
  • Roller izinleri kullanıcılardan ayırır; görev tanımı değiştiğinde tek bir rolün izinleri düzenlenir ve erişim izlenebilir kalır.
  • Görünüm neyin gösterileceğini tanımlar, yetki onu bağlayıcı kılar; erişim daraltmak için ikisi birlikte kullanılır.
  • En az yetki ilkesi iddia edilmez, sayılır: verilen izinler ile işin gerektirdiği izinlerin farkı hesaplanabilir bir büyüklüktür.

Kurs Kapanışı

Bu kurs SQL’in temel deyimlerini kurdu. Sorgulama konusunda SELECT yapısı, koşullar, sıralama, boş değerlerle çalışma ve yerleşik işlevler ele alındı. Birleştirmeler konusu tabloları iç ve dış birleştirmelerle bir araya getirdi, toplama işlevleri ve gruplamayla özet üretti, küme işlemleriyle sonuç kümelerini birleştirdi. Bu konu ise okumadan yazmaya geçti: şemanın tanımlanması ve kısıtlarla korunması, şemanın değiştirilmesi, satır ekleme, güncelleme ve silmenin riskleri, görünümler ve nesne düzeyi izinler.

Kurs boyunca tek bir örnek sürdü — şubeleri, üyeleri, kitapları ve ödünç işlemleri olan bir kütüphane veritabanı. Aynı şema üzerinde hem sorgular hem yazma deyimleri yazıldı; kısıtların neyi engellediği, koşulsuz bir güncellemenin ne yaptığı ve bir görünümün neyi gizleyip neyi gizlemediği aynı tablolarda görüldü.

Sıradaki kurs İleri SQL, buradaki deyimleri üç yönde derinleştirir. Bileşik sorgular konusu alt sorguları, ortak tablo ifadelerini, özyinelemeli sorguları ve pencere işlevlerini ele alır — bu kursta alt sorgu yalnızca koşul yazmak için kullanıldı, orada kendi başına bir yapı olur. İşlemler konusu, bu kursta bir alışkanlık olarak kullanılan BEGIN ve ROLLBACK çiftinin altındaki mekanizmayı açar: kaydetme noktaları, yalıtım düzeyleri, kilitleme ve kilitlenme. Sorgu başarımı konusu ise dizinleri, sorgu planını okumayı ve planı bozan yazımları ele alır — bu kursta ölçülen ekleme farkının yanına, okuma tarafının maliyet modeli eklenir.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat