Recent comments

İçerik Ara



Yasal Uyarı
Bu sitede sunulan tüm bilgi ve dökümanlar Turgay Sahtiyan tarafından yazılmaktadır. Yazıların kaynak göstermek şartıyla kullanılması serbesttir.

© Copyright 2009-2011
Takvim
<<  May 2012  >>
MoTuWeThFrSaSu
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
Keywords

Güvenlik açısından bir login’in şifresinin boş olması ya da login adı ile aynı olması bir sıkıntıdır. Bu makalemde paylaşacağım script’ler ile şifresi boş olan ya da şifresi login adı ile aynı olan SQL Login’leri bulabilirsiniz.

More...

SQL Server 2012 ile SQL Server Audit tarafında bazı geliştirmeler yapılmış durumda. Bu makalemde bu yenilikleri detaylı olarak inceliyor olacağız.

More...

Bildiğiniz gibi SQL Server’da şifreler hash’lenmiş olarak saklanırlar. Dolayısıyla login’lerin şifrelerinin ne olduklarını, güçlü mü yoksa zayıf mı oldukları direk olarak bilmemiz mümkün değildir. İşte bu amaçla PWDCOMPARE fonksiyonunu kullanabiliriz. Bu fonksiyon ile şifreyi istediğimiz bir şifre ile karşılaştırıp zayıf olup olmadığını kontrol edebiliriz.

More...

SQL Server varsayılan olarak, deny verilmiş bir tablo üzerinde bir kolona grant verildiyse bu kolonun sorgulanmasına izin vermektedir. “Common Criteria Compliance Enabled” parametresi ile bu davranış değiştirilebilir.

More...

SQL Server’da yetkilendirmeler sunucu, veritabanı, nesne ve kolon seviyesinde yapılabilmektedir. Bu makalede kolon seviyesinde yetkilendirmenin nasıl yapıldığına bakıyor olacağız.

More...

Atakları minimum hale getirmek ve veritabanı sunucusunu daha güvenli hale getirmek için Shared Memory ya da Named Pipes gibi kullanılmayan protokolleri disable etmekte hatta kullanıcıları TCP/IP’den bağlanmaya zorlamakta fayda vardır.

Bugünkü yazımda hangi protokollerin kullanılmadığını nasıl monitor edeceğimizi ve kullanılmayan protokollerin nasıl disable edileceğini görüyor olacağız.

More...

SQL Server 2008 R2, sunucu ve veritabanı seviyesinde daha güvenlikli bir ortam oluşturabilmek için bütün gerekli araçları sağlamaktadır. Görevler ayrılığı ilkesi kapsamında, SQL Server sunucusu üzerinde yetkili olan kişilerin minimum yetkiler ile ayarlanması, görevlerini yapabilecek kadar yetki ile donatılması yeterlidir.

Örneğin SQL Server DBA’lerin bile sysAdmin server role’un de olması pek güvenli bir ortam sağlamamaktadır. sysAdmin server role’u sunucu üzerinde yapılabilecek bütün işlemleri yapabildiği için çok zorda kalınmadıkça bu gruba kullanıcı dahil edilmemelidir.

SQL Server’da Görevler Ayrılığı'nın detaylarının anlatıldığı aşağıdaki whitepaper’ın ilginizi çekeceğini umuyorum.

SQL Server Seperation of Duties

 

İyi Çalışmalar

Turgay Sahtiyan

Bugünkü yazımda Database seviyesinde Select,Update gibi işlemler için verilen GRANT,DENY gibi yetkilerin, sys.sysprotects tablosundan nasıl sorgulanacağına bakıyor olacağız.

More...

Troubleshoot amaçlı, Visual Studio ile SQL Server üzerinde debug yapılmak istendiğinde aşağıdaki gibi bir hata alınabilir.

More...

Bugün üzerinde çalıştığım bir konudan bahsetmek istiyorum. Sunucularımdan birinde bir login windows authentication olarak bağlantı kurmasına rağmen, SQL Server Login’leri kontrol ettiğimde bu login’i göremedim.

More...

Bir Login’i drop ettiğimizde bu login’e bağlı olan user’lar DB altında tanımla kalmaya devam etmektedir. Bugün paylaşacağım script ile bir Login’i tamamen silmemiz mümkün.

More...

Bugün sizlerle paylaşacağım script ile sunucuda bulunan bütün DB’ler için hangi user’ların db_owner grubunda olduğunu sorgulayabilirsiniz.

More...

SQL Server 11 “Denali” ile gelen yeni özelliklerden biride Server Role create edebilmek. Bildiğiniz gibi SQL Server 2008 ve önceki sürümlerde olan server role’lerinde bir değişiklik yapamıyor yeni server role’leri create edemiyorduk. Denali ile beraber artık kendi server role’lerimizi create edebiliyoruz.

More...

Başlıktanda rahatça anlaşılacağı üzere bugün göreceğimiz sorgu ile Server’da bulunan bütün login’lerin server ve database role’lerini sorgulayacağız.

More...

Yazılım geliştiricilerin en büyük sıkıntılarından biri geliştirdikleri kodların başkaları tarafından çalınma riskidir. Execute file lar ile bu çalınma riski büyük ölçüde azaltılıyorken .Net yeni mimari yapısından kaynaklanan durum gereği .Net executable file ları bildiğiniz üzere reverse engineering yapılabilmektedir. Gerçi bu durumada önlem olarak obfuscator programları var ki bu konu başlı başına bir konu ve daha önce bloğumuzda işlenmiş durumda.

Peki ya Database Devolopment ? Geliştirdiğimiz SP, Function ve trigger ları müşteriye deploy etmemiz gerektiğinde kodlarıyla beraber apaçık şekilde mi vereceğiz. Ya da kendi firmamızda yazdığımız kodların gözükmesini istemiyorsak.

İşte bu tarz bir istek için SQL Server bize WITH Encryption key word unu sunmakta. Bu parametre ile SP, View, Function ve Trigger ları şifrelemek mümkün. 

WITH Encryption ile SP,View,Function ve Trigger ları Şifrelemek


4 obje içinde şifreleme tekniği aynı olduğu için ben sadece view i anlatacağım. Diğerlerinde aynı kod yapısı kullanılabilir.

Ufak bir view i WITH Encryption parametresi ile yazalım ve neler değiştiğini görelim.

use AdventureWorks2008
GO
CREATE VIEW VEncSample WITH ENCRYPTION
AS
  Select FirstName,LastName from Person.Person

 

View e sorgu çekmeyi deneyelim.

select * from VEncSample

 

Gördüğünüz gibi sorgu sonucunun gelme kısmında herhangi bir değişiklik yok.

Şimdi view i modify etmeye çalışalım bunun için AdventureWorks2008 >> Views kısmından view i bulalım.

view1

Burada ilk dikkatinizi çekmek istediğim konu VEncSample view inin yanındaki kilit işareti. Bu işaret bu view in encrypted olduğunu belirtmekte.

View e sağ tıkladığımızda Design in disable olduğunu göreceksiniz. Bununda sebebi encrypted olması. Dolayısıyla view i modify edemiyoruz.

view2

Peki birde view in Script ini oluşturmaya çalışalım. Bu seferde aşağıdaki gibi bir hata ile karşı karşıya kalıyoruz.

Property TextHeader is not available for View '[dbo].[VEncSample]'. This property may not exist for this object, or may not be retrievable due to insufficient access rights.  The text is encrypted. (Microsoft.SqlServer.Smo)

view3


Gördüğünüz gibi view in içeriğini görüntüleyemiyoruz.

Son bir not. Şifrelediğiniz obje lerin kodlarını kaybetmemek için script lerini açık bir halde yedeklemenizde fayda var.


İyi çalışmalar

Turgay Sahtiyan

SQL Server da xp_cmdshell ile windows komutları çalıştırabilmektedir. Örneğin diskte bir noktaya erişmek ve dosyaları bir yereden bir yere kopyalamak gibi windows üzerinde yapabildiğiniz her şeyi SQL Server üzerinden yetkili bir user ile yapabilirsiniz.

SQL Server üzerinde bu işlem yapılırken SQL Server Service account unun yetkileri kullanılır. Dolayısıyla bu account yetkili olduğu kadar hakkınız vardır. Ve genellikle bu account server ın üzerinde admin hakkına sahip olduğu için server ın üzerinde dilediğiniz işlemi yapabilirsiniz.

SQL Server da xp_cmdshell i kullanabilmek için sysAdmin rolüne sahip olmak gerekmektedir. Ya da proxy account kullanmak gerekmektedir.

Bugünkü makalemizin konusuda proxy account kullanarak sysAdmin olmayan user lara xp_cmdshell i kullandırabilmek için yapılması gereken ayarların ne olduğunu anlatmak olacaktır.

Adımlar halinde yapılması gereken işlemleri anlatalım.

  1. SQL Server configuration ayarlarından xp_cmdshell i kullanıma açalım. SQL Server kurulumunda bu özellik default olarak disable gelmektedir.
    sp_configure 'show advanced options',1
    reconfigure
    GO
    sp_configure 'xp_cmdshell',1
    reconfigure
      
  2. Adım olarak denemeler yapacağız bir sql login create edelim ve master a map yapalım. Kullanıcı adı xpDeneme ve şifresi x.
    USE [master]
    GO
    CREATE LOGIN [xpDeneme] WITH PASSWORD=N'x', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
    GO
    USE [master]
    GO
    CREATE USER [xpDeneme] FOR LOGIN [xpDeneme]
    GO
  3. Şu an da xpDeneme user ı ile SQL Server üzerinden xp_cmdshell 'dir' komutunu çalıştırırsanız aşağıdaki gibi bir hata alacaksınızdır.

    The EXECUTE permission was denied on the object 'xp_cmdshell', database 'mssqlsystemresource', schema 'sys'.


    Bu hatayı almaktayız, çünkü xpDeneme login i sysAdmin değil. Dolayısıyla proxy account kullanmamız gerekmekte. Bunun için aşağıdaki kodu server üzerinde yetkili bir windows yada domain user çalıştıralım.
    EXEC sp_xp_cmdshell_proxy_account 'windowsusername', 'password';
    GO
  4. xpDeneme login i için master db sinde bulunan xp_cmdshell e execute yetkisi verelim
    GRANT exec ON xp_cmdshell TO xpDeneme
    GO
  5. xpDeneme login i ile tekrar xp_cmdshell 'dir' kodunu çalıştırırsak sonucun geldiğini göreceksiniz. Dolayısıyla işlemlerimizi tamamlamış oluyoruz.

 

Burada dikkat etmeniz gereken şöyle bir şey var. Bütün ayarlamaları yapmış olmanıza rağmen aşağıdaki gibi bir hata almanız mümkün.

An error occurred during the execution of sp_xp_cmdshell_proxy_account. Possible reasons: the provided account was invalid or the '##xp_cmdshell_proxy_account##' credential

Bunun sebebide 4.adım ı server üzerinde yetkili olan bir user için yapmamış olmanız. Bu adıma da dikkat ederseniz bir sorun yaşayacağınızı düşünmüyorum. En azından bende böyle oldu :)

 

İyi çalışmalar

Turgay Sahtiyan

Login leri database lere yetkilendirirken Database Role lar kullanarak gruplarız.

Örneğin Developer lar için bir database i role ü oluşturur ve bu role e yetkilendirmeler yaparız. Developer User larıda bu role e ekleyerek otomatik yetkilendirmiş oluruz. Daha sonra developer yetkilerinde bir değişiklik yapmak istediğimizde tek tek developer user larda oynama yapmak yerine developer role ünü değiştiririz ve bütün developer user lar yansımasını sağlarız.

Böyle bir yapı kurgulamamız user ları daha iyi ve hızlı yönetmemizi sağlar.

Bugünkü konumuz ise bir DB için tanımlanmış Database Role de hangi user lar olduğunu listelemek.

Ortamlar arası DB taşıması yaparken, role lerde ki userlarıda bu makaledeki SP i sayesinde rahatça taşıyor olacağız.

İlk olarak listelemeyi yapacak olan SP ye bakalım.

USE [master]
GO
CREATE PROCEDURE [GetRoleMembers] @DBName sysname, @RoleName sysname
As

CREATE TABLE ##tmp_role_member_ids (id int not null, role_id int null, sub_role_id int null, generation int null)
CREATE TABLE ##tmp_names (name sysname)

declare @str varchar(max)=''
set @str='
declare @generation int
set @generation = 0
INSERT INTO ##tmp_role_member_ids (id) SELECT
rl.principal_id AS [ID]
FROM 
'+@DBName+'.sys.database_principals AS rl
WHERE
(rl.type = ''R'')and(rl.name='''+@RoleName+''')
UPDATE ##tmp_role_member_ids SET role_id = id, sub_role_id = id, generation=@generation
WHILE ( 1=1 )
BEGIN
	INSERT INTO ##tmp_role_member_ids (id, role_id, sub_role_id, generation)
		SELECT a.member_principal_id, b.role_id, a.role_principal_id, @generation + 1
            FROM '+@DBName+'.sys.database_role_members AS a INNER JOIN ##tmp_role_member_ids AS b
			ON a.role_principal_id = b.id
            WHERE b.generation = @generation
	if @@ROWCOUNT <= 0
		break
	set @generation = @generation + 1
END
DELETE ##tmp_role_member_ids WHERE id in (SELECT
rl.principal_id AS [ID]
FROM
'+@DBName+'.sys.database_principals AS rl
WHERE
(rl.type = ''R'')and(rl.name='''+@RoleName+''') )
UPDATE ##tmp_role_member_ids SET generation = 0;
INSERT INTO ##tmp_role_member_ids (id, role_id, generation) 
    SELECT distinct id, role_id, 1 FROM ##tmp_role_member_ids
DELETE ##tmp_role_member_ids WHERE generation = 0

insert ##tmp_names
SELECT
u.name AS [Name]
FROM
'+@DBName+'.sys.database_principals AS rl
INNER JOIN ##tmp_role_member_ids AS m ON m.role_id=rl.principal_id
INNER JOIN '+@DBName+'.sys.database_principals AS u ON u.principal_id = m.id
WHERE
(rl.type = ''R'')and(rl.name='''+@RoleName+''')
ORDER BY
[Name] ASC
'
exec (@str)
--print @str

select Name from ##tmp_names

drop table ##tmp_role_member_ids
drop table ##tmp_names

 

Gördüğünüz gibi SP yi Master DB sinde create ediyoruz. Her DB için ayrı SP kullanmaktansa DB yi parametre olarak göndereceğiz.

2. parametre ise role parametresi. Hangi DB içindeki hangi Role de ki user lar?

Kullanımına bakacak olursak;

Use Master
GO
exec GetRoleMembers 'AdventureWorks','My_Role'
GO

 

Şimdi örneğimize geçelim.

İlk önce tanımlamaları yapıyoruz.

User ları create edelim.

use Master
GO
CREATE LOGIN User1 WITH PASSWORD=N'u',DEFAULT_DATABASE=[master]
CREATE LOGIN User2 WITH PASSWORD=N'u',DEFAULT_DATABASE=[master]
CREATE LOGIN User3 WITH PASSWORD=N'u',DEFAULT_DATABASE=[master]
CREATE LOGIN User4 WITH PASSWORD=N'u',DEFAULT_DATABASE=[master]
CREATE LOGIN User5 WITH PASSWORD=N'u',DEFAULT_DATABASE=[master]
GO

 

User ları AdventureWorks DB sinde açalım.

Use AdventureWorks
GO
CREATE User [User1] FOR LOGIN [User1];
CREATE User [User2] FOR LOGIN [User2];
CREATE User [User3] FOR LOGIN [User3];
CREATE User [User4] FOR LOGIN [User4];
CREATE User [User5] FOR LOGIN [User5];
GO

 

Yeni bir DB Role tanımlayalım.

Use AdventureWorks
GO
CREATE ROLE [My_Role] AUTHORIZATION [dbo]
GO

 

User ları bu Role e ekleyelim.

Use AdventureWorks
GO
EXEC sp_addrolemember N'My_Role', N'User1';
EXEC sp_addrolemember N'My_Role', N'User2';
EXEC sp_addrolemember N'My_Role', N'User3';
EXEC sp_addrolemember N'My_Role', N'User4';
EXEC sp_addrolemember N'My_Role', N'User5';
GO

 

Tanımlamalar bitti. Şimdi SP yi kullanarak AdventureWorks DB sindeki My_Role DB Role üne eklenmiş user ları listeleyelim.

Use Master
GO
exec GetRoleMembers 'AdventureWorks','My_Role'
GO

 

Name
============
User1
User2
User3
User4
User5

Bu SP yi kullanarak user lar için Role e ekleme script i de oluşturabilirsiniz. Bunuda size bırakıyorum J

İyi çalışmalar,

Turgay Sahtiyan

Bir kullanıcıya DB bazında yetkilendirmelerin nasıl verildiğini SQL Server da Kullanıcı Yaratma ve Yetkilendirme yazımda anlatmıştım. Eğer bu yazımı okumadıysanız bundan sonrasını anlamak için lütfen okuyunuz.

Bir kullanıcıyı sysAdmin yada bunun gibi server bazlı yetkilendirmeler değilde db_owner yada db_datareader tarzı DB bazlı yetkilendirmeler her DB için ayrı ayrı verilir.

Yani eğer 10 tane DB niz varsa ve create ettiğinzi yeni bir user bu 10 DB de de db_owner olsun istiyorsanız User Mapping kısmında her DB için db_owner seçeneğini seçmeniz gerekir.

Peki bu işin kolay bir yolu yok mu? Tabiki var ve bu yazımızın konusuda bu.

Önce yetkilendirme işlemini yapacağımız bir user create edelim.

CREATE LOGIN MyUser 
WITH 
	PASSWORD=N'm',
	
	DEFAULT_DATABASE=[master],
	
	CHECK_EXPIRATION=OFF,
	
	CHECK_POLICY=OFF

Şimdide bu user ı server da bulunan bütün DB lerde db_owner yapalım.

select @str += 'USE ['+ name +']; ' + CHAR(10) +
	   'CREATE USER [MyUser] FOR LOGIN [MyUser] ' + char(10) +
	   'EXEC sp_addrolemember N''db_owner'', N''MyUser'' ' + char(10) + char(10)
from sys.databases where database_id>4
--print (@str)
exec @str


İşlem bu kadar basit.

İyi Çalışmalar

Turgay Sahtiyan

Bu makalemde DDL trigger ile SQL server login işlemi esnasında gelen login isteğini kontrol edeceğiz ve kullanıcı istediğimiz makinadan yada uygulamadan bağlanmadıysa login i engelleyeceğiz.

Canlı bir örnek vermek gerekirse; production sql server ortamınızda bir user create ettiniz ve uygulamada bu user ı kullanıyorsunuz. User ın bu uygulama harici kullanılmasını örneğin SSMS kullanılarak login olunmasını engellemek istiyorsunuz. İşte bu engellemeyi DDL trigger ile yapacağız.

Ama bu işleme geçmeden önce SQL Server DDL Trigger lar hakkında biraz bilgi vermek istiyorum.

DDL – DML Nedir?


SQL Server da DML(Data Manipulation Language) ve DDL(Data Definition Language) olmak üzere 2 tip script tipi vardır.

DML, database üzerinde yapılan insert,update,delete gibi data manipulation işlemlerini ifade eder. DML trigger ların oluşturulması ile alakalı daha önce yazdığım yazıyı okumanızı tavsiye ederim. Buradan erişebilirsiniz.

DDL ise database yada server üzerinde yapılan obje create,drop,alter gibi obje değişikliklerini ifade eder. Database creatinde yada table drop unda DDL trigger kullanarak işlemi yakalayabilir ve buna göre aksiyon alabiliriz.


İlk DDL Trigger ımız


Örneğin aşağıdaki DDL trigger ile kullanıcıların database üzerinde table drop etmesini engelleyebiliriz.

CREATE TRIGGER trg_Table_Drop
ON DATABASE 
FOR DROP_TABLE
AS 
   PRINT 'Table drop işlemi engellenmiştir!. "trg_Table_Drop trigger ını disable etmeniz gerekmektedir.' 
   ROLLBACK

 

DDL Trigger ı geçici olarak disable etmeniz gerekebilir. Örneğin yukarıdaki gibi table drop ddl trigger ınız var. Drop etmeye çalıştınız ve hata mesajını aldınız. Ama genede drop etmeniz gerekiyor. Bu durumda trigger ı disable edip drop işlemini yaptıktan sonra tekrar enable edebilirsiniz.

DISABLE TRIGGER [logon_ddl_trg] ON ALL SERVER
ENABLE TRIGGER [logon_ddl_trg] ON ALL SERVER

 

Ayrıca daha önce yazdığım tüm trigger ları disable-enable etme script ine aşağıdaki url den erişebilirsiniz.
http://www.turgaysahtiyan.com/post/Sql-Server-da-Triger-larc4b1-Sql-Kod-ile-Aktif-ve-Deaktif-Etmek.aspx

Server da create edilmiş DDL Trigger lara sys.server_triggers table ından bakabilirsiniz.

select * from sys.server_triggers

 

sys.server_trigger_events tableını kullanarakta bu trigger ların hangi event ler için create edilmiş olduğuna bakabilirsiniz.

select * from sys.server_trigger_events

 

Daha öncede söylediğim gibi DDL trigger lar sadece bazı event ler ile tetiklenmektedir. Bu event lerin tamamına aşağıdaki url den erişebilirsiniz.
http://msdn.microsoft.com/en-us/library/bb522542.aspx

DDL Trigger İle Login Kontrolü


Şimdi asıl konumuz olan DDL trigger ile Login kontrolüne geçelim.

Konuyu anlamanın daha anlaşılır olacağını düşündüğüm için direk örneklere geçiyorum.

Örneklere geçmeden önce “t” name inde bir SQL server user create ediyoruz.

USE [master]
GO
if exists (Select * from sql_logins where type_desc='SQL_LOGIN' and name='t')
  DROP LOGIN [t]
GO
CREATE LOGIN [t] WITH PASSWORD=N't', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO

 

Şimdi örnekler;

  1. “t “ SQL Server login i SQL Server a bağlanamasın. 
     
    if exists(select * from sys.server_triggers
        where name='logon_ddl_trg')
    DROP TRIGGER [logon_ddl_trg] ON ALL SERVER;
    GO
    
    ALTER TRIGGER [logon_ddl_trg]
    ON ALL SERVER WITH EXECUTE AS 'sa'
    FOR LOGON
    AS
    BEGIN 
      IF ORIGINAL_LOGIN()= 't' BEGIN
    		  rollback;
      END
    END
        

    Yukarıdaki trigger ı Execute ettikten sonra SSMS üzerinden bağlantı kurmayı denediğinizde aşağıdaki gibi bir hata mesajıyla karşılasacak ve bağlantı kuramayacaksınız.

    image 

  2. “t” user ı sadece management studio kullanarak login olamasın, diğer uygulamalarla login olabilsin.

    if exists(select * from sys.server_triggers
        where name='logon_ddl_trg')
    DROP TRIGGER [logon_ddl_trg] ON ALL SERVER;
    GO
    
    ALTER TRIGGER [logon_ddl_trg]
    ON ALL SERVER WITH EXECUTE AS 'sa'
    FOR LOGON
    AS
    BEGIN 
       IF ORIGINAL_LOGIN()= 't' 
         and APP_NAME()= 'Microsoft SQL Server Management Studio' BEGIN 
    		  rollback;
      END
    END


    Trigger ı execute ettikten sonra SSMS üzerinden bağlantı kurmayı denerseniz bağlanamadığınızı göreceksiniz.

    Birde osql ile bağlantı kurmayı deneyelim. Bunun için command promp ta osql –S sahtiyan_tu –U t –P t yazıp enter a basalım. Bingo. Bağlantı kurabildik. :)

    Bu tarz bir trigger la application için tanımladığınız user ın sadece o application ile kullanılmasını sağlayabilir ve güvenliğinizi arttırabilirsiniz.

  3. Son olarak LoginName ve ApplicationName gibi bilgileri gelen eventdata dan almak mümkün. Bununla alakalı örneğide aşağıda inceleyebilirsiniz.
    if exists(select * from sys.server_triggers 
    	where name='logon_ddl_trg')
      DROP TRIGGER [logon_ddl_trg] ON ALL SERVER;
    GO
    
    CREATE TRIGGER [logon_ddl_trg]
    ON ALL SERVER WITH EXECUTE AS 'sa'
    FOR LOGON
    AS
    BEGIN
       declare @EventData xml,
               @PostTime datetime,
               @LoginName varchar(50),
               @ClientHost varchar(50),
               @LoginType varchar(50)
       set @EventData = eventdata()
    
    
       set @PostTime = @EventData.value('(/EVENT_INSTANCE/PostTime)[1]', 'datetime')
       set @LoginName = @EventData.value('(/EVENT_INSTANCE/LoginName)[1]', 'varchar(50)')
       set @ClientHost = @EventData.value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(50)')
       set @LoginType = @EventData.value('(/EVENT_INSTANCE/LoginType)[1]', 'varchar(50)')
    
       if @LoginType = 'SQL Login' and @LoginName = 't'
          rollback;          
    end
    GO

İyi Çalışmalar

Turgay Sahtiyan

Güvenlik nedeniyle SQL Server login lerden Builtin/Administrator ı genelde kaldırırız biliyorsunuz. Bu şekilde sadece sa kullanıcısının ve bizim belirlediğimiz yetkili kullanıcıların sysAdmin kalmasını sağlarız.

Peki ya sa şifresini unutursak yada kaybedersek ne yapacağız?

Sıkça karşılaşılan bu problemin elbette bir çözümü var. Bu makalede bunu görüyor olacağız.

Unutulan sa şifresinin tekrar set edilmesi

  1. SQL Server Configuration Manager >> SQL Server >> Log On account tan SQL Server ın üzerinde kurulu olduğu makinada admin haklarına sahip bir windows account u seçiyoruz. Apply >> OK diyerek kapatıyoruz.
    image
  2. Local Computer Policy>>Windows Settings>>Security Settings>>Local Policies>>User Rights Assignment>>Log on as a service e bu account u ekliyoruz.
  3. Yaptığımız policy değişikliği update etmek için command prompt u açarak gpupdate /force yazıp enter a basıyoruz.
    image 
  4. SQL Server Configuration Manager dan SQL Server ı stop ediyoruz.
  5. SQL Server ı –m parametresi ile tekrar start ediyoruz. Bunun için command prompt ta C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn\sqlservr.exe –m çalıştırıyoruz.
  6. Command prompt ta OSQL ile bağlanarak SA şifresini set ediyoruz.
    osql –E
    ALTER LOGIN [sa] WITH PASSWORD=N'1' WITH CHECK_POLICY = OFF
    GO
  7. -m parametresini kullandığımız command prompt ta exit yazıp enter a basıyoruz. Diğer açtığınız command prompt larıda exit yazarak kapatınız.
  8. SSMS kullanarak sa ile server a bağlantı kurabildiğimizi görüyoruz.
  9. 1 nolu adımda log on da windows account u kullanmıştık. Bunu tekrar eski haline getiriyoruz.
  10. SQL Server Service ini restart ediyoruz.

Bu adımlardan sonra SQL Server sa şifresini değiştirmiş oluyoruz.

İşinize yaraması umuduyla.

Turgay Sahtiyan