ユーザー・グループ管理 - useradd/passwd と /etc/passwd・shadow【LPIC-1 107.1】

ユーザー・グループ管理 - 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 プライマリグループを変更

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.defsuseradd のデフォルト値を定義する。どちらもユーザー作成時の挙動を左右する。

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.defsCREATE_HOME yes で既定化も可能)。

ロックされたパスワードの ! 表記を「壊れた」と誤認する

/etc/shadow のハッシュ先頭の !!!* はロック/無効を表す正常な状態。passwd -lusermod -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 アカウント情報確認

ユーザー・グループ管理は権限とセキュリティの基盤。次はファイル管理やシェル環境と組み合わせると、運用知識がつながる。

次に読む