【Linux管理者必見】Linuxでユーザー一覧を確認する完全ガイド | セキュリティ管理からトラブル対処まで

Linux

Linuxサーバーや端末を管理していて、こんな不安を感じたことはありませんか?

  • 「このシステムに登録されているユーザーを正確に把握していない」
  • 「不要なアカウントが残っていて、セキュリティリスクになっていないか」
  • 「誰がシステムにアクセスできる状態なのか分からない」
  • 「定期的なユーザー監査を効率的に行いたい」

適切なユーザー管理は、Linuxシステムのセキュリティ、安定性、効率性を確保するための基本中の基本です。

しかし、多くの管理者が十分な注意を払っていないのが現実です。

この記事では、Linuxでユーザー一覧を確認する方法を体系的に解説し、さらに実務で役立つ管理テクニックやセキュリティのベストプラクティスまで包括的にカバーします。

スポンサーリンク

Linuxユーザー情報の基礎知識

ユーザー情報の保存場所

Linuxでは、ユーザー情報は以下のファイルに分散して保存されています:

ファイル内容アクセス権限主な情報
/etc/passwd基本ユーザー情報全ユーザー読み取り可能ユーザー名、UID、GID、ホームディレクトリ、シェル
/etc/shadowパスワード関連情報root のみ読み取り可能暗号化パスワード、パスワード期限
/etc/groupグループ情報全ユーザー読み取り可能グループ名、GID、メンバー
/etc/gshadowグループパスワード情報root のみ読み取り可能グループパスワード(rarely used)

/etc/passwdファイルの形式

username:password:UID:GID:GECOS:home_directory:shell

各フィールドの説明:

  • username: ユーザー名
  • password: 「x」(実際のパスワードは/etc/shadowに保存)
  • UID: ユーザーID(数値)
  • GID: プライマリグループID
  • GECOS: ユーザーの詳細情報(フルネーム等)
  • home_directory: ホームディレクトリのパス
  • shell: ログインシェル

UIDによるユーザー分類

UID範囲ユーザータイプ説明
0スーパーユーザーroot アカウント
1-99システムアカウント(静的)システムに固定で割り当て
100-999システムアカウント(動的)サービスやデーモン用
1000+一般ユーザー人間が使用するアカウント

ディストリビューションによって若干異なる場合があります

基本的なユーザー一覧確認方法

全ユーザーの一覧表示

最も基本的な方法:

cat /etc/passwd

ユーザー名のみを表示:

cut -d: -f1 /etc/passwd

整理された形式で表示:

column -t -s: /etc/passwd

一般ユーザーのみの抽出

UID 1000以上のユーザー(最も一般的):

awk -F: '$3 >= 1000 && $3 < 65534 { print $1 "\t(UID: " $3 ")" }' /etc/passwd

より詳細な情報付きで表示:

awk -F: '$3 >= 1000 && $3 < 65534 { printf "%-15s UID:%-6s Home:%-25s Shell:%s\n", $1, $3, $6, $7 }' /etc/passwd

システムユーザーとサービスユーザーの確認

システムユーザー(UID 1-999):

awk -F: '$3 >= 1 && $3 < 1000 { print $1 "\t(UID: " $3 ")" }' /etc/passwd

特定のシステムサービス用ユーザー:

grep -E '^(www-data|mysql|postgres|nginx|apache):' /etc/passwd

高度なユーザー情報確認テクニック

ログイン可能ユーザーの確認

有効なシェルを持つユーザー:

awk -F: '$7 !~ /\/false$|\/nologin$/ && $7 != "" { print $1 "\t" $7 }' /etc/passwd

より詳細な条件での抽出:

getent passwd | awk -F: '
$3 >= 1000 && $3 < 65534 && 
$7 !~ /\/false$|\/nologin$|\/sync$|\/halt$|\/shutdown$/ { 
    print $1 "\t(UID: " $3 ", Shell: " $7 ")" 
}'

2. 現在のログイン状況確認

現在ログイン中のユーザー:

who

ログイン中のユーザー名のみ:

users

詳細なログイン情報:

w

最近のログイン履歴:

last | head -20

権限別ユーザー確認

sudo権限を持つユーザー:

# Debian/Ubuntu系
getent group sudo | cut -d: -f4 | tr ',' '\n'

# Red Hat系
getent group wheel | cut -d: -f4 | tr ',' '\n'

特定のグループに属するユーザー:

getent group グループ名 | cut -d: -f4 | tr ',' '\n'

ユーザーが属するすべてのグループ:

groups ユーザー名

実践的なユーザー管理スクリプト

包括的ユーザー監査スクリプト

#!/bin/bash
# user_audit.sh - Linuxユーザー監査スクリプト

echo "=================================================="
echo "Linuxユーザーアカウント監査レポート"
echo "ホスト: $(hostname)"
echo "実行日時: $(date)"
echo "=================================================="

echo
echo "1. システム概要:"
echo "   総ユーザー数: $(wc -l < /etc/passwd)"
echo "   一般ユーザー数: $(awk -F: '$3 >= 1000 && $3 < 65534' /etc/passwd | wc -l)"
echo "   システムユーザー数: $(awk -F: '$3 >= 1 && $3 < 1000' /etc/passwd | wc -l)"

echo
echo "2. 一般ユーザーアカウント一覧:"
awk -F: '$3 >= 1000 && $3 < 65534 { 
    printf "   %-15s UID:%-6s Home:%-25s Shell:%s\n", $1, $3, $6, $7 
}' /etc/passwd

echo
echo "3. ログイン可能ユーザー:"
awk -F: '$3 >= 1000 && $3 < 65534 && $7 !~ /\/false$|\/nologin$/ { 
    print "   - " $1 " (Shell: " $7 ")" 
}' /etc/passwd

echo
echo "4. sudo権限を持つユーザー:"
SUDO_USERS=$(getent group sudo 2>/dev/null | cut -d: -f4)
WHEEL_USERS=$(getent group wheel 2>/dev/null | cut -d: -f4)
if [ -n "$SUDO_USERS" ]; then
    echo "$SUDO_USERS" | tr ',' '\n' | sed 's/^/   - /'
elif [ -n "$WHEEL_USERS" ]; then
    echo "$WHEEL_USERS" | tr ',' '\n' | sed 's/^/   - /'
else
    echo "   sudo/wheelグループが見つかりません"
fi

echo
echo "5. 現在ログイン中のユーザー:"
who | awk '{ print "   - " $1 " (" $2 ", " $3 " " $4 ")" }' | sort -u

echo
echo "6. パスワード有効期限が近いユーザー:"
while IFS=: read -r user _ uid _ _ _ _; do
    if [ "$uid" -ge 1000 ] && [ "$uid" -lt 65534 ]; then
        chage -l "$user" 2>/dev/null | grep "Password expires" | grep -v "never" | 
        awk -v user="$user" '{ print "   - " user ": " $0 }'
    fi
done < /etc/passwd

echo
echo "7. シェルが無効化されているユーザー:"
awk -F: '$3 >= 1000 && $3 < 65534 && ($7 ~ /\/false$|\/nologin$/) { 
    print "   - " $1 " (Shell: " $7 ")" 
}' /etc/passwd

echo
echo "=================================================="
echo "監査完了"

セキュリティチェック用スクリプト

#!/bin/bash
# security_check.sh - ユーザーセキュリティチェック

echo "セキュリティチェック開始..."

echo "1. UID 0(root権限)を持つアカウント:"
awk -F: '$3 == 0 { print "   ⚠️  " $1 }' /etc/passwd

echo "2. パスワードが設定されていないアカウント:"
sudo awk -F: '$2 == "" { print "   ⚠️  " $1 }' /etc/shadow

echo "3. 同じUIDを持つユーザー(重複チェック):"
awk -F: '{ uids[$3]++ } END { 
    for (uid in uids) 
        if (uids[uid] > 1) 
            print "   ⚠️  UID " uid " が重複しています" 
}' /etc/passwd

echo "4. ホームディレクトリが存在しないユーザー:"
awk -F: '$3 >= 1000 && $3 < 65534 { 
    if (system("[ ! -d \"" $6 "\" ]") == 0) 
        print "   ⚠️  " $1 " (Home: " $6 ")" 
}' /etc/passwd

echo "5. 90日以上ログインしていないユーザー:"
lastlog | awk 'NR > 1 && $4 != "in" { 
    if ($0 ~ /Never logged in/ || $9 ~ /[0-9]{4}/) 
        print "   ⚠️  " $1 
}'

トラブルシューティング(よくある問題と解決法)

問題1: “Permission denied” エラー

原因: /etc/shadowなど、root権限が必要なファイルにアクセスしようとしている

解決法:

sudo cat /etc/shadow

問題2: 特定のユーザーが見つからない

原因: LDAP、NIS、Active Directoryなどの外部認証を使用している可能性

確認方法:

# NSS(Name Service Switch)の設定確認
cat /etc/nsswitch.conf | grep passwd

# getentコマンドで外部ソースも含めて確認
getent passwd ユーザー名

問題3: システムユーザーと一般ユーザーの境界が不明

解決法: ディストリビューション固有の設定を確認

# Debian/Ubuntu
grep -E "^UID_MIN|^UID_MAX" /etc/login.defs

# Red Hat系
grep -E "^UID_MIN|^UID_MAX" /etc/login.defs

まとめ

Linuxでのユーザー管理は、システム全体のセキュリティと安定性に直結する重要な作業です。

実践コマンド集

# 1. 基本的な現状把握
awk -F: '$3 >= 1000 && $3 < 65534 { print $1 "\t" $3 "\t" $7 }' /etc/passwd

# 2. sudo権限ユーザーの確認
getent group sudo wheel | cut -d: -f4 | tr ',' '\n'

# 3. ログイン可能ユーザーの確認
awk -F: '$7 !~ /\/false$|\/nologin$/ && $7 != "" { print $1 "\t" $7 }' /etc/passwd

# 4. 最近のログイン状況
last | head -10

コメント

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