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
: プライマリグループIDGECOS
: ユーザーの詳細情報(フルネーム等)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
コメント