spacer.png, 0 kB
Bilgi için: bilgi at bilgiguvenligi gov tr   

 

spacer.png, 0 kB
spacer.png, 0 kB
MySQL Sunucu ve İstemci Trafiğinin Şifrelenmesi Yazdır E-posta
Gökhan ALKAN, TÜBİTAK-UEKAE   
18.04.2009

Aksi belirtilmedikçe MySQL sunucusu  ile istemcisi 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. İstemci sunucu arasındaki ağ trafiğini gözlemlemek isteyen kişiler, sunucu istemci arasında açık metin olarak gerçekleştirilen ağ trafiğini 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 gözlemlenebilen SQL 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 SQL sorguları açık olarak görülmektedir. Aynı durum MySQL sunucusu ve istemcisi arasındaki trafiğin şifreli olarak iletildiğinde aşağıdaki 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
gLO
%DgLOY
gLOY
lnp@
%HgLOY4
5.0.45
bA['P;xl
gLO\
gLO_
4nq@
%KgLO_
gLOo
4nr@

Yukarıda görüldüğü gibi MySQL sunucusu 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 ve 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 1'de görüldüğü gibi “SHOW VARIABLES LIKE 'have_openssl'” sql sorgusu ile görüntülenebilir.

ekil_1_3_mysql_ssl_desteinin_kontrol_edilmesi.png

Şekil 1 MySQL Ssl Desteğinin Kontrol Edilmesi

“Value” değerinin  “DISABLED” olması, veritabanı sunucusunun SSL desteğinini aktif hale getirilmesi için 5.0 öncesi sürümlerde "--with-vio", "--with-openssl" seçeneklerinin kullanılması gerekmektedir.5.0sürümleri için "--with-openssl" seçeneğinin kullanılması yeterli olacaktır. 5.1 ve sonrası sürümlerde SSL desteğinini aktif hale getirilmesi için "--with-ssl" seçeneğinin kullanılması yeterli olacaktır.

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 bizim tarafımızdan üretilerek, sunucu ve istemci için oluşturulacak sertifikalar bu sertifika yardımı ile üretilecektir. Bunun için  öncelikle sertifikalar için uygun bir dizin belirlenmeli ve gerekli sertifikalar oluşturulmalıdır.

# mkdir /usr/local/mysql-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 []: Bu mail adresi spam botlara karşı korumalıdır, görebilmek için Javascript açık olmalıdır

 

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 []: Bu mail adresi spam botlara karşı korumalıdır, görebilmek için Javascript açık olmalıdır
 
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= Bu mail adresi spam botlara karşı korumalıdır, görebilmek için Javascript açık olmalıdır
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 []: Bu mail adresi spam botlara karşı korumalıdır, görebilmek için Javascript açık olmalıdır
 
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= Bu mail adresi spam botlara karşı korumalıdır, görebilmek için Javascript açık olmalıdır
Getting CA Private Key

Sertifikaların oluşturulmasının ardından kullanım için MySQL sunucu tarafında sertifikaların 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 ardından MySQL sunucu servisi üzerinde SSL kullanımının aktif olduğu görülebilecektir.

ekil_4_mysql_sunucu_servisi_in_ssl_kullanmnn_aktif_hale_getirilmesi.png

Şekil 2 MySQL Sunucu Servisi İçin SSL Kullanımının Aktif Hale Getirilmesi

Ardından MySQL istemcisi sertifika kullanımı için gerekli yapılandırmanın 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ın sırası ile takip edilmelidir. Kullanılmak istenen MySQL istemcisine gore sertifika kullanımı ile ilgili yapılandırma farklılık göstereceği unutulmamalıdır. Ö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 gore farklı bir dizin seçilebilmektedir.

ekil_5_mysql_stemcisinde_ssl_kullanm_aktif_olmadan_nce.png

Şekil 3 MySQL İstemcisinde SSL Kullanımı Aktif Olmadan Önce

MySQL istemcisi için SSL sertifika kullanımının durumunu “SHOW STATUS LIKE ‘Ssl_cipher’” SQL sorgusu çalıştırılarak elde edilebilir. Bu duruma örnek bir kullanım Şekil 3’de gösterilmiştir.

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

[client]
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 ayaları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_6_ifreleme_in_kullanlacak_olan_anahtarn_durumunun_grntlenmesi.png

Şekil 4 Şifreleme İçin Kullanılacak Olan Anahtarın Durumunun Görüntülenmesi

SSL kullanımının aktif olmasının ardından MySQL kullanıcılarının SSL kullanımı ile MySQL sunucu servisi ile iletişime geçmelerini zorlamak için GRANT ifadesinde “REQUIRE SSL” kullanılarak gerçekleştirilebilir. Örnek bir ifade aşağıda yer almaktadır.

mysql> GRANT ALL ON deneme.* TO Bu mail adresi spam botlara karşı korumalıdır, görebilmek için Javascript açık olmalıdır 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 Şekil 5’de görülen hata mesajı ile karşılaşılacaktır.

ekil_7_ssl_kullanm_zorlanm_mysql_kullancsnn_ssl_kullanm_olmakszn_balant_gerekletirilmesi_esnasnda_karlalan_hata_mesaj.png

Şekil 5 SSL Kullanımı Zorlanmış MySQL Kullanıcısının SSL Kullanımı Olmaksızın Bağlantı Gerçekleştirilmesi Esnasında Karşılaşılan Hata Mesajı

KAYNAKLAR

[1] http://dev.mysql.com/doc/

[2] http://www.securityfocus.com/infocus/1726

[3] http://forge.mysql.com/wiki/Security_Vulnerabilities_In_MySQL_Server


Favori olarak ekle (0) | Görüntüleme sayısı: 1980

Bu yazıya ilk yorumu yazın

Sadece kayıtlı kullanıcılar yorum yazabilir.
Lütfen sisteme giriş yapın veya kayıt olun.

 
spacer.png, 0 kB
spacer.png, 0 kB
Copyright 2012 TÜBİTAK-BİLGEM. Sitenin teknik altyapısında Joomla kullanılmıştır. Yazar ve site referans gösterilmeden alıntı yapılamaz. Görüşleriniz
spacer.png, 0 kB