Konu anlatımı
-
Upload
oktay-goekgoel -
Category
Environment
-
view
226 -
download
5
Transcript of Konu anlatımı
İ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)