user・group 管理の実践 — マルチユーザー環境の構築
この記事のポイント
useradd/adduserの違いと、実務で安全なユーザー追加の型usermod -aGでグループにユーザーを追加する方法と-aを忘れた場合の事故/etc/passwd//etc/shadow//etc/groupの読み方と権限管理の実態- マルチユーザー環境の構築手順をゼロから一本道で
結論(実務の型)
- ユーザー追加:
useradd -m -s /bin/bash username→passwd username - グループ追加:
usermod -aG groupname username(-a必須) - 確認:
id username/groups username /etc/passwdの編集はusermod経由のみ(直接編集禁止)
前提(対象環境)
- OS: Ubuntu / Debian 系(
adduserコマンドも使用可) - 操作は
sudoまたはルートで実施
useradd と adduser はどう違うのか?
useradd は低レベルなバイナリ、adduser は Perl/Python 製の高レベルラッパー。Ubuntu では adduser が対話的にホームディレクトリ・パスワード設定まで行うため初心者向けだが、スクリプト内では useradd を使うほうが移植性が高い。
| useradd | adduser | |
|---|---|---|
| 種類 | バイナリ | スクリプトラッパー |
| 対話 | なし | あり |
| ホーム作成 | -m が必要 |
デフォルトで作成 |
| 移植性 | 全ディストリビューション | Debian 系のみ |
実務ではスクリプトに useradd、手作業に adduser を使い分けるのが一般的。
どうやってユーザーを追加するのか?
useradd -m -s /bin/bash username でホームディレクトリ付きのユーザーを作成し、その後 passwd でパスワードを設定するのが標準手順。
# ユーザー作成(ホームディレクトリ付き) sudo useradd -m -s /bin/bash alice # パスワード設定 sudo passwd alice
New password: Retype new password: passwd: password updated successfully
主なオプション:
| オプション | 説明 |
|---|---|
-m |
ホームディレクトリを作成 |
-s /bin/bash |
デフォルトシェル指定 |
-d /path |
ホームディレクトリのパスを指定 |
-u 1500 |
UID を明示的に指定 |
-g groupname |
プライマリグループ指定 |
-G grp1,grp2 |
補助グループ指定(複数可) |
作成後の確認:
id alice
uid=1001(alice) gid=1001(alice) groups=1001(alice)
adduser を使う場合は sudo adduser alice だけで対話的に全設定が完了する。スクリプト外での手動作業ならこちらが速い。
グループをどう作成・管理するのか?
groupadd groupname でグループを作成する。グループは /etc/group に記録され、ファイルの共有アクセス制御の基本単位になる。
# グループ作成 sudo groupadd developers # グループ確認 getent group developers
developers:x:1002:
グループの変更・削除:
# グループ名変更 sudo groupmod -n dev developers # グループ削除 sudo groupdel dev
グループを削除しても、そのグループを参照している /etc/group の補助グループエントリは残る。groupdel 後に grep ':dev:' /etc/group で残骸がないか確認すること。
ユーザーをグループに追加するにはどうするのか?
usermod -aG groupname username の -a(append)が最重要。-a なしで -G だけ使うと、既存の補助グループがすべて上書きされ削除される。
# グループに追加(-a 必須) sudo usermod -aG developers alice # 複数グループに同時追加 sudo usermod -aG developers,sudo alice # 確認 groups alice
alice : alice developers sudo
-a を忘れると既存グループがすべて失われる。
# 危険: sudo グループが剥奪される sudo usermod -G developers alice
特権ユーザーから sudo グループを誤って剥奪した場合、別のルートセッションから復旧する必要がある。
グループ変更はログイン中のセッションには即時反映されない。newgrp developers または再ログインで有効になる。
# セッションを再起動せずにグループを有効化 newgrp developers
/etc/passwd と /etc/shadow の読み方は?
/etc/passwd はユーザー情報のデータベース、/etc/shadow は暗号化パスワードを格納する。パスワードが /etc/passwd に直接書かれていた時代は全ユーザーが平文ハッシュを閲覧可能だったが、現代では /etc/shadow(root のみ読取可)に分離されている。
/etc/passwd の構造(コロン区切り 7 フィールド):
alice:x:1001:1001:Alice Smith:/home/alice:/bin/bash ^ ^ ^ ^ ^ ^ ^ | | | | | | デフォルトシェル | | | | | ホームディレクトリ | | | | GECOS(フルネーム等) | | | GID(プライマリグループ) | | UID | パスワード('x' = /etc/shadow に格納) ユーザー名
/etc/shadow の構造(コロン区切り 9 フィールド):
sudo cat /etc/shadow | grep alice
alice:$6$salt$hashedpassword...:19500:0:99999:7:::
^ ^ ^ ^ ^
| | | | 警告日数
| | | 最大有効日数
| | 最小変更間隔
| 最終変更日(epoch 日数)
ハッシュ($6$ = SHA-512)
/etc/passwd の直接編集は禁止。usermod や chsh を経由すること。直接編集でフォーマットを壊すとログイン不能になる。
ユーザー情報の変更・削除はどうするのか?
usermod でほぼすべての属性を変更できる。削除には userdel を使い、ホームディレクトリも削除する場合は -r を付ける。
# ログインシェル変更 sudo usermod -s /bin/zsh alice # ホームディレクトリ移動(既存ディレクトリを移動しながら変更) sudo usermod -d /home/alice2 -m alice # ロック(ログイン無効化) sudo usermod -L alice # ロック解除 sudo usermod -U alice # ユーザー削除(ホームディレクトリは残す) sudo userdel alice # ユーザー削除(ホームディレクトリも削除) sudo userdel -r alice
userdel -r は復元できない。削除前にホームの内容を確認すること。
ls -la /home/alice
マルチユーザー環境の構築手順
開発チームが共有サーバーを使う典型的な構成を一本道で示す。
# 1. 共有グループ作成 sudo groupadd developers # 2. ユーザー作成 sudo useradd -m -s /bin/bash -G developers alice sudo useradd -m -s /bin/bash -G developers bob # 3. パスワード設定 sudo passwd alice sudo passwd bob # 4. 共有ディレクトリ作成 sudo mkdir /srv/project sudo chown root:developers /srv/project sudo chmod 2775 /srv/project # setgid: 新規ファイルのグループを自動継承
chmod 2775 の 2 は setgid ビット。このディレクトリ下で作成されたファイルのグループが自動的に developers になり、グループメンバー全員が読み書きできる。
# 設定確認 ls -ld /srv/project
drwxrwsr-x 2 root developers 4096 Jun 2 00:00 /srv/project
^
's' = setgid ビット
# メンバー全員の確認 getent group developers
developers:x:1002:alice,bob
sudo 権限の付与
特定ユーザーに管理権限を与える場合は sudo グループへ追加(Ubuntu の場合):
sudo usermod -aG sudo alice
または visudo でより細かい権限制御も可能。
ログイン中ユーザーと接続状況を確認するには?
who / w コマンドで現在ログインしているユーザーと作業状況を確認できる。
who
alice pts/0 2026-06-02 09:00 (192.168.1.10) bob pts/1 2026-06-02 09:05 (192.168.1.11)
w
09:10:00 up 2 days, 3:00, 2 users, load average: 0.10, 0.08, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT alice pts/0 192.168.1.10 09:00 2:00 0.05s 0.01s bash bob pts/1 192.168.1.11 09:05 0.00s 0.10s 0.02s top
last コマンドでログイン履歴も確認できる:
last -n 10