Linuxでアカウントロックを確認する方法

Linux

Linuxサーバーを管理していると、セキュリティ対策としてアカウントのロック機能を使うことがあります。

こんな場面で必要になります

  • ユーザーが「ログインできない」と報告してきた
  • セキュリティインシデント後のアカウント状態確認
  • 定期的なアカウント監査
  • ログイン失敗による自動ロックの確認
  • 管理者による手動ロックの状態確認

たとえばログイン失敗が一定回数を超えると自動でロックされる仕組み(pam_tally2やfaillock)や、管理者がpasswd -lで手動ロックする場合です。

でも「このユーザーはロックされている?」「なぜロックされた?」「いつ解除すればいい?」と疑問に思うことも多いはずです。

この記事では、Linuxでアカウントがロックされているかどうかを確認する方法を、実際のコマンド例とともに初心者にもわかりやすく解説します。

スポンサーリンク

Linuxのアカウントロックの仕組み

ロックの種類

Linuxには主に以下のアカウントロック方式があります:

手動ロック

  • 管理者がpasswd -lでロック
  • /etc/shadowのパスワードフィールドに!が追加される
  • 永続的(手動解除まで)

ログイン失敗による自動ロック

  • pam_faillockpam_tally2による制御
  • 設定された回数の連続失敗でロック
  • 時間経過または手動で解除

アカウント無効化

  • usermod -Lpasswd -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アカウント期限の確認

トラブルシューティングの流れ

  1. 基本確認passwd -S で現在の状態
  2. 詳細調査/etc/shadow で具体的なロック方式
  3. 失敗履歴faillock または pam_tally2 で自動ロック確認
  4. ログ分析/var/log/auth.log で原因特定
  5. 解除実行:適切な方法でロック解除

管理のベストプラクティス

  • 定期監視:アカウント状態の定期的なチェック
  • ログ保存:アカウント操作の記録保持
  • 自動通知:異常なロック状態の早期発見
  • 文書化:ロック・解除手順の標準化

セキュリティ対策

  • 最小権限の原則:必要最小限のアクセス権限
  • 監査ログ:アカウント操作の追跡可能性
  • 定期レビュー:不要なアカウントの棚卸し

Linuxでアカウントロックを確認する技術をマスターすれば、passwd -S usernameで状態を素早く確認、/etc/shadowを直接見て詳細なロック状況をチェック、ログイン失敗ロックはfaillock --user usernameで確認することで、ユーザーが「ログインできない」と言ってきたときに、原因が単なるロックなのか他の問題なのかをすぐ切り分けられます。

コメント

タイトルとURLをコピーしました