Takip et

MariaDB ERROR 2002 (HY000) Çözümü: TLS El Sıkışma Hatası ve “Host Is Not Allowed to Connect” Sorunu

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 Fai…

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:

  1. 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ı.
  2. TLS Koşulları: Kullanıcının veya sunucunun, bağlantının TLS üzerinden yapılmasını zorunlu kılması (örn. REQUIRE SSL veya REQUIRE X509 gibi GRANT seç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.
  3. bind-address Kı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 mysql veya mariadb) 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_cert ve ssl_key ile 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_CA veya VERIFY_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.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.