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-2013
Takvim
<<  July 2014  >>
MoTuWeThFrSaSu
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
Keywords

SQL Server’a windows authentication yani windows account’lar ile bağlantı kurulurken önerilen bağlantı protokolü KERBEROS’tur. Bu yazımda güvenlik açısından oldukça önemli olan bu best practice üzerine konuşuyor olacağız.

More...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2012 ile beraber gelen güvenlik yeniliklerinden biri de windows group’lar için default schema atayabilme özelliğidir. Bugünkü makalemde bu konu üzerine konuşuyor olacağız.

More...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server’da tanımlı bir login’in şifresinin en son ne zaman değiştirildiğini bulmak için aşağıdaki fonksiyonu kullanabilirsiniz.

More...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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

More...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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...

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan