Giriş ve Ön Koşullar
Veritabanı sunucuları, hassas verileri depoladıkları ve işledikleri için siber güvenlik tehditlerine karşı en kritik hedeflerden biridir. MySQL gibi veritabanı sistemleri ile uygulamalar veya diğer hizmetler arasındaki iletişimin şifrelenmesi, yetkisiz erişimi ve veri sızıntılarını önlemek için hayati önem taşır. Bu rehberde, Ubuntu 18.04 üzerinde çalışan bir MySQL sunucusu için SSL/TLS (Secure Sockets Layer/Transport Layer Security) şifrelemesinin nasıl yapılandırılacağını adım adım inceleyeceğiz.
SSL/TLS, istemci ile sunucu arasındaki tüm veri trafiğini şifreleyerek, Man-in-the-Middle (Ortadaki Adam) saldırılarına, pasif dinlemeye ve veri bütünlüğünün bozulmasına karşı koruma sağlar. MySQL için SSL/TLS’i yapılandırmak, hem sunucu tarafında sertifikaların oluşturulmasını ve yapılandırılmasını hem de istemci tarafında bu sertifikaları kullanarak güvenli bağlantı kurulmasını gerektirir.
Ön Koşullar
- Ubuntu 18.04 işletim sistemi kurulu bir sunucu.
- MySQL sunucusu kurulu ve çalışır durumda (Bu rehber MySQL 5.7 veya 8.x sürümleri için geçerlidir).
sudoayrıcalıklarına sahip bir kullanıcı veyarooterişimi.- Temel Linux komut satırı bilgisi.
- OpenSSL kurulu (genellikle Ubuntu’da varsayılan olarak bulunur).
SSL/TLS Sertifikalarını Oluşturma
MySQL için SSL/TLS’i etkinleştirmek için bir Sertifika Yetkilisi (CA), sunucu sertifikası ve anahtarı ile isteğe bağlı olarak istemci sertifikası ve anahtarı oluşturmamız gerekir. Bu sertifikalar, iletişimin güvenliğini sağlamak için kullanılacaktır. Tüm sertifikaları aynı sunucu üzerinde oluşturacağız, ancak gerçek dünya senaryolarında CA genellikle ayrı, güvenli bir ortamda tutulur.
Sertifika Deposu Oluşturma
Öncelikle, sertifikalarımızı depolamak için bir dizin oluşturalım ve yetkisiz erişimi önlemek için izinlerini ayarlayalım:
sudo mkdir /etc/mysql/ssl
sudo chmod 700 /etc/mysql/ssl
cd /etc/mysql/ssl
Sertifika Yetkilisi (CA) Oluşturma
CA, hem sunucu hem de istemci sertifikalarını imzalayacak olan ana sertifikadır. Kendi CA’mızı oluşturacağız:
# CA anahtarını oluşturma
sudo openssl genrsa 2048 > ca-key.pem
CA sertifikasını oluşturma
sudo openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -sha256 -out ca.pem -subj "/CN=MyMySQLCA"
-subj "/CN=MyMySQLCA" parametresi, etkileşimli soruları atlayarak Ortak Adı (Common Name) doğrudan ayarlar. -days 3650, sertifikanın 10 yıl geçerli olacağını belirtir.
MySQL Sunucu Sertifikası ve Anahtarı Oluşturma
Şimdi MySQL sunucusu için bir anahtar ve sertifika isteği (CSR) oluşturup, bunu az önce oluşturduğumuz CA ile imzalayacağız.
# Sunucu anahtarını oluşturma
sudo openssl genrsa 2048 > server-key.pem
Sunucu sertifika isteğini (CSR) oluşturma
CN, sunucunun ana bilgisayar adı (hostname) veya IP adresi olmalıdır.
Eğer birden fazla ana bilgisayar adı/IP için geçerli olmasını istiyorsanız,
openssl.cnf dosyasına subjectAltName (SAN) eklemeniz gerekebilir.
sudo openssl req -new -key server-key.pem -nodes -sha256 -out server-req.csr -subj "/CN=your_mysql_server_hostname_or_ip"
CSR'yi CA ile imzalayarak sunucu sertifikasını oluşturma
sudo openssl x509 -req -in server-req.csr -days 3650 -sha256 -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
your_mysql_server_hostname_or_ip yerine MySQL sunucunuzun DNS adını veya IP adresini yazmayı unutmayın. İstemciler bu adı kullanarak sunucunun kimliğini doğrulayacaktır.
MySQL İstemci Sertifikası ve Anahtarı Oluşturma (İsteğe Bağlı)
Karşılıklı kimlik doğrulama (mutual authentication) için istemcinin de bir sertifika sunması gerekebilir. Bu, ek bir güvenlik katmanı sağlar. Bu adım isteğe bağlıdır, sadece sunucunun kimliğini doğrulamak yeterli ise atlanabilir.
# İstemci anahtarını oluşturma
sudo openssl genrsa 2048 > client-key.pem
İstemci sertifika isteğini (CSR) oluşturma
CN, istemcinin kimliğini tanımlayan herhangi bir değer olabilir.
sudo openssl req -new -key client-key.pem -nodes -sha256 -out client-req.csr -subj "/CN=mysqlclient"
CSR'yi CA ile imzalayarak istemci sertifikasını oluşturma
sudo openssl x509 -req -in client-req.csr -days 3650 -sha256 -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem
Sertifika İzinlerini Ayarlama
Oluşturulan anahtarların ve sertifikaların yalnızca MySQL kullanıcısı tarafından okunabilir olduğundan emin olmalıyız:
sudo chmod 400 ca-key.pem server-key.pem client-key.pem
sudo chmod 444 ca.pem server-cert.pem client-cert.pem
Bu komutlar, özel anahtarların (*.pem ile bitenler) yalnızca sahibine okuma izni verirken, genel sertifikaların herkes tarafından okunabilir olmasını sağlar.
MySQL Sunucusunu SSL/TLS İçin Yapılandırma
Sertifikalar oluşturulduktan sonra, MySQL sunucusunu bu sertifikaları kullanacak şekilde yapılandırmamız gerekir. MySQL yapılandırma dosyası genellikle /etc/mysql/mysql.conf.d/mysqld.cnf veya /etc/mysql/my.cnf konumundadır. Ubuntu 18.04’te /etc/mysql/mysql.conf.d/mysqld.cnf dosyasını düzenleyeceğiz.
MySQL Yapılandırma Dosyasını Düzenleme
Tercih ettiğiniz metin düzenleyici ile mysqld.cnf dosyasını açın:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld] bölümünün altına aşağıdaki satırları ekleyin:
[mysqld]
...
ssl-ca=/etc/mysql/ssl/ca.pem
ssl-cert=/etc/mysql/ssl/server-cert.pem
ssl-key=/etc/mysql/ssl/server-key.pem
İsteğe bağlı: Sadece SSL/TLS bağlantılarına izin vermek için
require_secure_transport=ON
bind-address = 127.0.0.1 (Eğer sadece yerel bağlantılara izin veriyorsanız)
skip-networking (Eğer sadece Unix soket bağlantılarına izin veriyorsanız)
require_secure_transport=ON parametresi, MySQL sunucusunun sadece SSL/TLS şifrelemeli bağlantıları kabul etmesini sağlar. Bu, güvenlik için şiddetle tavsiye edilir. Eğer bu satırı eklerseniz, SSL/TLS kullanmayan hiçbir istemci bağlanamayacaktır.
MySQL Servisini Yeniden Başlatma
Yapılandırma değişikliklerinin etkili olması için MySQL servisini yeniden başlatın:
sudo systemctl restart mysql
Herhangi bir hata olup olmadığını kontrol etmek için günlükleri (log) kontrol edebilirsiniz:
sudo systemctl status mysql
sudo journalctl -xe | grep mysql
SSL/TLS Yapılandırmasını Doğrulama
MySQL sunucusuna bağlanarak SSL/TLS’in düzgün çalıştığını doğrulayabiliriz. Varsayılan olarak, yerel bağlantılar genellikle SSL/TLS kullanmaz. Bu nedenle, bir uzaktan bağlantı simüle etmek veya require_secure_transport=ON ayarını yaptıysanız, SSL/TLS parametreleriyle bağlanmayı denemelisiniz.
mysql -u root -p --ssl-mode=DISABLED # Eğer require_secure_transport=ON ise bu başarısız olur
mysql -u root -p --ssl-mode=REQUIRED # SSL/TLS zorunlu olduğunda
Bağlandıktan sonra aşağıdaki komutları çalıştırarak SSL/TLS durumunu kontrol edin:
SHOW STATUS LIKE 'Ssl_cipher';
SHOW VARIABLES LIKE '%ssl%';
Ssl_cipher değişkeni boş değilse (örneğin, TLS_AES_256_GCM_SHA384 gibi bir değer gösteriyorsa), SSL/TLS başarıyla etkinleştirilmiş demektir. have_ssl değişkeninin YES olduğunu ve ssl_ca, ssl_cert, ssl_key değişkenlerinin doğru dosya yollarını gösterdiğini de kontrol edin.
MySQL İstemcisini SSL/TLS ile Bağlanacak Şekilde Yapılandırma
MySQL sunucusu SSL/TLS için yapılandırıldıktan sonra, istemcilerin de güvenli bir şekilde bağlanması gerekir. Bu bölüm, komut satırı istemcisi ve genel uygulama bağlantıları için yapılandırmayı kapsar.
Komut Satırı İstemcisi ile Bağlanma
İstemci sertifikalarını oluşturduysanız (karşılıklı kimlik doğrulama), bunları kullanarak bağlanabilirsiniz:
mysql -h your_mysql_server_hostname_or_ip -u your_username -p \
--ssl-ca=/path/to/ca.pem \
--ssl-cert=/path/to/client-cert.pem \
--ssl-key=/path/to/client-key.pem
Sadece sunucunun kimliğini doğrulamak istiyorsanız (istemci sertifikası olmadan):
mysql -h your_mysql_server_hostname_or_ip -u your_username -p \
--ssl-ca=/path/to/ca.pem \
--ssl-mode=VERIFY_IDENTITY # veya VERIFY_CA
--ssl-ca: CA sertifikasının yolu.--ssl-cert: İstemci sertifikasının yolu (isteğe bağlı).--ssl-key: İstemci anahtarının yolu (isteğe bağlı).--ssl-mode: Bağlantının SSL/TLS davranışını belirler:DISABLED: SSL/TLS kullanma (eğer sunucu zorlamıyorsa).PREFERRED: Mümkünse SSL/TLS kullan, yoksa kullanma.REQUIRED: SSL/TLS kullan, yoksa başarısız ol. Sunucu sertifikasını doğrulama.VERIFY_CA: SSL/TLS kullan ve sunucu sertifikasının CA tarafından imzalandığını doğrula.VERIFY_IDENTITY: SSL/TLS kullan, sunucu sertifikasının CA tarafından imzalandığını doğrula VE Common Name’in (CN) ana bilgisayar adı ile eşleştiğini doğrula. Bu en güvenli moddur.
Bağlandıktan sonra \s komutu ile bağlantı durumunu kontrol edebilirsiniz. SSL: Cipher in use is ... gibi bir satır görmeniz gerekir.
Uygulamalar için SSL/TLS Yapılandırması
Çoğu programlama dili ve veritabanı sürücüsü, MySQL’e SSL/TLS ile bağlanmayı destekler. Genellikle bağlantı dizesinde veya yapılandırma nesnesinde sslmode, ssl_ca, ssl_cert, ssl_key gibi parametreler belirtilir.
Örnek: PHP PDO ile SSL/TLS
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::MYSQL_ATTR_SSL_CA => '/path/to/client/ca.pem',
// İsteğe bağlı: Karşılıklı kimlik doğrulama için
PDO::MYSQL_ATTR_SSL_CERT => '/path/to/client/client-cert.pem',
PDO::MYSQL_ATTR_SSL_KEY => '/path/to/client/client-key.pem',
// PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true // MySQL 8+ için sunucu sertifikasını doğrula
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
echo "Veritabanına SSL/TLS ile başarıyla bağlandı!\n";
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
?>
Örnek: Python MySQL Connector ile SSL/TLS
import mysql.connector
try:
conn = mysql.connector.connect(
host="your_mysql_server_hostname_or_ip",
user="your_username",
password="your_password",
database="your_database_name",
ssl_ca="/path/to/client/ca.pem",
# İsteğe bağlı: Karşılıklı kimlik doğrulama için
ssl_cert="/path/to/client/client-cert.pem",
ssl_key="/path/to/client/client-key.pem",
ssl_verify_cert=True # Sunucu sertifikasını doğrula
)
print("Veritabanına SSL/TLS ile başarıyla bağlandı!")
conn.close()
except mysql.connector.Error as err:
print(f"Hata: {err}")
Uygulamanızın çalıştığı sunucuya CA ve istemci sertifikalarını (eğer kullanılıyorsa) kopyalamayı ve doğru yolları belirtmeyi unutmayın.
Sonuç ve Sıkça Sorulan Sorular
Bu rehberde, Ubuntu 18.04 üzerinde bir MySQL sunucusu için SSL/TLS şifrelemesini nasıl yapılandıracağınızı öğrendiniz. Kendi Sertifika Yetkilinizi oluşturarak, sunucu ve istemci sertifikalarını imzalayarak, MySQL sunucusunu ve istemcilerini bu sertifikaları kullanacak şekilde yapılandırdık. Bu adımlar, veritabanı iletişiminizin güvenliğini önemli ölçüde artırarak hassas verilerinizin korunmasına yardımcı olacaktır.
SSL/TLS kullanımı, özellikle veritabanı sunucusu ile istemcilerin farklı makinelerde bulunduğu veya internet üzerinden iletişim kurduğu durumlarda kritik öneme sahiptir. Güvenli bir veritabanı ortamı oluşturmak için bu yapılandırmayı uygulamak, genel güvenlik duruşunuzu güçlendirecektir.
Sıkça Sorulan Sorular (SSS)
Q: MySQL sunucum yeniden başlatılmıyor veya SSL/TLS etkinleşmiyor, ne yapmalıyım?
A: Öncelikle MySQL hata günlüklerini kontrol edin (sudo journalctl -xe | grep mysql veya /var/log/mysql/error.log). En yaygın sorunlar şunlardır:
- Yanlış dosya yolları:
mysqld.cnfdosyasındakissl-ca,ssl-cert,ssl-keyyollarının doğru olduğundan emin olun. - Dosya izinleri: Anahtar dosyalarının (
*-key.pem) sadece MySQL kullanıcısı tarafından okunabilir olduğundan emin olun (chmod 400). - Sertifika hataları: Sertifikaların doğru formatta (PEM) olduğundan ve geçerlilik sürelerinin dolmadığından emin olun.
- Yanlış Common Name (CN): Sunucu sertifikasının CN’sinin istemcinin bağlanmaya çalıştığı ana bilgisayar adı veya IP ile eşleştiğinden emin olun, özellikle
VERIFY_IDENTITYkullanılıyorsa.
Q: Mevcut bir SSL/TLS sertifikasını (örneğin Let’s Encrypt’ten) kullanabilir miyim?
A: Evet, kullanabilirsiniz. Let’s Encrypt gibi bir sağlayıcıdan aldığınız sertifikalar genellikle zaten CA zinciri ile birlikte gelir ve PEM formatındadır. Bu durumda, kendi CA’nızı oluşturmanıza gerek kalmaz. ssl-ca, ssl-cert ve ssl-key parametrelerini sağlayıcınızdan aldığınız ilgili dosyalara (genellikle fullchain.pem, cert.pem ve privkey.pem) işaret etmeniz yeterlidir.
Q: SSL/TLS kullanmak MySQL performansını etkiler mi?
A: Modern CPU’lar ve SSL/TLS uygulamaları ile şifreleme/şifre çözme işleminin performansa etkisi genellikle çok düşüktür ve çoğu uygulama için fark edilmez. Özellikle yüksek trafikli veritabanlarında çok küçük bir ek yük olabilir, ancak sağladığı güvenlik faydaları bu küçük maliyetten çok daha ağır basar.
Q: Neden hem sunucu hem de istemci sertifikaları oluşturduk?
A: Sunucu sertifikası, istemcinin sunucunun kimliğini doğrulamasını sağlar. İstemci sertifikası ise sunucunun istemcinin kimliğini doğrulamasını sağlar. Bu, “karşılıklı kimlik doğrulama” (mutual authentication) olarak bilinir ve ek bir güvenlik katmanı sunar, çünkü sadece doğru sertifikaya sahip istemcilerin bağlanmasına izin verir. Eğer sadece sunucunun kimliğini doğrulamak yeterliyse, istemci sertifikaları oluşturmak ve yapılandırmak zorunlu değildir.
Q: Sertifikaların geçerlilik süreleri dolduğunda ne olur?
A: Sertifikaların geçerlilik süreleri dolduğunda, MySQL bağlantıları başarısız olacaktır, çünkü istemciler sunucu sertifikasını doğrulayamayacak veya sunucu istemci sertifikasını doğrulayamayacaktır. Bu nedenle, sertifikaların geçerlilik sürelerini takip etmek ve süreleri dolmadan yenilemek önemlidir. Kendi imzaladığınız sertifikalar için bu, yeni sertifikalar oluşturup MySQL yapılandırmasını güncellemek anlamına gelir.