MariaDB'de bir kullanıcının kim olduğunu kanıtlama işi kimlik doğrulama eklentilerine (authentication plugin) bırakılır. Linux'ta kurulumla gelen root@localhost hesabı unix_socket eklentisini kullanır: işletim sisteminde root iseniz sudo mariadb ile parolasız bağlanırsınız. Eklenti belirtmeden oluşturulan hesaplar mysql_native_password ile çalışır; daha güçlü parola doğrulaması için ed25519 ya da MariaDB 11.6 ile gelen PARSEC kullanılabilir. Eklenti, CREATE USER ya da ALTER USER içinde IDENTIFIED VIA ile seçilir.

Bu yazı eklentilerin nasıl çalıştığını, hangisinin varsayılan olarak kurulu geldiğini, bir hesaba birden fazla yöntem tanımlamayı ve root hesabını parolalı girişe döndürmeyi belgelere dayanarak anlatıyor. Hesap oluşturmanın genel kuralları CREATE USER yazısında, parola değiştirme ve unutulan root parolası ise root parolası sıfırlama yazısında yer alıyor. Tüm seri için MariaDB öğrenme rehberi sayfasına bakın.

Kurulumdan sonra root nasıl doğrulanır?

Kimlik doğrulama sayfasına göre mariadb-install-db iki adet tam yetkili hesap oluşturur: root ve veri dizininin sahibi olan işletim sistemi kullanıcısıyla aynı adı taşıyan hesap (genellikle mysql). Bu hesaplar belgelerde şu tanımla gösterilir:

sql
CREATE USER root@localhost IDENTIFIED VIA unix_socket 
    OR mysql_native_password USING 'invalid'
CREATE USER mysql@localhost IDENTIFIED VIA unix_socket 
    OR mysql_native_password USING 'invalid'

Tanım iki yöntemi sırayla dener. Önce unix_socket çalışır: bağlantı yerel Unix soket dosyası üzerinden geliyorsa ve bağlanan süreç işletim sisteminin root kullanıcısına aitse giriş parolasız kabul edilir. Bu başarısız olursa mysql_native_password denenir; ancak saklanan değer 'invalid' geçerli bir parola özeti olmadığı için, siz SET PASSWORD ile bir parola atayana kadar bu yol kapalıdır.

Belgeler bu tasarımın gerekçesini de açıklar: sistem root kullanıcısı zaten tüm veri dosyalarına ve süreç belleğine erişebildiği için ondan ayrıca parola istemek güvenliği artırmaz. Parola olmadığında unutulacak bir root parolası da, betiklerde düz metin olarak saklanması gereken bir parola da yoktur. Bu yüzden kurulumdan sonra doğru giriş yolu şudur:

bash
sudo mariadb

Bu komutun Unix soket üzerinden bağlandığını unutmayın. Belgelere göre sistem genelindeki /etc/my.cnf dosyasında protocol=tcp varsa sudo mariadb --protocol=socket kullanmanız gerekir. mariadb -u root -p ile parola girmeye çalışmak ise bağlantı sorunları kılavuzunda anlatıldığı gibi reddedilebilir, çünkü sunucu bir parola değil işletim sistemi kimliğinizi bekler.

unix_socket eklentisi nasıl çalışır?

unix_socket eklentisi nasıl çalışır? Birden fazla Unix kullanıcısını tek hesaba bağlamak, Güçlü ve zayıf yanları

unix_socket, sokete bağlanan sürecin kullanıcı kimliğini (uid) getsockopt sistem çağrısı ve SO_PEERCRED seçeneğiyle öğrenir, bu kimliğe karşılık gelen kullanıcı adını bulur ve aynı adı taşıyan MariaDB hesabı olarak oturum açar. Belgelere göre Unix ve Linux sürümlerinde varsayılan olarak kuruludur ve hiçbir özel istemci eklentisi gerektirmez; tüm istemcilerle çalışır.

Belgelerdeki örnekte serg ve monty için iki hesap açılır. İşletim sisteminde serg olarak oturum açmış biri --user=serg ile bağlanabilir, ama --user=monty denemesi şu hatayla reddedilir:

text
ERROR 1045 (28000): Access denied for user 'monty'@'localhost' (using password: NO)
sql
CREATE USER username@hostname IDENTIFIED VIA unix_socket;

Birden fazla Unix kullanıcısını tek hesaba bağlamak

Belgelere göre MariaDB 11.6 öncesinde eklenti yalnızca işletim sistemi kullanıcı adının MariaDB kullanıcı adıyla aynı olup olmadığına bakar ve kimlik doğrulama dizesini yok sayar. MariaDB 11.6'dan itibaren AS ile verilen dize soket kullanıcısının adıyla karşılaştırılır. Aşağıdaki hesap A adını taşır ama yalnızca Unix kullanıcısı bob'u kabul eder; A adında bir Unix kullanıcısını kabul etmez. Bağlandıktan sonra @@external_user değişkeni işletim sistemi kullanıcısını gösterir.

sql
CREATE USER A identified via unix_socket as 'bob';

SELECT USER(),@@external_user;
+-------------+-----------------+
| user()      | @@external_user |
+-------------+-----------------+
| A@localhost | bob             |
+-------------+-----------------+

Birden fazla Unix kullanıcısının aynı hesapla bağlanması için her kullanıcı ayrı bir unix_socket girdisi olarak OR ile yazılır:

sql
CREATE USER A IDENTIFIED VIA unix_socket AS 'bob' OR unix_socket AS 'alice';

Güçlü ve zayıf yanları

Belgeler bu yöntemin parolasız olduğunu ve güvenliğinin parolanın karmaşıklığına değil, Unix kullanıcısına erişimin ne kadar korunduğuna dayandığını vurgular. Güçlü yanları: kaba kuvvetle kırılacak ya da yedeklerde, yapılandırma dosyalarında yanlışlıkla açığa çıkacak bir parola yoktur; örneğin www-data kullanıcısı root hesabına bu yolla erişemez. Zayıf yanları ise sistemin kendi kullanıcı güvenliğine bağlıdır: geniş sudo izinleri, başka kullanıcıların yazabildiği ve cron ile çalışan betikler, komut enjeksiyonuna açık ve yetkili bir Unix kullanıcısıyla çalışan web sayfaları, zayıf uzaktan erişim yöntemleri gibi.

Eklentiyi kullanmak istemiyorsanız sunucu seçeneğiyle kapatabilirsiniz. Belgelerde iki eşdeğer yazım verilir: seçeneğe OFF değeri vermek ya da disable ön ekini kullanmak. Bunu yapmadan önce root hesabına parolalı bir yöntem tanımladığınızdan emin olun; aksi hâlde yönetici girişini kaybedersiniz.

ini
[mariadb]
unix_socket=OFF
ini
[mariadb]
disable_unix_socket

mysql_native_password: varsayılan ama en güçlüsü değil

old_passwords değişkeni varsayılan değeri olan 0'da iken, eklenti belirtmeden oluşturulan her hesap mysql_native_password kullanır. Bu eklenti sunucuya statik olarak bağlıdır, kurulum gerektirmez ve tüm istemci kütüphanelerince desteklenir. Parolayı MySQL 4.1 ile gelen ve SHA-1 tabanlı bir algoritmayla özetler.

Belgeler bu eklentiyi yüksek parola güvenliği gereken yeni kurulumlar için önermez. Gerekçe açıktır: bağlantı protokolünü dinleyebilen ve aynı zamanda mysql.user tablosunun bir kopyasını ele geçiren biri, bu bilgilerle sunucuya bağlanabilir. Önerilen modern alternatif ed25519'dir. Daha eski ve güvensiz olan mysql_old_password ise yalnızca çok eski istemciler içindir ve kullanılmamalıdır; secure_auth bu eklentiyle gelen bağlantıları engeller.

ed25519 eklentisi

ed25519, parolaları OpenSSH'in de kullandığı Ed25519 eliptik eğri imza algoritmasıyla saklar ve doğrular. Paylaşılan kütüphanesi (auth_ed25519.so) MariaDB ile birlikte gelir ama belgelere göre varsayılan olarak kurulu değildir. Sunucuyu yeniden başlatmadan kurmak için:

sql
INSTALL SONAME 'auth_ed25519';

Sunucu açılışında yüklenmesini isterseniz seçenek dosyasına şu satırı eklersiniz. Seçenek dosyalarının nerede durduğu ve hangi grupların okunduğu my.cnf yazısında anlatılıyor.

ini
[mariadb]
plugin_load_add = auth_ed25519

Hesap, IDENTIFIED VIA ed25519 ve USING PASSWORD('...') ile oluşturulur. Belgeler bu eklentiyle parola verilmeden oluşturulan hesapların bağlanamayacağını özellikle belirtir. Parolayı sonradan ALTER USER ya da SET PASSWORD ile değiştirebilirsiniz.

sql
CREATE USER username@hostname IDENTIFIED VIA ed25519 USING PASSWORD('secret');

ALTER USER username@hostname IDENTIFIED VIA ed25519 USING PASSWORD('new_secret');

İstemci tarafında libmysqlclient ya da MariaDB Connector/C kullanan araçlar için client_ed25519 istemci eklentisi gerekir. İstemci eklentiyi bulamazsa --plugin-dir ile eklenti dizinini göstermeniz gerekebilir. Belgelere göre Connector/C, Connector/ODBC, Connector/J ve Connector/Node.js bu yöntemi destekler; .NET tarafında MySqlConnector ayrı bir NuGet paketiyle destek sağlar. Uygulamanızın kullandığı sürücünün desteğini kontrol etmeden üretim hesaplarını taşımayın; PHP ile bağlantı ayarları için PDO yazısına bakabilirsiniz.

PARSEC: geleceğin varsayılanı

Belgelere göre PARSEC MariaDB 11.6'dan itibaren kullanılabilir ve gelecekteki bir sürümde varsayılan olması amaçlanmaktadır. Tuzlanmış parolalar, PBKDF2 anahtar türetme, genişletilebilir bir saklama biçimi ve hem sunucu hem istemci tarafında rastgele değerler kullanır; yanıtı OpenSSL, WolfSSL ya da GnuTLS'in sağladığı değiştirilmemiş ed25519 ile imzalar. Varsayılan olarak kurulu ya da kullanılır değildir.

Eklenti yüklü değilken hesap oluşturmaya çalışırsanız belgelerde verilen şu hatayı alırsınız:

text
ERROR 1524 (HY000): Plugin 'parsec' is not loaded

Çözüm eklentiyi bir kez kurmaktır. Belgelere göre ek seçenek gerekmez; sunucu yeniden başlatılsa ya da yükseltilse de kurulu olduğunu hatırlar. Ardından hesap normal sözdizimiyle oluşturulur:

sql
INSTALL SONAME 'auth_parsec';

CREATE USER test1@'%' IDENTIFIED VIA parsec USING PASSWORD('pwd');

caching_sha2_password: yalnızca geçiş için

MySQL'den gelen kullanıcıları parolalarını değiştirmeden taşımak için MariaDB, MySQL uyumlu caching_sha2_password eklentisini sağlar. Belgelere göre Community Server'da 11.4.9, 11.8.4 ve 12.1 sürümlerinden itibaren vardır, varsayılan olarak kurulu değildir ve yalnızca geçiş amacıyla kullanılması, diğer durumlarda PARSEC tercih edilmesi önerilir. Kurulumu INSTALL SONAME 'auth_mysql_sha2'; ile yapılır. MySQL'deki mysql.user tablosundan alınan kimlik doğrulama dizesiyle hesap şöyle oluşturulur:

sql
CREATE USER user@host IDENTIFIED WITH caching_sha2_password USING 'authentication_string';

Belgeler bu dizenin yazdırılamayan karakterler içerebileceğini ve terminalden kopyalayıp yapıştırmanın büyük olasılıkla işe yaramayacağını hatırlatır. Geçişin genel adımları MySQL'den geçiş yazısında ele alınıyor.

Eklentilerin karşılaştırması

Eklentilerin karşılaştırması: unix_socket, mysql_native_password, ed25519, parsec
EklentiVarsayılan kurulu muParolaNot
unix_socketEvet (Unix ve Linux)Yokİşletim sistemi kullanıcısıyla eşleşir; yalnızca yerel soket
mysql_native_passwordEvetVar (SHA-1 tabanlı)Eklenti belirtilmezse kullanılır
ed25519Hayır, INSTALL SONAME gerekirVarİstemcide client_ed25519 gerekir
parsecHayır, INSTALL SONAME gerekirVar (tuzlu, PBKDF2)MariaDB 11.6 ile geldi
caching_sha2_passwordHayırVarMySQL geçişi için; 12.1 ile geldi
pam, gssapiHayırYapılandırmaya bağlıMerkezi kimlik doğrulama; ayrıntı resmî belgelerde

Bir hesaba birden fazla yöntem tanımlamak

Bir hesaba OR ile birden çok yöntem verilebilir; yöntemler yazıldıkları sırayla denenir ve biri başarılı olduğu anda giriş tamamlanır. Belgeler bunun tipik kullanımını, kullanıcıları zamanla ed25519'e taşırken geçiş süresince eski mysql_native_password yöntemini de açık tutmak olarak anlatır. Örneğin aşağıdaki hesap hem ed25519 parolasıyla hem de Unix soketiyle girebilir:

sql
CREATE USER safe@'%' IDENTIFIED VIA ed25519 USING PASSWORD('secret') OR unix_socket;

Hangi hesabın hangi yöntemleri kullandığını görmek için mysql.user yerine mysql.global_priv tablosuna bakmak gerekir; belgelere göre mysql.user artık bu tabloya dayanan bir görünümdür ve alternatif eklentileri göstermez:

sql
SELECT CONCAT(user, '@', host, ' => ', json_detailed(priv)) FROM mysql.global_priv;

root hesabını parolalı girişe döndürmek

Bazı yöneticiler root olarak sudo kullanmadan, parolayla bağlanmak ister. Kurulum yapıldıktan sonra belgelerde verilen yol şudur:

sql
ALTER USER root@localhost IDENTIFIED VIA mysql_native_password 
     USING PASSWORD("verysecret")

Bu deyim unix_socket yöntemini hesaptan kaldırır. Belgeler, parolasız erişime güvenen betiklerin bu değişiklikten sonra bozulacağını uyarır ve çözüm olarak parolanın /root/.my.cnf dosyasının [client] grubuna yazılabileceğini belirtir. Bunun parolayı düz metin olarak diske koymak anlamına geldiğini, yani unix_socket'in ortadan kaldırdığı riski geri getirdiğini göz önünde bulundurun. Genellikle daha iyi seçenek root'u olduğu gibi bırakıp günlük işler için ayrı, parolalı bir yönetici hesabı açmaktır.

ini
[client]
password=foo

Yeni kurulumlarda mariadb-install-db aracına --auth-root-authentication-method=normal verilerek root'un baştan parolaya dayalı oluşturulması da mümkündür. Kurulum aracının sayfasına göre bu seçeneğin varsayılanı socket'tir ve normal seçildiğinde root başlangıçta parolasız oluşturulduğu için güvensiz olabilir.

Kimlik doğrulama ve şifreli bağlantı ilişkisi

MariaDB 11.4 ile gelen sıfır yapılandırmalı TLS özelliği, sunucu sertifikasını doğrulamak için hesabın parolasını ortak sır olarak kullanır. Belgelere göre bu yalnızca kendi başına ortadaki adam saldırısına dayanıklı olan mysql_native_password, ed25519 ve parsec ile çalışır. PAM, GSSAPI ve caching_sha2_password gibi yöntemler TLS olmadan güvenli değildir ve klasik CA tabanlı doğrulama gerektirir. Ayrıntılar TLS yazısında.

Sık yapılan hatalar

Sık yapılan hatalar: Kurulumdan sonra mariadb -u root -p ile girmeye çalışmak, ed25519 ya da parsec eklentisini kurmadan hesap oluşturmak, İstemci tarafını unutmak, ALTER USER ile...
  • Kurulumdan sonra mariadb -u root -p ile girmeye çalışmak: root unix_socket kullanır; sudo mariadb ile bağlanın.
  • ed25519 ya da parsec eklentisini kurmadan hesap oluşturmak: Eklenti SHOW PLUGINS çıktısında etkin görünmüyorsa önce INSTALL SONAME gerekir.
  • İstemci tarafını unutmak: Sunucuda ed25519 açık olsa da istemci kütüphanesi client_ed25519 eklentisini bulamıyorsa bağlantı başarısız olur.
  • ALTER USER ile istemeden unix_socket'i kaldırmak: Korumak istediğiniz tüm yöntemleri OR ile yeniden yazın.
  • mysql.user görünümüne bakıp eklentileri eksik görmek: Alternatif yöntemler mysql.global_priv içinde görünür.
  • 12.3'te 13.x özelliklerini aramak: parsec_iterations gibi değişkenler belgelerde 13.1 olarak işaretlidir.

Sık Sorulan Sorular

Root parolası hiç sorulmadı, kurulum eksik mi kaldı?

Hayır. Belgelere göre root hesabı güvenli biçimde unix_socket ile oluşturulduğu için kurulum betikleri parola sormaz. Sistemde root olarak sudo mariadb ile bağlanırsınız. İlk güvenlik adımları için mariadb-secure-installation yazısına bakın.

Yeni hesaplar için hangi eklentiyi seçmeliyim?

Belgeler yüksek parola güvenliği için mysql_native_password yerine ed25519'i önerir ve PARSEC'in gelecekte varsayılan olmasının planlandığını belirtir. Seçmeden önce uygulamanızın sürücüsünün eklentiyi desteklediğini doğrulayın.

Uzak bir sunucudan unix_socket ile bağlanabilir miyim?

Hayır. Eklenti yalnızca yerel Unix soket dosyası üzerinden gelen bağlantılarda çalışır. Uzak bağlantılar için parolaya dayalı bir yöntem gerekir; ayarlar uzaktan bağlantı yazısında.

Bir kullanıcıyı ed25519'a geçirirken eski uygulamalar ne olacak?

Geçiş süresince hesaba OR ile hem ed25519 hem de mevcut yöntemi tanımlayabilirsiniz. Tüm istemciler güncellendiğinde eski yöntemi ALTER USER ile kaldırırsınız.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: MariaDB öğrenme rehberi · MariaDB CREATE USER · MariaDB root parolası sıfırlama · MariaDB TLS bağlantı · mariadb-secure-installation · MySQL'den MariaDB'ye geçiş · MariaDB nedir