User and Group Management
Linux ユーザーとグループの管理 - 包括的ガイド
目次
- はじめに
- ユーザー管理の基本ファイル
- 2.1 /etc/passwd
- 2.2 /etc/shadow
- 2.3 /etc/group
- 2.4 /etc/gshadow
- ユーザー管理コマンド
- 3.1 useradd - ユーザーの作成
- 3.2 usermod - ユーザーの変更
- 3.3 userdel - ユーザーの削除
- グループ管理コマンド
- 4.1 groupadd - グループの作成
- 4.2 groupmod - グループの変更
- 4.3 groupdel - グループの削除
- パスワード管理
- 5.1 passwd コマンド
- 5.2 パスワードエージング (chage)
- 設定ファイル
- 6.1 /etc/login.defs
- 6.2 /etc/skel
- NSS (Name Service Switch)
- ユーザー情報確認コマンド
- sudo 設定
- 9.1 /etc/sudoers と visudo
- 9.2 sudo の高度な設定
- LDAP/SSSD 統合
- ファイル比較表
- トラブルシューティング
- ベストプラクティス
- 参考文献
1. はじめに
Linux システムにおけるユーザーとグループの管理は、システム管理の最も基本的かつ重要なタスクの一つである。適切なユーザー管理は、セキュリティ、アクセス制御、監査の基盤となる。
本記事では、ローカルユーザー管理からディレクトリサービス統合まで、実務で必要な知識を体系的に解説する。
2. ユーザー管理の基本ファイル
2.1 /etc/passwd
ユーザーアカウント情報を格納するファイル。すべてのユーザーが読み取り可能。
フォーマット:
username:x:UID:GID:GECOS:home_directory:shell
各フィールドの説明:
| フィールド | 説明 | 例 |
|---|---|---|
| username | ログイン名(1〜32文字) | sysadmin |
| x | パスワードプレースホルダー(実体は /etc/shadow) | x |
| UID | ユーザーID(0〜65534) | 1001 |
| GID | プライマリグループID | 1001 |
| GECOS | コメント(フルネーム等) | System Administrator |
| home_directory | ホームディレクトリパス | /home/sysadmin |
| shell | ログインシェル | /bin/bash |
実例:
# /etc/passwd の内容を確認
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
sysadmin:x:1001:1001:System Administrator:/home/sysadmin:/bin/bash
deploy:x:1002:1002:Deployment User:/home/deploy:/bin/bash
# 特定ユーザーの情報を取得
$ getent passwd sysadmin
sysadmin:x:1001:1001:System Administrator:/home/sysadmin:/bin/bash
# UID の範囲を確認
$ awk -F: '{print $1, $3}' /etc/passwd | sort -t' ' -k2 -n
root 0
daemon 1
bin 2
sys 3
nobody 65534
sysadmin 1001
deploy 1002
UID の一般的な範囲:
| 範囲 | 用途 |
|---|---|
| 0 | root ユーザー |
| 1 - 999 | システムアカウント(RHEL/CentOS) |
| 1 - 499 | システムアカウント(旧いディストリビューション) |
| 1000 - 65534 | 一般ユーザー |
| 65534 | nobody |
2.2 /etc/shadow
パスワードハッシュと有効期限情報を格納するファイル。root のみ読み取り可能。
フォーマット:
username:password_hash:lastchg:min:max:warn:inactive:expire:reserved
各フィールドの説明:
| フィールド | 説明 | 例 |
|---|---|---|
| username | ログイン名 | sysadmin |
| password_hash | 暗号化パスワード | $6$rounds=... |
| lastchg | 最終パスワード変更日(1970/1/1 からの日数) | 19458 |
| min | パスワード変更禁止期間(日数) | 0 |
| max | パスワード有効期間(日数) | 90 |
| warn | 期限切れ警告期間(日数) | 7 |
| inactive | アカウント無効化猶予期間(日数) | 30 |
| expire | アカウント有効期限(1970/1/1 からの日数) | 20089 |
| reserved | 予約フィールド | (空) |
パスワードハッシュの形式:
$id$salt$hash
| ID | アルゴリズム | 強度 |
|---|---|---|
$1$ | MD5 | 非推奨 |
$5$ | SHA-256 | 推奨 |
$6$ | SHA-512 | 最も推奨 |
$y$ | yescrypt | 最新(Debian 12+, Fedora 35+) |
特殊な値:
| 値 | 意味 |
|---|---|
! または !! | アカウントロック |
* | パスワードログイン無効 |
| 空 | パスワード未設定(危険) |
実例:
# /etc/shadow の確認(root 権限が必要)
$ sudo cat /etc/shadow | grep sysadmin
sysadmin:$6$rKQ3x8Zp$Wv7nHe8JLK...truncated...:19458:0:90:7:30::
# パスワードハッシュのアルゴリズムを確認
$ sudo awk -F: '$2 ~ /^\$/ {split($2,a,"$"); print $1, a[2]}' /etc/shadow
root 6
sysadmin 6
deploy 6
# ロックされたアカウントを確認
$ sudo awk -F: '$2 ~ /^!/ || $2 ~ /^\*/ {print $1, "LOCKED"}' /etc/shadow
daemon LOCKED
bin LOCKED
sys LOCKED
nobody LOCKED
2.3 /etc/group
グループ情報を格納するファイル。
フォーマット:
groupname:password:GID:member_list
実例:
$ cat /etc/group | grep -E "(wheel|sudo|docker|sysadmin)"
wheel:x:10:sysadmin,deploy
sudo:x:27:sysadmin
docker:x:998:sysadmin,deploy
sysadmin:x:1001:
# ユーザーの所属グループを確認
$ groups sysadmin
sysadmin : sysadmin wheel sudo docker
# グループメンバーを確認
$ getent group wheel
wheel:x:10:sysadmin,deploy
2.4 /etc/gshadow
グループのシャドウ情報を格納するファイル。
フォーマット:
groupname:password:admins:members
| フィールド | 説明 |
|---|---|
| groupname | グループ名 |
| password | グループパスワード(暗号化済み)! = 無効 |
| admins | グループ管理者(メンバー追加・削除可能) |
| members | グループメンバー |
実例:
$ sudo cat /etc/gshadow | grep wheel
wheel:!::sysadmin,deploy
# グループ管理者の設定
$ sudo gpasswd -A sysadmin developers
$ sudo cat /etc/gshadow | grep developers
developers:!:sysadmin:
3. ユーザー管理コマンド
3.1 useradd - ユーザーの作成
# 基本的なユーザー作成
$ sudo useradd webadmin
# → ホームディレクトリは /etc/login.defs の設定に依存
# オプションを指定した作成
$ sudo useradd -m -d /home/webadmin -s /bin/bash -c "Web Administrator" \
-g webadmin -G wheel,docker -e 2027-03-31 webadmin
# システムアカウントの作成(UID < 1000, ホームディレクトリなし)
$ sudo useradd -r -s /usr/sbin/nologin -c "Application Service" appservice
# UID を指定して作成
$ sudo useradd -u 2000 -m -s /bin/bash specialuser
# 確認
$ id webadmin
uid=1003(webadmin) gid=1003(webadmin) groups=1003(webadmin),10(wheel),998(docker)
$ getent passwd webadmin
webadmin:x:1003:1003:Web Administrator:/home/webadmin:/bin/bash
useradd 主要オプション:
| オプション | 説明 | 例 |
|---|---|---|
-m | ホームディレクトリを作成 | -m |
-d | ホームディレクトリを指定 | -d /home/user1 |
-s | ログインシェルを指定 | -s /bin/bash |
-c | コメント(GECOS)を設定 | -c "Full Name" |
-g | プライマリグループを指定 | -g developers |
-G | 補助グループを指定 | -G wheel,docker |
-u | UID を指定 | -u 2000 |
-e | アカウント有効期限 | -e 2027-12-31 |
-r | システムアカウント | -r |
-k | スケルトンディレクトリを指定 | -k /etc/skel.custom |
-M | ホームディレクトリを作成しない | -M |
3.2 usermod - ユーザーの変更
# シェルの変更
$ sudo usermod -s /bin/zsh sysadmin
# コメントの変更
$ sudo usermod -c "Senior System Administrator" sysadmin
# 補助グループの追加(-a が重要! 忘れると既存グループから外れる)
$ sudo usermod -aG developers sysadmin
# ⚠️ 危険な例: -a なしでグループ設定(既存の補助グループがすべて外れる)
# $ sudo usermod -G newgroup sysadmin # 非推奨
# アカウントのロック
$ sudo usermod -L sysadmin
$ sudo grep sysadmin /etc/shadow
sysadmin:!$6$rKQ3x8Zp$Wv7nHe8JLK...:19458:0:90:7:30::
# アカウントのアンロック
$ sudo usermod -U sysadmin
# ホームディレクトリの変更(ファイルも移動)
$ sudo usermod -d /home/newdir -m sysadmin
# ユーザー名の変更
$ sudo usermod -l newname oldname
# アカウント有効期限の設定
$ sudo usermod -e 2027-06-30 contractor1
# 確認
$ sudo chage -l contractor1
Last password change : Apr 10, 2026
Password expires : Jul 09, 2026
Password inactive : Aug 08, 2026
Account expires : Jun 30, 2027
3.3 userdel - ユーザーの削除
# ユーザーのみ削除(ホームディレクトリとメールは残る)
$ sudo userdel tempuser
# ユーザーとホームディレクトリを削除
$ sudo userdel -r tempuser
# 強制削除(ログイン中でも削除)
$ sudo userdel -f tempuser
# 削除前の確認手順
$ id tempuser
uid=1005(tempuser) gid=1005(tempuser) groups=1005(tempuser)
$ find / -user tempuser -type f 2>/dev/null | head -20
/home/tempuser/.bashrc
/home/tempuser/.profile
/var/mail/tempuser
# 安全な削除手順(推奨)
$ sudo usermod -L tempuser # 1. まずロック
$ sudo usermod -e 1 tempuser # 2. 有効期限を過去に設定
$ sudo tar czf /backup/tempuser_home.tar.gz /home/tempuser # 3. バックアップ
$ sudo userdel -r tempuser # 4. 削除
4. グループ管理コマンド
4.1 groupadd - グループの作成
# 一般グループの作成
$ sudo groupadd developers
# GID を指定して作成
$ sudo groupadd -g 5000 projectx
# システムグループの作成
$ sudo groupadd -r appgroup
# 確認
$ getent group developers
developers:x:1004:
$ getent group projectx
projectx:x:5000:
4.2 groupmod - グループの変更
# グループ名の変更
$ sudo groupmod -n engineering developers
# GID の変更
$ sudo groupmod -g 5001 engineering
# 確認
$ getent group engineering
engineering:x:5001:
4.3 groupdel - グループの削除
# グループの削除
$ sudo groupdel projectx
# ⚠️ プライマリグループの場合は削除できない
$ sudo groupdel sysadmin
groupdel: cannot remove the primary group of user 'sysadmin'
# gpasswd を使ったグループメンバー管理
$ sudo gpasswd -a user1 developers # メンバー追加
$ sudo gpasswd -d user1 developers # メンバー削除
$ sudo gpasswd -M user1,user2,user3 developers # メンバー一括設定
5. パスワード管理
5.1 passwd コマンド
# 自分のパスワード変更
$ passwd
Changing password for sysadmin.
Current password:
New password:
Retype new password:
passwd: password updated successfully
# 他ユーザーのパスワード変更(root)
$ sudo passwd webadmin
New password:
Retype new password:
passwd: password updated successfully
# パスワードの即時期限切れ設定(次回ログイン時に変更を強制)
$ sudo passwd -e webadmin
# アカウントのロック/アンロック
$ sudo passwd -l webadmin # ロック
$ sudo passwd -u webadmin # アンロック
# パスワードの状態確認
$ sudo passwd -S webadmin
webadmin PS 2026-04-10 0 90 7 30 (Password set, SHA512 crypt.)
# 状態フラグの意味:
# PS = Password Set
# LK = Locked
# NP = No Password
5.2 パスワードエージング (chage)
# パスワードエージング情報の表示
$ sudo chage -l sysadmin
Last password change : Apr 10, 2026
Password expires : Jul 09, 2026
Password inactive : Aug 08, 2026
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 90
Number of days of warning before password expires : 7
# パスワード最大有効期間の設定(90日)
$ sudo chage -M 90 sysadmin
# パスワード最小変更禁止期間の設定(1日)
$ sudo chage -m 1 sysadmin
# 警告期間の設定(14日前から警告)
$ sudo chage -W 14 sysadmin
# アカウント有効期限の設定
$ sudo chage -E 2027-12-31 contractor1
# パスワード期限切れ後の猶予期間(30日)
$ sudo chage -I 30 sysadmin
# 次回ログイン時にパスワード変更を強制
$ sudo chage -d 0 newuser
# 一括設定の例
$ sudo chage -m 1 -M 90 -W 14 -I 30 sysadmin
chage オプション一覧:
| オプション | 説明 |
|---|---|
-l | エージング情報を表示 |
-d DAYS | 最終パスワード変更日を設定(0 = 次回変更強制) |
-m DAYS | パスワード変更禁止期間 |
-M DAYS | パスワード最大有効期間 |
-W DAYS | 期限切れ警告日数 |
-I DAYS | パスワード期限切れ後の猶予期間 |
-E DATE | アカウント有効期限(YYYY-MM-DD) |
6. 設定ファイル
6.1 /etc/login.defs
ユーザー作成・パスワードポリシーのデフォルト値を定義するファイル。
$ cat /etc/login.defs | grep -v '^#' | grep -v '^$'
主要な設定項目:
#
# /etc/login.defs - ユーザー管理のデフォルト設定
#
# メールディレクトリ
MAIL_DIR /var/mail
# パスワードエージングのデフォルト値
PASS_MAX_DAYS 90 # パスワード最大有効期間
PASS_MIN_DAYS 1 # パスワード変更禁止期間
PASS_MIN_LEN 12 # パスワード最小長(PAM で上書きされることが多い)
PASS_WARN_AGE 14 # 期限切れ警告日数
# UID の範囲
UID_MIN 1000 # 一般ユーザーの最小 UID
UID_MAX 60000 # 一般ユーザーの最大 UID
SYS_UID_MIN 201 # システムユーザーの最小 UID
SYS_UID_MAX 999 # システムユーザーの最大 UID
# GID の範囲
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
# ホームディレクトリ作成
CREATE_HOME yes
# umask(ホームディレクトリの権限に影響)
UMASK 077 # ホームディレクトリ: 700
# パスワードの暗号化アルゴリズム
ENCRYPT_METHOD SHA512
# ユーザー削除時のメール処理
MAIL_CHECK_ENAB yes
# ユーザープライベートグループ(同名グループの自動作成)
USERGROUPS_ENAB yes
# ログの設定
LOG_OK_LOGINS yes
FAILLOG_ENAB yes
6.2 /etc/skel
新規ユーザー作成時にホームディレクトリにコピーされるテンプレートファイル。
# デフォルトのスケルトンディレクトリ
$ ls -la /etc/skel/
total 20
drwxr-xr-x 2 root root 4096 Jan 15 10:00 .
drwxr-xr-x 88 root root 4096 Apr 10 12:00 ..
-rw-r--r-- 1 root root 220 Jan 15 10:00 .bash_logout
-rw-r--r-- 1 root root 3771 Jan 15 10:00 .bashrc
-rw-r--r-- 1 root root 807 Jan 15 10:00 .profile
# カスタムスケルトンの作成
$ sudo mkdir -p /etc/skel/.ssh
$ sudo chmod 700 /etc/skel/.ssh
$ sudo cat > /etc/skel/.bashrc << 'EOF'
# カスタム .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# エイリアス
alias ll='ls -la'
alias gs='git status'
alias gd='git diff'
# プロンプトのカスタマイズ
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
# ヒストリー設定
HISTSIZE=10000
HISTFILESIZE=20000
HISTTIMEFORMAT="%F %T "
export HISTCONTROL=ignoredups:erasedups
EOF
# 部門別スケルトンの作成
$ sudo mkdir /etc/skel.dev
$ sudo cp -r /etc/skel/. /etc/skel.dev/
$ sudo cat >> /etc/skel.dev/.bashrc << 'EOF'
# 開発者向け設定
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin:/usr/local/go/bin
EOF
# カスタムスケルトンを使用してユーザー作成
$ sudo useradd -m -k /etc/skel.dev -s /bin/bash devuser1
7. NSS (Name Service Switch)
NSS は、ユーザー情報、グループ情報、ホスト名解決などのソースと検索順序を制御する仕組み。
設定ファイル: /etc/nsswitch.conf
$ cat /etc/nsswitch.conf
# Name Service Switch 設定
#
# ソースの種類:
# files = ローカルファイル (/etc/passwd, /etc/group 等)
# sss = SSSD (System Security Services Daemon)
# ldap = LDAP ディレクトリ
# compat = NIS 互換モード
# dns = DNS
passwd: files sss
shadow: files sss
group: files sss
hosts: files dns myhostname
networks: files
protocols: db files
services: db files sss
ethers: db files
rpc: db files
netgroup: sss
automount: files sss
動作確認:
# NSS 経由でユーザー情報を取得
$ getent passwd sysadmin
sysadmin:x:1001:1001:System Administrator:/home/sysadmin:/bin/bash
# NSS 経由ですべてのユーザーを取得
$ getent passwd | wc -l
45
# NSS 経由でグループ情報を取得
$ getent group wheel
wheel:x:10:sysadmin,deploy
# NSS のデータベースを指定して取得
$ getent -s files passwd sysadmin
sysadmin:x:1001:1001:System Administrator:/home/sysadmin:/bin/bash
$ getent -s sss passwd ldapuser1
ldapuser1:*:10001:10001:LDAP User 1:/home/ldapuser1:/bin/bash
8. ユーザー情報確認コマンド
id コマンド
# 現在のユーザー情報
$ id
uid=1001(sysadmin) gid=1001(sysadmin) groups=1001(sysadmin),10(wheel),27(sudo),998(docker)
# 特定ユーザーの情報
$ id deploy
uid=1002(deploy) gid=1002(deploy) groups=1002(deploy),10(wheel),998(docker)
# UID のみ
$ id -u sysadmin
1001
# グループ名のみ
$ id -Gn sysadmin
sysadmin wheel sudo docker
# グループ ID のみ
$ id -G sysadmin
1001 10 27 998
who / w コマンド
# 現在ログインしているユーザー
$ who
sysadmin pts/0 2026-04-10 09:15 (192.168.1.100)
deploy pts/1 2026-04-10 10:30 (192.168.1.101)
webadmin pts/2 2026-04-10 11:45 (10.0.0.50)
# 詳細情報(w コマンド)
$ w
12:00:00 up 45 days, 3:22, 3 users, load average: 0.15, 0.10, 0.08
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
sysadmin pts/0 192.168.1.100 09:15 0.00s 0.12s 0.01s w
deploy pts/1 192.168.1.101 10:30 1:15m 0.05s 0.05s -bash
webadmin pts/2 10.0.0.50 11:45 0:10 0.08s 0.02s vim /etc/nginx/nginx.conf
# 自分が誰か
$ whoami
sysadmin
last コマンド
# 最近のログイン履歴
$ last | head -15
sysadmin pts/0 192.168.1.100 Thu Apr 10 09:15 still logged in
deploy pts/1 192.168.1.101 Thu Apr 10 10:30 still logged in
sysadmin pts/0 192.168.1.100 Wed Apr 9 08:00 - 18:30 (10:30)
root tty1 Tue Apr 8 03:00 - 03:05 (00:05)
reboot system boot 5.15.0-91 Mon Mar 25 08:37 still running
# 特定ユーザーのログイン履歴
$ last sysadmin | head -5
sysadmin pts/0 192.168.1.100 Thu Apr 10 09:15 still logged in
sysadmin pts/0 192.168.1.100 Wed Apr 9 08:00 - 18:30 (10:30)
sysadmin pts/0 192.168.1.100 Tue Apr 8 08:15 - 19:00 (10:45)
sysadmin pts/0 192.168.1.100 Mon Apr 7 09:00 - 18:00 (09:00)
sysadmin pts/0 192.168.1.100 Fri Apr 4 08:30 - 17:30 (09:00)
# ログイン失敗履歴(/var/log/btmp)
$ sudo lastb | head -10
baduser ssh:notty 10.0.0.99 Thu Apr 10 04:15 - 04:15 (00:00)
admin ssh:notty 10.0.0.99 Thu Apr 10 04:14 - 04:14 (00:00)
root ssh:notty 10.0.0.99 Thu Apr 10 04:13 - 04:13 (00:00)
# 最終ログイン時刻
$ lastlog | head -10
Username Port From Latest
root tty1 Tue Apr 8 03:00:15 +0900 2026
sysadmin pts/0 192.168.1.100 Thu Apr 10 09:15:22 +0900 2026
deploy pts/1 192.168.1.101 Thu Apr 10 10:30:45 +0900 2026
webadmin pts/2 10.0.0.50 Thu Apr 10 11:45:00 +0900 2026
9. sudo 設定
9.1 /etc/sudoers と visudo
重要: /etc/sudoers は必ず visudo コマンドで編集する。構文エラーがあるとシステムにログインできなくなる可能性がある。
# visudo で編集(EDITOR 環境変数でエディタを変更可能)
$ sudo visudo
# vi の代わりに nano を使用
$ sudo EDITOR=nano visudo
# sudoers ファイルの構文チェック
$ sudo visudo -c
/etc/sudoers: parsed OK
/etc/sudoers.d/custom: parsed OK
基本的な sudoers の構文:
# ユーザー指定
# who where=(as_whom) what
user host=(runas) command
# 例
sysadmin ALL=(ALL:ALL) ALL
deploy ALL=(root) /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart httpd
典型的な /etc/sudoers 設定:
# /etc/sudoers の基本構成
$ sudo cat /etc/sudoers
# Defaults 設定
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults logfile="/var/log/sudo.log"
Defaults log_input, log_output
Defaults passwd_timeout=1
Defaults timestamp_timeout=5
Defaults badpass_message="Incorrect password. This incident will be reported."
# root ユーザー
root ALL=(ALL:ALL) ALL
# wheel グループ(RHEL/CentOS)
%wheel ALL=(ALL:ALL) ALL
# sudo グループ(Debian/Ubuntu)
%sudo ALL=(ALL:ALL) ALL
# アプリケーション運用チーム
%appops ALL=(root) /usr/bin/systemctl restart app*, \
/usr/bin/systemctl stop app*, \
/usr/bin/systemctl start app*, \
/usr/bin/systemctl status app*, \
/usr/bin/journalctl -u app*
# デプロイユーザー(パスワードなし)
deploy ALL=(root) NOPASSWD: /usr/local/bin/deploy.sh, \
/usr/bin/systemctl restart myapp
# 監視ユーザー(読み取り系コマンドのみ)
%monitoring ALL=(root) NOPASSWD: /usr/bin/cat /var/log/*, \
/usr/bin/tail /var/log/*, \
/usr/bin/ss, \
/usr/bin/netstat, \
/usr/bin/df, \
/usr/bin/free
# sudoers.d からのインクルード
@includedir /etc/sudoers.d
9.2 sudo の高度な設定
/etc/sudoers.d/ ディレクトリを使った分割管理(推奨):
# チーム別の設定ファイルを作成
$ sudo visudo -f /etc/sudoers.d/10-sre-team
# /etc/sudoers.d/10-sre-team
# SRE チームの sudo 設定
# エイリアスの定義
User_Alias SRE_TEAM = sysadmin, engineer1, engineer2
Host_Alias PROD_SERVERS = web01, web02, db01, db02
Cmnd_Alias SERVICE_MGMT = /usr/bin/systemctl restart *, \
/usr/bin/systemctl stop *, \
/usr/bin/systemctl start *, \
/usr/bin/systemctl status *
Cmnd_Alias LOG_CMDS = /usr/bin/journalctl *, \
/usr/bin/tail -f /var/log/*, \
/usr/bin/less /var/log/*
Cmnd_Alias NETWORK_DIAG = /usr/sbin/tcpdump, \
/usr/bin/ss, \
/usr/sbin/iptables -L *, \
/usr/sbin/ip addr, \
/usr/sbin/ip route
# SRE チームに本番サーバーでのサービス管理・ログ・ネットワーク診断を許可
SRE_TEAM PROD_SERVERS=(root) SERVICE_MGMT, LOG_CMDS, NETWORK_DIAG
# /etc/sudoers.d/20-dba-team
# DBA チームの sudo 設定
User_Alias DBA_TEAM = dba1, dba2
Cmnd_Alias DB_CMDS = /usr/bin/mysql, \
/usr/bin/mysqldump, \
/usr/bin/pg_dump, \
/usr/bin/psql, \
/usr/bin/systemctl * postgresql, \
/usr/bin/systemctl * mysql
DBA_TEAM ALL=(root) DB_CMDS
sudo ログの確認:
# sudo の使用ログ
$ sudo cat /var/log/sudo.log | tail -5
Apr 10 12:00:01 server01 sysadmin : TTY=pts/0 ; PWD=/home/sysadmin ;
USER=root ; COMMAND=/usr/bin/systemctl restart nginx
Apr 10 12:05:30 server01 deploy : TTY=pts/1 ; PWD=/home/deploy ;
USER=root ; COMMAND=/usr/local/bin/deploy.sh
# 認証失敗ログ
$ sudo grep "authentication failure" /var/log/auth.log | tail -5
Apr 10 11:55:00 server01 sudo: pam_unix(sudo:auth): authentication failure;
logname=baduser uid=1010 euid=0 tty=/dev/pts/3 ruser=baduser rhost= user=baduser
10. LDAP/SSSD 統合
SSSD (System Security Services Daemon) の概要
SSSD は、LDAP、Active Directory、FreeIPA などのリモート認証ソースとの統合を提供する。
アーキテクチャ:
ユーザー認証要求
↓
PAM / NSS
↓
SSSD デーモン
↓ (キャッシュ)
┌───┼───┐
↓ ↓ ↓
LDAP AD IPA
SSSD のインストールと設定:
# インストール(RHEL/CentOS)
$ sudo dnf install sssd sssd-ldap sssd-ad sssd-tools oddjob-mkhomedir
# インストール(Debian/Ubuntu)
$ sudo apt install sssd sssd-ldap sssd-ad sssd-tools libnss-sss libpam-sss
/etc/sssd/sssd.conf の設定例(LDAP):
[sssd]
config_file_version = 2
services = nss, pam, sudo
domains = example.com
[nss]
filter_groups = root
filter_users = root
reconnection_retries = 3
entry_cache_timeout = 300
[pam]
reconnection_retries = 3
offline_credentials_expiration = 7
[domain/example.com]
# プロバイダー設定
id_provider = ldap
auth_provider = ldap
access_provider = ldap
sudo_provider = ldap
# LDAP 接続設定
ldap_uri = ldaps://ldap.example.com:636
ldap_search_base = dc=example,dc=com
ldap_user_search_base = ou=People,dc=example,dc=com
ldap_group_search_base = ou=Groups,dc=example,dc=com
# TLS/SSL 設定
ldap_id_use_start_tls = False
ldap_tls_cacert = /etc/pki/tls/certs/ca-bundle.crt
ldap_tls_reqcert = demand
# バインドアカウント
ldap_default_bind_dn = cn=sssd-bind,ou=ServiceAccounts,dc=example,dc=com
ldap_default_authtok = SecureBindPassword123
# UID/GID マッピング
ldap_user_object_class = posixAccount
ldap_user_name = uid
ldap_user_uid_number = uidNumber
ldap_user_gid_number = gidNumber
ldap_user_home_directory = homeDirectory
ldap_user_shell = loginShell
ldap_group_object_class = posixGroup
ldap_group_name = cn
ldap_group_gid_number = gidNumber
ldap_group_member = memberUid
# キャッシュ設定
cache_credentials = True
entry_cache_timeout = 600
# ホームディレクトリの自動作成
override_homedir = /home/%u
# アクセス制御
ldap_access_filter = (memberOf=cn=linux-users,ou=Groups,dc=example,dc=com)
# 列挙(大規模環境では False 推奨)
enumerate = False
# デバッグレベル(トラブルシューティング時に上げる)
debug_level = 0x0070
SSSD の設定と有効化:
# 設定ファイルの権限(必須: 600)
$ sudo chmod 600 /etc/sssd/sssd.conf
$ sudo chown root:root /etc/sssd/sssd.conf
# NSS の設定を更新
$ sudo vi /etc/nsswitch.conf
passwd: files sss
shadow: files sss
group: files sss
# PAM の設定(authselect を使用 - RHEL 8+)
$ sudo authselect select sssd with-mkhomedir --force
# ホームディレクトリの自動作成を有効化
$ sudo systemctl enable --now oddjobd
# SSSD の起動
$ sudo systemctl enable --now sssd
# 動作確認
$ getent passwd ldapuser1
ldapuser1:*:10001:10001:LDAP Test User:/home/ldapuser1:/bin/bash
$ id ldapuser1
uid=10001(ldapuser1) gid=10001(ldapusers) groups=10001(ldapusers),10002(linux-users)
# SSSD キャッシュのクリア
$ sudo sss_cache -E
# SSSD の再起動
$ sudo systemctl restart sssd
11. ファイル比較表
ユーザー管理ファイルの比較
| ファイル | 権限 | 主な内容 | 読み取り | 編集方法 |
|---|---|---|---|---|
/etc/passwd | 644 | ユーザー基本情報 | 全ユーザー | vipw |
/etc/shadow | 000/640 | パスワードハッシュ | root のみ | vipw -s |
/etc/group | 644 | グループ情報 | 全ユーザー | vigr |
/etc/gshadow | 000/640 | グループパスワード | root のみ | vigr -s |
/etc/login.defs | 644 | デフォルト設定 | 全ユーザー | テキストエディタ |
/etc/sudoers | 440 | sudo 設定 | root のみ | visudo |
/etc/nsswitch.conf | 644 | NSS 設定 | 全ユーザー | テキストエディタ |
コマンド比較表
| 操作 | ユーザー | グループ |
|---|---|---|
| 作成 | useradd | groupadd |
| 変更 | usermod | groupmod |
| 削除 | userdel | groupdel |
| パスワード | passwd | gpasswd |
| 情報表示 | id, getent passwd | getent group |
| ファイル直接編集 | vipw | vigr |
12. トラブルシューティング
よくある問題と解決策
問題 1: ユーザーがログインできない
# アカウントの状態を確認
$ sudo passwd -S username
username LK 2026-04-10 0 90 7 30 (Password locked.)
# シェルの確認
$ getent passwd username | cut -d: -f7
/usr/sbin/nologin
# 有効期限の確認
$ sudo chage -l username | grep "Account expires"
Account expires : Jan 01, 2026
# 解決手順
$ sudo passwd -u username # ロック解除
$ sudo usermod -s /bin/bash username # シェル修正
$ sudo chage -E -1 username # 有効期限を無期限に
問題 2: "usermod: user XXX is currently used by process YYY"
# プロセスを確認
$ ps -u username
PID TTY TIME CMD
1234 pts/0 00:00:00 bash
1256 pts/0 00:00:05 vim
# セッションを確認
$ loginctl list-sessions | grep username
5 1001 username pts/0
# 安全に対処
$ sudo loginctl terminate-user username
# または
$ sudo kill -9 $(ps -u username -o pid=)
問題 3: /etc/passwd と /etc/shadow の不整合
# 整合性チェック
$ sudo pwck
user 'testuser': directory '/home/testuser' does not exist
pwck: no changes
$ sudo grpck
grpck: no changes
# 修復
$ sudo pwck -r # 読み取り専用チェック
$ sudo grpck -r # 読み取り専用チェック
# ファイルのバックアップと修正
$ sudo cp /etc/passwd /etc/passwd.bak
$ sudo cp /etc/shadow /etc/shadow.bak
$ sudo pwck # インタラクティブに修正
問題 4: SSSD 接続エラー
# SSSD のステータス確認
$ sudo systemctl status sssd
$ sudo sssctl domain-status example.com
# デバッグログの有効化
$ sudo vi /etc/sssd/sssd.conf
# debug_level = 0x3FF0 を追加
$ sudo systemctl restart sssd
$ sudo tail -f /var/log/sssd/sssd_example.com.log
# キャッシュクリアと再起動
$ sudo sss_cache -E
$ sudo systemctl restart sssd
# LDAP 接続テスト
$ ldapsearch -x -H ldaps://ldap.example.com:636 \
-D "cn=sssd-bind,ou=ServiceAccounts,dc=example,dc=com" \
-W -b "ou=People,dc=example,dc=com" "(uid=ldapuser1)"
13. ベストプラクティス
セキュリティ
- 最小権限の原則: sudo は必要なコマンドのみに制限する
- 共有アカウントの禁止: 個人アカウントを使用し、sudo で権限昇格
- パスワードポリシーの強制: chage と PAM を組み合わせて複雑さ・有効期限を制御
- 定期的な監査: 不要なアカウントの特定と無効化
- root 直接ログインの禁止: SSH で
PermitRootLogin noを設定
運用
# 定期的なアカウント監査スクリプト
#!/bin/bash
# audit_users.sh
echo "=== UID 0 のアカウント(root 以外は危険)==="
awk -F: '$3 == 0 && $1 != "root" {print $1}' /etc/passwd
echo ""
echo "=== パスワード未設定のアカウント ==="
sudo awk -F: '$2 == "" {print $1}' /etc/shadow
echo ""
echo "=== 90日以上ログインしていないアカウント ==="
lastlog -b 90 | grep -v "Never logged in" | tail -n +2
echo ""
echo "=== 有効期限切れのアカウント ==="
today=$(date +%s)
while IFS=: read -r user _ _ _ _ _ _ expire _; do
if [[ -n "$expire" && "$expire" -gt 0 ]]; then
expire_sec=$((expire * 86400))
if [[ $expire_sec -lt $today ]]; then
echo "$user (expired: $(date -d @$expire_sec +%Y-%m-%d))"
fi
fi
done < /etc/shadow
echo ""
echo "=== sudo 権限を持つユーザー ==="
grep -Po '^sudo:.*:\K.*' /etc/group
getent group wheel | cut -d: -f4
ユーザー作成の標準手順
# 新規ユーザー作成の標準手順
#!/bin/bash
# create_user.sh <username> <fullname> <team>
USERNAME=$1
FULLNAME=$2
TEAM=$3
# ユーザー作成
sudo useradd -m -s /bin/bash -c "$FULLNAME" -G "$TEAM" "$USERNAME"
# 初回パスワード設定と次回変更強制
echo "${USERNAME}:$(openssl rand -base64 12)" | sudo chpasswd
sudo chage -d 0 "$USERNAME"
# パスワードポリシー設定
sudo chage -m 1 -M 90 -W 14 -I 30 "$USERNAME"
# SSH 公開鍵の設定(あれば)
sudo mkdir -p /home/${USERNAME}/.ssh
sudo chmod 700 /home/${USERNAME}/.ssh
sudo chown ${USERNAME}:${USERNAME} /home/${USERNAME}/.ssh
echo "ユーザー ${USERNAME} を作成しました。初回ログイン時にパスワード変更が必要です。"
14. 参考文献
- man useradd(8)
- man usermod(8)
- man passwd(5)
- man shadow(5)
- man sudoers(5)
- man sssd.conf(5)
- man nsswitch.conf(5)
- man chage(1)
- Red Hat - Managing Users and Groups
- SSSD Documentation
文書情報
- 作成日: 2026-04-10
- 対象OS: RHEL 8/9, CentOS Stream 8/9, Ubuntu 22.04/24.04, Debian 12
- 生成: AI Generated Technical Article