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.
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 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)
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.
...................................................................+++
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
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.
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
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 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 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 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 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ı