Uygulamalarda içeriklerin dinamikleştirilmesi ve kişilere özel sunumlar ve işlemler yapılabilmesi için bilindiği gibi veritabanı sistemleri kullanılmaktadır. İlgili sistemler bir yandan uygulamalarda bize kullanış kolaylığı sağladığı gibi bir yandan da çok geniş yelpazede bir atak yüzeyi sunmaktadır. Bu yazıda uygulamaların SQL ve NoSql veritabanı güvenli konfigürasyonu hakkında konulardan bahsedilecektir. Bu makale oluşturulurken kaynaklarda belirtilen Owasp serileriden faydalanılmıştır. Ayrıca kodsal düzeyde fortifyla yapılan taramalarda çıkan bulgulardan bir kaçını inleyeceğiz.
Backend Veritabanlarının Korunması
Backend veritabanlarını diğer sunuculardan izole edilerek mümkün olduğunca az sayıda hosta hizmet vermesi sağlanmalıdır. Tabiki bu kısım ağ mimarisine göre değişecektir.
Aşağıda yazılan maddeler bu kapsamda yönlendirici olacaktır:
- Tcp bağlantılarını devre dışı bırakarak tğm erişimlerin yerel soket dosyası üzerinden okunacak şekilde yapılandırılması.
- Veritabanının yalnızca localhost üzerinden çalışacak şekidle yapılandırılması
- Portlara erişimin firewall kurallarıyla kısıtlanması
- Veritabanu sunucusunun uygulama sunucusundan izole edilmiş ayrı bir DMZ te tutulması.
- Veritabanı yönetimi amacıyla kullanılan phpmyadmin gibi web tabanlı uygulamalarda aynı şekilde korunmalıdır.
Uygulamanın büyük kısmı kullanıcı tarafında çalışıyorsa thick client gibi bu şekilde güvenilmeyen sistemlerde erişim kontrollerinin kısıtlanabileceği API üzerinden veritabanına iletişim kurmalıdır.
Taşıma Katmanı Korumasını Uygulamak
Veritabanı sistemlerinin çoğu varsayılandaki yapılandırması şifrelenmemiş ağ bağlantıları (Microsoft Sql Server gibi ilk bağlantıda ) ve tahmin edilebilir parolalar ile çalışır. İlk iletişimin şifreli olduğu bağlantılarda sonraki iletişimde şifresiz olarak devam edeceği için tüm hassas bilgileri açık metin olarak iletilecektir.
Trafiği şifrelenmesi için aşağıdaki önerilerin takip edilmesi fyadalı olacaktır:
- Veritabanının yalnızca şifrelenmiş iletişimler kuracağı şekilde yapılandırılması
- Sunucuya yetkili otoriteler tarafından imzalanmış güvenilir bir sertifika yüklenmesi
- İstemci uygulamaları TLSv1.2+ ve modern cipher (e.g, AES-GCM or ChaCha20) larla kullanılması.
Güvenli Kimlik Doğrulama Yapılandırması
Veritabanları yerel sunuculardan bağlantı isteği gelsede daima kimlik doğrulama istemeledir.
Veri tabanı hesapları:
- Güçlü ve benzersiz parolalarla korunmalı
- Yalnızca bir uygulama veya hizmet tarafından kullanılmalı
- Minimum izinlerle kullanılmalıdır.
Mevcut hesapların rutin yönetim süreçleri aşağıdaki gibi olmalıdır:
- Hesapların hala kullanılıp kullanılmadığının tespit edilmesi.
- İzinlerin kontrol edilmesi,yeni eklenen farklı uygulama 3. Parti uygulamaların izinlerinin gözden geçirilmesi.
- Devre bırakılan, askıya alınan, uzun süre kullanılmayan, eski versiyonu kaldırılmamış fakat kullanımda olmayan uygulamaların veritabanı kullanıcı hesapları denetlenmeli ve kaldırılmalıdır.
- Ayrılan personelin ya da herhangi bir şekilde saldırıya uğramış ve/veya hesapları ele geçirilmişse hesabı kaldırılmalıdır.
Microsoft SQL Server için, SQL Server hesapları yerine mevcut Windows hesaplarının kullanılmasıyla uygulama bu kullanıcılarla sisteme bağlaancaktır. Bu sayede de ilgili kimlik bilgilerini saklama gereksinimide ortadan kalkacaktır. MySQL için de “Windows Native Authentication Plugins” eklentisi benzer kullanım kolaylığı sağlar.
Veritabanı Kimlik Bilgilerini Güvenli Bir Şekilde Saklama
Uygulamanın kaynak kodunda veritabanı kimlik bilgileri, şifreli ya da açık metin olarak saklanmamalıdır. Ayrıca bu kimlik bilgileri pentest aşamalarında da karşıldığı gibi test aşamalarında kullanılması için yorum satırı olarakta bırakılmamalı/unutulmamalıdır.
Bunun yerine, şu şekilde yapılandırılmış bir dosyada saklanmalıdırlar:
- Uygulama kök dizinin dışında yer almalıdır.
- Yalnızca dosyayı okuması gereken kişilere sadece okuma izni verilmelidir.
- Github, gitlab gibi platformlara bu dosyalar yüklenmemelidir.
- ASP.NET’teki web.config te bulunan şifreleme yöntemleri gibi yöntemlerle bu parolalar şifrelenmelidir.
Güvenli İzinler Oluşturma
Veritabanı yöneticileri kullanıcı hesaplarına uygulamaların çalışabileceği en düşük ayrıcalıklı şekilde izin tanımlamalıdır.
Tüm ortamlarda aşağıdakileri yapabilirsiniz:
- root, sa ve SYS hesaplarınının kullanmaması
- Hesaplara veritabanı yönetici haklarının verilmemesi
- Yalnızca izin verilen localhost yada uygulama sunucusunun adresi gibi adreslerden bağlanılması sağlanması
- Hesabın yalnızca erişmesi gereken veritabanlarına erişmesinin sağlanması, geliştirme uat ve production ortamlarının tümünün veritabanı ve hesaplarının ayrı tutulması
- Veritabanında kullanıcıların çalıştırdığı genelde uygulamalarda çalıştırılan Select,Update ve Delete sorguları haricindeki sorguların kısıtlanması, Hesabın veritabanı sahibi olması yetki yükseltme zafiyetine sebep olabilir.
- Bir veritabanın diğer veritabanına gerekmedikçe doğrudan erişecek şekilde yapılandırılmaması, Eğer zorunlu bir durum varsa kullanıcının minimum yetkilerle tablo ve veritabanlarına erişimin sağlayacak şekilde oluşturulması
Kritik seviyede hassas bilgiler içeren uygulamalar için izinlerin aşağıdaki gibi daha sıkı uygulanması önerilir:
- Tablo düzeyinde izinler
- Sütun düzeyinde izinler
- Satır düzeyinde izinler.
- Verilerin tutulduğu asıl tablolar yerine kısıtlı erişimlerle işlem yapmayı sağlayan viewlerin oluşturularak kullanılması
Veritabanı Yapılandırması ve Sıkılaştırma
Veritabanı sunucusunun işletim sistemi, CIS Benchmark’ları veya Microsoft Güvenlik Benchmark’ları gibi güvenli bir kontrol listesiyle bilikte sıkılaştırılmalıdır.
Veritabanı uygulaması da kısıtlamalar ve erişimlerle birlikte kontrol edilerek düzgün bir şekilde yapılandırılmalı ve sertleştirilmelidir.
Aşağıdaki maddeler, mevcutta bulunan tüm veritabanı uygulamaları ve platformları için uygulanmalıdır:
- Güncellemelerin takip edilmesi ve güvenli şekilde yüklenmesi
- Veritabanı hizmetlerini düşük ayrıcalıklı bir kullanıcı hesabı altında çalışacak şekilde yapılandırın.
- Varsayılan sistem hesaplarının ve veritabanlarının kaldırılması
- Loglarla veritabanını dosyalarının farklı disklere konumlandırılması
- Veritabanının düzenli yedeklerinin alınarak uygun izinlerde korunması ve şifrelenmesi
Ek olarak aşağıda bulunan maddelerle belirli veritabanı yazılımları için önerileri bulabilirsiniz
MSSQL Server Güvenlik Sıkılaştırması
- SQL Server Configuration Manager yada SQL Server Surface Area Configuration gibi araçlarla gereksiz hizmetleri, özellikleri ve protokollerin devre dışı bırakılması
- Xp_cmdshell ve xp_dirtree gibi kullanılması gerekmeyen prosedürlerin devre dışı bırakılması,
- Uygulamaların çeşitli dillerde (C#, VB.NET, F#, vb.) yazılmasını ve bu dillerdeki kodların ortak ortamında çalıştırılmasını sağlayan CLR nin devre dışı bırakılması,
- SQL Browser servisinin devre dışı bırakılması,
- Hem SQL Server Authentication hem de Windows Authentication da oturum açma imkanı sağlayan Mixed Mode Authentication kimlik doğrulama metodunun devre dışı bırakılması,
- Merkezi yönetimi bulunan bir log inceleme sistemiyle yetkisiz erişim ve veri hırsızlığına karşı sistemin incelenmesi,
- Northwind and AdventureWorks veritabanlarının kaldırılması,
MySQL Güvenlik Sıkılaştırması
- mysql_secure_installation script inin çalıştırılarak varsayılan veritabanı ve hesapların silinmesi,
- LOAD_FILE() ve INTO OUTFILE gibi fonksiyonlarla dosyalara yazma ve okuma yapabildiği için FILE yetkilerinin tüm kullanıcılar için devre dışı bırakılması
- MySQL güvenlik eklentilerinin, MySQL Enterprise Firewall gibi, etkinleştirilmesi
- MySQL’de veritabanı tablolarınının, InnoDB table encryption veya MariaDB encryptions gibi özelliklerle, şifrelenerek korunması
İlgili sıkılaştırma politikalarının daha detaylı incelenmesi için aşağıdaki linkler incelenebilir.
https://mariadb.com/kb/en/library/securing-mariadb/
https://dev.mysql.com/doc/refman/8.0/en/security-guidelines.html
PostgreSQL Güvenlik Sıkılaştırması
- Gereksiz PostgreSQL modül ve uzantılarının devre dışı bırakılması,
- PostgreSQL’de kullanıcı erişimi ve izinleri yönetmek için rol tabanlı erişim kontrolü (RBAC) uygulanması,
- PostgreSQL’de pgcrypto gibi şifreleme modülleriyle veri şifrelemesi kullanılması,
Oracle Veritabanı Güvenlik Sıkılaştırması
- Oracle Advanced Security ile veritabanı bağlantılarını ve veritabanı dosyalarını şifrelenmesi
- Veri erişimi güvenliğini artırmak için Oracle Database Vault gibi güvenlik özelliklerinin mimariye yapıya göre kullanılması
- Oracle Database’de gereksiz servisleri, işlevleri ve bağlantıları devre dışı bırakılması,
Veritabanı güvenliği, sadece yazılım ve donanım yapılandırmalarıyla sınırlı kalmayıp, aynı zamanda sürekli izleme, güncellemeler ve güvenlik politikalarının düzenli olarak gözden geçirilmesi ile sağlanmalıdır.
Fortify Bulguları
Bu bölümde Webgoat ve bazı örnek projelerden derlenen bazı fortify veritabanı bulgularını incelenecektir.
Aşağıdaki ekran görüntüsü verilen bulgu “Unreleased Resource Database” bulgusudur. İlgili bulgunun kaynak kodlarına inilerek bakıldığında oluşturulan conn nesnesinin kullanıldıktan sonra kaldırılmasını önermektedir.
Bir diğer aşağıda ekran görüntüsü bulunan “Access Control: Database” bulgusu olan erişim denetimi yapılmadan kullanılan bir fonksiyonun saldırganlar tarafından çalıştırılarak yetkisiz şekilde kayıtlara erişim sağlanacağını belirten bir bulgudur.
Aşağıdaki ekran görüntüsü bulunan “Insecure Transport: Database” bulgusu ise bir .net projesindeki web.config dosyasında bulunan veritabanı bağlantısı için yazılan connectionString içinde tanımlanan veritabanı güvensiz bağlantısını ifade etmektedir.
Fortify kod seviyesinde bulduğu zafiyetlerin bir kaçına değinildi. Bununda yanında SQL injection gibi doğrudan ya da dolaylı olarak veritabanını ilgilediren farklı zafiyetleride bulmaktadır.
Sonraki yazılarda görüşmek üzere.