Kişi/kurumlar için en değerli varlık olan Veri’nin işlenip Bilgi’ye dönüşmesi günümüzde fark yaratacak en önemli unsurdur. Bu açıdan bakıldığında, veri/bilgi kişi/kurumlar için hayati derecede değer taşımakta, güvenliğinin sağlanması da en çok dikkat edilmesi gereken konu haline gelmektedir.
Veri/Bilgi’nin güvenliğinin sağlanması için gizlilik (confidentiality), erişilebilirlik (availability) ve bütünlük (integrity) kırılımları göz önünde bulundurulmalıdır. Doğru veri/bilgiye gerektiğinde sadece yetkilendirilmiş kişilerin güvenli yöntemlerle erişiyor olması sağlanmalıdır.
Bu yazımızda, veri-bilginin saklandığı veritabanı ortamlarından biri olan Microsoft SQL Sunucu üzerindeki güvenlik kontrollerinden aşağıda sıralanmış maddeler halinde bahsedeceğiz:
1- MS SQL Server Versiyon Kontrolü;
Üretici tarafından yayınlanan service pack ve patchler kontrollü olarak uygulanmalıdır. Sisteme şimdiye kadar hangi patch ‘lerin uygulanıp uygulanmadığını kontrol etmek için aşağıdaki sorgu kullanılmalıdır. Sorgu SQL server sürüm numarasindan patch seviyesine kadar versiyon bilgisi verir.
SELECT @@version
Script çıktısı ;
Microsoft SQL Server 2008 (RTM) – 10.0.1600.22 (X64) Jul 9 2008 14:17:44 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) |
Yukarıda çıktıda görüldüğü gibi güncel patch makine üzerine geçilmemiş.
2 – SQL Server üzerindeki tüm veritabanlarının listesinin alınması ;
Sunucu üzerinde çalışan tüm veritabanı instancelarını kontrol etmemiz gerekmektedir.
select * from sys.databases
Script çıktısı ;
3- SQL server üzerindeki tüm kullanıcıların Listesi;
Database’ de yer alan tüm kullanıcılar incelenir. İşten ayrılmış kullanıcılar ile uygulama hesapları kontrol edilir. (çalışan kullanıcı bilgileri listesinin güncel haline IK biriminden ulaşılır)
SELECT * FROM sysusers where islogin = 1
Script çıktısı;
4- DBA Hakkına Sahip Kullanıcıların Listesi ;
Kullanıcıların neden bu yetkiye sahip olması gerektiği açıklanır. Önceden kalmış olan veya yanlışlıkla verilmiş olan yetkiler var ise bunlar geri alınmalıdır. Sorgu SQL Server üzerinde tanımlı tüm DBA ‘lerin listesini verir.
sp_helprolemember db_owner
Script çıktısı ;
5 – Select dışında yetkisi olan kullanıcı listesi ve yetkileri ;
Burada beklenilen database’ de update, delete vs. gibi (DML) kritik yetkilerin sadece yetkili kullanıcılarda olması gerektiğidir. Denetimlerde, bu yetkilerin “Görevler Ayrılığı” ve “En Az Haklar” prensiplerine uygun olduğunu göstermemiz beklenmektedir.
SELECT a.*, b.* ,*
FROM sys.database_principals a
INNER JOIN sys.database_permissions b ON b.grantee_principal_id = a.principal_id
WHERE b.permission_name not like ‘%SELECT%’
Script çıktısı ;
6– Şifresi boş olan kullanıcıları bulma;
SQL Server 2005/2008 de password u boş olan SQL kullanıcılarını aşağıdaki sorgu ile bulabilirsiniz .
select name
from sys.sql_logins
where pwdcompare(”, password_hash) = 1
Özellikle sa kullanıcısı kontrol edilmelidir.
7 – Password Policynin Çekilmesi;
SQL server üzerinde kullanıcı password ‘i yaratılırken password policy’nin uygulanıp uygulanmadığı ( Enforce Password Policy) kontrolünü ve expiration policy’nin uygulanıp uygulanmadığını aşağıdaki sorgu ile görüntüleyebiliriz.
Enforce Policy: Şifre politikası (lock, örn. 5 dk içinde 7 kez yanlış girerse 20 dk lock kalsın)
Expiration Policy: Şifre politikası (expire, örn. 42 günde bir şifresini değiştirsin)
select name ,is_expiration_checked,is_policy_checked ,*
from sys.sql_logins where is_expiration_checked = 0 or is_policy_checked= 0
Script çıktısı ;
Sorgunun çıktısında da görüldüğü üzere is_expiration_checked kolonu “0” gelenler expiration policy uygulanmayan kullanıcıları, is_policy_checked kolonu ”0” gelenler enforce password policy uygulanmamış kullanıcıları ve her iki kolon değeri de “0” gelen kullanıcılar ise her iki politikanın da uygulanmamış olan kullanıcıları listeler.
8 – Windows authentication ile SQL Server’a Bağlanan Kullanıcı Listesi;
SQL server üzerinde tanımlı olan kullanıcılardan Windows login olarak yaratılmış olan kullanıcılar server ‘ın kurulu olduğu makineye bağlandıkları anda tool (Management Studio vs ) aracılığı ile sql server ‘a şifre sormaksızın login olabiliyorlar demektedir. Bu durum güvenlik açığına neden olduğundan bu kullanıcıların sql server login olarak güncellenmesi daha doğru olacaktır. (Kurum risk yaklaşımına göre, kabul edilebilir. Edilmiyorsa, işletim sistemi kullanıcıları ile SQL’e bağlantıya izin verilmemeli, local SQL authentication kullanıcılar yaratılmalıdır.)
Select * from sys.server_principals where type_desc = ‘WINDOWS_LOGIN’
Script çıktısı ;
Kendi ortamınız için bu durumu değerlendirip karar vermeniz gerekmektedir.
9 – SQL authentication ile SQL Server’a Bağlanan Kullanıcı Listesi
SQL login’de kullanıcılar SQL veritabanında yaratılır, işletim sistemi seviyesinde yaratılmaz.
Yukarıdaki maddede WINDOWS_LOGIN olarak tanımlı kullanıcılar listelenmiştik, aşağıdaki sorgu ile de ‘SQL_LOGIN’ ‘leri listeye biliriz.
Select * from sys.server_principals where type_desc = ‘SQL_LOGIN’
Script çıktısı ;
10- Backup Operator Hakkına Sahip Kullanıcı Listesi ;
Kullanıcıların neden bu yetkiye sahip olması gerektiği açıklanır. Önceden kalmış olan veya yanlışlıkla verilmiş olan yetkiler var ise bunlar geri alınmalıdır. Sorgu SQL Server üzerinde tanımlı tüm db_backupoperator yetkisine sahip kullanıcıların listesini verir.
sp_helprolemember db_backupoperator
Script çıktısı ;
Ayrıca, bu rolün hangi yetkilere sahip olduğu kontrol edilmelidir (drop table varsa gerekli mi vb)
11- SQL server üzerindeki tüm SYNONYM lerin listesi ;
Adında anlaşılacağı gibi tablo üzerinde public synonym oluştursanız tüm veritabanı kullanıcıları bu synonym’ ler üzerinden tabloları okuyabilir, güncelleyebilir vs. duruma gelebilmektedir. Dolayısıyla bu açıdan bakıldığında synonym’ ler veri güvenliği açısından bakıldığında kullanılması pek istenilmeyen nesnelerdir.
Database’ de kullanılan synonym’ leri listelemek için aşağıdaki sorguyu kullanabilirsiniz;
select * from sysobjects where xtype = ‘SN’
12 – Manuel yaratılmış Roller tanımlanmış memberları ve default tanımlı roller;
Manuel olarak Sql Server üzerinde yaratılan roller aşağıdaki sorgu ile listelenmektedir.
select name , *
from sys.database_principals
where type=‘R’ and principal_id>0 and is_fixed_role=0
Script çıktısı ;
Bu madde ile database’ de yer alan tüm kullanıcılara ve rollere verilmiş olan yetkileri göstermektedir.
Kullanıcılara atanmış roller;
Guvenlik rolüne atanmış kullanıcıları listelemek için;
select dp.name
from sys.database_role_members drm
inner join sys.database_principals dp on drm.member_principal_id =dp.principal_id
where drm.role_principal_id =( select principal_id
from sys.database_principals
where name =‘guvenlik’)
Role ve kullanıcılara atanmış yetkiler incelenmelidir.
SQL Server üzerinde tanımlı manuel ve default olarak tanımlı tüm rolleri listelemek için ;
Sorgulamayı aşağıdaki sorgu ile yapabiliriz.
SELECT * FROM sysusers where issqlrole = 1
Script çıktısı ;
Yukarıdaki çıktıyı incelediğimizde altuid kolonu “1” den farklı olarak gelenler manuel tanımlanmış olan roller , “1” olarak gelenler ise kurulumla beraber olarak gelen rollerdir.
13 – SQL Server Linked Server Kontrolü ;
Farklı iki veritabanı üzerinden tek bir query penceresinde tabloları birbirine bağlayarak çektiğimiz sorgular için kullandığımız linklerin listesini alabilmek için aşağıdaki sorgu kullanılabilir. Bu linklerin ne amaçla kullanıldığı kayıt altına alınmalı, test ortamlarıyla üretim ortamları arasında bu tür bağlantılara izin verilmemelidir.
exec sp_linkedservers
Script çıktısı;
14 – SQL Sunucuda tanımlı Windows İşletim Sistemi Kullanıcı Grupları;
exec xp_enumgroups
SQL sunucunun işlertim sisteminde tanımlı kullanıcı gruplarının kontrol edilmesi gereklidir. (Örn. Local Administrators grubuna üye kullanıcıların SQL servisi üzerinde yönetici hakkı vardır.)