Linuxサーバーを管理していると、セキュリティ対策としてアカウントのロック機能を使うことがあります。
こんな場面で必要になります
- ユーザーが「ログインできない」と報告してきた
- セキュリティインシデント後のアカウント状態確認
- 定期的なアカウント監査
- ログイン失敗による自動ロックの確認
- 管理者による手動ロックの状態確認
たとえばログイン失敗が一定回数を超えると自動でロックされる仕組み(pam_tally2やfaillock)や、管理者がpasswd -l
で手動ロックする場合です。
でも「このユーザーはロックされている?」「なぜロックされた?」「いつ解除すればいい?」と疑問に思うことも多いはずです。
この記事では、Linuxでアカウントがロックされているかどうかを確認する方法を、実際のコマンド例とともに初心者にもわかりやすく解説します。
Linuxのアカウントロックの仕組み

ロックの種類
Linuxには主に以下のアカウントロック方式があります:
手動ロック
- 管理者が
passwd -l
でロック /etc/shadow
のパスワードフィールドに!
が追加される- 永続的(手動解除まで)
ログイン失敗による自動ロック
pam_faillock
やpam_tally2
による制御- 設定された回数の連続失敗でロック
- 時間経過または手動で解除
アカウント無効化
usermod -L
やpasswd -l
による無効化- 完全にログイン不可
ロック状態の保存場所
メインのアカウント情報
/etc/passwd # 基本ユーザー情報
/etc/shadow # パスワードハッシュとロック状態
ログイン失敗履歴
/var/run/faillock/ # faillock使用時
/var/log/tallylog # pam_tally2使用時(古い方式)
passwd -Sでロック状態を確認

基本的な使い方
passwd -S
(またはpasswd --status
)は、指定したユーザーのパスワードステータスを簡単にチェックできます。
基本構文
passwd -S username
実行例
$ passwd -S alice
alice P 05/20/2025 0 99999 7 -1
出力の読み方
出力は以下の形式になります:
ユーザー名 ステータス 最終変更日 最小日数 最大日数 警告日数 非活性日数
ステータスの意味
- P:Password set(パスワード設定済み・有効)
- L:Locked(ロック状態)
- NP:No Password(パスワード未設定)
日付と数値の意味
- 最終変更日:パスワードが最後に変更された日
- 最小日数:パスワード変更までの最小間隔
- 最大日数:パスワード有効期限(99999は無制限)
- 警告日数:期限切れ前の警告期間
- 非活性日数:期限後のログイン猶予期間
複数ユーザーの一括確認
全ユーザーの状態を確認
#!/bin/bash
for user in $(cut -d: -f1 /etc/passwd); do
echo -n "$user: "
passwd -S $user 2>/dev/null | awk '{print $2}'
done
特定のユーザーグループの確認
# システムユーザー以外を確認
awk -F: '$3 >= 1000 {print $1}' /etc/passwd | while read user; do
echo -n "$user: "
passwd -S $user | awk '{print $2}'
done
/etc/shadowを直接確認

shadowファイルの構造
/etc/shadow
ファイルには各ユーザーのパスワード関連情報が記録されています。
ファイルの確認
sudo cat /etc/shadow
特定ユーザーの確認
sudo grep username /etc/shadow
出力例と読み方
正常なアカウント
alice:$6$salt$hash...:19250:0:99999:7:::
ロックされたアカウント
bob:!$6$salt$hash...:19250:0:99999:7:::
charlie:*$6$salt$hash...:19250:0:99999:7:::
パスワード未設定
david:*:19250:0:99999:7:::
ロック状態の識別
パスワードフィールドの先頭文字で判断
- 通常:
$6$...
(暗号化ハッシュで始まる) - ロック:
!$6$...
(!で始まる) - 無効:
*$6$...
(*で始まる) - パスワードなし:
*
または!!
のみ
安全な確認方法
権限に注意して確認
# 読み取り専用で確認
sudo less /etc/shadow
# 特定ユーザーのみ抽出
sudo awk -F: '/^username:/ {print}' /etc/shadow
# パスワードフィールドのみ確認
sudo awk -F: '/^username:/ {print $2}' /etc/shadow
faillock(pam_faillock)でログイン失敗ロックを確認
faillock の基本
faillock
は比較的新しいLinuxディストリビューション(CentOS 7以降、Ubuntu 18.04以降など)で使われているログイン失敗制御システムです。
現在の失敗状況確認
特定ユーザーの失敗回数確認
faillock --user username
出力例
username:
When Type Source Valid
2024-01-15 10:30:15 RHOST 192.168.1.100 V
2024-01-15 10:30:45 RHOST 192.168.1.100 V
2024-01-15 10:31:15 RHOST 192.168.1.100 V
全ユーザーの失敗状況確認
faillock
ロック解除
特定ユーザーのロック解除
sudo faillock --user username --reset
全ユーザーのロック解除
sudo faillock --reset
faillock設定の確認
現在の設定確認
# 設定ファイルの場所(ディストリビューションにより異なる)
cat /etc/security/faillock.conf
# または
grep pam_faillock /etc/pam.d/system-auth
主要な設定項目
- deny:ロックまでの失敗回数
- unlock_time:自動解除までの時間(秒)
- fail_interval:失敗カウントのリセット間隔
pam_tally2(古い方式)での確認

pam_tally2 の基本
古いディストリビューション(CentOS 6、Ubuntu 16.04以前など)ではpam_tally2
が使われています。
失敗回数の確認
pam_tally2 --user username
出力例
Login Failures Latest failure From
username 3 01/15/24 10:31:15 192.168.1.100
ロック解除
sudo pam_tally2 --user username --reset
全ユーザーの確認
pam_tally2
その他の確認方法
chage でアカウント期限確認
アカウントの有効期限確認
chage -l username
出力例
Last password change : May 20, 2024
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
usermod によるロック確認
アカウントの無効化確認
# shadowファイルでシェルを確認
grep username /etc/passwd | cut -d: -f7
# 無効化されている場合は /sbin/nologin や /bin/false
ログファイルでのトラッキング
ログイン試行の確認
# 認証ログの確認
sudo grep "authentication failure" /var/log/auth.log
sudo grep "Failed password" /var/log/auth.log
# journalを使う場合
journalctl -u ssh.service | grep "authentication failure"
特定ユーザーのログイン履歴
last username
lastlog -u username
実用的なトラブルシューティング手順

基本的な診断フロー
1. 基本状態の確認
# ユーザーの基本状態
passwd -S username
# アカウントの存在確認
id username
2. ロック状態の詳細確認
# shadowファイルの確認
sudo grep "^username:" /etc/shadow
# ログイン失敗ロックの確認
faillock --user username
# または
pam_tally2 --user username
3. ログ分析
# 最近のログイン試行確認
sudo grep username /var/log/auth.log | tail -20
# SSH接続の確認
sudo grep "sshd.*username" /var/log/auth.log
アカウントロック解除手順
手動ロックの解除
# passwd -l でロックされた場合
sudo passwd -u username
ログイン失敗ロックの解除
# faillock の場合
sudo faillock --user username --reset
# pam_tally2 の場合
sudo pam_tally2 --user username --reset
アカウント期限切れの対処
# 期限の延長
sudo chage -E -1 username
# パスワード期限の延長
sudo chage -M 99999 username
自動化とスクリプト化
アカウント状態チェックスクリプト
#!/bin/bash
# アカウント状態一括チェックスクリプト
echo "=== アカウント状態チェック ==="
echo "日時: $(date)"
echo ""
# 一般ユーザーのみをチェック(UID 1000以上)
awk -F: '$3 >= 1000 {print $1}' /etc/passwd | while read username; do
echo "ユーザー: $username"
# 基本状態
status=$(passwd -S $username 2>/dev/null | awk '{print $2}')
echo " パスワード状態: $status"
# shadowファイルのチェック
shadow_entry=$(sudo awk -F: "/^$username:/ {print \$2}" /etc/shadow)
if [[ $shadow_entry == !* ]]; then
echo " ロック状態: 手動ロック"
elif [[ $shadow_entry == \** ]]; then
echo " ロック状態: 無効化"
else
echo " ロック状態: 正常"
fi
# faillock チェック(使用可能な場合)
if command -v faillock >/dev/null 2>&1; then
fail_count=$(faillock --user $username 2>/dev/null | grep -c "RHOST\|TTY")
if [ $fail_count -gt 0 ]; then
echo " ログイン失敗: $fail_count 回"
fi
fi
echo ""
done
ロック状態監視スクリプト
#!/bin/bash
# 定期的なロック状態監視
LOGFILE="/var/log/account_lock_monitor.log"
ALERT_EMAIL="admin@example.com"
check_account_locks() {
local locked_users=""
# 手動ロックの確認
while read username; do
if sudo awk -F: "/^$username:/ {print \$2}" /etc/shadow | grep -q "^!"; then
locked_users="$locked_users $username(manual)"
fi
done < <(awk -F: '$3 >= 1000 {print $1}' /etc/passwd)
# faillock による自動ロックの確認
if command -v faillock >/dev/null 2>&1; then
for username in $(awk -F: '$3 >= 1000 {print $1}' /etc/passwd); do
if faillock --user $username 2>/dev/null | grep -q "RHOST\|TTY"; then
locked_users="$locked_users $username(faillock)"
fi
done
fi
if [ -n "$locked_users" ]; then
echo "$(date): ロックされたアカウント: $locked_users" >> $LOGFILE
echo "ロックされたアカウントが検出されました: $locked_users" | mail -s "アカウントロック警告" $ALERT_EMAIL
fi
}
check_account_locks
セキュリティ考慮事項

ログの確認とアクセス制御
shadowファイルへの安全なアクセス
# 必要最小限の権限で確認
sudo -u root cat /etc/shadow | grep username
# ログ記録付きでアクセス
sudo logger "shadow file accessed by $(whoami)" && sudo cat /etc/shadow
監査ログの活用
# auditd でのアカウント操作追跡
ausearch -k account_changes
ausearch -ua username
定期的なアカウント監査
月次アカウント状態レポート
#!/bin/bash
# 月次アカウント状態レポート生成
REPORT_FILE="/tmp/account_status_$(date +%Y%m).txt"
{
echo "=== 月次アカウント状態レポート ==="
echo "生成日時: $(date)"
echo ""
echo "=== ロックされたアカウント ==="
awk -F: '$3 >= 1000 {print $1}' /etc/passwd | while read user; do
status=$(passwd -S $user | awk '{print $2}')
if [ "$status" = "L" ]; then
echo "$user: ロック状態"
fi
done
echo ""
echo "=== パスワード期限切れ間近 ==="
for user in $(awk -F: '$3 >= 1000 {print $1}' /etc/passwd); do
chage -l $user | grep "Password expires" | grep -v "never" | head -1
done
} > $REPORT_FILE
echo "レポートを生成しました: $REPORT_FILE"
よくある質問

Q:sudoが使えないユーザーでもアカウント状態を確認できますか?
A:限定的ですが可能です
# 自分のアカウント状態のみ
passwd -S $USER
# 他のユーザーの基本情報(/etc/shadowは見られない)
id username
Q:リモートでアカウントロック状態を確認するには?
A:SSH経由で確認できます
ssh admin@server "sudo passwd -S username"
ssh admin@server "sudo faillock --user username"
Q:アカウントロックの通知を自動化したい
A:cron とメール通知を組み合わせてください
# crontab に追加
0 */6 * * * /path/to/account_lock_monitor.sh
Q:ロック解除後にログイン履歴をクリアできますか?
A:以下の方法があります
# faillock履歴のクリア
sudo faillock --user username --reset
# lastlogのクリア(注意:全ユーザーに影響)
sudo truncate -s 0 /var/log/lastlog
まとめ:アカウントロック管理をマスターしよう
この記事のポイント
確認方法 | コマンド | 用途 |
---|---|---|
基本状態確認 | passwd -S username | 手動ロック状態の確認 |
詳細状態確認 | sudo grep username /etc/shadow | ロック方式の特定 |
ログイン失敗確認 | faillock --user username | 自動ロック状態の確認 |
古い方式確認 | pam_tally2 --user username | 古いシステムでの確認 |
期限確認 | chage -l username | アカウント期限の確認 |
トラブルシューティングの流れ
- 基本確認:
passwd -S
で現在の状態 - 詳細調査:
/etc/shadow
で具体的なロック方式 - 失敗履歴:
faillock
またはpam_tally2
で自動ロック確認 - ログ分析:
/var/log/auth.log
で原因特定 - 解除実行:適切な方法でロック解除
管理のベストプラクティス
- 定期監視:アカウント状態の定期的なチェック
- ログ保存:アカウント操作の記録保持
- 自動通知:異常なロック状態の早期発見
- 文書化:ロック・解除手順の標準化
セキュリティ対策
- 最小権限の原則:必要最小限のアクセス権限
- 監査ログ:アカウント操作の追跡可能性
- 定期レビュー:不要なアカウントの棚卸し
Linuxでアカウントロックを確認する技術をマスターすれば、passwd -S username
で状態を素早く確認、/etc/shadow
を直接見て詳細なロック状況をチェック、ログイン失敗ロックはfaillock --user username
で確認することで、ユーザーが「ログインできない」と言ってきたときに、原因が単なるロックなのか他の問題なのかをすぐ切り分けられます。
コメント