ユーザー・グループ管理 - useradd/passwd と /etc/passwd・shadow【LPIC-1 107.1】
この記事で達成できること
useradd/usermod/userdelでユーザーを作成・変更・削除できるgroupadd/groupmod/groupdel/gpasswdでグループを管理できるpasswd/chageでパスワードと有効期限を制御できる/etc/passwd//etc/shadow//etc/group//etc/gshadowの各フィールドを読める/etc/skel//etc/login.defsがユーザー作成にどう影響するか説明できる- 試験頻出の
usermod -aG(-G単独指定の罠)を根拠付きで答えられる
LPIC-1 主題 107.1「ユーザーとグループおよび関連するシステムファイルを管理する」の中核。アカウント管理は権限・セキュリティの土台になる。
ユーザー管理コマンドはどう使い分けるか
ユーザー操作は「作成(useradd)・変更(usermod)・削除(userdel)」の3コマンドが基本。パスワードは別系統の passwd、有効期限は chage が担当する。
| 目的 | コマンド | 代表オプション |
|---|---|---|
| 作成 | useradd |
-m -d -s -g -G -u |
| 変更 | usermod |
-aG -L -U -l |
| 削除 | userdel |
-r |
| パスワード | passwd |
-l -u -e |
| 有効期限 | chage |
-l -M -E |
ディストリビューションによっては対話的な adduser(Debian/Ubuntu 系の Perl スクリプト)も存在するが、LPIC-1 で問われるのは低レベルな useradd ファミリ。本記事はこちらを扱う。
ユーザーを作成・変更・削除する
useradd はデフォルトではホームディレクトリを作らない。-m を付けないと「ログインできてもホームがない」状態になりやすいので注意する。
Step 1: useradd でユーザーを作成する
sudo useradd -m -s /bin/bash -c "Sato Taro" sato getent passwd sato
sato:x:1001:1001:Sato Taro:/home/sato:/bin/bash
主要オプション(man useradd):
| オプション | 意味 |
|---|---|
-m |
ホームディレクトリを作成(/etc/skel をコピー) |
-d DIR |
ホームディレクトリのパスを指定 |
-s SHELL |
ログインシェルを指定 |
-g GROUP |
プライマリ(主)グループを指定 |
-G G1,G2 |
補助(サブ)グループを指定 |
-u UID |
UID を明示指定 |
-c COMMENT |
コメント(GECOS)欄を設定 |
-g は「プライマリグループ」、-G は「補助グループ」。1ユーザーにプライマリは1つだけ、補助は複数持てる。
Step 2: passwd でパスワードを設定する
sudo passwd sato
New password: Retype new password: passwd: password updated successfully
useradd 直後のアカウントはパスワード未設定でロック状態のことが多い。passwd で設定して初めて通常ログインできる。
Step 3: usermod でユーザーを変更する
sudo usermod -aG wheel,docker sato id sato
uid=1001(sato) gid=1001(sato) groups=1001(sato),10(wheel),998(docker)
主要オプション(man usermod):
| オプション | 意味 |
|---|---|
-aG G1,G2 |
補助グループへ追加(-a は append、既存維持) |
-G G1,G2 |
補助グループを置き換え(-a なしは上書き) |
-L |
パスワードをロック(/etc/shadow の先頭に ! 付与) |
-U |
パスワードのロック解除 |
-l NEWNAME |
ログイン名を変更 |
-g GROUP |
プライマリグループを変更 |
usermod -G group user を -a なしで実行すると、指定しなかった既存の補助グループから外れる。補助グループへ「追加」したいときは必ず -aG を使う。試験でも実務でも最頻出の事故。
Step 4: userdel でユーザーを削除する
sudo userdel -r sato
(出力なし。-r でホームディレクトリとメールスプールも削除)
userdel 単体ではホームディレクトリは残る。-r を付けるとホームディレクトリとメールスプールも削除する。実行中プロセスを持つユーザーは削除に失敗することがある。
グループはどう管理するか
グループ操作は groupadd(作成)・groupmod(変更)・groupdel(削除)、メンバー管理は gpasswd が担当する。/etc/group と /etc/gshadow が実体。
Step 1: groupadd でグループを作成する
sudo groupadd -g 1500 developers getent group developers
developers:x:1500:
-g GID で GID を明示指定する。省略時は /etc/login.defs の範囲から自動採番される。
Step 2: groupmod でグループを変更する
sudo groupmod -n devs developers sudo groupmod -g 1600 devs getent group devs
devs:x:1600:
-n NEWNAME でグループ名を変更、-g GID で GID を変更する。
Step 3: gpasswd でメンバーを管理する
sudo gpasswd -a sato devs sudo gpasswd -d sato devs getent group devs
Adding user sato to group devs Removing user sato from group devs devs:x:1600:
gpasswd -a user group でメンバー追加、-d user group で削除(man gpasswd)。gpasswd -A user group でグループ管理者を指定できる。
Step 4: groupdel でグループを削除する
sudo groupdel devs
(出力なし)
あるユーザーのプライマリグループになっているグループは削除できない。先にユーザーのプライマリグループを変更する必要がある。
/etc/passwd と /etc/shadow は何が違うのか
/etc/passwd はアカウントの基本情報、/etc/shadow は暗号化パスワードと有効期限を保持する。パスワードを passwd 本体から分離したのがシャドウパスワードの仕組み。
/etc/passwd の7フィールド
sato:x:1001:1001:Sato Taro:/home/sato:/bin/bash
コロン区切りで7フィールド(man 5 passwd):
| # | フィールド | 例 | 意味 |
|---|---|---|---|
| 1 | ユーザー名 | sato |
ログイン名 |
| 2 | パスワード | x |
x は実体が /etc/shadow にある印 |
| 3 | UID | 1001 |
ユーザーID |
| 4 | GID | 1001 |
プライマリグループID |
| 5 | GECOS | Sato Taro |
コメント(氏名等) |
| 6 | ホーム | /home/sato |
ホームディレクトリ |
| 7 | シェル | /bin/bash |
ログインシェル |
第7フィールドが /sbin/nologin や /bin/false のアカウントは、サービス専用でインタラクティブログインできない。
/etc/shadow の9フィールド
sato:$6$xyz...:19500:0:99999:7:::
コロン区切りで9フィールド(man 5 shadow):
| # | フィールド | 意味 |
|---|---|---|
| 1 | ユーザー名 | /etc/passwd と対応 |
| 2 | 暗号化パスワード | ハッシュ。! や * 始まりはロック・無効 |
| 3 | 最終変更日 | 1970-01-01 からの日数 |
| 4 | 最小変更日数 | 変更後この日数は再変更不可 |
| 5 | 最大有効日数 | この日数で要変更 |
| 6 | 警告日数 | 期限切れ前に警告する日数 |
| 7 | 猶予日数 | 期限切れ後ログイン可能な日数 |
| 8 | アカウント有効期限 | 1970-01-01 からの日数 |
| 9 | 予約 | 未使用 |
/etc/shadow は root のみ読める(パーミッション 0640 等)。一般ユーザーから見えないことで、ハッシュをオフライン解析される攻撃を防いでいる。
/etc/group と /etc/gshadow
developers:x:1500:sato,suzuki
/etc/group は4フィールド(man 5 group): グループ名、パスワード(x)、GID、メンバー一覧(補助グループとしての所属者をカンマ区切り)。/etc/gshadow はグループパスワードと管理者・メンバーを保持する(man 5 gshadow)。
/etc/group のメンバー欄に出るのは、そのグループを補助グループとして持つユーザーのみ。プライマリグループとして所属するユーザーはここには列挙されない(/etc/passwd の GID で表現される)。
/etc/skel と /etc/login.defs の役割
/etc/skel は新規ホームの雛形、/etc/login.defs は useradd のデフォルト値を定義する。どちらもユーザー作成時の挙動を左右する。
useradd -m でホームを作る際、/etc/skel 配下のファイル(.bashrc、.profile 等)が新しいホームへコピーされる。全ユーザーに配りたい初期設定はここに置く。
/etc/login.defs は UID/GID の自動採番範囲(UID_MIN / UID_MAX 等)、パスワード有効期限のデフォルト(PASS_MAX_DAYS / PASS_MIN_DAYS / PASS_WARN_AGE)、ホーム自動作成の可否(CREATE_HOME)などを定義する(man 5 login.defs)。
grep -E '^(UID_MIN|UID_MAX|PASS_MAX_DAYS)' /etc/login.defs
UID_MIN 1000 UID_MAX 60000 PASS_MAX_DAYS 99999
パスワードの有効期限はどう制御するか
chage は /etc/shadow の期限フィールドを操作する専用コマンド。passwd のロック系オプションと併せて押さえる。
chage で期限を確認・設定する
sudo chage -l sato
Last password change : May 30, 2026 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7
主要オプション(man chage):
| オプション | 意味 |
|---|---|
-l |
現在の期限設定を一覧表示 |
-M DAYS |
パスワード最大有効日数 |
-m DAYS |
パスワード最小変更日数 |
-W DAYS |
期限切れ前の警告日数 |
-E DATE |
アカウント有効期限(YYYY-MM-DD) |
-d DATE |
最終変更日(-d 0 で次回ログイン時に変更強制) |
passwd でロックと変更強制を行う
sudo passwd -l sato sudo passwd -u sato sudo passwd -e sato
passwd: password expiry information changed.
passwd -l でロック(/etc/shadow の先頭に ! を付ける)、-u で解除、-e で即時失効させ次回ログイン時にパスワード変更を強制する。
よくあるミスと対処法
usermod -G を -a なしで使い既存グループが外れる
usermod -G docker sato は補助グループを docker だけに置き換えるため、それまで所属していた wheel 等から外れる。追加したいなら usermod -aG docker sato を使う。
useradd で -m を付けずホームがない
useradd sato だけだとホームディレクトリが作られず、ログイン後に /etc/skel の設定も適用されない。useradd -m sato を基本とする(/etc/login.defs の CREATE_HOME yes で既定化も可能)。
ロックされたパスワードの ! 表記を「壊れた」と誤認する
/etc/shadow のハッシュ先頭の ! や !!、* はロック/無効を表す正常な状態。passwd -l や usermod -L で付与される。passwd -u または usermod -U で解除する。
userdel だけでホームが残りディスクを圧迫する
userdel sato はホームディレクトリを残す。完全に消すなら userdel -r sato。残ったホームは元の UID 所有のまま放置され、後で同じ UID が再利用されると所有権が混乱する。
グループ変更が反映されない
usermod -aG での補助グループ追加は、既存のログインセッションには即反映されない。新しいログイン(または newgrp group)で有効になる。id user で /etc/group 上の所属を確認できる。
トラブルシューティング
症状: useradd で「user already exists」
原因: 同名ユーザーが既に存在する、または UID が衝突している
確認:
getent passwd sato getent passwd 1001
対処: 既存アカウントを確認し、不要なら userdel で削除。UID 衝突なら -u で空いている UID を指定する。
症状: ユーザーが正しいグループにいるのに権限がない
原因: 補助グループ追加後にログインし直していない(セッションに反映されていない)
確認:
id sato getent group docker
対処: 一度ログアウトして再ログインする。即時反映したい単発操作なら newgrp docker でグループを切り替える。
症状: groupdel で「cannot remove the primary group」
原因: 削除しようとしたグループが、あるユーザーのプライマリグループになっている
確認:
getent passwd | awk -F: '$4=="1500"{print $1}'対処: 該当ユーザーのプライマリグループを usermod -g other user で変更してから groupdel する。
作業完了チェックリスト
- [ ]
useradd -m -s /bin/bashでホーム付きユーザーを作成した - [ ]
passwdでパスワードを設定した - [ ]
usermod -aG(-a付き)で補助グループへ追加した - [ ]
/etc/passwdと/etc/shadowの各フィールドを読めた - [ ]
chage -lでパスワード有効期限を確認した - [ ]
userdel -rでホームごと削除した
まとめ
| 場面 | コマンド | 目的 |
|---|---|---|
| 作成 | useradd -m -s /bin/bash user |
ホーム付きユーザー作成 |
| パスワード | passwd user |
パスワード設定 |
| 補助グループ追加 | usermod -aG group user |
既存維持で追加 |
| ロック | passwd -l / usermod -L |
アカウント無効化 |
| 有効期限 | chage -M 90 user |
パスワード期限設定 |
| 削除 | userdel -r user |
ホームごと削除 |
| 参照 | getent passwd / id |
アカウント情報確認 |
ユーザー・グループ管理は権限とセキュリティの基盤。次はファイル管理やシェル環境と組み合わせると、運用知識がつながる。