46
İZİNLERİN(PERMISSIONS) YÖNETİMİ: Veri tabanı içindeki veri ve nesnelere erişebilmek için mutlaka gerekli izinlere sahip olmak gerekir. SQL Server Management Studio içinden yapılacağı gibi GRANT, REVOKE veya DENY ifadeleri ile de gerçekleştirilebilir. Etki alanı eski versiyonlarda olduğu gibidir. Yani; *** Verilen bir izin, ait olduğu yapının tüm üyeleri için geçerli olur. *** Verilen bir kısıtlama, yine tüm üyelere etki eder. *** DENY izni, GRANT iznine baskındır. Örneğin, bir kullanıcıya bir tablo için SELECT hakkı verilmiş ise ancak üye olduğu bir role'den dolayı aynı tablo için DENY hakkı da varsa, geçerli olan DENY hakkıdır. *** Bazı izinler yukarıdan aşağı doğru miras olarak geçer. SERVER PFRMISSION: Direkt Server yapısı üzerinde uygulanacak izinlerdir. Örneğin, veri tabanı oluşturmak, SQL Server özelliklerini değiştirmek gibi... SQL Server Management Studio kullanarak bu izin yapısını gerçekleştirmek için; 1) Security klasörü altındaki Logins klasörü içinde hesaplar bulunmaktadır. İzin verilecek hesap üzerinde sağ tuşa basılarak Properties seçeneğine tıklanır. 2) Select a page kısmından Securables seçildikten sonra sag taraftaki Search butonuna tıklanır. Gelen Add Objects iletişim kutusundan The server... seçeneği ile server seçilerek OK butonuna basılır. 3) Permissions for.... Kısımından bu hesabın server genelinde sahip olacağı izinler ve kısıtlamalar seçilerek OK butonuna basılır.

Konu anlatımı

Embed Size (px)

Citation preview

İZİNLERİN(PERMISSIONS) YÖNETİMİ:

Veri tabanı içindeki veri ve nesnelere erişebilmek için mutlaka gerekli izinlere

sahip olmak gerekir. SQL Server Management Studio içinden yapılacağı gibi GRANT, REVOKE

veya DENY ifadeleri ile de gerçekleştirilebilir. Etki alanı eski versiyonlarda olduğu gibidir. Yani; *** Verilen bir izin, ait olduğu yapının tüm üyeleri için geçerli olur. *** Verilen bir kısıtlama, yine tüm üyelere etki eder. *** DENY izni, GRANT iznine baskındır. Örneğin, bir kullanıcıya bir tablo için

SELECT hakkı verilmiş ise ancak üye olduğu bir role'den dolayı aynı tablo için DENY hakkı da varsa, geçerli olan DENY hakkıdır.

*** Bazı izinler yukarıdan aşağı doğru miras olarak geçer.

SERVER PFRMISSION:

Direkt Server yapısı üzerinde uygulanacak izinlerdir. Örneğin, veri tabanı

oluşturmak, SQL Server özelliklerini değiştirmek gibi... SQL Server Management Studio kullanarak bu izin yapısını gerçekleştirmek

için; 1) Security klasörü altındaki Logins klasörü içinde hesaplar bulunmaktadır. İzin

verilecek hesap üzerinde sağ tuşa basılarak Properties seçeneğine tıklanır. 2) Select a page kısmından Securables seçildikten sonra sag taraftaki Search

butonuna tıklanır. Gelen Add Objects iletişim kutusundan The server... seçeneği ile server seçilerek OK butonuna basılır.

3) Permissions for.... Kısımından bu hesabın server genelinde sahip olacağı

izinler ve kısıtlamalar seçilerek OK butonuna basılır.

Transact-SQL ifadesi ile yetkilendirmek ise aşağıdaki gibidir. Bu yazılım

mutlaka master veri tabanı aktif iken yazılmalıdır.

GRANT { server_permission [ ,...n]} TO lagin[,...n] [ WITH GRANT OPTION ] [ AS { group / role} ]

Örneğin; USE master GRANT ALTER ANY DATABASE TO [fb1\inan] Server-scope içindeki securables; HTTP endpoints ve certificate gibi

nesneler içerir. Server-scope içindeki securables üzerinde GRANT izini vermek için kullanılan

yazılım şekli, aşağıdaki gibidir.

GRANT { securable_permission [ ,...n]} ON securable_type:: securable_name TO login[,...n] [ WITH GRANT OPTION ] [ AS { group I role} ]

Mutlaka master veri tabanı aktif iken yazılmalıdır.

DATABASE PERMISSION:

Veri tabanı içindeki nesnelere erişim için ve burada yapılacak görevler için sahip

olması gereken izinleri içerir. SQL Server ile bağlantı gerçekleştikten sonra, burada bulunan veri tabanları

üzerinde işlem yapmak için gerekli izinlerin verilmesi gerekir. Burada yapılacak.işlemler için gerekli izinlerin olup- olmadığı Master veri tabanı içindeki sysusers sistem tablosundan kontrol edilir. Bu kısımda, bu izinlerin nasıl verileceğini

inceleyeceğiz. use ogun3 SELECT * FROM sys.sysusers

Bu izinler; SQL Server Management Studio içinden veya Transact SQL ifadeleri ile verilebilir.

SOL Server Management Studio içinden bu izinleri ayarlamak için; 1) Databases klasörünü açarak, izin yönetimi yapacağımız veri tabanı üzerinde

sağ tuşa basıp Properties seçeneğine tıklayalım.

2) Permission sayfasına geçilerek Permissions for. izinler verilir (Grant) veya

kısıtlanır(Deny). OK ile onaylanarak devreye sokulur.

Aynı işlemin Transact-SQL ile yapılması durumunda kullanılacak biçim

aşağıdaki gibidir.

GRANT { database_permission [ ,...n ]} TO security_account [,...n] [ WITH GRANT OPTION ] [AS { group / role} ]

Örneğin; USE ogun3 GRANT ALTER USER TO dogan

Yukarıdaki örnekte ogun3 veri tabanı içinde dogan isimli hesaba herhangi bir

kullanıcı hesabı için her türlü değişiklik hakkı verilmektedir.

DATABASE-SCOPE SECURABLE PERMİSSİON:

Database-scope içindeki securables; nesneleri içerir. Bu nesneler users,

schemas, assemblies ve service broker nesneleri olabilir. Bunu Management Studio içinden yapmak için; 1) Server, Databases veya nesne tipi klasörü açılarak altındaki özel nesne

üzerinde sağ tuşa basılarak Properties seçeneğine tıklanır. 2) Permissions sayfasına geçilerek Permissions for <object>

kısmından gerekli izin atamaları yapılır. Transact-SQL yazılım biçimi ise şöyledir;

GRANT {database_permission [ , ...n]} ON security_type : : securable_name TO security_account [ ,...n ] [WITH GRANT OPTION] [AS {group / role} ]

Aşağıdaki ifade ile ogun3 veri tabanında bulunan mudur şeması için dogan

hesabında SELECT hakkı veriyoruz. Use ogun3 GRANT SELECT ON SCHEMA : : mudur TO dogan

SCHEMA-SCOPE SECURABLE PERMISSION:

Veri tabanı scope'ları içindeki securables nesneler; table, view, stored

procedure ve type. Bunun Management Studio içinden yapılması; 1)Server, Databases veya nesne tipi klasörü açılarak altındaki özel

nesne üzerinde sağ tuşa basılarak Properties seçeneğine tıklanır. 2)Permissions sayfasına geçilerek Permissions for<object>

kısmından gerekli izin atamaları yapılır. Transact-SQL yazılım biçimi ise şöyledir;

GRANT {type_permission [ ,...n]} ON TYPE :: type_name TO security_account[ ,...n] [WITH GRANT OPTION] [AS {group | role}]

Aşağıda bu örneklenmiştir; USE ogun3, GRANT EXECUTE ON TYPE :: adrestip1 TO gorkem

Aşağıdaki yazılım ile mudur şemasının personel tablosu üzerinde SELECT

hakkı alması görülmektedir.

USE ogun3, GRANT EXECUTE ON mudurpersonel2 TO dogan

UYGULAMA :

1) ogun3 veri tabanını altındaki Security klasörü altındaki Users klasörü

altında bulunan dogan isimli kullanıcı adı üzerinde sağ tuşa basarak Properties seçeneğine tıklayalım.

2) Database role membership kısmından db_datareader kutucuğunu

doldurarak OK butonuna basalım.

Bu izin ile dogan isimli kullanıcının ogun3 isimli veri tabanı içindeki tüm

kayıtları görme hakkı veriyoruz. Ancak bunun dışında bir hakkı yoktur. Yani ogun3 veri tabanı içinde herhangi bir nesne içindeki verileri silemez, değiştiremez ve yeni bir kayıt ekleyemez. Bunları yapması için listedeki diğer izinlerin kullanılması gerekir.

3) Database Engine seçeneğine tıklayalım.

4) Server name kısmından SQL Server adını seçelim. Authentication

kısmından SQL Server Authentication'ı seçerek Login kısmına oluşturduğumuz kullanıcı adı olan dogan yazalım.

Ardından New Query seçimini dogan veri tabanı için yapalım.

5) Daha önce çalıştıramadığımız SQL ifadesini Query Editör kısmına

yazdığımızda; tüm kayıtların listelendiğini görebilirsiniz. Ancak herhangi bir tabloya kayıt girmek istediğinizde, yine hata mesajı ile karşılaşırsınız.

NESNE BAZLI İZİNLER:

Buraya kadar izlediğimiz izinler dışında, bir nesneye özel izin ve kısıtlamalar

koyabiliriz. Hatta biraz daha ileriye giderek, nesne içinde bulunan sütun temelli izinler oluşturabiliriz. Burada oluşturulan izinler; diğer tüm güvenlik mekanizmalarının üzerindedir. Yani en baskın olan izindir.

UYGULAMA:

1) OZATA kullanıcısı ile SQL Server'a bağlanalım. 2) ogun3 veri tabanı altında bulunan, prestige tablosu üzerinde sağ tuşa

basarak, Properties seçeneğine tıklayalım. 3) Gelen ekrandan Permissions butonuna tıklayalım. 4) Search butonuna basarak dogan isimli kullanıcımızı ekleyelim. Ardından

izinleri şekildeki gibi yapılandıralım. Burada sadece bu tablo için Insert hakkı yererek; yeni kayıt eklenilecek olan kullanıcıya ayrıca değişiklik yapması için Update kutucuğunu doldurduk. Üst raftan gelecek olası bir silme tehlikesine karşında Deny altındaki Delete kutucuğunu doldurduk.

5) Değişiklik yapmasına izin verdik de, bu değişikliği de sınırlayabiliriz. Bunun

için Update butonu seçili iken Column Permissions butonuna tıklayalım. Gelen sütun izinleri penceresinde aşağıdaki kutucukları dolduralım. Böylelikle dogan isimli

kullanıcıya sadece fiyat değişikliği izini verdik. Eğer kutulardan herhangi birini boş bırakırsak, yukarıdan gelen izinler geçerli olur.

6) dogan isimli kullanıcı adı ile SQL Server'a bağlanalım. Ardından Object

Explorer'ı dogan isimli kullanıcı için bağlayalım.

7) Object Explorer kısmından prestige tablosunu açalım. Bu işlemin başarı ile

gerçekleştiğini göreceksiniz. Yeni bir kayıt girelim. Burada da bir sorun olmayacaktır. 8) Var olan bir kayıdın fiyat sütununu değiştirmeye kalktığınızda da hata mesajı

karşılaşmayacaksınız.

9) Ancak var olan bir kayıdın fiyat sütunu dışında bir sütununu değiştirmek

istediğinizde veya bir satırı silmek istediğinizde; size bunu yapamayacağınızı bildiren mesaj ile karşılaşacaksınız.

10) Tekrar sa isimli kullanıcı ile bağlanalım.

ROLES: İzinleri tek tek kullanıcılara vermek bazı durumlarda büyük karmaşıklığa yol

açar. Onun için her zaman gruplara izin vermek doğru bir çözüm olacaktır. Aynı yetki içinde bulunacak kullanıcıları ilk önce bir gruba atamak, ardından bu gruba gerekli izin ataması yapmak gerekir. İşte SQL Server içindeki bu grup yapısına Role adı veriyoruz.

Dört çeşit Role vardır; *** Hazır Server Role. *** Hazır Database Role. *** Kullanıcı Tanımlı Role. *** Application Role. Şimdi bu rolleri tek tek inceleyelim.

HAZIR SERVER ROLE:

Bu roller, Server düzeyli izinlerin belirlendiği rollerdir. Bu alana ulaşmak için

Security klasörü altındaki Server Roles seçeneğine tıklamak yeterlidir.

Birer cümle ile açıklayacak olursak;

Rol İzin bulkadmin BULK INSERT komutlarını çalıştırır. dbcreator Veri tabanı oluşturur ve düzenler. diskadmin Disk dosyalarını yönetir. processadmin SQL Server işlem kademelerini yönetir. securıtyadmin Veri tabanı izinlerini düzenler ve kullanımları izler. serveradmin Server ayarlarını yapar. setupadmin Replikasyon kurulumu yapar. sysadmin Her şeyi yapar. En yetkili roldür. Varsayılan olarak sistem yöneticisi bu grubun üyesidir. Bir kullanıcıyı bu gruba üye yapmak için role üzerinde sağ tuşa basılarak

Propertles seçeneğine girilir. Add butonu kullanılarak üye eklenir.

HAZIR DATABASE ROLE:

Her veri tabanı için ayrı olarak yapılandırılan rol şeklidir. Ulaşmak için, veri

tabanı altındaki Roles seçeneğine tıklamak yeterlidir.

Rol İzin

db_accessadmin

Veri tabanına kullanıcı, grup, rol ekler veya kaldırır.

db_backupoperator Veri tabanının yedeğini alır.

db_datareader Herhangi bir tablodan veri okur.

db_datawriter Tabloların içindeki verilere ekleme yapar, siler, değiştirir.

db_ddladmin Veri tabanına nesneleri ekler, siler, değiştirir.

db_denydatareader

Herhangi bir tablodan veri okuyamaz.

db_denydatawriter

Herhangi bir tabloda değişiklik yapamaz.

db_owner Veri tabanıyla ilgili herhangi bir aktiviteyi gerçekleştirir.

db_scurityadmin Nesnelerin izinlerini düzenler.

public Bir veri tabanı içindeki kullanıcılar için, tüm yerleşik izinleridüzenler.

Bir kullanıcıyı bir hazır veri tabanı grubuna dahil etmek için üzerinde sağ tuşa

basılarak Properties seçeneğine tıklanır. Gelen ekrandan kullanıcı; Add butonu kullanılarak bu gruba dahil edilir. Her iki yapı için de üyelik, kullanıcının ilk oluşumu sırasında da

belirlenebilir.

KULLANICI TANIMLI ROLE:

Sabit roller dışında, istersek özel roller de tanımlayabiliriz. Bunun için; veri

tabanı altında bulunan Roles nesnesini kullanırız. Bu kendi oluşturduğumuz gruba üye veya başka bir grup ekleyebiliriz.

Şimdi bir örnek ile bunu açıklayalım. 1) ogun3 veri tabanı altında bulunan Security/ Roles/ Database Roles klasörü

üzerinde sağ tuşa basarak, New Database Role... seçeneğine tıklayalım.

2) Gelen ekranın Role name kısmına; vermek istediğimiz ismi yazalım ve Add

butonunu kullanarak, üye etmek istediğimiz kullanıcıları ekleyelim. Yine buradan sahiplik yapacak şemalar belirlenebilir, izin atamaları için de Securables sayfası kullanılabilir.

APPLICATION ROLE:

Diğer bir rol seçimi de Application Role (Uygulama rolü)' dur. Bu yapıda

oluşturulan rol'e herhangi bir kullanıcı dahil edilmez. Bunun yerine, bir şifre belirlenerek, kod kısmında sp_setapprole sistem stored procedure'ö çalıştırılıp, rolün uygulanması sağlanır. Bu rol ile bir kez bağlandıktan sonra başka bir işlem yapmak için, mutlaka bağlantıyı kesmek gerekir. Oturum süresince aktif kalır. Daha çok sistem dışı kullanıcıların sadece belli nesnelere erişmesi amacı ile kullanılabilir.

UYGULAMA:

1) ogun3 veri tabanı altında bulunan Securitry\ Roles\ Application Roles

klasörü üzerinde sağ tuşa basarak New Application Role... seçeneğine tıklayalım.

2) Role name kısmına rol için vereceğimiz ismi yazalım. Örneğimizde federer

adı verdik. Ardından Password kısmına şifremizi yazalım. Biz örneğimizde 1 yazdık.

3) Securables sayfasına geçerek Search butonuna tıklayalım. Gelen iletişim

kutusundan All objects of the types seçeneğini işaretleyip OK butonuna basınca; aşağıdaki şekil karşımıza gelir.

Buradan Tables kutusunu doldurup OK butonuna bastığımızda tablolar

aşağıdaki gibi karşımıza gelecektir. Prestige tablosunu seçerek Grant kısmından Select izini karşısındaki kutuyu dolduralım. Onaylayarak, iletişim kutularını kapatalım.

4) SOL Server Ouery Editörü açarak aşağıdaki kodu yazalım ve F5 ile

çalıştıralım ve tüm kay.tların geldiğini gözlemleyelim. use ogun3 exec sp_setapprole 'federer','1' select * from prestige

CERTIFICATES: SQL Server tarafından kullanılan dijital sertifikalar, SSL bağlantılar

oluşturmak ve Service Broker'lar ile birarada anılırlar.

SQL Server, X.509v3-compliant türü sertifikalar oluşturabilir. iki iletişim hattı arasında hareket eden mesajların şifrelenmesi ve/veya kimlik

denetimine tabii tutulması için dijital sertifikalar kullanılabilir. Mesaj ile birlikte bu mesajın şifrelenmesi ve çözülmesi için gerekli anahtarları bünyesinde bulundurabilir.

Public ve Private olmak üzere iki anahtar çifti temel yapısıdır. Public parçası seninle ilişki kuracak herhangi bir kimseye verilebilirken, Private parçası özel olmalı ve sadece sende bulunmalıdır. Ortak sertifika yayımlayıcılar ve sertifika server'lar yaygın olarak

kullanılan yapılardır.

Not: Sertifikalar ile ilgili geniş bilgiyi Windows 2003- 2008 Server kitabımızda bulabilirsiniz.

SOL SERVER SERTİFİKA KULLANIMI:

SQL Server; kimlik denetimi ve şifreleme amaçlı sertifika kullanımına destek

verir. Bu sayede web senkronizasyonu için replikasyon yapılarında güvenlik sağlar.

SQL Server bünyesinde sertifika oluşturup, tutabileceğimizden bir nevi sertifika

sunucusu (Certificates Server) olarak davranır. Bir sertifika oluşturduğumuz zaman, aktif veri tabanı içinde tutulur. Bu yüzden

veri tabanını başka bir yere taşıdığımız zaman bünyesindeki sertifikalar da beraber taşınır.

İlişki içinde olan iki servis arasında kimlik denetimi ve güvenlik için Service

Broker kullanılabilir. Aynı zamanda tam güvenlik yapısı için kullanılır ki uzaktaki kullanıcılar arasındaki mesajların şifrelenmesini sağlar.

Transact-SOL ifadeleri kullanılarak, bir sertifika oluşturulabilir. Bunun vanısıra

başka bir sertifika server yapısına dahil edilebileceği gibi, var olan bir sertifika başka bir ortama yollanabilir.

Aşağıda genel yazılım biçimi görünmektedir;

CBEATE CERTIFICATE sertifika_ad [AUTHORIZATION kullanıcı_ad] {FROM < sertifika_kaynağı > | < sertifika_seçenekleri > } [ACTIVE FOR BEGIN_DIALOG = { ON | OFF} ] <sertifika__kaynağı> ::=

ASSEMBLY assembly_name |{ [ EXECUTABLE ] FILE = 'dosya_yolu'

[ WITH PRİVATE KEY { <private_key_seçenekleri> ) ] } <sertifika_seçenekleri > ::= [ENCRYPTION BY PASSVVORD = 'passvrord'] WITH SUBJECT = 'certificate_adı' [, <tarih seçenekleri> [ ,...n ] ] <private_key_seçenekleri> ::= FİLE = 'private_key_yolu' [, DECRYPTION BY PASSVVORD = 'password' ] [, ENCRYPTION BY PASSVVORD = 'passvvord' ] <tarih seçenekleri> ::= START_DATE = 'mm/dd/yyyy' | EXPIRY_DATE = 'mm/dd/yyyy'

Aşağıdaki örnek göksel veri tabanı için nasıl sertifika oluşturulacağını

göstermektedir; USE ogun3 CREATE CERTIFICATE goksertifika ENCRYPTION BY PASSMORD = 'F@ner1907' WITH SUBJECT = 'oguneaitsertifika', EXPIRY_DATE = '12/21/2012';

Aşağıdaki yazılım ise sertifikayı oluşturur ve Service Broker ile başlatır. USE ogun3 CREATE CERTIFICATE goksertifİka2 ENCRYPTION BY PASSWORD = 'F@ner1907' WITH SUBJECT = 'oguneaitsertifika2' ACTIVE FOR BEGIN_DIALOG = ON

ALTER CERTIFICATE ifadesi ile var olan bir sertifika üzerinde değişiklik

yapılabilirken, BACKUP CERTIFICATE ifadesi ile var olan bir sertifikayı bir dosya olarak istediğimiz bir ortama yollayabiliriz.

Aşağıdaki yazılımda C:\ sürücüsüne sertifika yollanmıştır. BACKUP CERTIFICATE goksertifika TO FILE = 'c:\acil.cer'

Silmek için ise DROP CERTIFICATE ifadesi kullanılır. DROP CERTIFICATE goksertifika

STORED PROCEDURE ve VIEW İZİNLERİ:

Her ne kadar daha Stored Procedure ve View yapılarını işlemiş olsak da, bu

yapıların da güvenlik mekanizmalarına değinelim. Tablolar gibi, Stored Procedure ve View nesnelerine de izin uygulanabilir. Genelde bu izinlere tabii olacak objeler hazırlandığı için ve son kullanıcı; içindeki komutları göremeyeceği için, Public tabanlı izinler vermek daha mantıklıdır. Aşağıdaki örneğimiz, bu iki yapıya ait izinleri içermektedir.

UYGULAMA:

1) SQL Server içinde son isimli yeni bir Login oluşturarak, ogun3 veri tabanı

altındaki Users nesnesine ekleyelim.

2) ogun veri tabanı altındaki Views nesnesi üzerinde sağ tuşa basarak, New

View seçeneğine tıklayalım.

3)Gelen ekranda prestige tablosunu seçerek Add butonuna basalım.

Sonra Close butonu ile bu ekranı kapatalım.

4) Eklenen prestige tablosunda ilk iki kutuyu dolduralım ve

prestigemini ismi ile kaydedelim kapatalım. 5) Query Editör içine aşağıdaki kodu yazarak çalıştıralım. Başarılı oluşum

mesajını alınca Stored Procedure oluşmuş demektir.

CREATE PROCEDURE nadal AS Select * from prestige GO

6) SQL Server Query Editor'e son isimli kullanıcı ile bağlanarak, aşağıdaki

kodları yazalım.

use ogun3 select * from prestige_mini

use ogun3 exec nadal

Her iki komutun da çalışmadığını göreceksiniz. Çünkü son isimli kullanıcının

burada bir yetkisi yok. O zaman herkesin, dolayısı ile son isimli kullanıcının da bunu çalıştırması için; "Public" rolüne view için select ve Stored Procedure için exec hakkı vermek gerekiyor. Bu, SQL Server Management Studio içinden yapılabilir. Ancak bu sefer Transact- SQL ifadesi ile yapalım.

7) "sa" kullanıcısı ile SQL Server Query Editör'ü açalım. 8) Aşağıdaki ifadeleri yazalım. grant select on prestige_mini to son grant exec on nadal to son

9) Tekrar "son" isimli kullanıcı ile logon olduğumuz zaman 6. adımdaki

komutları çalıştırdığımızda bu işlemin, başarı ile gerçekleştiğini izleyeceğiz.

UYGULAMA:

1) ogun3 veri tabanında beykoz isimli yeni bir tabloyu şekildeki gibi

tasarlayarak örnek kayıtlar girelim.

2) Yine aynı yerde sariyer isimli bir tasarlayarak örnek verileri içine

girelim.

3) Şimdi Security dizinin içindeki Logins kısmında alit, belit, selit isimli üç

adet yeni SQL Login hesabı oluşturalım.

4) SQL Query Editör içine aşağıdaki SQL komutlarını yazıp, F5 ile çalıştıralım. use ogun3 select * from beykoz

Aynı işlemi sariyer tablosu için de yaptığınızda, hiçbir sorun olmadan eriştiğinizi

görebilirsiniz. 5) İşlemi, grafiksel olarak test etmek için sıra ile beykoz ve sariyer tablosu

üzerinde sağ tuşa basarak Edit Top... seçeneği ile yapalım.

Her iki işlemde de hiçbir sorun olmadan verileri görebiliyoruz. 6) Connect/ Database Engine seçeneğine tıklayalım.

7) Gelen ekranda alit ile sisteme girelim. 8) 4. adımda yaptıklarımızı tekrarlayalım. Ne Oldu? (Eğer SQL Query Editör

açılırken, kullanıcı adını sorarsa alit yazmayı unutmayınız!) Evet! SQL Server'ı açma yetkimiz var ancak bu, veri tabanı için bir izin

olmadığından, her iki durumda da "alit" isimli kullanıcının bu veri tabanı için yetkili bir kullanıcı olmadığına dair mesaj ile karşılaşacaksınız.

9) O zaman bizim alit ve belit isimli kullanıcıları; bu veri tabanı için yetkili kullanıcı yapalım. Bunun için tekrar, sa isimli kullanıcı ile SQL Server'a bağlanalım.

10) ogun3 isimli veri tabanının altındaki Users nesnesi üzerinde, sağ tuşa

basarak; New User seçeneğine tıklayalım. Sıra ile hem alit hem de belit isimli kullanıcıları ekleyelim

11) Tekrar "alit" ile SQL Server'a bağlanalım. 12) 4. adımda yaptıklarımızı tekrarlayalım. Ne Oldu?

13) Yine beceremedik ve bu sefer de veri tabanı nesnesi için gerekli izinin

olmadığını belirten mesaj ile karşılaştık. OFFFF nasıl olacak bakalım. :) 14) Tekrar "sa" ile SQL Server'a bağlanalım. 15) ogun3 veri tabanı altında bulunan Roles\ Database Roles kısmını seçerek;

db_datareader üzerinde sağ tuşa basıp, Properties seçeneğine tıklayalım.

16) Gelen ekranda Add butonunu kullanarak "alit" ve "belit" isimli kullanıcıları

ekleyelim ve OK butonu ile onaylayalım. 17) Yine Roles kısmında bulunan db_datawriter'ın üzerinde sağ tuşa basıp,

Properties seçeneğine tıklayalım ve Add butonunu kullanarak sadece "belit'i ekleyelim .

18) İlk önce alit" isimli kullanıcı ile SQL Server'a bağlanalım. 19) 4. adımda yaptıklarımızı tekrarlayalım. Artık hem sariyer, hem de personel

tablosu içindeki tüm kayıtları görebiliyoruz. Demek ki buradan çıkacak sonuç: db_datareader yerleşik rolüne bir kullanıcıyı üye yaptığımız zaman, o veri tabanı içindeki tüm tabloları okuma hakkına sahip oluyor.

20) Şimdi sariyer veya beykoz tablosunu açarak içine; yeni kayıt

girmeye çalışalım. Evet, şimdi de bunu yapamıyoruz! Çünkü alit sadece db_datareader hakkına sahip.

21) belit isimli kullanıcı ile SQL Server'a logon olalım. 22) 4. ve 20. adımdaki işlemleri yapmaya çalıştığımızda, hepsinin de

gerçekleştiğini göreceğiz. Çünkü "belit" hem db_datareader, hem de db_datawriter rollerine üye olduğu için, okuma ve yazma hakkına sahip olmaktadır.

AUDITING GÜVENLİK:

Auditing ile SQL Server'ın bir instance'ının veya SQL Server'ın veri tabanının

sistem üzerinde meydana gelen olaylarını izleyebiliriz. SQL Server için birkaç yöntem mümkündür. SQL Server 2008 içinde, SQL Server Auditing yapısı ile otomatik izleme gerçekleştirebiliriz.

SOL SERVER PROFILER:

Microsoft SQL Server Profiler; Database Engine veya Analysis Services

yapılarını izlemek için kullanılan grafiksel bir ara yüzdür. Kullanımı; *** İlk olarak SQL Server izlemesi için gerekli tanımlama, SQL Server Profile

kullanılarak yapılır. *** SQL Server Profile, bu verileri kaydetmeye başlar. *** ilgilendiğimiz bilgileri izleyebiliriz. Bu yapıya yardımcı olacak ise SQL Trace

yapısıdır. *** Olaylarda meydana gelen kilitlenmelerin nasıl olduğunu grafiksel olarak

izleyebilir. Sonuçları XML olarak kaydedebilir. *** Tüm sonuçları XML formatına kaydedeceği gibi, ANSI, Unicode ve OEM

olarak da kaydedebilir. *** İzlemede seçilen anahtara göre gruplama yapabilir. Böylelikle izlenen

olayların basitçe kaç kez meydana geldiği görülebilir. XML; her ortama rahatlıkla aktarılacak olan bir biçime sahip olduğu için, izlenen

olay bilgilerini XML biçiminde kaydetmek doğru bir seçim olacaktır. Ardından bu veriler; analiz için özel bir uygulama yazılabileceği Excel programı gibi yaygın programlar bünyesine çağrılarak da kullanılabilir.

Nasıl yapılır? 1) SQL Server 2008 programı içinden Tools menüsünden SQL Server Profiler

seçeneğine tıklanır.

2) File menüsünden New Trace seçilir.

3) Gelen iletişim kutusunda izlenecek yer tespit edilerek Connect butonuna

basılır. Bu Database Engine veya Analysis Services tipli olabilir.

4) General kısmından Trace name kısmına bir isim verilir. Ardından Event

Selection sekmesine geçilerek olaylar belirlenir ve Run butonu ile izleme başlatılır.

5) Yapılan olaylar istediğiniz süre zarfında, şekildeki gibi kaydolur. Bunun için SQL Server içinde bir kaç işlem yapmanız, olayların artmasını gözlemeniz açısından yararlı olacaktır.

6) Şekildeki gibi, izleme devam eder.

7) File menüsünden Stop Trace seçeneğine tıklanarak izleme işlemi

durdurulur.

8) XML olarak kaydetmek için File/ Save As altındaki Trace XML File...

seçeneğine tıklanır.

9) isim verilerek, istenilen yere kaydedilir.

10) Excel programına getirmek için, bu program açılarak File/ Öpen

seçeneğinden kaydedilmiş dosya seçilir. Gelen iletişim kutularından değişiklik yapılmadan onaylanır. Sonunda Excel süzme yapısının da içinde bulunduğu tüm bilgiler; şekildeki gibi karşımıza gelir. Burada olayları bulmak, oldukça pratik ve basit olacaktır.

DDL TRİGGER:

Veri tabanı içindeki nesne hareketlerini bildirmek için kullanılır. Bildiğimiz klasik

Trigger gibi değildir, sadece verilerde bir değişiklik olduğu zaman bunları bize sunar. Örneğin; bir tablonun oluşturulması veya silinmesi gibi işlemleri izlememizi sağlar. SQL Server yapısını izlemek için, oldukça kullanışlı bir araçtır.

Kullanılan DDL ifadelerinde CREATE TABLE, ALTER TABLE, DROP TABLE

veya UPDATE STATICS devreye giren DDL Trigger ile yönetimsel işlerde takip edilebilir.

Meydana gelen olaylar istenilirse ROOLBACK TRANSACTION ifadesi ile geri

alınabilir.

CREATE TRİGGER:

Bir DDL Trigger oluşturmak için CREATE TRİGGER ifadesi kullanılır. Trigger

oluşturulurken ilk yapılması gereken işlem, DDL Trigger yapısından bulunacak alan ve tip belirtilmelidir.

Aşağıdaki örnek kod; bir kullanıcının veri tabanı üzerinde tablo oluşturmasını izleyen bir DDL Trigger oluşturur. Bu yapıda ON DATABASE yerine, duruma göre ON ALL SERVER ifadesi de kullanılabilir.

CREATE TRİGGER tabloolustur ON DATABASE FOR CREATE_TABLE AS ...

Veri tabanı içinde herhangi bir DDL işlemini izlemek için ise,

DDL_DATABASE_LEVEL_EVENTS ifadesinden yararlanılabilir. EVENTDATA: Standart Trigger; veriler üzerinde işlem yapılmak için otomatik olarak inserted

ve deleted tablolarını oluşturur. Ancak DDL Trigger bu tabloları oluşturmaz. Bunun yerine, bilgilere ulaşmak için eventdata fonksiyonu kullanılır.

Bu fonksiyon EVENT_INSTANCE_XML belgesi döndürür. Bu XML

dosyası içinde aşağıdaki elementler bulunur; <PostTime> Trigger'ın işlediği zaman. <SPID> Veri tabanı işlem numarası. <EventType> Bu Trigger işleminde uygulanan olay Ayrıca uygulanan işleme göre birçok element içerir. Eventdata fonksiyonu ile dönen değerleri yakalamak için query ifadesi

kullanılır. Bir uygulama ile görelim;

UYGULAMA:

1) SQL Server içinden Ouery kısmına geçelim. Ardından aşağıdaki komutu

yazarak çalıştıralım. CREATE TRİGGER tabloolusturr ON DATABASE FOR CREATE_TABLE AS Declare @verial XML DECLARE @veritaban nvarchar(100) SET @verial=eventdata() SET @verial=Convert(nvarchar(100)), @verial.query('data(//DatabaseName)')) Select @verial, @veritaban

2) Test etmek için aşağıdaki ifadeyi yazalım;

create table denek ( sno int, ad varchar(10) )

3) Çalıştırdıktan sonra aşağıdaki görüntü karşımıza gelir.

Burada tüm bilgilerin bulunduğu XML yapısı ve oluşturulan veri tabanı adı

görünmektedir. XML yapısına tıkladığımızda tüm bilgiler şekildeki gibi karşımıza gelir.

4) Trigger'ı silmek için ise DROP ifadesinden yararlanılır. DROP TRIGGER tabloolusturur ON DATABASE

Aşağıdaki ifadeler ile Trigger'lar hakkında genel bilgi edinilebilir;

SELECT name FROM sys.triggers SELECT definition FROM sys.sglmodules

Şimdi bu bilgileri bir tablo içinde depolamak için bir uygulama daha yapalım.

Burada da bilgileri value ile yakalayalım. Burada tüm DDL ifadeleri için genel bir tanımlama olan

DDL_DATABASEJ-EVELJEVENTS iadesinden yararlanacağız.

UYGULAMA:

1) SQL Server içinden Query kısmına aşağıdaki ifadeleri yazarak, olay

günlüğünü tutacağımız tabloyu oluşturalım.

CREATE TABLE kaydet_trig (zaman datetinte, kullanan nvarchar(100), olay nvarchar(100), komut nvarchar(2000));

2) Olayları izlemek için aşağıdaki kodu yazıp çalıştırarak, Trigger'ı oluşturalım. CREATE TRIGGER izle ON DATABASE FOR DLL_DATABASE_LEVEL_EVENTS AS DECLAPE @verial XML SET @verial = EVENTDATA() INSERT kaydet_trig (zaman, kullanan, olay, komut) VALUES (GETDATE(), CONVERT(nvarchar(100), CURRENT_USER), @verial.value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(100)'), @verial.value('(/EVENT_INSTANCE/TSQLCommand)[1]','nvarchar(2000)'));

3) Test etmek için aşağıdaki komutları yazarak çalıştıralım. CRSATS TABLE ogun2 (ad varchar(1O))

DROP TABLE ogun2

4) Aşağıdaki komut ile kaydet_trigger içindeki kayıtları görüntüleyelim.

Select * from kaydet_trig

5) Trigger'i silelim.

Drop trigger izle ON DATABASE

UYGULAMA:

1) Bu uygulamamızda ise veri tabanında tablo oluşumunu

engelleyeceğiz. Bunun için aşağıdaki ifadeleri Query kısmına yazalım. CREAT TRIGGER tabloengelle ON DATABASE FOR CREATE_TABLE AS PRINT 'CREAT TABLE ifadesi kullanılmaz.' SELECT EVENDATA().value( *(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)') RAISERROR ('Bu veri tabanında Tablo Oluşturulmaz',16,1) ROLLBACK TRANSACTION;

2) Test için aşağıdaki ifadeyi yazarak, bir tablo oluşturmaya çalışalım.

creat table denem ( Sno int, Ad varchar(10) )

3) Komutu çalıştırdığımızda şekildeki gibi, işlemin gerçekleşemeyeceğini

belirten mesajlar ile karşılaşırız.

4) Aşağıdaki ifadeyi yazarak Trigger'ımızı silelim. DROP TRIGGER tabloengelle ON DATABASE

EVENT NOTIFICATION:

SQL Server aktivitelerini izlemek için kullanacağımız seçeneklerden biri de yeni

bir yapı olan Event Notification'dır. SQL Server performansını mümkün olduğu kadar aza düşürerek olayları izlememize olanak tanır. Trigger gibi DDL ifadelerini izleyeceği gibi, bunun yanı sıra veri tabanları komutlarını oluşturan DML ifadelerini de izleyebilir. Ayrıca SQL Profil yapısındaki izlemeyi de gerçekleştirebilir.

Bu yakaladığı bilgileri Service Broker servisine yollayarak, analiz

yapılmasını sağlar.

CREATE EVFNT NOTIFICATION:

Oluşturmak için CREATE EVENT NOTIFICATION ifadesi kullanılır. Tüm kullanım şeklini verecek olursak;

CREATE EVENT NOTIFICATION event_notification_ad ON { SERVER | DATABASE | QUEUE kuyruk_ad} [ WITH FANJN ] FOR { eventjp \ event_grup] [ ,...n] TO SERVİCE 'broker_service', {'brokerjnstance' | 'current database'}

Aşağıdaki yazılım Server üzerinde uygulanan UPDATE_STATISTICS ifadesini

istatisliklog isimli Broker servisine yollar.

CREATE EVENT NOTIFICATION istatislik_guncelle ON SERVER FOR UPDATE_STATISTICS TO SERVICE 'istatistiklog','current database'

Aşağıdaki yazılım ise veri tabanında meydana gelen silme olaylarını izler.

CREATE EVENT NOTIFICATION tablo_silme ON DATABASE FOR DROP_TABLE TO SERVICE 'tablosillog','current database'

Genel DDL ifadeleri için FOR DDL_DATABASE_LEVEL_EVENTS ve genel

DML ifadeleri için ise FOR DML_EVENTS kullanılabilir.

EVENT NOTIFICATION İÇİN SERVİCE BROKER:

SQL Server olaylarını tutmak için oluşturulacak Service Broker servisi için en

basit yöntem Stored Procedure ile gerçekleştirilebilir. Böylelikle Event Notification tarafından gönderilen mesajlar; bu servisin kuyruğuna takılır.

Nasıl bağlantı kurulacağını adımlayarak inceleyelim; 1) Aşağıdaki ifade ile veri tabanımız içinde Service Broker servisi aktif

hale getirilir. ALTER DATABASE ogun3 SET ENABLE_BROKER

2) Kuyruk yapısı için aşağıdaki ifade kullanılır.

CREATE QUEUE tablosilkuyruk

3) Bu kuyruk ile ilişkili servis tanımlanır.

CREATE SERVİCE tablosillog CM CUEUE tablosilkuyruk {[http://schemas.microsoft.com/SQL/Notifications/PostEventNotificatio

n]}

4) Oluşturulan servis işe ilişkili Route tanımlanır.

CREATE ROUTE silyolla1 WITH SERVİCE_NAME = 'tablosillog', ADDRESS = 'LOCAL'

5) Notification oluşturularak; servis ile ilişki kurulur.

CREATE EVENT NOTIFICATION tablo_silme

ON DATABASE FOR DROP_TABLE TO SERVİCE 'tablosillog', 'curren database'

6) Kaba yapısı, aşağıdaki şekilde görüntülenebilir. Select * FROM dbo.tablosilkuyruk

UYGULAMA:

1) SQL Server içinden Query kısmına geçip, aşağıdaki ifadeleri yazalım.

ALTER DATABASE ogun3 SET ENABLE_EROKER GO CREATE QUEUE tablosilkuyruk33 GO CRSATE SERVİCE tablosillog33 ON QUEUE tablosilkuyruk33 ( [http://schemas.microsoft.com/SQL/Notifications/PostEventNotification] ) GO CREATE ROUTE silyolla33 WITH SERVICE_NAME = ' tablosillog33 ' , ADDRESS = 'LOCAL' GO

2) Oluşturacağımız Notification servis ile bu yapıyı ilişkilendirelim. CREATS EVENT NOTİFİCATİON tablo_silme33 ON DATABASE FOR DROP_TABLE TO SERVİCE 'tablosiilog33','current database'

3) Silme işlemlerini tutacak bir tablo oluşturalım.

CREATE TABLE gunluk_yakala33 (komut NVARCHAR(1000), Zaman NVARCHAR(24), hostad NVARCHAR(100), loginad NVARCHAR(100) )

4) Bir kaç tablo oluşturarak, onları silelim.

5) Ardından Query bölümüne aşağıdaki ifadeyi yazalım. Bu ifade bir Stored

Procedure içine yazılıp; kuyruk ile ilişkilendirilebilir.

DECLARE @mesajtipal NVARCHAR(256), @mesaj XML; RECEIVE TIP(1) @mesajtipal = message_type_name, @mesaj = message_body FROM dbo.tablosilkuyruk33; IF @@ROWCOUNT = 0 RETURN PRINT CONVERT (NVARCHAR(1000), @mesaj) DECLARE @cmd NVARCHAR(1000) DECLARE @posttime NVARCHAR(24) DECLARE @hostname NVARCHAR(100) DECLARE @loginname NVARCHAR(100) SET @cmd = CONVERT(NVARCHAR(100), @mesaj.query('data(//TSQLCommand//CommandText)')) SET @posttime = CONVERT(NVARCHAR(24), @mesaj.query('data(//PostTime)')) SET @hostname = HOST_NAME() SET @loginname = SYSTEM_USER INSERT IN TO gunluk_yakala33(komut,zaman,hostad,loginad) VALUES(@cmd, @posttime, @hostname, @loginname) GO SELECT * FROM gunluk_yakala33

Görüntü, aşağıdaki gibi olur;

UYGULAMA:

1) Bu uygulamada verileri depolamak için notification yapısında kuyruk ile

ilişkilendireceğimiz bir Stored procedure kullanalım. Bunun için ilk olarak günlükleri görüntüleyeceğimiz tabloyu gunluk_yakala4 ismi ile aşağıdaki gibi tanımlayarak, çalıştıralım.

CREATE TABLE gunluk_yakala4 (komut XML, zaman NVARCHARC24) )

2) Kuyruk ile ilişkilendireceğimiz izlebak_4 isimli stored procedure'ü aşağıdaki

gibi oluşturalım. CREATE PROCEDURE dbo.izlebak_4 AS DECLARE @message_body XML ;WAITFOR( RECETIVE TOP(1) @message_body-message_body FROM kuyruk_3 }, TIMEOUT 2000 ; IF @@ROWCOUNT=0 RETURN DECLARE @zaman NVARCHAR(24) SET @zaman = CONVERT(NVARCHAR(24), @message_body.query('data(//PostTime)')) INSERT INTO dbo.gunluk_yakala4(komut, zaman) VALUES {@message_body, @zaman) GO

3) Broker servisini aktif hale getirelim. ALTER DATABASE ogun3 SET ENABLE_BROKER

4) Aşağıdaki gibi kuyruk tanımlaması yaparken bu sefer farklı olarak

oluşturduğumuz stored procedure ile ilişkilendiriyoruz. CREATE QUEUE kuyruk_4 WITH STATUS = ON,ACTIVATION ( PROCEDURE_NAME = dbo.izlebak_4, MAX_QUEUE_READERS = 5, EXECUTE AS SELF) GO

5) Sırası ile aşağıdaki komutları da uygulayalım.

CREATE SERVİCE servis_4 ON QUEUE kuyruk_4 ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]) GO CREATE ROUTE Route_4 WITH SERVICE_NAME = 'servis_4', ADDRESS = 'LOCAL' GO

6) Servisimizle ilişkili Notification yapısını oluşturalım.

CREATE EVENT NOTIFICATION Notification_4 ON DATABASE FOR CREATE_TABLE TO SERVICE 'servis_4','current database'

7) Test için aşağıdaki komutları yazalım.

Create table yuk4 (ad varchar(10)) drop table yuk4

8) Aşağıdaki komutu yazarak, test edelim. Sonra da oluşturduğumuz yapıları

silelim.

Select * from gunluk_yakala4

METADATA:

SQL Server 2008 iki türlü Metadata sorgulaması yapar. Bunlar; katalog

görüntülemeler için static metadata ve dinamik görüntüleme için dynamic metadata. Bu bilgiler direkt olarak sistem tablolarından gelir.

STATİC METADATA:

SOL Server veri tabanı nesneleri hakkında bilgi almak için kullanılır. Bu bilgiler

<Database adı>\Views\System Views klasöründe bulunur. Biz bu bilgileri sys namespaces'ini kullanarak görebiliriz.

Şimdi bunları birer örnek ile inceleyelim;

Tüm ifadeleri çalıştırmak için başına Select * from koyunuz. Örneğin: Select name from sys.databases gibi. sys.assemblies: Veri tabanı içinde kayıtlı assembly bilgisini döndürür.

Uygulanacak veri tabanı, aktif hale getirilmelidir.

sys.databases: Server içinde kayıtlı veri tabanlarının bilgisini döndürür.

sys.database files: Bir veri tabanının; veri tabanı dosyalarının bilgisini

döndürür. Dosyaları görüntülenecek veri tabanı aktif hale getirilmelidir.

sys.linkedjogins: Bağlantılı server login'lerini döndürür. Linked Server

yapısı olmalıdır.

sys.remotejogins: Bağlantılı server'larda uzaktaki server'ı döndürür. Linked

Server yapısı olmalıdır. sys.servers: Yine bağlantılı server ve uzak server bilgisini birarada döndürür. sys.coİumns: Belirli bir veri tabanı içinde oluşturulmuş tüm sütunları gösterir.

Eğer sadece belli bir tablo veya view için bu bilgiyi almak isterseniz, aşağıdaki ifadeleri yazmanız gerekir. Bu da prestige tablosunun adını, dbo ise şema ifadesini gösterir.

SELECT * FROM sya.columns WHERE [object_id] = (SELECT [object_id] FROM sys.tables st JOIN sys.schamas ss ON st.schama_id = ss.schama_id WHERE st.name='prestige' AND ss.name = 'dbo')

sys.events: Veri tabanındaki Trigger ve Notification yapılarını gösterir sys.indexes: Veri tabanındaki index bilgileri döner. sys.tables: Veri tabanında bulunan tablo bilgileri döner.

sys.schemas: Veri tabanındaki şema bilgileri döner.

Diğer yapıları ise deneyiniz ve sonuçlarını gözlemleyiniz;

sys.views sys.database_permissions

sys.database_principals sys.database_role_members sys.configurations

DYNAMIC METADATA:

Dinamik metadata komutları; eski versiyonda DBCC ile başlayan ifadelerin

daha gelişmiş bir şekilde kullanılmasını sağlar. Örneğin: sys.dm_db_index_physical_stats, daha genel bilgi veren DBCC

SHOVVCONTIG yerine kullanılabilir. declare @db_id smallint declare @object_id int set @db_id = DB_ID(N'ogun3') set @object_id = OBJECT_ID(N'ogun3.dbo.prestige') select * from sys.dm_db_index_physical_states (@db_id, @object_id, NULL, NULL, NULL)

Diğer sorgulama komutlarını da bir tablo halinde inceleyecek olursak;

Dynamic Management View Açıklama

sys.dm_db_partition_stats Veri tabanı içinde bulunan her bir partition için sayfa ve satır sayısı döndürür.