Linux: ユーザーとグループの管理 — マルチユーザーシステム

Linuxは最初からマルチユーザーオペレーティングシステムとして設計されています。開発チームがサーバーを共有する場合も、異なるアプリケーションが分離された実行権限を必要とする場合も、ユーザーとグループの管理はコアスキルです。

📋 前提条件:まず以下を完了していること

1. このレッスンで学ぶこと


2. チームメンバーがサーバーを共有するストーリー

(1) 悩み:新しい同僚にアカウントが必要

小明のチームに新しい同僚ボブが入りました。開発サーバーにアカウントが必要です。Windowsなら「コンピューターの管理」→「ユーザーとグループ」→右クリックで作成(さらにライセンス認証やパスワードポリシーの処理も必要)。

(2) Linuxの1行ソリューション

BASH
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) ユーザー関連ファイル

BASH
/etc/passwd    # User account information
/etc/shadow    # Encrypted passwords (root-readable only)
/etc/group     # Group information

/etc/passwdの各行は7つのコロン区切りフィールドで構成されています:

TEXT

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) ユーザーの作成と管理

BASH
# 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) グループの作成と管理

BASH
# 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(または指定ユーザー)としてコマンドを実行できるようにします。

BASH
# Edit sudoers configuration (never edit /etc/sudoers directly)
sudo visudo

> ⚠️ 注意:`/etc/sudoers`をvimやnanoで直接編集しないでください!構文エラーがあると`sudo`が完全に壊れ、権限昇格して修正できなくなります。`visudo`は保存前に自動的に構文チェックを行います — 唯一の安全な編集方法です。

よく使う設定:

BASH
# 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) ▶ サンプル:ユーザーの作成と環境設定

BASH
# 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

出力:

TEXT
uid=1001(alice) gid=1001(alice) groups=1001(alice),27(sudo)
alice

(6) ▶ サンプル:チーム共有グループの作成

BASH
# 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

出力:

TEXT
developers:x:1005:alice,bob,charlie

(7) ▶ サンプル:パスワードなしsudoの設定

BASH
# 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

出力:

TEXT
User alice may run the following commands on server:
    (ALL) NOPASSWD: ALL

(8) ▶ サンプル:オンラインユーザーの確認

TEXT
# 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

出力:

TEXT
alice   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) ▶ サンプル:ユーザーのロックとアンロック

BASH
# 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

出力:

TEXT
bob:!$6$xyz...:19600:0:99999:7:::
Permission denied, please try again.
bob:$6$abc...:19600:0:99999:7:::

(10) ▶ 総合例:新規開発者向けサーバーアカウントセットアップの完成

BASH
#!/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接続は独立したセッションで、独自のシェルプロセスを持ちます。ただし、同じファイルへの同時書き込みは競合する可能性があります(ファイルロックで解決)。


📖 まとめ


📝 練習問題

  1. 基本(難易度 ⭐):新規ユーザーstudent1を作成し、パスワードを設定し、ホームディレクトリを作成し、whowで現在のログインユーザー情報を確認する
  2. 中級(難易度 ⭐⭐)student1sudoグループに追加してsudoの動作を確認し、共有グループteamを作成して2人のユーザーを追加する
  3. 上級(難易度 ⭐⭐⭐)sudo -l -U student1でそのユーザーのsudo権限を確認し、/etc/sudoers.d/に設定ファイルを作成してstudent1sudo aptsudo systemctlのみ実行できるように制限する
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%