14.

MySQL ユーザー / Linux アカウントのパスワード無効化(ACCOUNT LOCK / passwd -l)

編集
この記事の要点
  • MySQL: ALTER USER 'app'@'%' ACCOUNT LOCK でアカウント自体をロック(5.7.6+)
  • MySQL(パスワードだけ無効化): ALTER USER ... IDENTIFIED BY '' + require_secure_transport など
  • Linux: passwd -l ユーザー でロック(/etc/shadow の hash 先頭に ! 付与)、usermod -L 同義
  • Linux 完全無効化: chage -E 0 user でアカウント失効、usermod -s /sbin/nologin でシェル禁止
  • 復旧: MySQL は ACCOUNT UNLOCK、Linux は passwd -u

MySQL ユーザーのパスワード無効化

方法 A: ACCOUNT LOCK(推奨・MySQL 5.7.6+)

パスワードは残したままアカウントだけロックします。ログイン試行時に明示的にエラーが返り、原因が分かりやすい:

-- ロック
ALTER USER 'app'@'%' ACCOUNT LOCK;

-- アンロック
ALTER USER 'app'@'%' ACCOUNT UNLOCK;

-- 新規ユーザーをロック状態で作成
CREATE USER 'temp'@'%' IDENTIFIED BY 'secret' ACCOUNT LOCK;

-- 状態確認
SELECT User, Host, account_locked
FROM mysql.user
WHERE User = 'app';

ロック中のユーザーがログイン試行すると:

ERROR 3118 (HY000): Access denied for user 'app'@'localhost'.
Account is locked.

方法 B: パスワードを空に / 無効プラグインに

-- パスワードを空にする(接続させない用途)
ALTER USER 'app'@'%' IDENTIFIED BY '';

-- 認証プラグインを mysql_no_login に(MySQL 5.7.6+)
ALTER USER 'app'@'%' IDENTIFIED WITH mysql_no_login;
-- → このユーザーではログイン不可。アプリ内部でだけ参照される definer などに

-- 有効期限を切る(過去日付)
ALTER USER 'app'@'%' PASSWORD EXPIRE;
-- 次回ログイン時にパスワード変更を強制

方法 C: ユーザー自体を削除

-- 一発削除
DROP USER 'app'@'%';

-- 削除後に確認
SELECT User, Host FROM mysql.user WHERE User = 'app';

Linux ユーザーのパスワード無効化

方法 A: passwd -l(パスワードロック)

最も一般的。/etc/shadow のパスワードハッシュ先頭に ! を付与してログインを無効化します:

# ロック
sudo passwd -l alice

# アンロック
sudo passwd -u alice

# 状態確認
sudo passwd -S alice
# alice L 2026-05-17 0 99999 7 -1 (Password locked.)
#       ^
#       P = 有効, L = ロック, NP = パスワード未設定

# /etc/shadow を直接確認
sudo grep '^alice:' /etc/shadow
# alice:!$6$xxxx:... ← 先頭の ! でロック

方法 B: usermod -L / -U

passwd -l と同じ動作:

sudo usermod -L alice    # ロック
sudo usermod -U alice    # アンロック

方法 C: chage -E 0(アカウント失効)

パスワードだけでなくアカウント自体を失効させます。sudo / 公開鍵認証も拒否されます:

# アカウント失効日を 1970-01-01 に
sudo chage -E 0 alice

# 失効解除
sudo chage -E -1 alice

# 状態確認
sudo chage -l alice
# Account expires: never  ← もしくは過去日付

方法 D: シェルを nologin に

SSH ログインだけを禁止しつつ、その UID 配下のサービス(メール配信など)は動かしたい場合:

sudo usermod -s /usr/sbin/nologin alice
# /sbin/nologin (RHEL) / /usr/sbin/nologin (Ubuntu)

# 確認
grep '^alice:' /etc/passwd
# alice:x:1001:1001::/home/alice:/usr/sbin/nologin

# 元に戻す
sudo usermod -s /bin/bash alice

3 つの「無効化」の違い

方法SSH パスワードSSH 公開鍵sudocron 実行
passwd -l不可パスワード sudo 不可動く
chage -E 0不可不可不可止まる
usermod -s nologin不可不可不可動く
userdel消滅消滅消滅消滅

SSH 公開鍵だけ無効化したい

# 公開鍵を退避
sudo mv /home/alice/.ssh/authorized_keys /home/alice/.ssh/authorized_keys.disabled

# または rename
sudo chmod 000 /home/alice/.ssh/authorized_keys

# 元に戻す
sudo mv /home/alice/.ssh/authorized_keys.disabled /home/alice/.ssh/authorized_keys
sudo chmod 600 /home/alice/.ssh/authorized_keys
sudo chown alice:alice /home/alice/.ssh/authorized_keys

退職者のアカウント処理(実務手順)

  1. 引き継ぎ・ファイル退避完了を確認
  2. passwd -l alice で即座にロック
  3. chage -E 0 alice でアカウント失効
  4. find / -user alice 2>/dev/null で所有ファイル確認
  5. 必要なら所有者を変更(chown -R newowner /path
  6. 30 日後など期間を置いてから userdel alice 削除

MySQL 全ユーザーのパスワード強制リセット

-- 全ユーザーのパスワードを即時失効
ALTER USER 'app'@'%' PASSWORD EXPIRE;

-- 全員に対しては動的 SQL
SELECT CONCAT('ALTER USER ''', User, '''@''', Host, ''' PASSWORD EXPIRE;')
FROM mysql.user
WHERE User NOT IN ('mysql.sys','mysql.session','mysql.infoschema','root');
-- 結果をコピペして実行

FAQ

Q: passwd -l しても SSH 公開鍵でログインできる
A: 仕様です。passwd -l はパスワード認証だけ無効化します。完全に止めるなら chage -E 0 または公開鍵を退避。

Q: MySQL の root をロックしたら復旧不能?
A: 他に admin ユーザーがあればそこから ACCOUNT UNLOCK。無ければ --skip-grant-tables で起動して直接 mysql.user を更新。

Q: Active Directory / LDAP 連携のユーザーは?
A: ローカルの passwd -l は効きません。AD / LDAP 側で「アカウント無効」にする必要があります。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ダウンロード&インストール方法(Windows)
  2. インストール方法(Linux)
  3. コマンド一覧
  4. SQL
  5. データ型
  6. 関数
  7. 管理ツール
  8. 設定
  9. パフォーマンスチューニング関連
  10. エクスポートおよびインポート
  11. エラー&トラブル
  12. 文字コードの確認
  13. 実行中の SQL の状態確認およびプロセスキルの方法
  14. パスワードの無効化設定
  15. root ユーザーの初期パスワード確認方法
  16. rootユーザーのパスワード変更方法
  17. LIMIT, OFFSET の始まりと挙動
  18. mysqlのバージョン確認方法
  19. 実行計画の表示方法
  20. レプリケーションのステータス確認方法
  21. 中央値の導き方(バージョン8未満)
  22. 階層SQL(バージョン8未満)
  23. パーセンタイルの導き方
  24. 特定スキーマの全テーブルの全カラム情報を取得する方法
  25. MySQLで文字列の置換をする方法