Linux: ユーザーとグループの管理 — マルチユーザーシステム
Linuxは最初からマルチユーザーオペレーティングシステムとして設計されています。開発チームがサーバーを共有する場合も、異なるアプリケーションが分離された実行権限を必要とする場合も、ユーザーとグループの管理はコアスキルです。
📋 前提条件:まず以下を完了していること
- レッスン8:ファイル権限
1. このレッスンで学ぶこと
- useraddとadduserの違い
- passwdによるパスワード管理
- groupaddとusermodによるグループ管理
- sudo権限設定
- ログイン中のユーザー情報の確認
2. チームメンバーがサーバーを共有するストーリー
(1) 悩み:新しい同僚にアカウントが必要
小明のチームに新しい同僚ボブが入りました。開発サーバーにアカウントが必要です。Windowsなら「コンピューターの管理」→「ユーザーとグループ」→右クリックで作成(さらにライセンス認証やパスワードポリシーの処理も必要)。
(2) Linuxの1行ソリューション
sudo useradd -m -s /bin/bash bob
sudo passwd bob
# Enter bob's password
sudo usermod -aG developers,sudo bob
3コマンド、30秒で完了。
(3) 得られるもの:多人数協業の基盤
ユーザー作成後、ボブはssh bob@serverでログインでき、自分のホームディレクトリを持ち、共有のdevelopersグループディレクトリにアクセスでき、sudoでソフトウェアをインストールできます。
3. 知識ポイント
(1) ユーザー関連ファイル
/etc/passwd # User account information
/etc/shadow # Encrypted passwords (root-readable only)
/etc/group # Group information
/etc/passwdの各行は7つのコロン区切りフィールドで構成されています:
alice:x:1001:1001:Alice Wang:/home/alice:/bin/bash
└───┘ └ └───┘ └───┘ └───────┘ └─────────┘ └─────────
│ │ │ │ │ │ └── Login Shell
│ │ │ │ │ └────────────── Home directory
│ │ │ │ └────────────────────────── Full name/description
│ │ │ └────────────────────────────────── Group ID (GID)
│ │ └──────────────────────────────────────── User ID (UID)
│ └──────────────────────────────────────────── Password placeholder (actual encrypted password in shadow)
└──────────────────────────────────────────────── Username
(2) ユーザーの作成と管理
# Create a user (with home directory and specified Shell)
sudo useradd -m -s /bin/bash alice
# Set password
sudo passwd alice
> ⚠️ 注意:デフォルトまたは弱いパスワードで作成された新規ユーザーは、ブルートフォース攻撃の標的になりやすいです。本番環境では、初回ログイン時のパスワード変更を強制(`chage -d 0 alice`)し、パスワード複雑性ポリシーを設定してください。
# Delete a user
sudo userdel bob # Keep home directory
sudo userdel -r bob # Delete user and home directory
# Modify user information
sudo usermod -l newname alice # Change username
> ℹ️ 注意:Ubuntuには`adduser`コマンドもあります。これは`useradd`の対話型ラッパーで — ホームディレクトリの自動作成、パスワードの入力プロンプト、`/etc/skel`テンプレートのコピーを行います。`useradd`はより柔軟ですが手動パラメータが必要、`adduser`は親切ですがカスタマイズ性が低いです。本番スクリプトでは`useradd`、手動操作なら`adduser`でも構いません。
sudo usermod -d /home/newhome alice # Change home directory
sudo usermod -L alice # Lock user (disable login)
sudo usermod -U alice # Unlock user
(3) グループの作成と管理
# Create a group
sudo groupadd developers
sudo groupadd devops
# Delete a group
sudo groupdel oldteam
# Add a user to a group
sudo usermod -aG developers alice # -aG = append to Group
sudo gpasswd -a bob developers # Alternative method
# Remove a user from a group
sudo gpasswd -d bob developers
# View a user's groups
groups alice
# Output: alice : alice sudo developers
(4) sudo権限昇格
sudoは一般ユーザーがroot(または指定ユーザー)としてコマンドを実行できるようにします。
# Edit sudoers configuration (never edit /etc/sudoers directly)
sudo visudo
> ⚠️ 注意:`/etc/sudoers`をvimやnanoで直接編集しないでください!構文エラーがあると`sudo`が完全に壊れ、権限昇格して修正できなくなります。`visudo`は保存前に自動的に構文チェックを行います — 唯一の安全な編集方法です。
よく使う設定:
# Allow all members of the sudo group to use sudo
%sudo ALL=(ALL:ALL) ALL
# Allow a specific user to run sudo without a password
alice ALL=(ALL) NOPASSWD: ALL
# Restrict to specific commands only
bob ALL=(ALL) /usr/bin/apt, /usr/bin/systemctl
(5) ▶ サンプル:ユーザーの作成と環境設定
# Create user alice
sudo useradd -m -s /bin/bash alice
# Set password
sudo passwd alice
# Add alice to the sudo group (so she can elevate privileges)
sudo usermod -aG sudo alice
# Verify
id alice
# uid=1001(alice) gid=1001(alice) groups=1001(alice),27(sudo)
# Switch to alice and test
sudo -u alice whoami
# alice
出力:
TEXTuid=1001(alice) gid=1001(alice) groups=1001(alice),27(sudo) alice
(6) ▶ サンプル:チーム共有グループの作成
# Create a development group
sudo groupadd developers
# Add team members to the developers group
sudo usermod -aG developers alice
sudo usermod -aG developers bob
sudo usermod -aG developers charlie
# View group members
grep developers /etc/group
# developers:x:1005:alice,bob,charlie
出力:
TEXTdevelopers:x:1005:alice,bob,charlie
(7) ▶ サンプル:パスワードなしsudoの設定
# Edit with visudo (safe method)
sudo visudo
# Add at the end of the file (after the %sudo line):
alice ALL=(ALL) NOPASSWD: ALL
# Or create a standalone file
echo "alice ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/alice
sudo chmod 440 /etc/sudoers.d/alice
# Verify
sudo -l -U alice
出力:
TEXTUser alice may run the following commands on server: (ALL) NOPASSWD: ALL
(8) ▶ サンプル:オンラインユーザーの確認
# Currently logged-in users
who
# alice pts/0 2026-07-07 09:15 (192.168.1.100)
# bob pts/1 2026-07-07 10:23 (192.168.1.101)
# More detailed information
w
# 10:30:45 up 2 days, 1 user, load average: 0.08, 0.03, 0.01
# USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
# alice pts/0 192.168.1.100 09:15 0.00s 0.23s 0.02s w
# View recent login records
last | head -10
# Count currently logged-in users
who | wc -l
出力:
TEXTalice pts/0 2026-07-07 09:15 (192.168.1.100) bob pts/1 2026-07-07 10:23 (192.168.1.101) 10:30:45 up 2 days, 1 user, load average: 0.08, 0.03, 0.01 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT alice pts/0 192.168.1.100 09:15 0.00s 0.23s 0.02s w alice pts/0 192.168.1.100 Mon Jul 7 09:15 still logged in bob pts/1 192.168.1.101 Mon Jul 7 10:23 still logged in 2
(9) ▶ サンプル:ユーザーのロックとアンロック
# Lock a user (locked accounts cannot log in)
sudo usermod -L bob
# Verify lock status
sudo grep bob /etc/shadow
# bob:!$6$... ← The ! before the password field indicates locked
# Try to log in (should be denied)
ssh bob@localhost
# Permission denied
# Unlock the user
sudo usermod -U bob
出力:
TEXTbob:!$6$xyz...:19600:0:99999:7::: Permission denied, please try again. bob:$6$abc...:19600:0:99999:7:::
(10) ▶ 総合例:新規開発者向けサーバーアカウントセットアップの完成
#!/bin/bash
# add-dev-user.sh - Create an account for a new developer
# Check arguments
if [ $# -ne 1 ]; then
echo "Usage: sudo ./add-dev-user.sh <username>"
exit 1
fi
USERNAME=$1
echo "Creating user $USERNAME..."
# 1. Create user
sudo useradd -m -s /bin/bash "$USERNAME"
# 2. Set password (interactive)
sudo passwd "$USERNAME"
# 3. Add to developers and sudo groups
sudo usermod -aG developers,sudo "$USERNAME"
# 4. Create SSH directory
sudo mkdir -p /home/$USERNAME/.ssh
sudo chmod 700 /home/$USERNAME/.ssh
# 5. Copy template configuration
sudo cp /etc/skel/.bashrc /home/$USERNAME/
sudo cp /etc/skel/.profile /home/$USERNAME/
# 6. Set correct permissions
sudo chown -R $USERNAME:$USERNAME /home/$USERNAME/
echo "User $USERNAME created!"
echo "Please run manually: sudo passwd $USERNAME to set password"
❓ よくある質問
Q: rootと一般ユーザーの違いは? A: \1
Q: なぜrootで直接ログインするのではなくsudoを使うのですか? A: セキュリティ+監査:
sudoで実行されたコマンドはログに記録され(/var/log/auth.log)、誰がいつ何を実行したかを追跡できます。rootの直接ログインでは操作者を区別できません。
Q:
userdel -rは何を削除しますか? A: ユーザーのホームディレクトリとメールスプール。-rなしではホームディレクトリは保持されます — データを残す必要がある場合(引き継ぎ時など)に便利です。
Q: なぜ一般ユーザーは
/etc/shadowを読めないのですか? A: 暗号化されたパスワードハッシュが保存されているためです。ハッシュは直接逆変換できなくても、攻撃者はレインボーテーブルでブルートフォース攻撃が可能です。そのためshadowファイルの権限は600で、rootのみ読み取り可能です。
Q: 複数ユーザーが同時にSSH接続すると競合しますか? A: しません。各SSH接続は独立したセッションで、独自のシェルプロセスを持ちます。ただし、同じファイルへの同時書き込みは競合する可能性があります(ファイルロックで解決)。
📖 まとめ
useradd -m -s /bin/bashで新規ユーザー作成、passwdでパスワード設定groupaddでグループ作成、usermod -aGでユーザーをグループに追加sudo visudoで安全にsudo設定を編集、%groupでグループレベルの権限設定/etc/passwdはユーザー情報、/etc/shadowはパスワード、/etc/groupはグループ情報who/w/lastでログイン中のユーザーを確認
📝 練習問題
- 基本(難易度 ⭐):新規ユーザー
student1を作成し、パスワードを設定し、ホームディレクトリを作成し、whoとwで現在のログインユーザー情報を確認する - 中級(難易度 ⭐⭐):
student1をsudoグループに追加してsudoの動作を確認し、共有グループteamを作成して2人のユーザーを追加する - 上級(難易度 ⭐⭐⭐):
sudo -l -U student1でそのユーザーのsudo権限を確認し、/etc/sudoers.d/に設定ファイルを作成してstudent1がsudo aptとsudo systemctlのみ実行できるように制限する