ORACLE REDO LOG

ORACLE REDO LOG GİRİş

Oracle’da veri girişleri direk olarak veritabanı dosyalarına yapılmaz.
İlk önce veriler redo log denilen dosyalara yazılır. Daha sonra da
belirli işlemlerden sonra veritabanı dosyalarına yazılır.

Redo log dosyaları minumum 2 veya daha fazla olabilir. Yoğun
trafiğe sahip databaselerde 2 redo log dosyası var ise veri girişleri
ve update işlemleri sırasına sık sık “Thread 1 cannot allocate new log,sequence”
hatası alırsınız.

LGWR (Log Writer): Bufferdaki redo bilgilerini redo log dosyasına yazmakla
yükümlüdür. Ek olarakda redo log dosyalarının statulerini günceller.

LGWR, redo log dosyaları dolduğunda bir sonraki redo log dosyasının
veritabanı dosyalarına yazılıp yazılmadığını ve arşivlenip arşivlenmediğini kontrol eder ve
yeni redo log dosyasına geÇer. Bu sırada bir önceki redo log dosyasının
statusunu CURRENT dan ACTIVE Çeker. Devamında DBWR (Database Writer)’a
Checkpoint işlemini yapması iÇin bilgi verir . DBWR Checkpoint işlemini tamamlayıp,
redo loglardaki datayı veritabanı dosyalarına yazıp CKPT processini Çağırır.
CKPT işlemi ise veritabanı dosyalarının header bilgisini ve statusunu gunceller.
Bu işlemleri tamamladıktan sonra LGWR işlemini Çağırır. LGWR de redo log
statu bilgisini ACTIVE‘den INACTIVE‘e Çeker.
Tüm bu işlemlerden sonra redo log dosyası tekrar kullanıma aÇılmış olur.
şunu da unutmamak gerekir bir birim zamanda sadece bir tane redo log dosyasına
yazılma işlemi yapılabilir.

Bir sonraki makalelerde görüşmek dileğiyle,
Tayfur BÖLER
Database Administrator

Oracle'da Commit ve Rollback İşlemi

Oracle”da Commit ve Rollback İşlemi,

Datalar üzerinde işlem yapan insert,update,delete gibi DML cümleleri
Çalıştırıldığı zaman yapılan değişikliklerin kalıcı olması iÇin COMMIT
cümlesi Çalıştırılır. Yapılan bu değişiklikleri COMMIT cümlesi Çalıştırmadan
geri almak mümkündür. Bunu da ROLLBACK cümlesi ile yaparız.

Aşağıdaki durumlarda COMMIT komutu Çalıştırılır.

* COMMIT komutunu kendimiz Çalıştırdığımız zaman.
* Bir DDL cümlesi Çalıştırıldığı zaman.
* Oracle sunucularından disconnect oldugumuz zaman.

Aşağıdaki durumlarda ROLLBACK komutu Çalıştırılır.


*
ROLLBACK komutunu Çalıştırdığımız zaman.
* Sunucu anormal bir şekilde sonlandığı zaman.
* Bağlı olduğumuz oturum kill edildiği zaman.

ÜRNEK:

select adi,soyadi,adres from personel;

Yukarıdaki sorgu sonucu boş dönüyor.Yani tabloda herhangi bir kayıt yok.

insert into personel(adi,soyadi,adres) values (“tayfur”,'boler”,'istanbul”);

Yukarıdaki sorgu ile bir kayıt insert ettik.

COMMIT;

Yukarıdaki komut ile kayıtı kalıcı olarak

insert into personel(adi,soyadi,adres) values (“ali”,'bak”,'istanbul”);

Yukarıdaki sorgu ile bir kayıt insert ettik.

ROLLBACK;

Yukarıdaki komut ile yeni kaydımızı geri aldık.

insert into personel(adi,soyadi,adres) values (“ali”,'bak”,'istanbul”);

Yukarıdaki sql ile aynı kayıtı yeniden ekledik.

ALTER TABLE PERSONEL ADD (dogum_yeri VARCHAR2(20));

Yukarıdaki DDL ile personel tablomuza dogum_yeri kolonunu ekledik.

şimdi son eklediğimiz ‘ali’ kayıdını geri almak istiyoruz.

ROLLBACK;

Oracle ,yukarıdaki komutu Çalıştırdıgımızda geri alma işlemini yapamayacaktır.
Üünkü herhangi bir DDL ifade Çalıştırıldıgında otomatik olarak
COMMIT komutu Çalışmaktadır.

Bir sonraki makalelerde görüşmek dileğiyle,

Tayfur BÖLER
Database Administrator

MySQL VERİTABANI GÜVENLİğİ

MySQL VERİTABANI GÜVENLİğİ KILAVUZU

TÜBİTAK “ UEKAE tarafından hazırlanan Mysql Veritabanı güvenliği hakkında
faydalı bir döküman.

1 . G İ R İş

Bu kılavuzda yaygın olarak kullanılan aÇık kaynak kodlu veritabanı MySQL”in güvenlik
yapılandırması anlatılmaktadır.

1.1 AmaÇ ve Kapsam

Bu dokümanın amacı, MySQL veritabanlarının güvenli kabul edilmesi amacıyla uygulanması
gereken politika, prensip ve esasların belirlenmesidir. Dokümanda, belirlenen adımların
uygulanmasına yönelik yöntemler de yer almaktadır.

1.2 Hedeflenen Kitle

Bu doküman MySQL veritabanlarının yönetilmesinden ve güvenli olarak yapılandırılmasından
sorumlu kişiler tarafından kullanılabilir. 5

2 . MySQL VERİTABANI

MySQL sunucu servisi hem Windows hem de Linux/Unix sistemler üzerinde koşan, genellikle
php ile uygulama geliştiren geliştiriciler tarafından tercih edilen, kullanım oranı yüksek bir
veritabanı uygulamasıdır. Burada Unix/Linux sistemler üzerinde Çalışan MySQL veritabanı
uygulamasının güvenli hale gelmesi iÇin gerekli adımlardan bahsedilecektir. Burada
anlatılanlar ne kadar Unix/Linux sistemlere has bilgiler olsada temel olarak diğer işletim
sistemleri iÇinde uygulanabilmektedir. Sıkılaştırma adımlarından genel olarak aşağıda
bahsedilmiştir:
â?¢ MySQL sunucu servisi Çalışma ortamı güvenliği (chroot),
â?¢ MySQL sunucu servisinin root harici “kullanıcı/grup” ikilisinin hakları ile Çalışacağının
belirlenmesi,
â?¢ MySQL sunucusu dosya dizin erişim güvenliği,
â?¢ MySQL sunucu servisinin Çalışacağı IP adresi bilgisinin belirlenmesi,
â?¢ Yerel erişim güvenliğinin artırılması,
â?¢ Ağ trafiğinin şifrelenmesi,
â?¢ MySQL kullanıcıları erişim güvenliği,
â?¢ Parola güvenliği,
â?¢ MySQL root kullanıcısı güvenliği,
â?¢ Ürnek veritabanı ve tabloların güvenliği,
â?¢ Yama Kontrolü,
â?¢ DNS Güvenliği

2.1 MySQL Veritabanı Genel Güvenlik AÇıklık Görünümü

MySQL yapılandırma dosyası genel formatının belirtilmesinin ardından, MySQL sunucu
servisinin nasıl daha güvenli hizmet verebileceği noktasında yapılacaklar anlatılacaktır.
GerÇekleştirilecek adımların ana başlıkları yukarıda listelenmiştir. Bugüne kadar 3.3
sürümünden 5.0 sürümüne kadar MySQL veritabanında bulunan ve yayınlana
aÇıklık listesine adresinden
http://forge.MySQL.com/wiki/Security_Vulnerabilities_In_MySQL_Server
ulaşılabilir.

2.2 MySQL Sunucu Servisi Yapılandırma Dosyası Genel Formatı

MySQL sunucu servisi genel yapılandırma dosyası olarak “/etc/my.cnf” kullanılmaktadır. Eğer
MySQL servisi chroot ortamı altında Çalıştırılıyor ise, yapılandırma dosyası olarak chroot
ortamı iÇin belirlenen dizinin altında bulunan “/etc/my.cnf” dosyası kullanılacaktır. Bu
dosyanın genel yapısı ve basitÇe yapılandırma seÇeneklerinin alacağı değerler aşağıda
belirtilmiştir.
â?¢ yapılandırma_seÇeneği=değer
Yukarıda belirtilen gösterim komut satırından aynı değerin mysqld ikilisi iÇin belirtimi aynıdır.
Ürneğin “my.cnf” yapılandırma dosyası iÇerisinde belirtimi gerÇekleştirilen “port = 3306” ile
“mysqld –port= 3306” Çalıştırılması aynı anlamdadır. “#” ile başlayan satırlar aÇıklama satırı
olarak ele alınmaktadır.

3. MySQL VERİTABANI GÜVENLİK YAPILANDIRMALARI

3.1 MySQL Veritabanı Üalışma Ortamı Güvenliğinin Sağlanması

MySQL sunucu servisinin chroot ortamı altında Çalışması sağlanarak, MySQL sunucu
servisinin işletim sistemi kaynaklarının tümüne erişimi kısıtlanmalıdır. Bu şekilde MySQL
sunucu servisi sadece ihtiyaÇ duyacağı kaynaklara erişim sağlanmış olacaktır.

3.2 MySQL Veritabanını Süper Kullanıcı Harici Bir Kullanıcı Hakları ile Üalıştırmak

â?¢ [group]
group ile belirtilen değer yapılandırması gerÇekleştirilmek istenen programın adı ya da group.
Yapılandırma seÇenekleri [group] ile başlayıp bir sonraki [group] adına kadar geÇerli
olmaktadır. Ürneğin [mysqld] ile mysqld sunucu yazılımı iÇin etkinleştirilmek istenen değerler
belirtilecektir.
â?¢ “user = kullanıcı_adı” değeri ile MySQL sunucu servisinin hangi kullanıcı hakları ile
Çalıştırılacağı belirlenmektedir. Burada root kullanıcı haklarına sahip olmayan MySQL
grubuna üye MySQL kullanıcısı belirtilmiştir.
# vi my.cnf
[mysqld]
â?¦
user = mysql

3.3 MySQL Veritabanı Dosya ve Dizin Erişim Güvenliği

MySQL sunucu servisi tarafından kullanılan dizin ve dosya sahipliği hakları root kullanıcısına,
grup sahipliği hakları ise MySQL sunucu servisini Çalıştıran kullanıcının dahil olduğu gruba ait
olmalıdır. MySQL sunucu servisinin mysql/mysql kullanıcı, grup ikilisi hakları ile Çalıştırıldığı
düşünüldüğünde örnek bir dosya/dizin sahipliği hakları aşağıdaki gibi olmalıdır.
# chown root:mysql [dosya/dizin]
Yukarıda belirtilen dosya dizin sahipliklerine göre, dosya erişim izinleri iÇin sayısal
notasyonda 440 (r–r—–), dizin erişim izinleri iÇin ise 550 (r-xr-x—) şeklinde olmalıdır. Bu
durum iÇin istisna teşkil edecek durumlar olabilmektedir. Ürneğin log, var ya da yeni
oluşturulan bir veritabanı iÇin kullanılacak olan dizinler iÇinde MySQL kullanıcısının dahil
olduğu grubun yazma hakkının olması gerekmektedir. Bunun yanında MySQL sunucu
servisinin tarafından gerÇekleştirilen veri değişimleri hakkında bilgileri iÇeren “.bin” uzantılı
dosyalar iÇinde yazma hakkının bulunması gerekmektedir. Bu duruma örnek teşkil edecek bir
kullanım aşağıda gösterilmiştir.
# chown root:mysql /var/mysql/{log,var}
# chmod 550 /var/mysql/{log,var}
# chmod 460 /var/mysql/var/mysql-bin.*
“my.cnf” dosyasının sahipliği root kullanıcısı, grup sahipliği olarak ise MySQL sunucu
servisini Çalıştıran kullanıcının ( Ürneğin “mysql/mysql” kullanıcı/grup ikilisi ) dahil olduğu
grup olarak yapılandırmalı ve erişim izinleri iÇin ise sayısal notasyon olarak 440 olarak
belirlenmelidir.
# chown root:mysql my.cnf
# chmod 440 my.cnf

3.4 MySQL Veritabanı Servisinin Üalışacağı IP Adres Bilgisinin Belirlenmesi

“bind-address= ip adres bilgisi” değeri ile MySQL sunucu servisinin bağlantıları dinleyeceği
ip adres bilgisi tanımlanmaktadır. Ün tanımlı olarak MySQL sunucu yazılımı bütün ağ
arayüzlerinden gelen bağlantıları kabul edecek şekilde yapılandırılmaktadır. Eğer MySQL
sunucu servisi ve web uygulaması aynı sunucu makine üzerinde Çalışacak ise bu değer
“127.0.0.1” olarak belirtilmelidir. Aslında bu durumda “skip-networking” değeri
kullanılabilir. “skip-networking” değeri ile MySQL sunucu yazılımı hiÇbir şekilde TCP/IP
bağlantılarını dinlemez. Bütün etkileşim (Linux/Unix) unix soketleri aracılığı ile
gerÇekleştirilir. Ancak burada Apache ve MySQL sunucu servisleri iÇin ayrı ayrı chroot
dizinleri oluşturulmuş ise, bu seÇenek kullanılamamaktadır. Bu seÇeneğin yerine “bind-
address=127.0.0.1” değeri ile sadece belirtilen ip adreslerinden gelen bağlantıları kabul edecek
şekilde yapılandırılmalıdır. Eğer Apache ve MySQL sunucu servisleri aynı sunucu makine
üzerinde değil iseler, güvenlik duvarı ya da tcp_wrapper gibi uygulamalar aracılığı ile ip adres
kısıtlaması gerÇekleştirilmelidir. Bu şekilde sadece belirtilen ip adreslerinden bağlantı kabul
edilecektir. Bunun yanında iletişimin aÇık bir şekilde değil, şifreli olarak ağ üzerinden
gerÇekleştirilmesi sağlanmalıdır.
# vi my.cnf
[mysqld]
â?¦
bind-address=127.0.0.1
â?¦
#
netstat komutu ile MySQL sunucu servisinin hangi ağ ara yüzünden gelen bağlantıları kabul
edeceği görülebilmektedir.
# netstat -plunat | grep “mysqld”
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 5010/mysqld
#

3.5 Yerel Erişim Güvenliğinin Artırılması

“LOAD DATA LOCAL INFILE” komutları engellenerek, yerel dosyaların yetkisiz erişimlerden
korunması sağlanmalıdır. Bu şekilde özellikle php ile geliştirilen web uygulamalarında
bulunabilecek olan, sql enjeksiyonu saldırılarından kaynaklanan yetkisiz yerel dosyaların
okunmasını engellemektedir. Bunun iÇin MySQL sunucu servisi yapılandırma dosyasında
aşağıdaki değer bulunmalıdır.
# vi my.cnf
â?¦
local-infile =0
â?¦
#

3.6 Ağ Trafiğinin Gözlemlenmesi

Aksi belirtilmedikÇe MySQL sunucu istemci arasındaki ağ trafiği aÇık metin olarak
gerÇekleştirilmektedir. Aslında bu sadece MySQL”e has bir özellik değil, sunucu istemci
mimarisi ile Çalışan bütün uygulamalar iÇin geÇerli bir durumdur. Kötü niyetli kişiler sunucu
istemci arasında gerÇekleştirilen aÇık metin trafiği dinlereyek hassas bilgilere erişim
sağlayabilirler. Aşağıda MySQL sunucusu ile istemcisi arasındaki ağ trafiğinin gözlemlenmesi
halinde nelerin yapılabileceğini göstermek aÇısından MySQL sunucu sistemi üzerinde tcpdump
ve strings komutları kullanılarak gerÇekleştirilen sorgu işlemleri gösterilmiştir.

# tcpdump -l -i eth0 -w – src or dst port 3306 | strings
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96
bytes
5.0.45
wRuuj5g,
LLBPALES
show databases
SCHEMATA
Datab
show tables
TABLE_NAMES
select @@version_comment
@@version_com
show databases
SCHEMATA
Datab

Görüldüğü gibi MySQL istemcisinden gerÇekleştirilen sorgular aÇık olarak görülmektedir.
Aynı işlem MySQL sunucu istemci arasındaki trafiğin şifreli olarak iletildiği durumda aşağıda
görüldüğü gibi olmaktadır.

# tcpdump -l -i eth0 -w – src or dst port 3306 | strings
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96
bytes
gLOY
%DgLOY
gLOY
lnp@
%HgLOY4
5.0.45
bA[‘P;xl
gLO
gLO_
4nq@
%KgLO_
gLOo
4nr@

Yukarıda görüldüğü gibi MySQL sunucu ve istemcisi arasındaki ağ trafiği şifreli bir biÇimde
gerÇekleştirildiğinde, sorgular aÇık olarak görüntülenememektedir.

MySQL sunucu istemci trafiğinin şifrelenmesi iÇin uygulanabilecek yöntemlerden bir taneside
openssl uygulamasının kullanılmasıdır. MySQL sunucu istemci trafiğinin şifrelenmesi iÇin
kullanılabilecek aÇık kaynak kodlu yöntemlerden bazıları olarak OpenSSH, OpenVPN ve
OpenSSL gösterilebilir. Burada OpenSSL kullanılarak nasıl sunucu istemci arasındaki trafiğin
şifreleneceği anlatılacaktır. Üncelikle mevcut MySQL sunucu servisinde SSL desteğinin aktif
olup olmadığına bakılmalıdır. şekil 3-2”de görüldüğü gibi “SHOW VARIABLES LIKE
‘have_openssl” SQL sorgusu ile görüntülenebilir.

“Value” değerinin “DISABLED” olması, veritabanı sunucusunun SSL desteğinin olduğunu
fakat doğru parametreler ile başlatılmadığını göstermektedir. SSL desteğinin kullanılabilmesi
iÇin MySQL sunucu yazılımının derlenmesi esnasında “–with-vio –with-openssl”
paremetrelerinin kullanılması gerekmektedir.

MySQL sunucu servisine SSL desteğinin verilmesinin ardından sunucu ve istemci iÇin gerekli
sertifikalar oluşturulmalı ve son olarak sunucu ve istemci yapılandırma dosyalarında gerekli
işlemler gerÇekleştirilmelidir. Burada sertifika otoritesi iÇin gerekli sertifikalar öncelikle bizim
tarafımızdan üretilir. Daha sonra sunucu istemci iÇin gerekli sertifikalar üretilerek bu sertifika
otoritesi yardımı ile imzalanır. Bu işlemler iÇin öncelikle uygun bir dizin belirlenmeli ve
gerekli sertifikalar oluşturulmalıdır.

# mkdir /usr/local/SQL-certs
# cd /usr/local/MySQL-certs

Sertifika iÇin gerekli dizinin oluşturulmasının ardından öncelikle sertifika otoritesi iÇin gerekli
seritifikalar oluşturulmalı ardından sunucu ve istemci iÇin gerekli sertifikalar oluşturulmalıdır.
Sertifika otoritesi iÇin gerekli sertifikayı oluşturmak iÇin aşağıdaki adımlar sırası ile
uygulanmalıdır.

# openssl genrsa -out ca-key.pem 2048

Generating RSA private key, 2048 bit long modulus
…………………………………………………………………+
+++++ e is 65537 (0x10001)

# openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem

You are about to be asked to enter information that will be incorporated
into your certificate request. What you are about to enter is what is called
a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank For some fields
there will be a default value, If you enter ‘.’, the field will be left
blank.
—–
Country Name (2 letter code) [GB]:TR
State or Province Name (full name) [Berkshire]:Kocaeli
Locality Name (eg, city) [Newbury]:Gebze
Organization Name (eg, company) [My Company Ltd]:Tubitak/Uekae
Organizational Unit Name (eg, section) []:Bilgi Guvenligi
Common Name (eg, your name or your server’s hostname) []:Uekae/Bilgi
Guvenligi
Email Address []:bilgi@bilgiguvenligi.gov.tr
Ardından sunucu iÇin gerekli sertifikalar oluşturulmalıdır. Bunun iÇin aşağıdaki adımların
sırası ile takip edilmesi gerekmektedir.

# openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out

server-req.pem
Generating a 2048 bit RSA private key
………………………………………………………………….
……………………………………………+++
………………………………………………………….+++
writing new private key to ‘server-key.pem’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank For some fields
there will be a default value, If you enter ‘.’, the field will be left
blank.
—–
Country Name (2 letter code) [GB]:TR
State or Province Name (full name) [Berkshire]:Kocaeli
Locality Name (eg, city) [Newbury]:Gebze
Organization Name (eg, company) [My Company Ltd]:Tubitak/Uekae
Organizational Unit Name (eg, section) []:Bilgi Guvenligi

Common Name (eg, your name or your server’s hostname) []:Uekae/Bilgi
Guvenligi
Email Address []:bilgi@bilgiguvenligi.gov.tr
Please enter the following ‘extra’ attributes to be sent with your
certificate request
A challenge password []:
An optional company name []:

# openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-
key.pem -set_serial 01 -out server-cert.pem

Signature ok
subject=/C=TR/ST=Kocaeli/L=Gebze/O=Tubitak/Uekae/OU=Bilgi
Gvenligi/CN=Uekae/Bilgi Guvenligi/emailAddress=bilgi@bilgiguvenligi.gov.tr
Getting CA Private Key
Son olaral MySQL istemcisi iÇin gerekli sertifikalar oluşturulmalıdır. Bunun iÇin aşağıdaki
adımların sırası ile takip edilmesi gerekmektedir.

# openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out
client-req.pem

Generating a 2048 bit RSA private key
……….+++………………………………………………………
……+++ writing new private key to ‘client-key.pem’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank For some fields
there will be a default value, If you enter ‘.’, the field will be left
blank.
—–
Country Name (2 letter code) [GB]:TR
State or Province Name (full name) [Berkshire]:Kocaeli
Locality Name (eg, city) [Newbury]:Gebze
Organization Name (eg, company) [My Company Ltd]:Tubitak/Uekae
Organizational Unit Name (eg, section) []:Bilgi Guvenligi

Common Name (eg, your name or your server’s hostname) []:Uekae/Bilgi
Guvenligi
Email Address []:bilgi@bilgiguvenligi.gov.tr
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-
key.pem -set_serial 01 -out client-cert.pem

Signature ok
subject=/C=TR/ST=Kocaeli/L=Gebze/O=Tubitak/Uekae/OU=Bilgi
Guvenligi/CN=Uekae/Bilgi Guvenligi/emailAddress=bilgi@bilgiguvenligi.gov.tr
Getting CA Private Key
Sertifikaların oluşturulmasının ardından kullanım iÇin MySQL sunucusu üzerinde, MySQL
yapılandırma dosyası iÇerisinde gerekli belirtimlerinin gerÇekleştirilmesi gerekmektedir. Bunun
iÇin yapılandırma dosyasında, sunucu taraflı yapılandırma iÇin [mysqld] bölümü iÇerisine
aşağıda belirtilen satırların eklenmesi gerekmektedir.
[mysqld]
ssl-ca=/usr/local/mysql-certs/cacert.pem
ssl-cert=/usr/local/mysql-certs/server-cert.pem
ssl-key=/usr/local/mysql-certs/server-key.pem
MySQL sunucu üzerinde sunucu taraflı gerekli yapılandırmanın gerÇekleştirilmesinin ardından,
MySQL sunucu servisi yeninden başlatılmalıdır ve ardından MySQL sunucu servisi üzerinde
SSL kullanımının aktif olduğu görülebilecektir.

Ardından MySQL istemcisi üzerinde sertifika kullanımı iÇin gerekli yapılandırma
değişikliklerinin gerÇekleştirilmesi gerekmektedir. Burada uzak MySQL istemcisi ile komut
satırından MySQL sunucusu ile iletişim sağlanıp, sorguların gerÇekleştirileceği göz önünde
bulundurularak aşağıdaki adımlar sırası ile takip edilmelidir. Kullanılmak istenen MySQL
istemcisine göre sertifika kullanımı ile ilgili yapılandırma farklılık göstermektedir. Üncelikle
sertifika yetkilisi ve istemcisi iÇin gerekli sertifikalar MySQL istemcisi üzerinde belirlenen
uygun bir dizine taşınmalıdır. Burada “/usr/local/mysql-certs” dizini olarak belirlenmiştir.
İsteğe göre farklı bir dizin seÇilebilir.

MySQL komut satırı istemcisinde SSL kullanımını aktif hale getirmek iÇin yapılandırma
dosyasında sertifikaların tam yolları belirtilmelidir.

ssl-ca=/usr/local/mysql-certs/cacert.pem
ssl-cert=/usr/local/mysql-certs/client-cert.pem
ssl-key=/usr/local/mysql-certs/client-key.pem

İlgili ayarların ardından MySQL istemcisinde “SHOW STATUS LIKE “Ssl_cipher” sorgusu
tekrar Çalıştırılarak şifreleme iÇin kullanılacak olan anahtar görüntülenebilir.

şekil 3-5 şifreleme iÇin kullanılacak olan anahtarın durumunun görüntülenmesi
SSL kullanımının aktif hale getirilmesinin ardından MySQL kullanıcılarının SSL kullanımı ve
MySQL sunucu servisi ile iletişime geÇmelerini zorlama işlemi, GRANT ifadesinde
“REQUIRE SSL” kullanılarak gerÇekleştirilebilir. Bu duruma örnek bir ifade aşağıda yer
almaktadır.

mysql> GRANT ALL ON deneme.* TO mysqluser@192.168.6.105 IDENTIFIED BY
‘sifre’ REQUIRE SSL;

Bu şekilde mysqluser kullanıcısının deneme veritabanına 192.168.6.105 ip adresinden SSL
kullanımı aktif olacak şekilde bağlanması zorlanmış olur. Eğer SSL kullanımı aktif olmadan
bağlanmaya Çalışılırsa aşağıda görülen hata mesajı ile karşılaşılacaktır

MySQL kullanıcıların erişim izinleri MySQL veritabanındaki db tablosuna göre
belirlenmektedir. Üncelikle bu tabloya MySQL root kullanıcısı haricinde kimsenin erişim izni
olmamalıdır.

MySQL erişim kontrolleri GRANT ve REVOKE deyimleri ile belirlenmektedir. GRANT deyimi
ile hangi kullanıcının hangi veritabanına hangi ip adresi ya da ip adreslerinden erişim
sağlayabileceği belirlenmektedir. MySQL root kullanıcısının uzak erişimine izin verilmemeli,
sadece yerel erişimlere tam makine adı ya da ip adres bilgisi belirtilerek izin verilmelidir.
Ürneğin “kullanıcı1” MySQL kullanıcısının 192.168.8.98 ip adresinden veritabanı1
veritabanına “şifre” şifresi ile erişim sağlaması iÇin aşağıdaki SQL sorgusu Çalıştırılmalıdır.
mysql > GRANT ALL ON veritabanı1.* TO kullanıcı1@192.168.8.98 IDENTIFIED BY
‘sifre’;
Aynı şekilde “kullanıcı2” MySQL kullanıcısının yerel olarak “veritabanı2” isimli veritabanı
üzerinde sadece INSERT, SELECT ve DELETE yetkilerine sahip olabilmesi iÇin aşağıdaki sql
sorgusu Çalıştırılmalıdır.

mysql > GRANT SELECT,INSERT,DELETE ON veritabanı2.* TO kullanıcı2@localhost
IDENTIFIED BY ‘sifre’;

Yukarıda belirtilen kullanıcıların ilgili veritabanları üzerindeki erişim izinlerinin
yapılandırılmasının ardından, Db ve User tablosundaki ilgili alanları ortak olarak görüntülemek
iÇin aşağıda belirtilen SQL sorgusu Çalıştırılmalıdır.
mysql > select db.Host,db.Db,db.User,user.Password from db,user where
db.Host=user.Host and db.User=user.User ;


3.8 Parola Güvenliği

Hemen hemen her uygulamada olduğu gibi MySQL sunucu servisi iÇin de kullanıcı
parolalarının güvenliği Çoğu zaman en kritik durum olarak göze batmaktadır. MySQL
kullanıcıları MySQL veritabanı iÇerisinde bulunan User tablosunda tutulmaktadır. MySQL
kullanıcı şifreleri aÇık olarak bu tabloda yer almazlar. şifreler tek yönlü geri döndürülemez bir
algoritma ile şifrelenerek tutulmaktadırlar.
şifrelenmiş olarak User tablosunda tutulan özet (hash) bilgilerinden, deneme yanılma (brute
force) yolu ile ya da farklı yöntemler uygulanarak parola bilgisi elde edilebilmektedir. şekil
3-8”de görüldüğü gibi MySQL root kullanıcısının şifrelenmiş parola bilgileri elde edilmiş ve
ardından deneme yanılma (brute force) yolu ile parola bilgisi, görüldüğü gibi aÇıkÇa
görüntülenmiştir.

Belirli aralıklar kullanıcı şifrelerinin hash (özet ) bilgileri brute force (deneme yanılma) yolu ile
aÇık olarak görüntülenmeye Çalışılmalı, eğer parola bilgileri kolayca elde edilebilecek parolalar
varsa bu parola bilgisine sahip kullanıcıların tahmin edilmesi zor parola seÇimleri yapmaları
sağlanmalıdır.

3.9 MySQL Süper Kullanıcı Güvenliği

MySQL root kullanıcısının adı tahmin edilmesi zor, farklı bir isim ile değiştirilmelidir. Bu
şekilde MySQL root kullanıcısının parola bilgisi deneme yanılma yolu ile tahmin edilmesi
zorlaşacaktır. Bu şekilde sadece MySQL root kullanıcısının sadece şifresini değil aynı
zamanda kullanınıcı adını da tahmin etmelidir. MySQL root kullanıcısının adını değiştirmek
iÇin aşağıdaki adımlar sırası ile uygulanmalıdır.

mysql > update user set user=”dbadmin” where user=”root”;

MySQL root kullanıcısının parola bilgisi ön tanımlı olarak boş gelmektedir. Yani hiÇbir parola
bilgisi olmaksızın MySQL root kullanıcısı ile erişim hakkı elde edilebilmektedir. MySQL root
kullanıcısının parola bilgisi tahmin edilmesi zor bir parola ile değiştirilmelidir. Bunun iÇin
aşağıdaki adımlar uygulanmalıdır.

mysql > SET PASSWORD FOR root@localhost=PASSWORD(‘yenisifre’);

MySQL root kullanıcı hesabının komut satırından değiştirilmesinin doğuracağı güvenlik
aÇıklıkları olabilmektedir. Ürneğin yukarıdaki işlem sonrası “.mysql_history” dosyasında bu
işlemin kayıtları aşağıdaki şekilde görülmektedir.

# cat .mysql_history
â?¦
UPDATE40mysql.user40SET40Password=PASSWORD(‘yenisifre’)40WHERE40Us
er=’root’;
#
Bu dosyanın erişim izinlerinden kaynaklanan bir durumda MySQL root kullanıcısının parolası
görülebilmektedir. Ya da parolanın “mysqladmin” gibi komut satırı araÇları ile değiştirilmesi
sırasında, sistem üzerinde oturum aÇmış bir kullanıcı ps komutu yardımı ile şifreyi elde
edebilir. Bu duruma örnek bir durum aşağıda gösterilmiştir. User kullanıcısının sistemde
“Mysqladmin” komutunun Çalışmasını gözlemlediği sırada, root kullanıcısının MySQL root
şifresi mysqladmin komutu yardımı ile değiştirilmektedir.
$ while [ 1 ]; do ps auwx | grep “mysqladmin”| grep -v “grep”; done

MySQL root kullanıcısına yeni şifre atama işleminin gerÇekleştirildiği sırada mysqladmin
komutunu gözlemleme olayının sonucu aşağıdaki şekilde gerÇekleşmiştir.
â?¦
root 15823 0.0 0.2 7748 1740 pts/0 S+ 09:55 0:00 MySQLadmin
-u root -p password sifre
â?¦

Görüldüğü gibi MySQL root kullanıcısına atanan yeni şifre aÇık olarak görülmektedir.
3.10 Ürnek Veritabanı ve Tabloların Güvenliği
Kurulum ile birlikte ön tanımlı olarak gelen örnek veritabanı ve MySQL root kullanıcısı
haricindeki kullanıcıların silinmesi gerekmektedir. Bunun iÇin aşağıdaki adımların sırası ile
uygulanması gerekmektedir. Bu şekilde anonim kullanıcıların da sistemden kaldırılması
sağlanmış olacaktır.

mysql > drop database test;
mysql > use MySQL;
mysql > delete from user where not (host=”localhost” and user=”root”);

3.11 Yama Kontrolü

Herhangi bir uygulama iÇin en önemli güvenlik aÇığı, uygulama iÇin yayınlanmış güvenlik
yamalarıdır. Düzenli olarak kullanımak istenen uyguglma iÇin yayınlanmış güvenlik yamaları
takip edilmeli ve uygulanmalıdır. MySQL sunucu servisi iÇinde bu tehlike şekil 2-1”de bugüne
kadar MySQL sunucu servisi iÇin yayınlanmış güvenlik yamaları ile gösterilmiştir. İlgili
güvenlik yamaları http://www.mysql.com/ adresinden ya da bu konu üzerinde Çalışma gösteren
sitelerin e-posta listelerinden düzenli olarak takip edilmeli ve uygulanmalıdır.

3.12 DNS Güvenliği

DNS ön bellek zehirlenmesi gibi DNS saldırılarını önlemek iÇin, kullanıcı yetkilendirmesi
esnasında kullanılan DNS isimleri yerine ip adres bilgisi kullanılmalıdır. Bu duruma örnek bir
kullanım aşağıda gösterilmiştir.

4 . K AYNAKÜA
[1 ] http://dev.mysql.com/doc/
[2 ] http://www.securityfocus.com/infocus/1726
[3 ] http://www.securityfocus.com/infocus/1706
[4 ] http://forge.mysql.com/wiki/Security_Vulnerabilities_In_MySQL_Server
[5 ] Hazırlayan Gökhan ALKAN