EC-CUBEの管理画面にログインできなくなり、パスワード再発行メールも受け取れない状況では、データベースを直接操作して復旧します。方法は2つあり、EC-CUBE4では設定を変えずに済む「ハッシュを生成して登録する」ほうが安全です。両方の手順と使い分けを、検証結果とあわせてまとめます。
まずログインできない原因を切り分ける
「ログインできない」には原因が3パターンあります。当てはまるところから確認してください。
- 管理画面のURL自体がわからない・404になる — URLの調べ方はEC-CUBE4で管理画面URLを忘れた時の確認方法にまとめています
- パスワードを忘れた・再発行メールが届かない — この記事の手順で復旧できます。なお再発行メール自体が届かない場合、他のメールも送信できていない可能性があるのでメールが届かないときの切り分け手順も確認を
- 正しいはずのパスワードで弾かれる — DB移行やバージョンアップ後に起きがちです。原因を追うより、この記事の方法1でパスワードを上書きするのが早道です
方法1: ハッシュを生成して登録する(4系で推奨)
EC-CUBE4の管理者パスワードはbcryptでハッシュ化され、dtb_member テーブルに保存されています。元の文字列は取り出せないため、新しいパスワードのハッシュを作って上書きします。
設定ファイルを触らないので、稼働中のサイトでも影響が出ません。
SSHでサーバーに接続し、EC-CUBEのディレクトリで実行します。
php bin/console security:hash-password "新しいパスワード" "Eccube\Entity\Member"
第2引数は対象のエンティティです。管理者は Eccube\Entity\Member、会員は Eccube\Entity\Customer。省略すると対話形式で選択を求められます。
実行するとハッシュが表示されます。
--------------- -------------------------------------------------------------
Key Value
--------------- -------------------------------------------------------------
Hasher used Symfony\Component\PasswordHasher\Hasher\MigratingPasswordHasher
Password hash $2y$13$1YyUXCK4XpGH0l9aJWluuOtGaF26nd/rM74P.CoFHUlau.MbTdWri
--------------- -------------------------------------------------------------
[OK] Password hashing succeeded
これをデータベースに登録します。
UPDATE dtb_member
SET password = '生成されたハッシュ', salt = NULL
WHERE login_id = 'admin';
salt をNULLにしてください。bcryptはハッシュ自体にsaltを含む方式なので、テーブル側のsaltカラムは使いません。古い値が残っていると認証に失敗することがあります。
この手順は検証環境で実際にログインできるところまで確認しています。
SSHが使えない場合は、ローカルのPHPでハッシュだけ作ることもできます。
php -r "echo password_hash('新しいパスワード', PASSWORD_BCRYPT, ['cost' => 13]);"
cost はEC-CUBE4の既定に合わせて13を指定します。
方法2: auth_typeをPLAINにする(4系でも使える)
古くから使われている方法で、EC-CUBE4でも動作します。パスワードの検証方式を一時的に平文比較へ切り替えるものです。
4系では app/config/eccube/packages/eccube.yaml の該当行を変更します。
eccube_auth_type: PLAIN
3系は場所が違い、app/config/eccube/config.yml に auth_type: PLAIN を追記します。
設定ファイルの変更なのでキャッシュクリアが必要です。
php bin/console cache:clear --no-warmup
そのうえで、パスワードを平文のままデータベースに入れます。
UPDATE dtb_member
SET password = '任意のパスワード', salt = NULL
WHERE login_id = 'admin';
これでそのパスワードによりログインできます。ログイン後は設定を元に戻し、キャッシュクリアを行ってください。
ログインすると自動でハッシュに戻る
4系で確認できた挙動として、PLAINでログインに成功した時点で、パスワードが自動的にbcryptへ再ハッシュされます。
検証環境で PlainTest999 という平文を登録してログインしたところ、データベースの値が $2y$13$K1ZtVQ... に書き換わりました。Symfonyのパスワードハッシャーが、古い形式を検出すると新しい形式へ移行する仕組みを持っているためです。
平文がデータベースに残り続けるわけではありませんが、ログインするまでの間は平文のまま保存されていることに変わりはありません。
どちらを使うか
| 方法1(ハッシュ生成) | 方法2(PLAIN) | |
|---|---|---|
| 設定ファイルの変更 | 不要 | 必要(戻し忘れのリスク) |
| キャッシュクリア | 不要 | 必要(設定変更のため) |
| 他の利用者への影響 | なし | あり(後述) |
| SSHの要否 | コマンド版は必要。ローカルPHPでも可 | 不要 |
稼働中のサイトでは方法1を選んでください。方法2は設定変更がサイト全体に及びます。
PLAINにしている間は会員(Customer)の認証も平文比較になります。その状態で会員がパスワードを変更したり新規登録したりすると、平文のまま保存されます。作業がごく短時間でも、その間にアクセスがあれば影響します。
やむを得ず本番で方法2を使う場合は、メンテナンスモードにして管理画面以外のアクセスを遮断してから作業してください。
作業前にバックアップを取る
どちらもデータベースを直接操作します。dtb_member だけでも構わないので、必ず退避してください。
mysqldump -u ユーザー名 -p データベース名 dtb_member > member_backup.sql
UPDATE文のWHERE句を書き間違えると、全管理者のパスワードを同じ値で上書きしてしまいます。戻せる状態を作ってから実行してください。データベース全体のバックアップはEC-CUBEのバックアップと復元の手順にまとめています。
作業が終わったら、管理画面から改めてパスワードを設定し直してください。コマンドの履歴やSQLに文字列が残るためです。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。