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.
GRANTizin verir,REVOKEgeri 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.