MariaDB ERROR 2002 (HY000) Çözümü: TLS El Sıkışma Hatası ve “Host Is Not Allowed to Connect” Sorunu
MariaDB veritabanı sunucularında karşılaşılan ERROR 2002 (HY000): TLS Handshake Fails with "Host Is Not Allowed to Connect" hatası, hem bağlantı güvenliği (TLS/SSL) hem de sunucu erişim izinleriyle ilgili karmaşık bir soruna işaret eder. Bu makale, bu hatanın kökenlerini anlamanıza, olası nedenlerini belirlemenize ve adım adım çözümler uygulamanıza yardımcı olmayı amaçlamaktadır. Hem sunucu hem de istemci tarafındaki yapılandırmaları detaylıca inceleyerek, veritabanı bağlantılarınızı güvenli ve sorunsuz hale getirme yolculuğunuzda size rehberlik edeceğiz.
1. Hatayı Anlamak: ERROR 2002 ve TLS El Sıkışma Süreci
MariaDB’de karşılaşılan ERROR 2002 (HY000) genellikle bir bağlantı hatasıdır. Ancak bu özel durumda, hatanın devamında yer alan “TLS Handshake Fails” ve “Host Is Not Allowed to Connect” ifadeleri, sorunun sadece basit bir bağlantı reddinden öte, güvenlik katmanında ve erişim politikalarında yattığını gösterir. Bu bölüm, bu ifadelerin ne anlama geldiğini ve TLS el sıkışma sürecinin nasıl işlediğini açıklayacaktır.
1.1. TLS/SSL Nedir ve Neden Önemlidir?
TLS (Transport Layer Security) ve selefi SSL (Secure Sockets Layer), internet üzerinden gönderilen verilerin güvenliğini sağlamak için kullanılan kriptografik protokollerdir. MariaDB gibi veritabanı sistemlerinde TLS kullanımı, istemci ile sunucu arasındaki tüm iletişimin şifrelenmesini sağlayarak hassas verilerin dinlenmesini (eavesdropping) ve kurcalanmasını (tampering) engeller. Ayrıca, sunucu kimlik doğrulaması (server authentication) ve isteğe bağlı olarak istemci kimlik doğrulaması (client authentication) yaparak bağlantının doğru taraflar arasında kurulduğundan emin olur.
1.2. El Sıkışma Sürecinde Neler Yanlış Gidebilir?
TLS el sıkışma (handshake) süreci, istemci ve sunucunun güvenli bir bağlantı kurmak için birbirleriyle iletişim kurduğu adımlar dizisidir. Bu süreçte birçok şey yanlış gidebilir:
- Sertifika Sorunları: Sunucu sertifikasının süresinin dolması, geçersiz olması, güvenilmeyen bir CA (Certificate Authority) tarafından imzalanması veya istemcinin CA sertifikasına sahip olmaması.
- Anahtar Sorunları: Sertifikayla eşleşmeyen özel anahtar (private key) kullanılması.
- Protokol veya Şifre Uyuşmazlığı: İstemci ve sunucunun desteklediği TLS protokol versiyonları (örn. TLSv1.2, TLSv1.3) veya şifre süitlerinin (cipher suites) uyumsuz olması.
- Saat Farkı: İstemci ve sunucu arasındaki önemli saat farkları, sertifika geçerlilik kontrollerini etkileyebilir.
- İstemci Sertifikası Zorunluluğu: Sunucunun istemciden bir sertifika talep etmesi ancak istemcinin bunu sağlamaması veya geçersiz bir sertifika sunması.
1.3. “Host Is Not Allowed to Connect” İfadesinin Anlamı
Bu ifade genellikle iki ana senaryoda karşımıza çıkar:
- Kullanıcı İzinleri: MariaDB’de tanımlı kullanıcının, bağlantı kurmaya çalıştığı IP adresi veya ana bilgisayar adından bağlanma izni olmaması. Örneğin, bir kullanıcı sadece
user@'localhost'olarak tanımlanmışken, başka bir IP adresinden bağlanmaya çalışması. - TLS Koşulları: Kullanıcının veya sunucunun, bağlantının TLS üzerinden yapılmasını zorunlu kılması (örn.
REQUIRE SSLveyaREQUIRE X509gibiGRANTseçenekleri). Eğer TLS el sıkışması başarısız olursa, sunucu bağlantıyı reddeder ve bu mesajı gösterebilir, çünkü belirtilen koşullar sağlanamamıştır. bind-addressKısıtlaması: MariaDB sunucusunun sadece belirli IP adreslerinden gelen bağlantıları dinleyecek şekilde yapılandırılması ve istemcinin bu izin verilen adresler arasında olmaması.
2. MariaDB Sunucu Tarafı TLS/SSL Yapılandırmasını Kontrol Etme
Bu hatanın en yaygın nedenlerinden biri, MariaDB sunucusunun TLS/SSL yapılandırmasındaki yanlışlıklardır. Sunucunun doğru sertifikaları kullandığından ve güvenli bir şekilde yapılandırıldığından emin olmalıyız.
2.1. my.cnf Dosyasını İnceleme
MariaDB yapılandırma dosyası olan my.cnf (veya ilgili my.cnf.d dizinindeki dosyalar), sunucunun TLS ayarlarını içerir. Bu dosyayı genellikle /etc/mysql/my.cnf, /etc/my.cnf veya /etc/mysql/mariadb.conf.d/50-server.cnf gibi konumlarda bulabilirsiniz. Aşağıdaki parametreleri kontrol edin:
[mariadb]
# Veya [mysqld] bölümünde de olabilir
ssl_ca=/etc/mysql/certs/ca.pem
ssl_cert=/etc/mysql/certs/server-cert.pem
ssl_key=/etc/mysql/certs/server-key.pem
# İsteğe bağlı, ancak güvenlik için önerilir
# tls_version=TLSv1.2,TLSv1.3
# ssl_cipher=TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
ssl_ca: Güvenilir kök sertifika otoritesinin (CA) sertifika dosyasının yolu. İstemci sertifikalarını doğrulamak için kullanılır.ssl_cert: Sunucunun kendi sertifika dosyasının yolu.ssl_key: Sunucunun özel anahtar dosyasının yolu.tls_version: Desteklenen TLS protokol versiyonlarını belirtir. Eski ve zayıf versiyonları (örn. TLSv1.0, TLSv1.1) devre dışı bırakmak önemlidir.ssl_cipher: Kullanılacak şifre süitlerini belirtir. Güvenli ve modern süitler tercih edilmelidir.
2.2. Sertifika ve Anahtar Dosyalarının Doğruluğu
Belirtilen sertifika ve anahtar dosyalarının:
- Mevcut Olduğundan: Dosyaların belirtilen yollarda gerçekten bulunduğundan emin olun.
- Okunabilir Olduğundan: MariaDB kullanıcısının (genellikle
mysqlveyamariadb) bu dosyalara okuma izni olduğundan emin olun. Özel anahtar dosyası için izinler çok kısıtlı olmalıdır (örn.600). - Geçerli Olduğundan: Sertifikaların süresinin dolmadığından ve bozuk olmadığından emin olun.
- Eşleştiğinden:
ssl_certvessl_keyile belirtilen sertifika ve özel anahtarın birbirine uyumlu olduğundan emin olun. Bunu aşağıdaki komutlarla kontrol edebilirsiniz:openssl x509 -noout -modulus -in /etc/mysql/certs/server-cert.pem | openssl md5 openssl rsa -noout -modulus -in /etc/mysql/certs/server-key.pem | openssl md5 # Her iki komutun çıktısı aynı olmalıdır.
2.3. TLS Protokol Versiyonları ve Şifre Süitleri
Hem istemci hem de sunucunun ortak bir TLS versiyonu ve şifre süiti üzerinde anlaşabilmesi gerekir. Eğer sunucu çok kısıtlayıcı bir yapılandırmaya sahipse ve istemci bu kısıtlamaları karşılayamıyorsa, el sıkışma başarısız olur. Güvenlik için eski TLS versiyonlarını (TLSv1.0, TLSv1.1) devre dışı bırakmak, ancak istemcilerinizin desteklediği modern versiyonları (TLSv1.2, TLSv1.3) etkin bırakmak önemlidir.
2.4. Sunucuyu Yeniden Başlatma ve Logları Kontrol Etme
my.cnf dosyasında yapılan herhangi bir değişiklikten sonra MariaDB hizmetini yeniden başlatmanız gerekir:
sudo systemctl restart mariadb
Yeniden başlatmanın ardından, MariaDB hata loglarını kontrol ederek TLS ile ilgili herhangi bir uyarı veya hata olup olmadığını inceleyin:
sudo journalctl -u mariadb # Systemd kullanan sistemler için
# Veya
sudo tail -f /var/log/mysql/error.log # Eski sistemler veya farklı yapılandırmalar için
3. MariaDB Kullanıcı İzinlerini ve Bağlantı Ayarlarını Gözden Geçirme
"Host Is Not Allowed to Connect" mesajı, genellikle MariaDB'nin kendi içindeki kullanıcı izinleri veya ağ ayarlarıyla ilgilidir. TLS el sıkışması başarılı olsa bile, bu sorunlar bağlantıyı engelleyebilir.
3.1. Kullanıcı İzinlerini ve GRANT Deyimlerini Kontrol Etme
Bağlantı kurmaya çalıştığınız kullanıcının, istemcinin IP adresinden veya ana bilgisayar adından bağlanma izni olduğundan emin olun. Ayrıca, TLS gereksinimlerini kontrol edin.
SELECT user, host, ssl_type FROM mysql.user WHERE user = 'your_user';
Eğer kullanıcınızın host değeri localhost ise ve siz uzak bir IP'den bağlanmaya çalışıyorsanız, bağlantı reddedilecektir. host değeri % (herhangi bir host) veya belirli bir IP adresi olmalıdır. Eğer ssl_type değeri ANY, X509, SPECIFIED veya REQUIRED ise, bağlantının TLS üzerinden yapılması zorunludur.
Kullanıcının izinlerini güncellemek için:
-- Kullanıcının belirli bir host'tan bağlanmasına izin verme
GRANT ALL PRIVILEGES ON your_database.* TO 'your_user'@'your_client_ip' IDENTIFIED BY 'your_password' REQUIRE SSL;
-- Veya herhangi bir host'tan bağlanmasına izin verme (güvenlik riski taşıyabilir, dikkatli olun)
-- GRANT ALL PRIVILEGES ON your_database.* TO 'your_user'@'%' IDENTIFIED BY 'your_password' REQUIRE SSL;
-- Sadece sertifika ile kimlik doğrulama gerektiren bir kullanıcı oluşturma
-- CREATE USER 'tls_user'@'%' REQUIRE X509;
-- GRANT ALL PRIVILEGES ON your_database.* TO 'tls_user'@'%';
FLUSH PRIVILEGES;
REQUIRE SSL, bağlantının şifreli olmasını zorunlu kılar. REQUIRE X509 ise ek olarak istemcinin geçerli bir sertifika sunmasını ve bu sertifikanın CA tarafından imzalanmış olmasını gerektirir.
3.2. bind-address Ayarının İncelenmesi
MariaDB sunucusu, my.cnf dosyasındaki bind-address ayarı ile hangi ağ arayüzlerinden bağlantıları dinleyeceğini belirler. Eğer bu ayar 127.0.0.1 (localhost) olarak yapılandırılmışsa, sunucu sadece yerel bağlantıları kabul edecektir. Uzak bağlantılara izin vermek için bu ayarı sunucunun IP adresine veya 0.0.0.0 (tüm arayüzler) olarak değiştirmelisiniz.
[mariadb]
bind-address=0.0.0.0 # Tüm arayüzlerden gelen bağlantılara izin verir
# Veya belirli bir IP adresi:
# bind-address=192.168.1.100
Değişiklik yaptıktan sonra MariaDB hizmetini yeniden başlatmayı unutmayın.
3.3. Güvenlik Duvarı (Firewall) Kontrolü
Sunucu üzerindeki bir güvenlik duvarı (örn. ufw, firewalld, iptables) MariaDB'nin varsayılan portu olan 3306'ya gelen bağlantıları engelliyor olabilir. İstemcinin IP adresinden bu porta erişime izin verildiğinden emin olun.
# UFW için örnek
sudo ufw allow from your_client_ip to any port 3306
sudo ufw enable
sudo ufw status verbose
# Firewalld için örnek
sudo firewall-cmd --permanent --add-source=your_client_ip --add-port=3306/tcp
sudo firewall-cmd --reload
4. MariaDB İstemci Tarafı TLS/SSL Yapılandırması
Sorun sadece sunucuda değil, istemcinin MariaDB'ye bağlanma şekli ve TLS yapılandırmasında da olabilir.
4.1. İstemci Bağlantı Dizgesini İnceleme
İstemcinizin MariaDB'ye bağlanmak için kullandığı komut veya kod dizgesini kontrol edin. TLS bağlantısı kurmak için genellikle belirli parametreler gereklidir.
mysql -h your_mariadb_host -u your_user -p \
--ssl-mode=REQUIRED \
--ssl-ca=/path/to/client/certs/ca.pem \
--ssl-cert=/path/to/client/certs/client-cert.pem \
--ssl-key=/path/to/client/certs/client-key.pem
--ssl-mode=REQUIRED: İstemcinin TLS bağlantısı kurmasını zorunlu kılar.--ssl-ca: Sunucunun sertifikasını doğrulamak için kullanılan CA sertifikasının yolu.--ssl-cert: İstemcinin kendi sertifikasının yolu (sunucu istemci sertifikası talep ediyorsa).--ssl-key: İstemcinin özel anahtarının yolu (sunucu istemci sertifikası talep ediyorsa).
4.2. İstemci Sertifikaları ve CA Dosyaları
Eğer sunucu istemci sertifikası talep ediyorsa (REQUIRE X509), istemcinin doğru ve geçerli bir sertifika ile özel anahtara sahip olması ve bunları bağlantı sırasında sunması gerekir. Ayrıca, istemcinin sunucu sertifikasını doğrulaması için sunucunun sertifikasını imzalamış olan CA'nın sertifikasına da ihtiyacı vardır.
İstemci tarafındaki sertifika dosyalarının da doğru izinlere sahip olduğundan ve bozuk olmadığından emin olun.
4.3. ssl-mode Parametresi
ssl-mode parametresi, istemcinin TLS bağlantısını nasıl kuracağını belirler:
DISABLED: TLS kullanma. (Güvenlik riski taşır, önerilmez)PREFERRED: Mümkünse TLS kullan, değilse kullanma.REQUIRED: TLS kullanmak zorunlu. Eğer TLS bağlantısı kurulamıyorsa, bağlantı başarısız olur.VERIFY_CA: TLS kullan ve sunucu sertifikasını CA'ya göre doğrula.VERIFY_IDENTITY: TLS kullan, sunucu sertifikasını CA'ya göre doğrula ve sertifikadaki ana bilgisayar adının bağlanmaya çalışılan ana bilgisayar adıyla eşleştiğinden emin ol.
Güvenlik için genellikle VERIFY_CA veya VERIFY_IDENTITY kullanılması önerilir.
5. Ortak Hata Ayıklama Adımları ve Araçlar
Sorunu teşhis etmek için kullanabileceğiniz bazı genel hata ayıklama teknikleri ve araçları vardır.
5.1. MariaDB Hata Loglarını İnceleme
MariaDB hata logları, sunucu tarafındaki sorunlar hakkında en değerli bilgiyi sağlar. TLS el sıkışma hataları, sertifika sorunları veya izin reddi gibi durumlar burada açıkça belirtilebilir. Logları düzenli olarak kontrol etmek, sorunun kök nedenini hızlıca bulmanıza yardımcı olur.
sudo tail -f /var/log/mysql/error.log
# Veya
sudo journalctl -u mariadb -f
5.2. openssl Komutları ile Bağlantı Testi
openssl s_client aracı, MariaDB sunucusunun TLS yapılandırmasını dışarıdan test etmek için çok güçlü bir araçtır. İstemci tarafında bir MariaDB bağlantısı kurmadan önce sunucunun TLS özelliklerini kontrol edebilirsiniz.
openssl s_client -connect your_mariadb_host:3306 -CAfile /path/to/client/certs/ca.pem
Bu komut, sunucu ile bir TLS el sıkışması yapmaya çalışır ve bağlantının detaylarını (kullanılan TLS versiyonu, şifre süiti, sunucu sertifikası bilgileri vb.) gösterir. Eğer el sıkışma başarısız olursa, hatanın nerede olduğunu anlamanıza yardımcı olacak mesajlar göreceksiniz.
5.3. Ağ İzleme Araçları (Wireshark, tcpdump)
Daha derinlemesine bir analiz için Wireshark veya tcpdump gibi ağ izleme araçlarını kullanabilirsiniz. Bu araçlar, ağ üzerinden geçen tüm paketleri yakalayarak TLS el sıkışma sürecini adım adım görmenizi sağlar. Hangi tarafın hangi mesajı gönderdiğini ve nerede bir hata oluştuğunu (örn. "Alert (Level: Fatal, Description: Handshake Failure)") tespit etmenize yardımcı olabilir.
6. Pratik Çözümler ve En İyi Uygulamalar
Bu tür hataları önlemek ve MariaDB bağlantılarınızı güvenli tutmak için bazı en iyi uygulamalar mevcuttur.
6.1. Sertifikaları Yenileme ve Doğrulama
Sertifikalarınızın süresinin dolmadığından ve doğru bir şekilde yapılandırıldığından emin olun. Sertifikaları düzenli olarak yenilemek ve CA sertifikalarının hem sunucu hem de istemci tarafında güncel olduğundan emin olmak önemlidir. Let's Encrypt gibi hizmetler, otomatik sertifika yenileme için kullanılabilir.
6.2. Güvenli TLS Yapılandırması İçin Öneriler
- Her zaman modern TLS versiyonlarını (TLSv1.2, TLSv1.3) kullanın ve eski, zayıf versiyonları devre dışı bırakın.
- Güçlü şifre süitleri kullanın ve zayıf olanları devre dışı bırakın.
- Hem sunucu hem de istemci tarafında sertifika doğrulamasını (
VERIFY_CAveyaVERIFY_IDENTITY) zorunlu kılın. - Özel anahtar dosyalarının izinlerini çok kısıtlı tutun (sadece MariaDB kullanıcısı okuyabilir).
6.3. Otomatik Sertifika Yönetimi
Let's Encrypt ve Certbot gibi araçlar, sertifika yaşam döngüsünü (oluşturma, yenileme, dağıtma) otomatikleştirmek için kullanılabilir. Bu, manuel hataları azaltır ve sertifikaların süresinin dolması gibi sorunları önler.
7. Geçici Çözümler ve Riskler
Acil durumlarda, sorunu hızlıca çözmek için bazı geçici çözümler uygulanabilir. Ancak bu çözümler genellikle güvenlik riskleri taşır ve kalıcı bir çözüm olarak düşünülmemelidir.
7.1. TLS'i Geçici Olarak Devre Dışı Bırakma (UYARI!)
Eğer acil bir durumdaysanız ve bağlantı kurmanız gerekiyorsa, TLS'i geçici olarak devre dışı bırakabilirsiniz. Bu, my.cnf dosyasındaki ssl_ca, ssl_cert, ssl_key ayarlarını yorum satırı yaparak ve MariaDB'yi yeniden başlatarak yapılabilir. İstemci tarafında da ssl-mode=DISABLED kullanmanız gerekebilir.
[mariadb]
#ssl_ca=/etc/mysql/certs/ca.pem
#ssl_cert=/etc/mysql/certs/server-cert.pem
#ssl_key=/etc/mysql/certs/server-key.pem
UYARI: Bu, bağlantınızı şifresiz hale getirir ve verilerinizi dinlemeye karşı savunmasız bırakır. Sadece hata ayıklama amacıyla ve çok kısa süreliğine kullanılmalıdır.
7.2. skip-name-resolve Kullanımı (UYARI!)
Eğer "Host Is Not Allowed to Connect" hatası DNS çözümleme sorunlarından kaynaklanıyorsa, my.cnf dosyasına skip-name-resolve ekleyebilirsiniz. Bu, MariaDB'nin istemci ana bilgisayar adlarını IP adreslerine çözümlemeye çalışmasını engeller ve sadece IP adresleriyle çalışır.
[mariadb]
skip-name-resolve
UYARI: Bu ayar, kullanıcı izinlerini sadece IP adresleri üzerinden yönetmenizi gerektirir (örn. user@'192.168.1.10'). Ayrıca, güvenlik denetimi ve loglama açısından bazı zorluklar yaratabilir. Yeniden başlattıktan sonra, kullanıcı izinlerini IP adreslerine göre güncellemeyi unutmayın.
Sonuç
MariaDB'deki ERROR 2002 (HY000): TLS Handshake Fails with "Host Is Not Allowed to Connect" hatası, genellikle TLS/SSL yapılandırması, kullanıcı izinleri ve ağ erişimi gibi birden fazla faktörün birleşimiyle ortaya çıkan karmaşık bir sorundur. Bu makalede sunulan adımları izleyerek, hem sunucu hem de istemci tarafındaki olası sorunları sistematik bir şekilde teşhis edebilir ve çözebilirsiniz. Güvenli ve şifreli bağlantılar, veritabanı güvenliğinin temel taşıdır; bu nedenle, bu tür hataları gidermek ve doğru yapılandırmaları uygulamak kritik öneme sahiptir. Unutmayın, güvenlik ve erişilebilirlik arasında doğru dengeyi bulmak, sağlam bir veritabanı altyapısı için elzemdir.
SSS (Sık Sorulan Sorular)
S: ERROR 2002 her zaman TLS hatası mı demektir?
C: Hayır, ERROR 2002 genel bir bağlantı hatasıdır. Ancak bu makaledeki özel durumda, hatanın devamındaki "TLS Handshake Fails" ve "Host Is Not Allowed to Connect" ifadeleri, sorunun TLS ve host izinleriyle ilgili olduğunu belirtir.
S: my.cnf dosyasını nerede bulabilirim?
C: my.cnf dosyası genellikle Linux sistemlerinde /etc/mysql/my.cnf, /etc/my.cnf veya /etc/mysql/mariadb.conf.d/ dizini içinde (örn. 50-server.cnf) bulunur. Tam konum dağıtıma ve MariaDB sürümüne göre değişebilir.
S: Kendi imzalı (self-signed) sertifikaları kullanabilir miyim?
C: Evet, kendi imzalı sertifikaları kullanabilirsiniz, ancak istemcinizin bu sertifikaya veya onu imzalayan CA sertifikasına güvenmesi için manuel olarak yapılandırmanız gerekir. Üretim ortamlarında genellikle güvenilir bir CA tarafından imzalanmış sertifikalar tercih edilir.
S: Bağlantı kurarken neden ssl-mode=DISABLED kullanmamalıyım?
C: ssl-mode=DISABLED kullanmak, istemci ile sunucu arasındaki tüm iletişimin şifresiz olacağı anlamına gelir. Bu, hassas verilerin ağ üzerinde kolayca dinlenmesine (eavesdropping) yol açabilir ve ciddi güvenlik riskleri oluşturur. Yalnızca çok kısa süreli hata ayıklama durumları dışında kaçınılmalıdır.
S: "Host is not allowed to connect" hatası TLS olmadan da alınabilir mi?
C: Evet, bu hata TLS ile ilgili olmayan nedenlerle de alınabilir. Örneğin, MariaDB kullanıcısının belirli bir IP adresinden bağlanma izni yoksa (GRANT deyimleri), bind-address ayarı istemcinin erişimine izin vermiyorsa veya bir güvenlik duvarı bağlantıyı engelliyorsa, TLS kullanılmasa bile bu hatayla karşılaşabilirsiniz.