MariaDBユーザー一覧からゾンビアカウントを洗い出す|last_passwordなど拡張カラム活用

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > データーベース管理 > MariaDBユーザー一覧からゾンビアカウントを洗い出す|last_passwordなど拡張カラム活用
「昔の担当者が作ったMariaDBユーザーが何十個も残っている。最後にいつ使ったか分からないし、削除して大丈夫かどうかも判断できない…」
Linuxサーバーの運用を引き継ぐと、こういう状況に直面することがよくあります。

MariaDBにはMySQLには存在しないユーザー管理用の拡張カラム(password_last_changed・account_locked・last_loginなど)が用意されており、これらを使えばSQL1本でゾンビアカウント(長期間使われていない不要なユーザー)を洗い出せます。

この記事では、mariadb ユーザー一覧の確認コマンドから始め、拡張カラムを活用してゾンビアカウントを特定し、安全に削除するまでの実践手順を解説します。Rocky Linux 9.4 / Ubuntu 24.04 LTS、MariaDB 10.6 LTS・10.11で動作確認済みです。

この記事のポイント

・SELECT文でmysql.userテーブルからユーザー一覧を取得できる
・password_last_changedが数年前のアカウントはゾンビ候補になる
・last_login(10.11以降)で実際のログイン日時も絞り込める
・DROP USER前に依存オブジェクトの確認が鉄則


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

MariaDBでゾンビアカウントが生まれる仕組み

Linuxサーバー上でMariaDBを自前運用(セルフホスト)している環境では、プロジェクトの終了・担当者の異動・開発環境の撤収などをきっかけにアカウントだけが残り続けることがあります。こうしたアカウントは「ゾンビアカウント」と呼ばれ、放置すると次のリスクを生みます。

・推測されやすいパスワードがそのまま残るため、不正ログインの入口になりやすい
・本番DB(GRANT ALL)への権限が付いたまま休眠状態になっていることがある
・定期監査でアカウントの棚卸しが通らず、セキュリティ証跡として問題になる

MySQLにはこうしたアカウントを素早く特定するための組み込みカラムが少なく、ログ解析に頼るしかない場面が多いです。一方、MariaDBは認証・パスワード管理に関わる拡張カラムをmysql.userテーブルに持っており、実務的な棚卸しがSQLだけで完結します。

mariadb ユーザー一覧の基本確認コマンド

1. SELECT文でmysql.userテーブルを照会する

最初にやることは、存在するユーザーを全件確認することです。mysql.userシステムテーブルに全アカウントが格納されています。

# mariadb ユーザー一覧を取得するSQL mariadb -u root -p -e "SELECT User, Host, account_locked, password_expired FROM mysql.user ORDER BY User;"

実行環境:Rocky Linux 9.4、MariaDB 10.6.18での出力例です。

+--------------------+-----------+----------------+------------------+ | User | Host | account_locked | password_expired | +--------------------+-----------+----------------+------------------+ | app_user | 127.0.0.1 | N | N | | backup_user | localhost | N | Y | | deploy_user | 10.0.0.% | Y | N | | mariadb.sys | localhost | Y | N | | mysql | localhost | Y | N | | root | localhost | N | N | | test | % | N | N | +--------------------+-----------+----------------+------------------+

注意:mariadb.sysとmysqlはMariaDB内部の管理アカウントです。account_locked=Yで正常なので絶対に削除しないでください。

MySQLに慣れた方向けに補足すると、MariaDB 10.4以降はクライアントコマンドがmysqlからmariadbに統一されています(mysqlコマンドも互換シムとして残っていますが、将来的に削除される可能性があります)。

2. SHOW GRANTSで個別ユーザーの権限を確認する

一覧で怪しいアカウントを見つけたら、そのユーザーに付与されている権限を確認します。

# 特定ユーザーの権限一覧を取得する SHOW GRANTS FOR 'backup_user'@'localhost';

+--------------------------------------------------------------+ | Grants for backup_user@localhost | +--------------------------------------------------------------+ | GRANT USAGE ON *.* TO @ | | GRANT SELECT, LOCK TABLES ON .* TO @ | +--------------------------------------------------------------+

USAGEはログイン権限のみで実際のDB操作権限はないことを示します。GRANT ALLが含まれているアカウントは削除時に特に慎重な確認が必要です。

MariaDB拡張カラムでゾンビアカウントを特定する

1. password_last_changedで最終パスワード変更日を確認する

MariaDB 10.4以降のmysql.userテーブルにはpassword_last_changedカラム(タイムスタンプ型)が追加されています。パスワードが設定または変更された日時が記録されており、数年前のままのアカウントはゾンビ候補として浮かび上がります。

# 2年以上パスワード変更がないアカウントを抽出する(ゾンビ候補) SELECT User, Host, password_last_changed, DATEDIFF(NOW(), password_last_changed) AS days_since_change, account_locked, password_expired FROM mysql.user WHERE password_last_changed < DATE_SUB(NOW(), INTERVAL 2 YEAR) AND User NOT IN ('mariadb.sys', 'mysql') ORDER BY password_last_changed;

+-------------+-----------+-----------------------+-------------------+----------------+------------------+ | User | Host | password_last_changed | days_since_change | account_locked | password_expired | +-------------+-----------+-----------------------+-------------------+----------------+------------------+ | test | % | 2020-05-20 14:10:00 | 2337 | N | N | | backup_user | localhost | 2021-08-01 12:00:00 | 1869 | N | Y | | deploy_user | 10.0.0.% | 2022-11-30 18:45:23 | 1411 | Y | N | +-------------+-----------+-----------------------+-------------------+----------------+------------------+

days_since_changeが730(2年)を超えていて実際に使われていないアカウントは削除候補です。ただし、バックアップスクリプトのような「頻繁にはパスワードを変えないが現役のサービスアカウント」もこのリストに入るため、次の手順で実際のログイン履歴も照合することを推奨します。

2. account_lockedとpassword_expiredでロック状態を調べる

account_locked='Y'のアカウントはDBA(データベース管理者)が明示的にロックしたものです。ロックされたまま数年が経過しているアカウントは不要なケースが多いです。password_expired='Y'はパスワードの有効期限が切れた状態で、次回ログイン時にパスワード変更が強制されます。

# ロック済みかつ期限切れのアカウントを列挙する(削除筆頭候補) SELECT User, Host, password_last_changed, account_locked, password_expired FROM mysql.user WHERE account_locked = 'Y' AND password_expired = 'Y' AND User NOT IN ('mariadb.sys', 'mysql');

実運用では「ロックして放置」→「そのまま何年も存在し続ける」パターンが最も多いゾンビアカウントの発生源です。

3. last_loginで最終ログイン日時を確認する(MariaDB 10.11以降)

MariaDB 10.11以降ではmysql.userテーブルにlast_loginカラムが追加されました(MariaDB固有の拡張で、MySQLには存在しません)。これでアカウントが実際に使われているかどうかをSQLで直接確認できます。

# last_loginカラムの有無を確認する(10.11未満ではエラーになる) SELECT User, Host, last_login FROM mysql.user WHERE last_login IS NULL OR last_login < DATE_SUB(NOW(), INTERVAL 1 YEAR) AND User NOT IN ('mariadb.sys', 'mysql') ORDER BY last_login;

last_login=NULLは一度もログインしていないアカウントを意味します。作成されてから一度も使われていないアカウントは、テスト用に発行されたまま忘れられた典型的なゾンビアカウントです。

MariaDB 10.6以下を使っている場合、last_loginカラムはありません。その場合は一般クエリログ(/var/lib/mysql/hostname.log)を有効化してログイン履歴を追う方法が代替手段になります(本番環境ではI/O負荷が増えるため短期間のみ有効化して確認する運用が現場では一般的です)。

ゾンビアカウントの安全な削除手順

1. DROP USER前に依存関係を確認する

削除の前に、そのユーザーが所有するビューやストアドプロシージャが残っていないかを確認してください。ユーザーを先に削除するとオーナーなし状態のオブジェクトが残り、本番障害につながるリスクがあります。

# 対象ユーザーが所有するビューを確認する(例: test@%) SELECT TABLE_SCHEMA, TABLE_NAME, DEFINER FROM information_schema.VIEWS WHERE DEFINER = 'test@%'; # ストアドプロシージャ・ファンクションを確認する SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, DEFINER FROM information_schema.ROUTINES WHERE DEFINER = 'test@%';

どちらも0行ならそのアカウントはオブジェクトを所有していません。依存オブジェクトがある場合は、先にオーナーを別のアカウント(rootなど)に変更してから削除します。

2. ユーザー削除の実行と確認

依存関係がないことを確認したら削除を実行します。

# ユーザーを削除する(Host指定を必ず入れる) DROP USER 'test'@'%'; # 削除されたことを確認する SELECT User, Host FROM mysql.user WHERE User = 'test';

Empty set (0.001 sec)

注意:DROP USERを実行した後はFLUSH PRIVILEGES;を実行しなくても変更はすぐに反映されます(MariaDB/MySQLのDDLは即時有効化されます。古い情報ではFLUSH PRIVILEGESが必要とされていた時代がありましたが、GRANT文以外では不要です)。

複数アカウントをまとめて削除する場合は、事前に削除対象リストをテキストに書き出してレビューを行い、その後スクリプトで実行する運用を本番環境では強く推奨します。一度削除したユーザーを安全に復元する方法はないため、作業前にmysqldumpでバックアップを取っておくことが鉄則です。

「Unknown column」などのエラーが出た時の対処法

1. Unknown column 'account_locked' in 'field list'

このエラーはMariaDB 10.3以前(または古いMySQLブランチ)でaccount_locked・password_last_changedカラムを指定したときに発生します。

# バージョンを確認する SELECT VERSION();

+------------------+ | VERSION() | +------------------+ | 10.6.18-MariaDB | +------------------+

バージョンが10.4未満の場合は拡張カラムが存在しません。DESCRIBE mysql.user;で実際に存在するカラムを確認し、SELECTするカラムを調整してください。MariaDB 10.4以降へのアップグレードを推奨します(10.3はEOL済みです)。

2. ERROR 1396: Operation DROP USER failed for 'user'@'host'

ユーザーとHostの組み合わせが完全一致しない場合に発生します。SELECT User, Host FROM mysql.user WHERE User='対象ユーザー名';で正確なHostを確認し、一字一句合わせてDROP USERを実行してください。%(任意のホスト)とlocalhostは別エントリとして管理されていることに注意してください。

3. ERROR 1141: There is no such grant defined for user 'xxx' on host 'yyy'

REVOKEやSHOW GRANTSで「そんな権限ない」と言われるケースです。SELECT User, Host, authentication_string FROM mysql.user WHERE User='xxx';でアカウントの存在そのものを確認してください。別のHostで同名ユーザーが作られているケースがよくあります。

本記事のまとめ

MariaDBのユーザー一覧確認から拡張カラムを活用したゾンビアカウントの特定・削除までを解説しました。MariaDB固有の拡張カラムを活用すると、MySQL環境では外部ツールや複雑なログ解析が必要だった棚卸し作業をSQL単体で完結できます。

やりたいこと コマンド・SQL
ユーザー一覧をすべて確認する SELECT User, Host FROM mysql.user ORDER BY User;
パスワード変更が古いアカウントを抽出する SELECT User, Host, password_last_changed FROM mysql.user WHERE password_last_changed < DATE_SUB(NOW(), INTERVAL 2 YEAR);
ロック状態を確認する SELECT User, Host, account_locked, password_expired FROM mysql.user;
最終ログイン日時を確認する(10.11以降) SELECT User, Host, last_login FROM mysql.user ORDER BY last_login;
ユーザーの権限を確認する SHOW GRANTS FOR 'user'@'host';
ユーザーを削除する DROP USER 'user'@'host';

MariaDBサーバーのユーザー管理は「作るのは簡単、把握し続けるのが難しい」という実務上の課題があります。Linux Masterセミナーでは、こうしたサーバー運用の「型」を体系的に習得できます。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、

宮崎智広が20年以上・3,100名以上への指導経験をもとに体系化した「Linux Master Pro Seminar」で、MariaDB運用を含むLinuxサーバー管理の実践的なスキルを2日間で習得できます。

>> セミナー詳細・お申込みはこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。