TERÖRÜ LANETLİYORUZ

IPB

Hoşgeldiniz ( Giriş | Kayıt Ol )

DUYURU:

GencForm'a Hoşgeldiniz...

MySQL Güvenliği

This topic is about MySQL Güvenliği , the author, SeytaN, wrote about: 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ı gi ... To read more just scroll down

Title Önemli : Bölüm Kuralı

Bu bölümde ancak bilgi paylaşımı yapılabilir. Destek almak için lütfen Teknik Destek bölümünü kullanınız.

 
Reply to this topic Start new topic
 MySQL Güvenliği
 
SeytaN
mesaj 23.12.2007, 21:46:08
İleti #1


Süper Aktif Üye
Grup Simge

Grup: EMEKLİ MOD
Üye No: 18
Cinsiyet :
Katılım: 29.04.2007
İleti: 424
Konuları: 29
Nereden: ZuZaY



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.

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.
Yukarıdakilerden farklı olarak, aşağıda belirtilenlerin varolduğunu kabul edeceğiz: MySQL veritabanı sadece PHP uygulamaları için kullanılacak, aynı host üzerinde kurulu olacak;
Mysqladmin, mysql, mysqldump gibi default yönetim araçları veritabanı yönetimi için kullanılacaktır;
Uzaktan veri yedeklemesi SSH protokolü kullanılarak gerçekleşecektir.

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 veritabanı chroot edilmiş ortamda uygulanacaktır;
MySQL işlemleri tek bir UID/GID altında çalışacak ve bu başka bir sistem işlemi için kullanılmayacaktır;

MYSQL'e sadece lokal erişime izin verilecektir;
MySQL root hesabı tahmini zor bir şifre ile korunacaktır;
Yönetici hesabı ismi değiştirilecektir;
Veritabanına Anonim erişim ( Nobody hesabı ile) engellenecektir;
Tüm örnek veritabanları ve tablolar silinecektir.

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:
pw groupadd mysql
pw useradd mysql -c "MySQL Server" -d /dev/null -g mysql -s /sbin/nologin


MySQL'i Derlemek

MYSQL yazılımını /usr/local/mysql dizini içinde derleyip kuracağız:
configure --prefix=/usr/local/mysql --with-mysqld-user=mysql --with-unix-socket-path=/tmp/mysql.sock --with-mysqld-ldflags=-all-static
make
su
make install
strip /usr/local/mysql/libexec/mysqld
scripts/mysql_install_db
chown -R root /usr/local/mysql
chown -R mysql /usr/local/mysql/var
chgrp -R mysql /usr/local/mysql

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
chown root:sys /etc/my.cnf
chmod 644 /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:
/usr/local/mysql/bin/mysql -u root mysql

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;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.00 sec)

mysql> quit;

Birkez bağlantı başarılı olarak sağlandığında, veritabanını kapatabiliriz:
/usr/local/mysql/bin/mysqladmin -u root shutdown

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.

Iş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:
mkdir -p /chroot/mysql/dev
mkdir -p /chroot/mysql/etc
mkdir -p /chroot/mysql/tmp
mkdir -p /chroot/mysql/var/tmp
mkdir -p /chroot/mysql/usr/local/mysql/libexec
mkdir -p /chroot/mysql/usr/local/mysql/share/mysql/english

Erişim Haklarının Ayarlanması

Yukarıda belirtilen dizinlere erişim hakları, aşağıdaki şekilde ayarlanmalıdır:
chown -R root:sys /chroot/mysql
chmod -R 755 /chroot/mysql
chmod 1777 /chroot/mysql/tmp

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/
cp /usr/local/mysql/share/mysql/english/errmsg.sys /chroot/mysql/usr/local/mysql/share/mysql/english/
cp /etc/hosts /chroot/mysql/etc/
cp /etc/host.conf /chroot/mysql/etc/
cp /etc/resolv.conf /chroot/mysql/etc/
cp /etc/group /chroot/mysql/etc/
cp /etc/master.passwd /chroot/mysql/etc/passwords
cp /etc/my.cnf /chroot/mysql/etc/

Ş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):
cd /chroot/mysql/etc
pwd_mkdb -d /chroot/mysql/etc passwords
rm -rf /chroot/mysql/etc/master.passwd

Özel Hususlar

Apache web sunucu kullanımı halinde, özel bir aygıt dosyası yaratmalıyız /dev/null:
ls -al /dev/null
crw-rw-rw- 1 root sys 2, 2 Jun 21 18:31 /dev/null
mknod /chroot/mysql/dev/null c 2 2
chown root:sys /chroot/mysql/dev/null
chmod 666 /chroot/mysql/dev/null

Ayrıca, MySQL kurulumunda oluşturulmuş grant tablolar içeren mysql veritabanını da kopyalamalıyız:
cp -R /usr/local/mysql/var/ /chroot/mysql/usr/local/mysql/var
chown -R mysql:mysql /chroot/mysql/usr/local/mysql/var

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:
chrootuid /chroot/mysql mysql /usr/local/mysql/libexec/mysqld &

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.
Not olarak, mysqld işlemini çalıştırmak için, Apache ya da PHP kullanımlarında chrootuid programı chroot yerine kullanılabilir. Ana farklılık ise, chrootuid'in, uygulanan işlemin sahibini değiştirmesidir. Bizim örneğimizde, mysqld chroot edilmiş ortamda çalışmaktadır, fakat işlemin sahibi root değildir, mysql kullanıcısıdır. Chrootuid , bir çok sistemde default olarak gelmez ve gerekliliğinden dolayı manual olarak yüklenmeli ve kurulmalıdır.

Sunucu Konfigürasyonu

Sonraki adım ise veritabanı sunucusunu, bizim güvenlik gerekliliklerimizi tamamlayacak şekilde konfigüre etmektir.
MySQL'in default kurulumu halinde, ana konfigürasyon dosyası /etc/my.cnf _dır. Bizim durumumuzda, her ne kadar chroot edilmiş ortamda çalışan sunucu olsa da, biz 2 konfigürasyon dosyası kullanacağız: /chroot/mysql/etc/my.cnf ve /etc/my.cnf. Ilk dosya sadece MySQL sunucu tarafından kullanılacaktır, sonraki ise MySQL araçları tarafından (mysqladmin, mysql, mysqldump vb.). Her iki durumda da bazı konfigürasyon değişiklikleri gerekebilir.

Uzaktan Erişimin Kapatılması

Ilk 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:
skip-networking

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:
backuphost$ ssh mysqlserver /usr/local/mysql/bin/mysqldump -A > backup

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 enjeksiyon teknikleri keşfedildiği zamanlarda oldukça önem kazanır.
Bu amaçla, aşağıdaki parametrelerin /chroot/mysql/etc/my.cnf dizininin [mysqld] bölümüne eklenmesi gerekir:
set-variable=local-infile=0

Ilaveten, 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:
socket = /chroot/mysql/tmp/mysql.sock

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):
chrootuid /chroot/mysql mysql /usr/local/mysql/libexec/mysqld &
and change the administrator's password as follows:
/usr/local/mysql/bin/mysql -u root
mysql> SET PASSWORD FOR root[at]localhost=PASSWORD('new_password');

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:
mysql> drop database test;
mysql> use mysql;
mysql> delete from db;
mysql> delete from user where not (host="localhost" and user="root");
mysql> flush privileges;

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 Isminin 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.
mysql> update user set user="mydbadmin" where user="root";
mysql> flush privileges;

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:
cat /dev/null > ~/.mysql_history

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:
ln /chroot/mysql/tmp/mysql.sock /chroot/httpd/tmp/

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.).
Son olarak, işletim sistemi çalıştığında MySQL'inde çalışması için ayrıca bir shell script'i yaratmalıyız. Örnek script aşağıda gösterilmektedir:

#!/bin/sh

CHROOT_MYSQL=/chroot/mysql
CHROOT_PHP=/chroot/httpd
SOCKET=/tmp/mysql.sock
MYSQLD=/usr/local/mysql/libexec/mysqld
PIDFILE=/usr/local/mysql/var/`hostname`.pid
CHROOTUID=/usr/local/sbin/chrootuid

echo -n "mysql"

case "$1" in
start)
rm -rf ${CHROOT_PHP}/${SOCKET}
nohup ${CHROOTUID} ${CHROOT_MYSQL} mysql ${MYSQLD} >/dev/null 2>&1
&
sleep 5 && ln ${CHROOT_MYSQL}/${SOCKET} ${CHROOT_PHP}/${SOCKET}
;;
stop)
kill `cat ${CHROOT_MYSQL}/${PIDFILE}`
rm -rf ${CHROOT_MYSQL}/${SOCKET}
;;
*)
echo ""
echo "Usage: `basename $0` {start|stop}" >&2
exit 64
;;
esac

exit 0
FreeBSD sistem kullanımı halinde, yukarıdaki script, mysql.sh ismi ile /usr/local/etc/rc.d dizini altında bulunmalıdır.

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.
Bununla birlikte, hiçbir metot %100 güvenlik elde etmemizi sağlamaz, vurgulanan metotlar, web sunucumuzu kötü niyetlerle ziyaret edenlerden gelebilecek saldırıları en aza indirgeyecektir...


--------------------
|-Dr-SeytaN-|
-------------------------------------------------
İletişim : <a href="mailto:Mc_S-e-y-t-a-N@Hotmail.CoM">Mc_S-e-y-t-a-N@Hotmail.CoM</a>
Go to the top of the page
 
+Quote Post
Reply to this topicStart new topic
Tags
No Tag inserted yet

1 kullanıcı bu başlığı okuyor (1 Misafir ve 0 Gizli Kullanıcı)
0 üye:

 



Yararlı Linkler
ÖNEMLİ :Linkler sürekli kontrol edilecektir.Habersiz linkimizi kaldıranlar yada hiç eklemeyen ve/veya uygunsuz içerik bulunduran sitelerin linkleri silenecektir.İletişim için GiZeMsU
Basit Görünüm

 | SEO by MinervaSEO © Icelabz.net

Tarih : 02.12.2008 - 18:33:51
- Arşiv Görünümü -
6 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24 25 26 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 77 78 79 80 81 82 86 98 102 104 105 106 107 109 110 111 112 113 114 115 117 118 119 121 122 123 124 125 126 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 157 158 159 160 161 162 163 165 166 169 170 173 175 176 177 178 179 180 181 182 184 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 254 256 258 261 264 266 267 268 269 271 273 274 276 277 280 282 283 284 285 286 287 289 290 291 295 296 298 300 304 305 306 307 308 309 310 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 339 341 342 343 344 345 346 347 348 351 352 353 354 355 356 358 359 362 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
Copyright 2008 © GencForm.Org Tüm Hakkı Saklıdır
Modül ve Eklentiler GiZeMsU