User and Group Management

Linux ユーザーとグループの管理 - 包括的ガイド

目次

  1. はじめに
  2. ユーザー管理の基本ファイル
  3. ユーザー管理コマンド
  4. グループ管理コマンド
  5. パスワード管理
  6. 設定ファイル
  7. NSS (Name Service Switch)
  8. ユーザー情報確認コマンド
  9. sudo 設定
  10. LDAP/SSSD 統合
  11. ファイル比較表
  12. トラブルシューティング
  13. ベストプラクティス
  14. 参考文献

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プライマリグループID1001
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 の一般的な範囲:

範囲用途
0root ユーザー
1 - 999システムアカウント(RHEL/CentOS)
1 - 499システムアカウント(旧いディストリビューション)
1000 - 65534一般ユーザー
65534nobody

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
-uUID を指定-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/passwd644ユーザー基本情報全ユーザーvipw
/etc/shadow000/640パスワードハッシュroot のみvipw -s
/etc/group644グループ情報全ユーザーvigr
/etc/gshadow000/640グループパスワードroot のみvigr -s
/etc/login.defs644デフォルト設定全ユーザーテキストエディタ
/etc/sudoers440sudo 設定root のみvisudo
/etc/nsswitch.conf644NSS 設定全ユーザーテキストエディタ

コマンド比較表

操作ユーザーグループ
作成useraddgroupadd
変更usermodgroupmod
削除userdelgroupdel
パスワードpasswdgpasswd
情報表示id, getent passwdgetent group
ファイル直接編集vipwvigr

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. ベストプラクティス

セキュリティ

  1. 最小権限の原則: sudo は必要なコマンドのみに制限する
  2. 共有アカウントの禁止: 個人アカウントを使用し、sudo で権限昇格
  3. パスワードポリシーの強制: chage と PAM を組み合わせて複雑さ・有効期限を制御
  4. 定期的な監査: 不要なアカウントの特定と無効化
  5. 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. 参考文献


文書情報

  • 作成日: 2026-04-10
  • 対象OS: RHEL 8/9, CentOS Stream 8/9, Ubuntu 22.04/24.04, Debian 12
  • 生成: AI Generated Technical Article