Category Archives: MS SQL Server
SQL Server 2022 Auto-Drop Özelliği
SQL veri tabanında kullanılan istatistikler oldukça önemli bir yere sahiptir.
Tablolarda verilerin yüzde kaç oranında yer aldığını belirten istatistikler index ler ile birlikte otomatik oluşurlar.
SQL Server 2022 öncesinde elle oluşturulan istatistikler bazen sorunlara sebep oluyordu. Şema değişikleri de bunlardan biri.
Tablo ya da kolonların silinmesi durumunda şema değişeceğinden elle oluşturduğunuz istatistik silinmeyecektir ve dolayısıyla hatalara sebep olur ve silmek için ekstra işlem yapmak gerekir.
SQL Server 2022 de gelen Auto-Drop özelliği istatistiğin bağlı olduğu nesne silinirse istatistiğinde otomatik olarak silinmesini sağlar.
Tablomda auto-drop özelliği ile bir istatistik oluşturuyorum.
1 2 3 4 |
CREATE STATISTICS Personel ON Kullanici (Ad, Soyad, Sicilno) WITH AUTO_DROP = ON; |
Sorgu ile kontrol ettiğimde elle oluşturduğum istatistik için auto-drop özelliğinin açık olduğunu görmekteyim. Index den gelen istatistikte ise kapalıdır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
USE ortacdb; GO SELECT s.name AS statistics_name ,c.name AS column_name ,sc.stats_column_id ,s.auto_created ,s.user_created ,s.auto_drop FROM sys.stats AS s INNER JOIN sys.stats_columns AS sc ON s.object_id = sc.object_id AND s.stats_id = sc.stats_id INNER JOIN sys.columns AS c ON sc.object_id = c.object_id AND c.column_id = sc.column_id WHERE s.object_id = OBJECT_ID('dbo.Kullanici'); |
Oluşturduğum istatistiğe bağlı olan bir kolonu siliyorum.
İstatistik de silinmiş oldu.
Auto-drop özelliğini açmadan kolonu silseydim hata ile karışılacaktım.
Auto-Drop özelliği sonradan açılıp kapatılabilir.
UPDATE STATISTICS [dbo].[Kullanici] [Peronel] WITH AUTO_DROP = ON;
Ya da
UPDATE STATISTICS [dbo].[Kullanici] [Peronel] WITH AUTO_DROP = OFF;
SQL Server Dynamic Data Masking – Veri Maskeleme
SQL veri tabanımızda hassas veriler içeren tablolarda veri maskelemesi uygulayabiliriz.
DDM, bize tablodaki verilerin tamamının ya da bir kısmının yetkisiz kullanıcılara gözükmemesini sağlar.
Örneğin kredi kartı bilgilerinin sadece son hanesinin gözükmesi ya da TC kimlik numarası gibi hassas bilgilerin sadece baştaki ve sondaki belirli karakterlerin gözükmesi gibi.
Veri maskelemede yapıla bilen bazı maskeleme çeşitleri:
- Verinin tamamının gizlenmesi
- Satırda yer alan verinin belirli bir kısmının gizlenmesi. (İlk karakterler, son karakterler ya da ortadaki belirli karakterler).
- Email asresin gizlenmesi
- Verilerin random sayılar ile yer değiştirmesi.
Öncelikle veri maskelemesi yapacağımız bir tablo oluşturmamız gerekiyor. Tablomuz oluşturulurken kolonları da veri maskelemeye uygun halde oluşturmamız gerekiyor.
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE Kullanici ( ID int IDENTITY PRIMARY KEY, Ad nvarchar(20) NULL, Soyad nvarchar(20) MASKED WITH (FUNCTION = 'default()') NULL, EmailAdresi nvarchar(50) MASKED WITH (FUNCTION = 'email()') NULL, SicilNo int MASKED WITH (FUNCTION = 'random(3000, 5000)') NULL, TCNO varchar(50) MASKED WITH (FUNCTION = 'partial(3,"X",1)') NULL, KrediKarti varchar(50) MASKED WITH (FUNCTION = 'partial(0,"XXXX-XXXX-XXXX-",4)') NULL ); |
Bu örnekte ad kolonunda veriler açıktır, soyadı kolonu tamamen gizlidir (default), email adresi SQL in “email” parametresi ile maskelenir ve ayarlar varsayılan olarak gelir, sicil numarası 3000 ile 5000 arasındaki rastgele sayılan ile değiştirilir, TC kimlik numarasının ilk 3 hanesi ve son 1 hanesi gözükürken ortadaki sayılan gizlenir ve son olarak kredi kartının sadece son 4 rakamı gözükür.
Veri girişi yapıyorum.
1 2 3 4 5 6 |
insert Kullanici values ('Ortaç','Demirel','ortac@ortacdemirel.com','3456','89987654321','012311223344') insert Kullanici values ('Hasan','Toprak','hasan@gmail.com','4576','59787454981','03434454431') insert Kullanici values ('Ahmet','Demir','ahmet@hotmail.com','6744','12387600321','693519947342') insert Kullanici values ('Emel','Can','emel.can@hotmail.com','8971','43987654567','946224590025') insert Kullanici values ('Zeynep','Göl','zeynep.gol@yandex.com','9002','12988740183','128874460146') |
Veriler yetkili kullanıcılara açık şekilde gözükmektedir.
Sadece veri çekmesi için izine sahip bir kullanıcı oluşturup tabloma atıyorum.
1 2 3 4 5 |
create user testuser without login go grant select on Kullanici to testuser |
Bu kullanıcı ile verileri çektiğimizde verilerin maskelenmiş olduğunu görürüz.
1 2 3 |
execute as user ='testuser' select * from Kullanici |
SQL Server Row-Level Security (RLS)
SQL Server 2016 ile duyurulmuş olan satır seviyesinde güvenlik uygulaması kullanıcıların sadece yetkileri oldukları satırlara erişmesini sağlar.
Birçok kullanıcının aynı veri tabanını kullandığı ortamlarda kullanıcılar tablolarda sadece kendilerine ait bilgileri filtreleyerek eriştirmemizi sağlar.
Önemli bir uygulama olan RLS veri tabanı katmanında çalışır. Herhangi bir uygulamadan veriye erişim sağlanmak istendiğinde erişim kısıtlamaları uygulanır. Böylelikle daha iyi bir güvenlik katmanı sağlanır.
RLS Uygulaması:
Veri tabanıma ürün satışları ile ilgili bir tablo oluşturuyorum.
1 2 3 4 5 6 |
CREATE TABLE UrunSatis ( ID INT IDENTITY(1,1) PRIMARY KEY, Kisi NVARCHAR(10), Ulke NVARCHAR(10), SatisMiktari DECIMAL(10, 2) ); |
Satış tabloma satışlardan sorumlu personelin adı, satışın yapıldığı ülke ve miktarı giriyorum.
1 2 3 4 5 6 7 |
INSERT INTO UrunSatis (Kisi, Ulke, SatisMiktari) VALUES ('User1', 'Türkiye', 680), ('User3', 'USA', 1200), ('User2', 'Germany', 2300), ('User1', 'Türkiye', 750), ('User3', 'USA', 1100), ('User2', 'Germany', 790); |
SQL Server da Tüm Oturum Hesaplarını Devre Dışı Bırakırsanız Ne Olur?
MS SQL sunucuda yanlışlıkla tüm oturum (login) hesaplarını silerseniz ya da devre dışı bırakırsanız SQL sunucunuza bağlantı da kuramazsınız. SA hesabını da güvenlik nedeni ile daha önceden devre dışı bıraktıysanız zor durumda kalabilirsiniz.
Veri tabanlarını farklı SQL sunucuya taşıyıp çalıştırma seçeneği zahmetli de olsa mümkündür. Tabi veri tabanı bazında şifreleme yapmıyorsanız.
SQL Server size bu durum için alternatif bir çözüm yolu sunmaktadır.
Microsoft SQL Server, sunucuda “Local Administrators” grubunda yer alan bir kullanıcıya bu durumu düzeltmesi için imkan sağlar.
İlk adımda SQL de login hesaplarında olmayan bir kullanıcıyı yerel yönetici hesabına ekliyoruz ve SQL sunucuda bu hesap ile oturum açıyoruz.
AdventureWorks sample databases
https://github.com/microsoft/sql-server-samples/releases/tag/adventureworks
Güncelleme Dosyası ile Birlikte SQL Server Kurulumu
SQL server veri tabanı yönetim yazılımının güncellemeleri Service Pack ve Cumulative Update olmak üzere iki farklı yayın ile dağıtılır.
Service Pack güncellemeleri Microsoft un volume sitesinden indirdiğiniz SQL Server sürümünün içerisinde entegre olarak verilmektedir.
Cumulative Update leri ise ayrıca çekip yüklemeniz gerekmektedir.
SQL server yazılımını ilk kurduktan sonra CU güncellemelerini ayrı ayrı yükleyebilirsiniz.
İsterseniz SQL Server kurulumu sırasında da CU güncellemelerini kurulum sırasında yükleyebilirsiniz.
Bu işlemi yapmanın üç farklı yöntemi vardır.
Birincisi internete açıp olan sunucularda sql server yükleme penceresinden güncellemeleri buldurarak yükletebilirsiniz. Fakat bir çok veri tabanı yapısı internete kapalı ağda kurulmakta ve çalışmaktadır. Güvenlik içinde bu gereklidir.
Kapalı ağda SQL server kurulumu sırasında CU paketlerini de kuruluma eklemek için komut satırından kurulum yapmalısınız. Bunun sebebi de güncelleme paketinin yerini parametre olarak belirtebilirsiniz.
Öncelikle SQL server media içeriğini sunucuda bir klasöre kopyalıyoruz.
Ardından CU güncellemesini de bir klasöre kopyalıyoruz.
Klasörler aynı olmak zorunda değil hatta dvd içerisine koyup ISO haline de getirebilirsiniz.
SQL Server Express Sürüm Katılımsız Kurulum
SQl server yazılımının Express dışındaki katılımsız kurulum işlemlerini aşağıdaki makalede bulabilirsiniz:
SQL Server Management Studio Vulnerability Assessment
MS SQL Server Management Studio 17.4 sürümü ile birlikte yeni gelen özelliklerden biri de sql server güvenlik açığı değerlendirme aracı.
Bu araç veri tabanlarınızda yer alan güvenlik açıklarını rapor ederek sizi bilgilendiriyor ve nasıl çözeceğinize dair bilgiler veriyor.
SQL server sürümünüz en az 2008 olmalıdır. Yönetim aracınınız ise mutlaka 17.4.
Veri tabanı bazlı kullanılan bu aracı veri tabanızın üzerine sağ tıklayarak “tasks” bölümünden erişebilirsiniz.
Kısa bir süre içerisinde (veri tabanının büyüklüğüne bağlı olarak) ayrıntılı bir rapor vermektedir.
Güvenlik açıkları yüksek, orta ve düşük olmak üzere üç risk kategorisinde incelenmektedir.
Her bir uyarıya bir kimlik numarası atanır. Bu kimlik numaraları VA ile başlar. VA1245, VA1281 gibi.
ID lere tıklayarak problem hakkınca detaylı bilgiyi alabilirsiniz. Bu bilginin sonlarında da çözüm için yapılması gereken işlemler yer alır.
Oldukça kullanışlı olan bu araç her çalıştırıldığında bilgisayarınıza json dosyaları oluşturulur. Instance ve veri tabanı bazında ayrı klasörlerde yer alır bu dosyalar. SMSS ile açıp daha sonra da inceleyebilirsiniz.
SQL Server 2017 Read-Scale Availability Groups
Microsoft, AlwaysOn özelliğini her yeni SQL Server sürümünde biraz daha ileriye taşıyor.
SQL 2016’da domaine dahil olmayan makineler ile de AlwaysOn yapabilirken SQL Server 2017 sürümünde Read-Scale Availability Groups özelliğini getirdi.
Read-Scale Availability Groups özelliği Windows failover cluster rolünü kullanmadan sunucuları AlwaysOn grubuna dahil etmemizi sağlıyor. Haliyle listener a da ihtyaç duymuyor bu sistem.
Fail-over rolü olmayınca high-availability ve disaster recovery amaçları içinde kullanamıyoruz veri tabanı sunucumuzu.
Peki ne için kullanılıyor bu özellik, sadece veri tabanını farklı sunucular üzerinde çoğaltmak için kullanılıyor. Bunu yaparken de yukarda belittiğim üzere failover cluster hizmetini kullanmamıza gerek kalmıyor. Quorum yok, listener yok ve haliyle otomatik failover mekanizması da devre dışı.
SQL sunucuda failover hizmeti kurulu değil iken AlwaysOn özelliğini aktif edebiliyoruz.
Yeni bir Availability group oluşturken “Cluster type” bölümünden NONE seçmemiz gerekmektedir.
Bu özellik ile grubumuzu oluşturunca failover hizmeti yüklü olmayan sunucuları gruba dahil edebiliyoruz.
Otomatik geçiş olmamasına rağmen elle geçiş imkanı sağlıyor.
Mevcut grupları daha sonradan NONE olarak değiştiremeyeceğimizden dolayı bu işlemi başta yapmamız gerekmektedir.