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 が一時停止するため、サイトのメンテナンス時間に行います。

  1. 新しいパスワードを設定する SQL をファイルに書きます。書き込み先は MySQL のプロセスが読めて、ほかのユーザーが読めない場所にします
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new-root-password';
  1. MySQL を停止し、mysqld --user=mysql --init-file=/path/to/reset.sql のように初期化ファイルを指定して起動します(起動するユーザーやパスはディストリビューションによって異なります)
  2. 新しいパスワードでログインできることを確かめたら、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 で再設定でき、作業前にバックアップと別の管理経路を確保しておきます

お気軽にご相談ください

お見積りへ お問い合わせへ
▲