この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: パスワードの無効化設定
SEOタイトル: 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 側で「アカウント無効」にする必要があります。