AraKullanıcı girişiGezintiEn son ağ günlüğü gönderileri
En Çok Okunanlar
Kimler yeni
İçerik paylaşımı |
MySql GüvenliğiMySQL Internet üzerindeki en popüler veritabanlarından biridir ve sıklıkla PHPi ile birlikte kullanılır. Yüksek performansına oranla kolay kullanımı gibi bir çok avantajı bir yana, MySQL basit fakat çok etkili bir güvenlik mekanizması sunmaktadır. MySQL Internet üzerindeki en popüler veritabanlarından biridir ve sıklıkla PHP ile birlikte kullanılır. Yüksek performansına oranla kolay kullanımı gibi bir çok avantajı bir yana, MySQL basit fakat çok etkili bir güvenlik mekanizması sunmaktadır. Ne yazık ki, MySql'in default kurulumu, şifresiz root yetkisi sağlaması ve hafıza taşması atakları için potansiyel güvelik açıkları bulundurması bu veritabanını saldırılar için kolay hedef haline getirmektedir. Bu makale, lokal ve uzak saldırılara karşı MySql'in nasıl güvenli hale getirilebileceğinin temel adımların tarif etmektedir. Fonksiyonellik Makalemizde bir önceki Apache ile ilgili makalemizde belirtilenlere uygun olarak üzerinde PHP kurulmuş Apache sunucumuz olduğunu varsayacağız ve bu da /chroot/httpd dizininde bulunacak. Güvenlik Gereklilikleri Yüksek güvenlik seviyesi sağlamak için, MYSQL'in kurulumu ve konfigürasyonu, aşağıda belirtilen güvenlik gereklilikleri gerçekleştirilmelidir: MYSQL'e sadece lokal erişime izin verilecektir; MySQL Kurulumu MySQL güvenliğine başlamadan önce, sunucu üzerine yazılımı yüklemeliyiz. Daha önceki makalelerde olduğu gibi, kuruluma, işletim sistemi üzerinde MySQL veritabanı için kullanılacak tek ve düzgün grup ve kullanıcı hesabı yaratmakla başlayacağız: MySQL'i Derlemek MYSQL yazılımını /usr/local/mysql dizini içinde derleyip kuracağız: Genellikle, sunucu üzerinde kuurlum işlemleri daima MySQL manuelinde tarif edildiği gibidir.Tek değişiklik ise ./configure satırında belirtilmiş birkaç ilgili parametrenin kullanımıdır. En önemli farklılık ise MySQL'in statik linklenmesine etki eden --with-mysqld-ldflags=-all-static parametresinin kullanımıdır. Bu, 3. bölümde de tarif edildiği gibi, önemli bir değerde sunucu chroot ayarlama işlemlerini basite indirger. Diğer parametreleri de dikkate alırsak, bunlar da programa /usr/local/mysql dizinine yazılımı yüklemesi emrini verir, mysql account yetkisinde MySQL Daemon'u çalıştırır ve /tmp dizininde mysql.sock socket'i oluşturur. Konfigürasyon Dosyasının Kopyalanması Yukarıdaki komutlar uygulandıktan sonra, veritabanının muhtemel boyutuna göre (küçük, orta, büyük, çok büyük) default konfigürasyon dosyasını kopyalamalıyız. Örneğin: cp support-files/my-medium.cnf /etc/my.cnf Sunucunun Çalıştırılması Bu noktada MySQL tamamı ile yüklenmiş ve çalışmaya hazırdır.Aşağıdaki komutu kullanarak MySQL'i çalıştırabiliriz: /usr/local/mysql/bin/mysqld_safe & Bağlantı Testi Aşağıdaki şekilde veritabanı ile bağlantı kurmaya çalışın: Welcome to MySQL Monitor. Commands end with ; or \g. Your MySQL connection id is 2 to server version: 4.0.13-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> show databases; mysql> quit; Birkez bağlantı başarılı olarak sağlandığında, veritabanını kapatabiliriz: ve yazılımın güvenliğine başlayabiliriz. Aksi halde, the /usr/local/mysql/var/`hostname`.err log dosyasını analiz etmeli ve bazı sorunları elimine etmeliyiz. Sunucu Chroot Ayarları MySQL güvenliğindeki ilk adım, MySQL sunucunun çalışacağı chroot edilmiş bir alan hazırlanmasıdır. Chroot tekniği "' Adım adım Apache Güvenliği"' makalemizde ayrıntılı olarak tarif edilmişti, bu sebeple eğer bu teknik hakkında bilginiz yoksa ya da neden gerekli olduğunu öğrenmek istiyorsanız, bahse konu makaleyi okumanızı tavsiye ederim. İşletim Sistemi Bir önceki makalede olduğu gibi, işletim sistemimiz FreeBSD 4.7. Ancak belirtilen metotlar gelişmiş Unix ve Unix_benzeri sistemlerde de uygulanabilir. Chroot Alanı Hazırlama Chroot alanı hazırlamak için, aşağıdaki dizin yapısını oluşturmamız gerekiyor: Erişim Haklarının Ayarlanması Yukarıda belirtilen dizinlere erişim hakları, aşağıdaki şekilde ayarlanmalıdır: Dizin Yapısı Oluşturmak Sonrasında ise, aşağıdaki dosyalar yeni dizin yapısıne kopyalanmalıdır: cp /usr/local/mysql/libexec/mysqld /chroot/mysql/usr/local/mysql/libexec/ Şifreleri ve Grupları Güçlendirmek Mysql hesabı ve grubu hariç, /chroot/mysql/etc/passwords ve /chroot/mysql/etc/group dosyalarından tüm satırları kaldırmalıyız. Sonra, aşağıda belirtildiği şekilde şifre veritabanı oluşturmalıyız (Bu sadece FreeBSD sistemlerde uygulanır): Özel Hususlar Apache web sunucu kullanımı halinde, özel bir aygıt dosyası yaratmalıyız /dev/null: Ayrıca, MySQL kurulumunda oluşturulmuş grant tablolar içeren mysql veritabanını da kopyalamalıyız: Sabitleme Eğer ingilizce haricinde başka bir dil kullanılacaksa, ayrıca /usr/local/mysql/share/mysql/charsets dizininden ilgili charset'leri de kopyalamalıyız. Konfigürasyonun Testi Bu noktada MySQL Chroot edilmiş alanda çalışmaya hazırdır. Eğer doğru çalışıyorsa aşağıdaki komutlarla test yapabiliriz: Eğer herhangi bir hata oluşursa truss komutunu ya da ktrace/kdump, strace gibi alternatiflerini kullanmalıyız. Bu sorunların sebeplerini tespit ve elimine atmak için bize yardımcı olacaktır. Sunucu Konfigürasyonu Sonraki adım ise veritabanı sunucusunu, bizim güvenlik gerekliliklerimizi tamamlayacak şekilde konfigüre etmektir. Uzaktan Erişimin Kapatılması İlk değişiklik, MySQL'in default olarak dinlemede olduğu 3306/TCP portunda uygulanır. Çünkü, ilk ayarlamalara göre veritabanı sadece lokal olarak kurulmuş PHP uygulaması tarafından kullanılacaktır, rahatlıkla bu port üzerinden dinlemeyi kapatabiliriz. Bu, diğer hostlardan direkt olarak TCP/IP protokolü üzerinden MySQL'e yapılacak saldırı ihtimallerini kısıtlayacaktır. Lokal bağlantı ise mysql.sock soket üzerinden çalışmaya devam edecektir. Bahse konu port üzerinde dinlemeyi kapatmak için, aşağıdaki parametrelerin /chroot/mysql/etc/my.cnf dizininin [mysqld] bölümüne eklenmesi gerekmektedir: Eğer bir sebeple veritabanına uzaktan erişim hala gerekiyorsa (örneğin veri yedeklemesi için), SSH protokolü aşağıda belirtildiği şekilde kullanılabilir: Lokal Güvenliğin Geliştirilmesi Sonraki değişiklik ise LOAD DATA LOCAL INFILE komutunun kullanıma kapatılmasıdır, ki bu da lokal dosyalar üzerindeki yetkisiz "'okuma"' hakkı elde edilmesini önlemek içindir. Bu PHP uygulamalarında yeni SQL enjeksiyoni teknikleri keşfedildiği zamanlarda oldukça önem kazanır. İlaveten, veritabanı yönetim araçlarının kullanımı mümkün ise, /etc/my.cnf dizininin [client] bölümünde bulunan aşağıdaki parametreler değiştirilmelidir: Artık her zaman bu araçları çalıştıracağımız zaman --socket=/chroot/mysql/tmp/mysql.sock komutu ile mysql, mysqladmin, mysqldump araçlarını desteklememiz gerekmiyor. Yönetici Şifresinin Değiştirilmesi MySQL'in güvenliğinde en önemli adımlardan biri de default olarak şifresiz olan veritabanı yöneticisinin şifresinin değiştirilmesidir. Bunu uygulayabilmek için MySQL'i çalıştırmamız gerekmektedir ( eğer o anda çalışmıyorsa): Bu, komut satırından şifre değiştirilmemesi için, örneğin bir "mysqladmin password" kullanmadan, iyi bir uygulamadır. Bu özellikle diğer kullanıcılar sunucu üzerinde çalışıyorsa önemlidir. Uygunsuz erişim izinleri ayarlanmış olsa bile bu şekilde şifre, örneğin "ps aux" komutu kullanarak ya da history dosyalarına bakarak (~/.history, ~/.bash_history etc) kolaylıkla ortaya çıkmayacaktır. Default Kullanıcı/Veritabanlarının Kaldırılması Sonraki adımda ise, örnek veritabanını (test) ve lokal root hesabı hariç diğer tüm hesapları kaldırmalıyız: Bu, veritabanına anonim bağlantılar sağlanmasını ve /chroot/mysql/etc/my.cnf dizinindeki skip-networking parametresine bakmaksızın uzak bağlantıları önleyecektir. Yönetici Hesap İsminin Değiştirilmesi Ayrıca default yönetici hesabı isminin de ( root), farklı ve tahmin edilmesi zor bir isim ile değiştirilmesi tavsiye edilmektedir.Bu tip bir değişiklik yönetici şifresine brute-force ve dictionary tabir edilen saldırıların yapılmasını oldukça zorlaştıracaktır. Bu durumda saldırgan sadece şifreyi değil, birincil ve mecburi olarak yönetici hesabı ismini de tahmin etmek zorundadır. History Dosyasının Kaldırılması En son olarak, uygulanmış tüm SQL komutlarının bulunduğu ( özellikle basit text olarak tutulan şifreler) MySQL History (~/.mysql_history) dosyasının içeriğini de kaldırmamız gerekmektedir: PHP ile MySQL Arasındaki Haberleşme Bir diğer makalemizde ("Adım adım PHP Güvenliği"), programlardan biri chroot edilmiş alanda çalıştırıldığında PHP ile MySQL arasındaki haberleşme sorunlarına dikkat çekmiştik.. Çünkü lokal olarak PHP, /tmp/mysql.sock soketi aracılığı ile MySQL ile haberleşmektedir, PHP'nin chroot edilmiş alanda olması demek, birbirleri ile haberleşememeleri anlamına gelmektedir. Bu sorunu çözmek için, MySQL'i çalıştırdığımız her zaman, PHP'nin chroot edilmiş alanına hard link oluşturmamız gerekmektedir: Not edilmelidir ki, /chroot/mysql/tmp/mysql.sock soketi ve /chroot/httpd/tmp dizini fiziksel olarak aynı dosya sisteminde bulunmalıdır. Aksi halde programların birbirleri ile haberleşmeleri mümkün olmayacaktır -- hard linkler dosya sistemleri arasında çalışmaz. Son Adımlar Bu noktada spesifik PHP uygulaması tarafından kullanılacak olan tüm veritabanlarını ve hesapları yaratmalıyız. Önemle vurgulamak gerekir ki bu hesaplar, sadece PHP uygulaması tarafından kullanılan veritabanına girmeye yetkili olmalıdır. Farklı olarak bu hesaplar mysql veritabanına erişim iznine ya da herhangi bir sistem için yönetici yetkisine sahip olmamalıdır, (FILE, GRANT, ALTER, SHOW DATABASE, RELOAD, SHUTDOWN, PROCESS, SUPER vb.). #!/bin/sh CHROOT_MYSQL=/chroot/mysql echo -n "mysql" case "$1" in exit 0 Sonuç Bu makale de açıklanan metotları uygulamak bize MySQL'in güvenliğini önemli derecede arttırma olanağı sağlar.Veritabanını chroot edilmiş alanda çalıştırmak, 3306/TCP port dinlemesini kapatmak ve kullanıcı hesaplarına güçlü şifreler koymak, default kurulumda oluşması muhtemel bir çok saldırıya karşın veritabanını dokunulmaz hale getirmemize olanak sağlamaktadır. __________________________
|
EtiketlerŞifre
Ağ
Antivirüs
botnet
Cisco
Cross Site Scripting
DDoS
Denetim
DoS
Ebeveyn Kontrolü
Exploit
Firefox
Firewall
Güvenlik
Güvenlik Açıkları
Güvenlik Duvarı
Google
GP
Hack
Hacker
hacking
Hafıza Taşması
IP
Kablosuz Ağ
Kimlik Doğrulama
Kriptografi
Kurtçuk
Kurulum
Linux
Microsoft
Olta Saldırısı
Phishing
Rootkit
Saldırı
Servis Kullanımı Engelleme
Spam
SQL Injection
Sunucu
Trojan
Veritabanı
Virüs
Vista
VPN
web filtreleme
Web Güvenliği
Windows
worm
XSS
En son forum mesajlarıYaklaşan Aktiviteler |
Son yorumlar
16 saat 55 dk önce
16 saat 54 dk önce
2 gün 19 saat önce
6 gün 57 dk önce
6 gün 9 saat önce
6 gün 9 saat önce
1 hafta 20 saat önce
1 hafta 1 gün önce
1 hafta 1 gün önce
1 hafta 1 gün önce