2026年5月23日
2026年5月23日
MySQLのパスワード変更とセキュリティ設定 WordPressを止めずに変える手順とパスワードポリシー
MySQL のユーザーのパスワードは ALTER USER 文で変更します。WordPress が使っているユーザーの場合は、MySQL 側を変えた瞬間に wp-config.php の値と食い違い、サイトが「データベース接続確立エラー」になる点に注意が必要です。この記事では、基本の変更手順、WordPress を止めずに切り替える方法、パスワードをログに残さない操作、パスワードポリシーとロックの設定、root のパスワードを忘れたときの復旧手順までを説明します。
作業の前に確認すること
- 変更するユーザーの正確な名前とホスト部分。MySQL のユーザーは
'wpuser'@'localhost'のように「名前+接続元」の組で1つです。同じ名前でもホストが違えば別のユーザーです - WordPress がどのユーザーで接続しているか。
wp-config.phpのDB_USERとDB_HOSTを見ます - データベースのバックアップと、MySQL に管理者として入れる手段(root や管理用ユーザー)。作業中に締め出されないよう、変更対象とは別の管理者ログインを確保しておきます
ユーザーの一覧と認証方式は次の文で確認できます。
SELECT user, host, plugin
FROM mysql.user
ORDER BY user, host;
plugin 列は認証方式です。MySQL 8.0 以降の既定は caching_sha2_password で、MySQL 8.4 では古い mysql_native_password が既定で無効になっています(2026年10月現在、細かな扱いはバージョンで異なるため公式ドキュメントで確認してください)。古い PHP や接続ライブラリとの組み合わせで認証エラーが出る場合は、まず PHP と mysqlnd を新しくすることを検討します。
基本のパスワード変更
ALTER USER 'wpuser'@'localhost' IDENTIFIED BY 'new-strong-password';
MySQL 5.7.6 以降と MariaDB 10.2 以降では ALTER USER が使えます。古い資料にある UPDATE mysql.user SET password = PASSWORD(...) は現在の MySQL では動かないため使いません。ALTER USER は権限表に即時反映されるので、FLUSH PRIVILEGES も通常は不要です。
パスワードは推測されにくい長いランダム文字列にします。たとえば次のコマンドで生成できます。
openssl rand -base64 32
wp-config.php では値をシングルクォートで囲むため、パスワードに ' や \ が入っていると PHP の文字列が壊れます。生成した値にこれらが含まれていたら作り直すか、記号を含まない長い文字列を使うと扱いやすくなります。
WordPressを止めずに切り替える(デュアルパスワード)
通常の手順では「MySQL を変更してから wp-config.php を書き換える」までの間、サイトが接続エラーになります。MySQL 8.0.14 以降では、古いパスワードを一時的に残したまま新しいパスワードを設定できます。
-- 1. 新しいパスワードを設定し、古いパスワードも当面有効にする
ALTER USER 'wpuser'@'localhost'
IDENTIFIED BY 'new-strong-password'
RETAIN CURRENT PASSWORD;
この状態では新旧どちらのパスワードでも接続できます。次に wp-config.php の DB_PASSWORD を新しい値に書き換え、サイトの表示と管理画面へのログインを確かめます。問題がなければ古いパスワードを無効にします。
-- 2. 古いパスワードを破棄する
ALTER USER 'wpuser'@'localhost' DISCARD OLD PASSWORD;
この構文は MySQL 固有で、MariaDB には同じ仕組みがありません。MariaDB の場合は、アクセスの少ない時間帯に「MySQL の変更」と「wp-config.php の書き換え」を続けて行い、停止時間を短くします。別の方法として、新しいユーザーを作って同じ権限を付け、wp-config.php を新ユーザーに切り替えてから旧ユーザーを削除する手もあります。
パスワードをログや履歴に残さない
パスワードの扱いで多い失敗は、変更そのものより「どこかに平文で残すこと」です。
mysql -u root -pパスワードのようにコマンドラインに書かない。シェルの履歴やプロセス一覧に残ります。-pだけを付けて対話入力にします- 自動処理で使う場合は、ホームディレクトリの
~/.my.cnfに書き、chmod 600で本人以外が読めないようにする。MySQL ならmysql_config_editorで難読化した設定ファイルを作る方法もあります - MySQL クライアントの履歴ファイル(
~/.mysql_history)は、パスワードを含む文を記録しない設定が既定になっていますが、クライアントの種類や設定によって異なります。不安なら履歴ファイルの中身を確認します - 一般クエリログや監査ログを有効にしている場合、設定によってはパスワードを含む文が記録されることがあります。ログの出力先の権限も確認してください
wp-config.phpを Git で管理している場合、パスワードはコミットしない。環境ごとのファイルに分けるか、環境変数から読み込みます
パスワードポリシーを設定する(validate_password)
MySQL には、弱いパスワードの設定を拒否する validate_password コンポーネントがあります。MySQL 8.0 以降では次のように有効にします。
INSTALL COMPONENT 'file://component_validate_password';
SHOW VARIABLES LIKE 'validate_password%';
validate_password.length(最小文字数)や validate_password.policy(LOW / MEDIUM / STRONG)などの変数で強さを調整します。既存のパスワードがさかのぼって弾かれることはなく、次に設定するときから効きます。MariaDB では simple_password_check や cracklib_password_check といった別のプラグインを使います。
失敗回数でロックする・使い回しを防ぐ
MySQL 8.0 では、ユーザーごとにログイン失敗時のロックやパスワード履歴を設定できます。
-- 4回連続で失敗したら2日間ロック(MySQL 8.0.19 以降)
ALTER USER 'wpuser'@'localhost'
FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 2;
-- 直近5回分のパスワードの再利用を禁止
ALTER USER 'wpuser'@'localhost' PASSWORD HISTORY 5;
WordPress 用のユーザーにロックを設定するときは、パスワードを書き間違えたままの設定ファイルや、古いパスワードを持ったままの cron などが失敗を重ね、サイト全体がロックされる可能性があります。ロックは人が使う管理用ユーザーから適用し、アプリ用ユーザーは接続元を絞る方法と組み合わせて検討してください。
パスワードの有効期限(PASSWORD EXPIRE INTERVAL)も設定できますが、アプリ用ユーザーで期限が切れると、その時点でサイトが止まります。期限を付ける場合は、更新の予定と担当を決めてからにします。
パスワード以外に見直したい設定
- 接続元を絞る:外部から接続しない構成なら、
my.cnfのbind-address = 127.0.0.1で待ち受けをローカルに限定します。WordPress 用ユーザーも'wpuser'@'localhost'のようにホストを限定します - 不要なユーザーを消す:匿名ユーザーやリモートからの root ログインは、
mysql_secure_installationで削除・無効化できます - 権限を最小にする:WordPress 用ユーザーには、そのデータベースだけの権限を付けます。プラグインの更新でテーブルを作ったり変更したりするため、
CREATEやALTERが必要になる点は考慮します - 外部から接続する場合:TLS を必須にし(
REQUIRE SSLなど)、ファイアウォールで接続元の IP を限定します
rootのパスワードを忘れたときの復旧
管理者のパスワードが分からなくなった場合は、サーバーの OS に root で入れることを前提に、初期化ファイルを使ってパスワードを設定し直せます。作業中は MySQL が一時停止するため、サイトのメンテナンス時間に行います。
- 新しいパスワードを設定する SQL をファイルに書きます。書き込み先は MySQL のプロセスが読めて、ほかのユーザーが読めない場所にします
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-root-password';
- MySQL を停止し、
mysqld --user=mysql --init-file=/path/to/reset.sqlのように初期化ファイルを指定して起動します(起動するユーザーやパスはディストリビューションによって異なります) - 新しいパスワードでログインできることを確かめたら、MySQL を通常の方法で再起動し、パスワードを書いたファイルは削除します
Ubuntu などでは、root が auth_socket(OS の root ユーザーであれば MySQL の root として入れる方式)で設定されていることがあります。その場合は sudo mysql で入れるので、上の手順は不要です。
まとめ
- パスワードの変更は
ALTER USER ... IDENTIFIED BYで行い、ユーザーは「名前+ホスト」の組で指定します - WordPress 用ユーザーは
wp-config.phpとの食い違いでサイトが止まります。MySQL 8.0.14 以降ならRETAIN CURRENT PASSWORDで新旧を並行させ、切り替え後にDISCARD OLD PASSWORDします - パスワードはコマンドライン・履歴・ログ・Git に平文で残さないようにします
validate_passwordで弱いパスワードを拒否し、失敗回数のロックは管理用ユーザーから適用します- root を忘れた場合は
--init-fileで再設定でき、作業前にバックアップと別の管理経路を確保しておきます