Sunucu Chroot Ayarları İş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 : 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/lisanssız: ls -al /dev/lisanssız crw-rw-rw- 1 root sys 2, 2 Jun 21 18:31 /dev/lisanssız mknod /chroot/mysql/dev/lisanssız c 2 2 chown root:sys /chroot/mysql/dev/lisanssız chmod 666 /chroot/mysql/dev/lisanssız 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 &amp; 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. 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ı&quot; /etc/my. cnf&quot; 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. İlk dosya sadece MySQL sunucu tarafından kullanılacaktır, sonraki ise MySQL araçları tarafından &quot;mysqladmin, mysql, mysqldump vb&quot;Her iki durumda da bazı konfigürasyon değişiklikleri gerekebilir. 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 bölümüne eklenmesi gerekmektedir: skip-networking Eğer bir sebeple veritabanına uzaktan erişim hala gerekiyorsa , SSH protokolü aşağıda belirtildiği şekilde kullanılabilir: backuphost$ ssh mysqlserver /usr/local/mysql/bin/mysqldump -A &gt; 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 &quot;'okuma&quot;' hakkı elde edilmesini önlemek içindir. Bu amaçla, aşağıdaki parametrelerin /chroot/mysql/etc/my. cnf dizininin bölümüne eklenmesi gerekir: set-variable=local-infile=0 İlaveten, veritabanı yönetim araçlarının kullanımı mümkün ise, /etc/my. cnf dizininin 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 Bunu uygulayabilmek için MySQL'i çalıştırmamız gerekmektedir : chrootuid /chroot/mysql mysql /usr/local/mysql/libexec/mysqld &amp; and change the administrator's password as follows: /usr/local/mysql/bin/mysql -u root mysql&gt; SET PASSWORD FOR root localhost=PASSWORD ; Bu, komut satırından şifre değiştirilmemesi için, örneğin bir &quot;mysqladmin password&quot; kullanmadan, iyi bir uygulamadır. Uygunsuz erişim izinleri ayarlanmış olsa bile bu şekilde şifre, örneğin &quot;ps aux&quot; komutu kullanarak ya da history dosyalarına bakarak kolaylıkla ortaya çıkmayacaktır. Default Kullanıcı/Veritabanlarının Kaldırılması Sonraki adımda ise, örnek veritabanını ve lokal root hesabı hariç diğer tüm hesapları kaldırmalıyız: mysql&gt; drop database test; mysql&gt; use mysql; mysql&gt; delete from db; mysql&gt; delete from user where not ; mysql&gt; 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 İsminin Değiştirilmesi Ayrıca default yönetici hesabı isminin de , 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&gt; update user set user=&quot;mydbadmin&quot; where user=&quot;root&quot;; mysql&gt; flush privileges; History Dosyasının Kaldırılması En son olarak, uygulanmış tüm SQL komutlarının bulunduğu MySQL History dosyasının içeriğini de kaldırmamız gerekmektedir: cat /dev/lisanssız &gt; /. mysql_history PHP ile MySQL Arasındaki Haberleşme Bir diğer makalemizde , 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, . 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 &quot;mysql&quot; case &quot;$1&quot; in start) rm -rf $ /$ nohup $ $ mysql $ &gt;/dev/lisanssız 2&gt;&amp;1 &amp; sleep 5 &amp;&amp; ln $ /$ $ /$ ;; stop) kill `cat $ /$ ` rm -rf $ /$ ;; ) echo &quot;&quot; echo &quot;Usage: `basename $0` &quot; &gt;&amp;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ç 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. alıntı: http://www.olympos.org/article/articleview/1852/1/12/mysql_guvenligi