MariaDB root parolasını unuttuysanız önce sudo mariadb ile bağlanmayı deneyin: Linux kurulumlarında root hesabı varsayılan olarak unix_socket ile doğrulandığı için sistem root kullanıcısı parola olmadan girebilir ve ALTER USER ya da SET PASSWORD ile yeni parola atayabilir. Bu yol da kapalıysa sunucu geçici olarak --skip-grant-tables ile başlatılır, bağlanılır, FLUSH PRIVILEGES çalıştırılır, parola değiştirilir ve sunucu normal ayarlarla yeniden başlatılır.

Bu yazı iki yolu da adım adım anlatıyor, ardından günlük parola yönetimine geçiyor: SET PASSWORD ve ALTER USER farkı, parola süresi (PASSWORD EXPIRE), süresi dolan parolalarla gelen kısıtlı kip ve parola doğrulama eklentileri. Bilgiler resmî MariaDB Server belgelerinden alındı. Kimlik doğrulama yöntemlerinin kendisi unix_socket ve ed25519 yazısında, serinin geri kalanı MariaDB öğrenme rehberi sayfasında.

Önce şunu deneyin: sudo mariadb

Bağlantı sorunları kılavuzu, yeni kurulmuş bir sunucuda Access denied for 'root'@'localhost' hatası alanlara önce bu çözümü önerir. Linux'taki varsayılan güvenlik modelinde MariaDB root hesabı sistemin root kullanıcısına bağlıdır; mariadb -u root -p ile parola girmeye çalıştığınızda sunucu parolanızı değil işletim sistemi kimliğinizi beklediği için girişi reddedebilir. Doğru komut şudur:

bash
sudo mariadb

Kimlik doğrulama sayfası da aynı noktayı vurgular: root parolanızı unuttuysanız sudo ile bağlanıp parolayı değiştirebilirsiniz. Bağlandıktan sonra parolayı şöyle atarsınız:

sql
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('your_new_strong_password');

Tam sıfırlama: --skip-grant-tables ile

Tam sıfırlama: --skip-grant-tables ile: 1. Sunucuyu durdurun, 2. Seçeneği geçici olarak ekleyin, 3. Başlatın ve bağlanın, 4. Yetki tablolarını yeniden yükleyin ve parolayı...

sudo mariadb çalışmıyorsa, örneğin root hesabından unix_socket yöntemini daha önce kaldırdıysanız, son çare yetki tablolarını devre dışı bırakarak başlatmaktır. Belgelere göre --skip-grant-tables sunucuyu yetki tabloları olmadan başlatır ve bu, tüm kullanıcılara tüm tablolara tam erişim verir. Kılavuz bunu yalnızca geçici olarak ve son derece dikkatli kullanmanızı ister. MariaDB 10.10'dan itibaren aynı ayar skip_grant_tables adıyla bir sistem değişkeni olarak da görünür; dinamik değildir, yani yalnızca açılışta ayarlanabilir.

1. Sunucuyu durdurun

systemd kullanan dağıtımlarda servis şu komutla durdurulur. Servis yönetiminin ayrıntıları systemd yazısında anlatılıyor.

bash
sudo systemctl stop mariadb.service

2. Seçeneği geçici olarak ekleyin

Kılavuz sunucuyu komut satırından --skip-grant-tables ile elle başlatmayı anlatır. systemd ile yönetilen bir sunucuda aynı seçeneği sunucunun okuduğu bir seçenek grubuna yazmak da aynı etkiyi verir; seçenek dosyalarında baştaki iki tire yazılmaz. Belgeler kendi ayarlarınız için ayrı bir dosya önerir: RHEL, Rocky Linux ve SLES'te /etc/my.cnf.d/z-custom-my.cnf, Debian ve Ubuntu'da /etc/mysql/mariadb.conf.d/z-custom-my.cnf. Dosyalar hakkında ayrıntı my.cnf yazısında.

ini
[mariadb]
skip-grant-tables
skip-networking

Buradaki skip-networking satırı isteğe bağlı bir önlemdir. Belgelere göre bu ayar açıkken sunucu TCP/IP bağlantılarını dinlemez ve tüm erişim Unix soket dosyası üzerinden olur. Yetki denetimi kapalıyken sunucunun ağdan erişilebilir olmaması, bu kısa sürede herhangi birinin dışarıdan tam yetkiyle bağlanmasını önler. Uygulamanız bu sürede veritabanına erişemeyecektir; işlemi bakım penceresinde yapın.

3. Başlatın ve bağlanın

bash
sudo systemctl start mariadb.service
mariadb -u root

Kılavuza göre bu modda root@localhost için parola gerekmez. Ayrıca belgelere göre Event Scheduler da yetki tablolarına dayandığı için --skip-grant-tables ile çalışırken otomatik olarak devre dışı kalır; zamanlanmış görevleriniz bu süre içinde çalışmaz.

4. Yetki tablolarını yeniden yükleyin ve parolayı değiştirin

Kimlik doğrulama sayfasındaki adımlara göre önce FLUSH PRIVILEGES çalıştırılır. Bu komut yetki tablolarını yeniden etkinleştirir, yani --skip-grant-tables etkisini o çalışma için kaldırır ve saklanan kimlik doğrulama yöntemini değiştirmenize izin verir. Ardından parola atanır:

sql
FLUSH PRIVILEGES;
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('your_new_strong_password');

root'un hem sudo ile parolasız hem de parolayla girebilmesini, yani kurulumdaki düzeni geri istiyorsanız iki yöntemi OR ile birlikte tanımlayabilirsiniz. Aşağıdaki deyim belgelerdeki IDENTIFIED VIA ... OR ... yazımını ALTER USER ile kullanır:

sql
ALTER USER root@localhost IDENTIFIED VIA unix_socket
   OR mysql_native_password USING PASSWORD("your_new_strong_password");

5. Seçeneği kaldırıp normal başlatın

Eklediğiniz skip-grant-tables (ve varsa skip-networking) satırlarını silin ya da dosyayı kaldırın, sonra sunucuyu yeniden başlatın. Bu adımı atlamak, sunucuyu bir sonraki yeniden başlatmada herkese açık bırakmak demektir.

bash
sudo systemctl restart mariadb.service

Son olarak yeni parolayla bağlanarak işlemi doğrulayın. Sunucu yeniden başlamazsa hata günlüğüne bakın; olası nedenler sık hatalar yazısında ve error log yazısında anlatılıyor.

Günlük parola değişikliği: SET PASSWORD ve ALTER USER

SET PASSWORD var olan bir hesaba parola atar. FOR yazılmazsa geçerli oturumun hesabının parolası değişir ve anonim olmayan her hesap kendi parolasını bu yolla değiştirebilir. Başka bir hesabın parolasını değiştirmek için mysql veritabanında UPDATE yetkisi gerekir. Parola PASSWORD() içinde düz metin olarak verilir ya da doğrudan özet olarak yazılır.

sql
SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('newpass');

Aynı işi ALTER USER ile de yapabilirsiniz; bu deyim parola süresi ve kilit gibi diğer ayarları da aynı yerde toplar. Kendi parolanız için CURRENT_USER() yazılabilir:

sql
ALTER USER CURRENT_USER() IDENTIFIED BY 'mariadb';

Belgelere göre SET PASSWORD, parolaları mysql.global_priv içinde saklayan eklentilerle (ed25519, mysql_native_password, mysql_old_password) çalışır ve PASSWORD() hesabın eklentisine uygun biçimde özetlenir. unix_socket, named_pipe, gssapi ve pam parola saklamadığı için bu hesaplarda sunucu şu türden bir hata verir:

text
SET PASSWORD IS ignored FOR users authenticating via unix_socket plugin

SET PASSWORD FOR 'bob'@localhost = PASSWORD(""); parolayı siler. Belgelere göre parolaya dayalı eklentilerde parola boş olabilir ve o durumda parola gerekmez; bu yüzden bu deyimi yalnızca gerçekten istiyorsanız kullanın.

Parola süresi

Parolaların belirli aralıklarla değiştirilmesini zorunlu kılmak için iki katman vardır. Genel politika default_password_lifetime değişkeniyle belirlenir; belgelere göre varsayılanı 0'dır ve bu, otomatik parola süresinin kapalı olduğu anlamına gelir. Pozitif bir N değeri parolaların her N günde bir değiştirilmesi gerektiğini belirtir. Hesap bazındaki ayar genel ayarın önüne geçer:

sql
ALTER USER 'monty'@'localhost' PASSWORD EXPIRE INTERVAL 120 DAY;
ALTER USER 'monty'@'localhost' PASSWORD EXPIRE NEVER;
ALTER USER 'monty'@'localhost' PASSWORD EXPIRE DEFAULT;

NEVER sınırı kapatır, DEFAULT hesabı yeniden genel politikaya bağlar. Belgelere göre SHOW CREATE USER parola süresini gösterir ama MySQL'den farklı olarak DEFAULT olan ya da kilitli olmayan durumu yazmaz:

sql
SHOW CREATE USER 'monty'@'localhost';
+------------------------------------------------------------------+
| CREATE USER for monty@localhost                                  |
+------------------------------------------------------------------+
| CREATE USER 'monty'@'localhost' PASSWORD EXPIRE INTERVAL 120 DAY |
+------------------------------------------------------------------+

Süresi dolan parola ve kısıtlı kip

Parolası dolmuş bir kullanıcının nasıl karşılanacağını disconnect_on_expired_password belirler. Belgelere göre varsayılanı OFF'tur; bu durumda kısıtlı kipi bilmeyen istemciler de bağlanır ama yalnızca parola sıfırlamayla ilgili sınırlı deyimleri, özellikle SET PASSWORD ve SET, çalıştırabilir. Değişken açıksa bu istemcilerin bağlanmasına izin verilmez. mariadb istemcisinin --connect-expired-password seçeneği, --batch verilmiş olsa bile istemcinin bu kipi işleyebildiğini sunucuya bildirir. MariaDB 11.5'ten itibaren parola süresi bilgileri Information Schema USERS tablosunda da tutulur ve yetkisiz bir kullanıcı kendi satırını bu tablodan okuyabilir.

Tüm hesapların parolalarının ne zaman dolacağını görmek isteyen yönetici için belgelerde mysql.global_priv tablosunun JSON alanlarını okuyan uzunca bir sorgu verilir. Sorgunun mantığı basittir: hesabın kendi password_lifetime değeri yoksa genel @@global.default_password_lifetime kullanılır, password_last_changed zaman damgasına bu kadar gün eklenerek bitiş tarihi hesaplanır. Aşağıda sorgunun ilk kısmını görüyorsunuz; tamamı parola süresi sayfasında yer alıyor.

sql
WITH password_expiration_info AS (
  SELECT User, Host,
  IF(
   IFNULL(JSON_EXTRACT(Priv, '$.password_lifetime'), -1) = -1,
   @@global.default_password_lifetime,
   JSON_EXTRACT(Priv, '$.password_lifetime')
  ) AS password_lifetime,
  JSON_EXTRACT(Priv, '$.password_last_changed') AS password_last_changed
  FROM mysql.global_priv
)

Parola doğrulama eklentileri

Parola doğrulama eklentileri: simple_password_check_minimal_length, simple_password_check_digits, simple_password_check_letters_same_case, simple_password_check_other_characters

Zayıf parolaları en baştan reddetmek için parola doğrulama eklentileri kullanılır. MariaDB üç eklentiyle gelir: simple_password_check, cracklib_password_check ve password_reuse_check. Belgelere göre hiçbiri varsayılan olarak etkin değildir; INSTALL SONAME ile kurulurlar. En az bir eklenti yüklüyken tüm yeni parolalar denetlenir ve birden fazla eklenti yüklüyse parola hepsinin denetiminden geçmelidir.

sql
INSTALL SONAME 'simple_password_check';

simple_password_check ilk kurulduğunda en az sekiz karakter, en az bir rakam, bir büyük harf, bir küçük harf ve harf ya da rakam olmayan bir karakter ister. Kurallara uymayan parola belgelerdeki şu hatayla reddedilir:

sql
SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('abc');
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
DeğişkenVarsayılanAnlamı
simple_password_check_minimal_length8En az karakter sayısı
simple_password_check_digits1En az rakam sayısı
simple_password_check_letters_same_case1En az büyük ve en az küçük harf sayısı
simple_password_check_other_characters1Harf ve rakam dışındaki en az karakter sayısı

cracklib_password_check, birçok Linux dağıtımında zaten kurulu olan CrackLib kütüphanesiyle parolanın gücünü denetler. Belgelere göre en az cracklib 2.9.0 gerektirir ve paylaşılan kütüphanesi derlenebildiği sistemlerde MariaDB paketlerine dahildir; kurulumu yine INSTALL SONAME 'cracklib_password_check'; ile yapılır. Bir parola reddedildiğinde CrackLib'in asıl gerekçesi SHOW WARNINGS ile görülebilir; belgelerdeki örnekte uyarı satırında parolanın kullanıcı adına dayandığı yazar. SELinux zorlayıcı kipte çalışan sistemlerde mariadbd sözlük dizinine erişemeyebilir ve güçlü parolalar da aynı hatayla reddedilebilir; bu bilinen sorun eklentinin sayfasında anlatılıyor.

password_reuse_check ise kullanıcının eski bir parolayı yeniden kullanmasını engeller. Eski parolalar mysql.password_reuse_check_history tablosunda saklanır; ne kadar süre tutulacağını password_reuse_check_interval belirler ve varsayılan 0 sınırsız saklama demektir. Belgelerdeki örnekte aynı parola ikinci kez denendiğinde reddedilir:

sql
INSTALL SONAME 'password_reuse_check';

GRANT SELECT ON *.* TO user1@localhost identified by 'pwd1';
Query OK, 0 rows affected (0.038 sec)

GRANT SELECT ON *.* TO user1@localhost identified by 'pwd1';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

Özet olarak verilen parolalar ve strict_password_validation

Parola düz metin yerine özet olarak verildiğinde, örneğin IDENTIFIED BY PASSWORD '...' ile, eklentilerin denetleyebileceği bir şey kalmaz. strict_password_validation bu durumu yönetir: belgelere göre varsayılan olarak ON'dur ve en az bir doğrulama eklentisi yüklüyken doğrulanamayan, yani özet olarak verilen parolaları reddeder. Eklenti yüklü değilse etkisi yoktur. Bu değişkeni kapatmak, doğrulamayı özetle atlamanın kapısını açar.

Sık yapılan hatalar

  • Hemen skip-grant-tables'a başvurmak: Çoğu durumda sudo mariadb yeterlidir.
  • skip-grant-tables satırını dosyada unutmak: Bir sonraki yeniden başlatmada sunucu yine yetki denetimi olmadan açılır.
  • Bu modda sunucuyu ağa açık bırakmak: Yetki denetimi kapalıyken TCP dinlemesini skip-networking ile kapatmayı düşünün.
  • FLUSH PRIVILEGES olmadan kimlik doğrulama yöntemini değiştirmeye çalışmak: Belgelerdeki sıra önce FLUSH PRIVILEGES, sonra SET PASSWORD şeklindedir.
  • unix_socket hesabında SET PASSWORD beklemek: Bu eklenti parola saklamaz; hesaba parolalı bir yöntem eklemek için ALTER USER ... IDENTIFIED VIA gerekir.
  • Parola süresini secure_timestamp olmadan güvenilir sanmak: Oturum zaman damgası değiştirilerek sınır atlatılabilir.
  • Doğrulama eklentisini kurup özet parolaları unutmak: strict_password_validation kapalıysa özetle verilen parolalar denetlenmez.

Sık Sorulan Sorular

Yeni kurulumda root parolası nedir?

Belgelere göre kurulumda root için geçerli bir parola yoktur; saklanan değer 'invalid' olduğundan parolayla giriş kapalıdır ve giriş sudo mariadb ile yapılır. Parola isterseniz SET PASSWORD ile atarsınız. İlk güvenlik adımları için mariadb-secure-installation yazısına bakın.

skip-grant-tables açıkken kimler bağlanabilir?

Belgelere göre bu modda tüm kullanıcılar tüm tablolara tam erişime sahiptir. Bu yüzden süreyi kısa tutun, mümkünse TCP dinlemesini kapatın ve işlem biter bitmez seçeneği kaldırıp sunucuyu yeniden başlatın.

Uygulama kullanıcısının parolasını değiştirdim, site çalışmıyor. Neden?

Uygulamanın yapılandırma dosyasındaki parola hâlâ eskisidir. Parolayı uygulamada da güncelleyin. WordPress için veritabanı bağlantı hatası yazısına bakabilirsiniz.

Kullanıcıların zayıf parola seçmesini nasıl engellerim?

simple_password_check ya da cracklib_password_check eklentisini kurun, gerekirse password_reuse_check ile eski parolaların tekrarını da engelleyin ve strict_password_validation değişkenini açık bırakın.

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 kimlik doğrulama · MariaDB CREATE USER · mariadb-secure-installation · MariaDB systemd · MariaDB my.cnf · WordPress veritabanı bağlantı hatası