はじめに

Linuxはマルチユーザーシステムとして設計されており、複数のユーザーが同時にシステムにアクセスできます。サーバー運用では、開発者やシステム管理者など役割ごとにアカウントを作成し、適切な権限を付与することがセキュリティの基本となります。

本記事では、Linuxのユーザー管理とグループ管理の仕組みを体系的に解説します。/etc/passwd/etc/shadowといったシステムファイルの構造から、useraddusermoduserdelによるユーザー操作、groupaddgpasswdによるグループ管理、そしてsudoの設定方法まで網羅しています。

この記事を読み終える頃には、マルチユーザー環境でのアカウント管理ができるようになり、適切なアクセス制御を実現できるようになります。

動作確認環境

本記事のコマンドは以下の環境で動作確認しています。

項目 内容
OS Ubuntu 24.04 LTS
シェル bash 5.3
カーネル Linux 6.8
shadow-utils 4.18

WSL2やVirtualBox上のLinux環境、AlmaLinux 9、Debian 12等の主要ディストリビューションでも同様に動作します。

ユーザーアカウントの仕組み

/etc/passwdファイルの構造

/etc/passwdはユーザーアカウント情報を格納するテキストファイルです。すべてのユーザーが読み取り可能ですが、書き込みはrootのみ許可されています。

1
cat /etc/passwd | head -5

実行結果の例:

1
2
3
4
5
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
sync:x:4:65534:sync:/bin:/bin/sync

各行は7つのフィールドで構成され、コロン(:)で区切られています。

graph LR
    subgraph "/etc/passwdの構造"
        A["ユーザー名"] --> B["パスワード<br/>(x=shadow)"]
        B --> C["UID"]
        C --> D["GID"]
        D --> E["GECOS<br/>(コメント)"]
        E --> F["ホームディレクトリ"]
        F --> G["ログインシェル"]
    end
フィールド 説明
ユーザー名 ログインに使用する名前 developer
パスワード xはshadowファイル使用を示す x
UID ユーザーID(0=root) 1001
GID プライマリグループID 1001
GECOS ユーザーの説明(フルネーム等) Developer User
ホームディレクトリ ログイン時の作業ディレクトリ /home/developer
ログインシェル ログイン時に起動するシェル /bin/bash

/etc/shadowファイルの構造

/etc/shadowは暗号化されたパスワードとパスワードエージング情報を格納します。rootのみが読み取り可能で、セキュリティを高めています。

1
sudo cat /etc/shadow | head -3

実行結果の例:

1
2
3
root:$6$xyz123...:19724:0:99999:7:::
daemon:*:19723:0:99999:7:::
bin:*:19723:0:99999:7:::

各行は9つのフィールドで構成されています。

フィールド 説明
ユーザー名 /etc/passwdと対応
暗号化パスワード ハッシュ化されたパスワード(!や*はロック状態)
最終変更日 パスワードを最後に変更した日(1970/1/1からの日数)
最小日数 パスワード変更可能になるまでの日数
最大日数 パスワードの有効期限(日数)
警告日数 期限切れ前に警告を表示する日数
猶予日数 期限切れ後もログイン可能な日数
有効期限 アカウントが無効になる日(1970/1/1からの日数)
予約フィールド 将来の使用のために予約

/etc/groupファイルの構造

/etc/groupはグループ情報を格納します。

1
cat /etc/group | head -5

実行結果の例:

1
2
3
4
5
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,developer
フィールド 説明
グループ名 グループの名前 developers
パスワード xはgshadow使用を示す x
GID グループID 1002
メンバーリスト 所属ユーザーのカンマ区切りリスト user1,user2

ユーザー管理コマンド

useraddでユーザーを作成する

useraddコマンドは新規ユーザーアカウントを作成します。

基本的な使用方法:

1
sudo useradd developer

このコマンドだけでは、ホームディレクトリは作成されず、パスワードも設定されません。実用的なユーザー作成には、オプションを指定します。

ホームディレクトリ付きでユーザーを作成:

1
sudo useradd -m -s /bin/bash -c "Developer User" developer
オプション 説明
-m ホームディレクトリを作成
-s ログインシェルを指定
-c コメント(GECOS)を設定
-d ホームディレクトリのパスを指定
-g プライマリグループを指定
-G 追加グループを指定(カンマ区切り)
-u UIDを指定
-e アカウントの有効期限を設定(YYYY-MM-DD形式)

実践的な例:

1
2
3
4
5
# 開発者ユーザーを作成(複数グループに所属)
sudo useradd -m -s /bin/bash -c "Taro Yamada" -G sudo,docker yamada

# パスワードを設定
sudo passwd yamada

passwdコマンドでパスワードを対話的に設定します。

1
2
3
New password: 
Retype new password: 
passwd: password updated successfully

usermodでユーザー情報を変更する

usermodコマンドは既存ユーザーの情報を変更します。

ログインシェルを変更:

1
sudo usermod -s /bin/zsh developer

コメント(フルネーム)を変更:

1
sudo usermod -c "Senior Developer" developer

追加グループに参加(既存のグループを維持):

1
sudo usermod -aG docker developer

重要: -a(append)オプションを忘れると、指定したグループのみになり、既存のグループから削除されます。

オプション 説明
-l ユーザー名を変更
-d ホームディレクトリを変更
-m -dと併用でホームディレクトリの内容を移動
-g プライマリグループを変更
-G 所属グループを設定(既存を置換)
-aG 追加グループに追加(既存を維持)
-L アカウントをロック
-U アカウントのロックを解除
-e アカウントの有効期限を設定

アカウントをロックする:

1
sudo usermod -L developer

ロックされたアカウントは/etc/shadowのパスワードフィールドの先頭に!が付加されます。

userdelでユーザーを削除する

userdelコマンドはユーザーアカウントを削除します。

ユーザーのみ削除(ホームディレクトリは残す):

1
sudo userdel developer

ホームディレクトリとメールスプールも削除:

1
sudo userdel -r developer
オプション 説明
-r ホームディレクトリとメールスプールを削除
-f ログイン中でも強制削除

注意: -fオプションの使用は慎重に。ユーザーがログイン中の場合、予期しない問題が発生する可能性があります。

ユーザー情報を確認する

現在のユーザー情報を確認するコマンド:

1
2
3
4
5
6
7
8
# 現在のユーザーIDとグループを表示
id

# 特定ユーザーの情報を表示
id developer

# 所属グループを表示
groups developer

実行結果の例:

1
uid=1001(developer) gid=1001(developer) groups=1001(developer),27(sudo),999(docker)

グループ管理コマンド

groupaddでグループを作成する

groupaddコマンドは新規グループを作成します。

1
sudo groupadd developers

特定のGIDを指定して作成:

1
sudo groupadd -g 2000 webteam
オプション 説明
-g GIDを指定
-r システムグループとして作成(GID 100〜999)
-f グループが存在する場合もエラーにしない

groupmodでグループを変更する

groupmodコマンドはグループ情報を変更します。

グループ名を変更:

1
sudo groupmod -n newteam oldteam

GIDを変更:

1
sudo groupmod -g 2001 developers

groupdelでグループを削除する

groupdelコマンドはグループを削除します。

1
sudo groupdel developers

注意: ユーザーのプライマリグループは削除できません。先にユーザーのプライマリグループを変更するか、ユーザーを削除する必要があります。

gpasswdでグループメンバーを管理する

gpasswdコマンドはグループのメンバー管理を行います。usermod -aGよりも直感的にメンバー操作ができます。

ユーザーをグループに追加:

1
sudo gpasswd -a developer webteam

ユーザーをグループから削除:

1
sudo gpasswd -d developer webteam

グループ管理者を設定:

1
sudo gpasswd -A developer webteam

グループ管理者に指定されたユーザーは、rootでなくてもそのグループにメンバーを追加・削除できます。

オプション 説明
-a ユーザーをグループに追加
-d ユーザーをグループから削除
-A グループ管理者を設定
-M グループメンバーを一括設定(既存を置換)

sudoの設定と使い方

sudoとは

sudo(SuperUser DO)は、一般ユーザーが一時的にroot権限でコマンドを実行するための仕組みです。直接rootでログインするよりも安全で、誰が何を実行したかの監査ログも残ります。

graph TD
    A[一般ユーザー] -->|sudo コマンド| B{sudoers設定}
    B -->|許可| C[パスワード認証]
    C -->|成功| D[root権限で実行]
    C -->|失敗| E[アクセス拒否]
    B -->|拒否| E
    D --> F[監査ログ記録]

sudoグループへの追加

多くのディストリビューションでは、sudoグループ(CentOS/RHELではwheelグループ)のメンバーがsudoを使用できます。

Ubuntu/Debian系:

1
sudo usermod -aG sudo developer

CentOS/RHEL/AlmaLinux系:

1
sudo usermod -aG wheel developer

グループ変更を反映するには、ユーザーが一度ログアウトして再ログインする必要があります。

sudoersファイルの構造

sudoの権限設定は/etc/sudoersファイルで管理されます。このファイルは必ずvisudoコマンドで編集します。直接編集すると構文エラーでsudoが使えなくなる危険があります。

1
sudo visudo

sudoersファイルの基本的な書式:

1
ユーザー ホスト=(実行ユーザー:実行グループ) コマンド

具体的な設定例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# rootはすべてのコマンドを実行可能
root    ALL=(ALL:ALL) ALL

# sudoグループのメンバーはすべてのコマンドを実行可能
%sudo   ALL=(ALL:ALL) ALL

# developerユーザーはパスワードなしですべてのコマンドを実行可能
developer ALL=(ALL) NOPASSWD: ALL

# webadminユーザーはApache関連コマンドのみ実行可能
webadmin ALL=(root) /usr/sbin/apachectl, /usr/sbin/systemctl restart apache2
要素 説明
ユーザー 権限を付与するユーザー(%で始まるとグループ)
ホスト この設定が有効なホスト(ALLはすべて)
実行ユーザー コマンドを実行するユーザー
実行グループ コマンドを実行するグループ
コマンド 実行を許可するコマンド(フルパス指定)

sudoers.dディレクトリの活用

/etc/sudoersを直接編集する代わりに、/etc/sudoers.d/ディレクトリに個別のファイルを作成する方法が推奨されます。

1
sudo visudo -f /etc/sudoers.d/developers

ファイル内容の例:

1
2
# developersグループにDockerとSystemdの操作を許可
%developers ALL=(root) /usr/bin/docker, /usr/bin/systemctl

ファイル名の注意点:

  • チルダ(~)で終わるファイルは無視される
  • ドット(.)を含むファイルは無視される
  • ファイル名は英数字とアンダースコアのみ推奨

sudoの基本的な使い方

単一コマンドをroot権限で実行:

1
sudo apt update

別のユーザーとしてコマンドを実行:

1
sudo -u postgres psql

root権限のシェルを起動:

1
sudo -i

現在の権限を確認:

1
sudo -l

実行結果の例:

1
2
3
4
5
Matching Defaults entries for developer on ubuntu:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User developer may run the following commands on ubuntu:
    (ALL : ALL) ALL

実践的なユースケース

Webアプリケーション開発チームの設定

開発チーム用のグループとユーザーを作成し、必要な権限を付与する例です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 開発チームグループを作成
sudo groupadd webdev

# 開発者ユーザーを作成
sudo useradd -m -s /bin/bash -c "Taro Yamada" -G webdev,docker yamada
sudo useradd -m -s /bin/bash -c "Hanako Suzuki" -G webdev,docker suzuki

# パスワードを設定
sudo passwd yamada
sudo passwd suzuki

# プロジェクトディレクトリを作成し、グループ権限を設定
sudo mkdir -p /var/www/project
sudo chown root:webdev /var/www/project
sudo chmod 2775 /var/www/project

sgid(2775の2)を設定することで、ディレクトリ内に作成されたファイルは自動的にwebdevグループの所有になります。

システム管理者アカウントの設定

システム管理者用の設定例です。

1
2
3
4
5
6
7
8
9
# 管理者ユーザーを作成
sudo useradd -m -s /bin/bash -c "System Admin" -G sudo sysadmin

# SSH鍵認証用のディレクトリを設定
sudo mkdir -p /home/sysadmin/.ssh
sudo chmod 700 /home/sysadmin/.ssh
sudo touch /home/sysadmin/.ssh/authorized_keys
sudo chmod 600 /home/sysadmin/.ssh/authorized_keys
sudo chown -R sysadmin:sysadmin /home/sysadmin/.ssh

サービスアカウントの作成

アプリケーション実行用のシステムアカウントを作成する例です。

1
2
3
4
5
# ログインシェルなしのシステムユーザーを作成
sudo useradd -r -s /usr/sbin/nologin -c "Application Service" appservice

# アプリケーションディレクトリの所有者を設定
sudo chown -R appservice:appservice /opt/myapp

-rオプションでシステムユーザー(UID 100〜999)として作成され、/usr/sbin/nologinを指定することで対話的ログインを禁止しています。

トラブルシューティング

ユーザーがsudoを使えない場合

症状:

1
developer is not in the sudoers file. This incident will be reported.

対処法:

1
2
3
# rootでsudoグループに追加
su -
usermod -aG sudo developer

または、/etc/sudoers.d/に設定ファイルを作成します。

グループ変更が反映されない場合

グループの変更はログアウト・再ログイン後に反映されます。すぐに反映したい場合:

1
2
# 新しいシェルセッションを開始(そのセッション内でのみ有効)
newgrp groupname

または、完全に反映するにはログアウトして再ログインします。

パスワードの有効期限を確認・変更

chageコマンドでパスワードエージングを管理できます。

現在の設定を確認:

1
sudo chage -l developer

パスワードの有効期限を90日に設定:

1
sudo chage -M 90 developer

次回ログイン時にパスワード変更を強制:

1
sudo chage -d 0 developer

セキュリティベストプラクティス

ユーザーとグループ管理におけるセキュリティのベストプラクティスをまとめます。

  1. 最小権限の原則: 必要最小限の権限のみを付与する
  2. 直接rootログインを避ける: sudoを使用して監査証跡を残す
  3. 強力なパスワードポリシー: パスワードの複雑さと有効期限を設定
  4. 不要なアカウントを削除: 退職者や不要なサービスアカウントは速やかに削除
  5. 定期的な権限レビュー: 誰がどの権限を持っているか定期的に確認
  6. sudoersの慎重な管理: NOPASSWDは本当に必要な場合のみ使用

まとめ

本記事では、Linuxのユーザーとグループ管理について解説しました。

  • /etc/passwd/etc/shadow/etc/groupの構造と役割
  • useraddusermoduserdelによるユーザー管理
  • groupaddgroupmodgroupdelgpasswdによるグループ管理
  • sudosudoersによる権限昇格の設定

これらの知識を活用することで、マルチユーザー環境で安全かつ効率的なアカウント管理が実現できます。次のステップとして、SSH鍵認証やPAM(Pluggable Authentication Modules)について学ぶと、より高度なセキュリティ設定が可能になります。

参考リンク