はじめに:なぜユーザー管理が重要なのか?

Linuxはマルチユーザーオペレーティングシステムです。複数のユーザーが同時にシステムにアクセスでき、各ユーザーは固有の権限とワークスペースを持ちます。サーバーセキュリティの最初の防御線は、適切なユーザー管理と権限設定です。

今回は、ユーザーアカウント作成からグループ管理、ファイル権限設定、特殊権限、sudo設定まで、実務で必須の内容を扱います。

1. ユーザーアカウントの理解

1.1 ユーザータイプ

  • rootユーザー:UID 0、システムのすべての権限を持つスーパーユーザー
  • システムユーザー:UID 1-999、サービス実行用アカウント(nginx、mysqlなど)
  • 一般ユーザー:UID 1000以上、実際の人が使用するアカウント

1.2 ユーザー情報ファイル

# /etc/passwd - ユーザー基本情報
username:x:1000:1000:Full Name:/home/username:/bin/bash
# フィールド:ユーザー名:パスワード位置:UID:GID:説明:ホームディレクトリ:デフォルトシェル

# /etc/shadow - 暗号化されたパスワード(rootのみアクセス可能)
username:$6$salt$encrypted:19000:0:99999:7:::
# フィールド:ユーザー名:暗号化パスワード:最終変更日:最小使用日:最大使用日:警告期間:...

1.3 ユーザー情報の確認

# 現在のユーザー確認
whoami
id

# 特定ユーザーの情報
id username
getent passwd username

# ログイン中のユーザー
who
w

2. ユーザーアカウント管理

2.1 ユーザー作成

# 基本ユーザー作成
sudo useradd username

# オプションを指定して作成
sudo useradd -m -d /home/devuser -s /bin/bash -c "Developer Account" devuser
# -m: ホームディレクトリ作成
# -d: ホームディレクトリパス指定
# -s: デフォルトシェル指定
# -c: 説明(コメント)

# パスワード設定
sudo passwd devuser

2.2 ユーザー変更

# ユーザー情報変更
sudo usermod -c "Updated Comment" username
sudo usermod -s /bin/zsh username        # シェル変更
sudo usermod -d /new/home username       # ホームディレクトリ変更
sudo usermod -l newname oldname          # ユーザー名変更
sudo usermod -aG groupname username      # グループに追加(-a必須!)

# アカウントロック/解除
sudo usermod -L username    # ロック
sudo usermod -U username    # 解除

2.3 ユーザー削除

# ユーザーのみ削除(ホームディレクトリ保持)
sudo userdel username

# ユーザーとホームディレクトリを一緒に削除
sudo userdel -r username

3. グループ管理

3.1 グループの理解

グループは複数のユーザーをまとめて権限を一括管理する単位です。各ユーザーは1つのプライマリグループと複数のセカンダリグループに所属できます。

# /etc/group - グループ情報
groupname:x:1000:user1,user2,user3
# フィールド:グループ名:パスワード:GID:メンバーリスト

3.2 グループ管理コマンド

# グループ作成
sudo groupadd developers
sudo groupadd -g 2000 devops    # GID指定

# グループ変更
sudo groupmod -n newname oldname    # 名前変更
sudo groupmod -g 2001 groupname     # GID変更

# グループ削除
sudo groupdel groupname

# グループメンバー確認
getent group developers
groups username

3.3 グループ活用例

# 開発チームグループ作成とユーザー追加
sudo groupadd developers
sudo usermod -aG developers alice
sudo usermod -aG developers bob

# 共有ディレクトリ設定
sudo mkdir /srv/project
sudo chgrp developers /srv/project
sudo chmod 2775 /srv/project

4. ファイル権限の深掘り

4.1 権限構造のおさらい

-rwxr-xr-- 1 owner group 1024 Jan 21 10:00 file.txt
│└─┬┘└─┬┘└─┬┘
│  │   │   └── その他(Others):r--(読み取りのみ)
│  │   └────── グループ(Group):r-x(読み取り、実行)
│  └────────── 所有者(Owner):rwx(読み取り、書き込み、実行)
└───────────── ファイルタイプ:-(通常ファイル)

4.2 chmod - 権限変更

# 数値方式(Octal)
chmod 755 script.sh    # rwxr-xr-x
chmod 644 file.txt     # rw-r--r--
chmod 700 private/     # rwx------
chmod 777 public/      # rwxrwxrwx(セキュリティ上非推奨)

# 記号方式(Symbolic)
chmod u+x script.sh           # 所有者に実行権限を追加
chmod g-w file.txt            # グループから書き込み権限を削除
chmod o=r file.txt            # その他を読み取りのみに設定
chmod a+r file.txt            # 全員に読み取り権限を追加
chmod u=rwx,g=rx,o=r file     # 複合設定

# 再帰的適用
chmod -R 755 directory/

4.3 chown - 所有権変更

# 所有者変更
sudo chown newowner file.txt

# 所有者とグループを同時に変更
sudo chown newowner:newgroup file.txt

# グループのみ変更
sudo chown :newgroup file.txt
sudo chgrp newgroup file.txt

# 再帰的適用
sudo chown -R webuser:www-data /var/www/

5. 特殊権限

5.1 SUID(Set User ID)

実行ファイルに設定すると、実行時にファイル所有者の権限で実行されます。

# SUID設定
chmod u+s program
chmod 4755 program

# 例:passwdコマンド
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
# 一般ユーザーも自分のパスワードを変更できる

5.2 SGID(Set Group ID)

ファイルに設定するとグループ権限で実行、ディレクトリに設定すると新しいファイルがディレクトリのグループを継承します。

# SGID設定
chmod g+s directory/
chmod 2775 directory/

# チーム共有フォルダに便利
sudo mkdir /srv/shared
sudo chgrp developers /srv/shared
sudo chmod 2775 /srv/shared
# この中に作成されるすべてのファイルはdevelopersグループに属する

5.3 Sticky Bit

ディレクトリに設定すると、ファイル所有者のみがそのファイルを削除できます。

# Sticky Bit設定
chmod +t directory/
chmod 1777 directory/

# 例:/tmpディレクトリ
ls -ld /tmp
# drwxrwxrwt 12 root root ... /tmp
# 全ユーザーがファイル作成可能だが、自分のファイルのみ削除可能

5.4 特殊権限の数値表記

権限数値表示適用対象
SUID4s(所有者実行位置)実行ファイル
SGID2s(グループ実行位置)ファイル/ディレクトリ
Sticky1t(その他実行位置)ディレクトリ

6. sudo設定と管理

6.1 sudoとは?

sudo(Superuser Do)は一般ユーザーが管理者権限でコマンドを実行できるようにするツールです。rootで直接ログインするより安全で、すべての操作がログに記録されます。

6.2 sudoersファイルの編集

# 必ずvisudoを使用(構文チェックを実行)
sudo visudo

# /etc/sudoers 基本構造
# ユーザー名    ホスト=(実行ユーザー)    コマンド
root        ALL=(ALL:ALL)        ALL
%sudo       ALL=(ALL:ALL)        ALL

# 例:devuserにsudo権限を付与
devuser     ALL=(ALL:ALL)        ALL

# 特定コマンドのみ許可
webadmin    ALL=(ALL)    /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx

# パスワードなしで実行許可
deploy      ALL=(ALL)    NOPASSWD: /usr/bin/git pull

6.3 sudoグループの活用

# Ubuntu/Debian:sudoグループ
sudo usermod -aG sudo username

# RHEL/CentOS:wheelグループ
sudo usermod -aG wheel username

# グループ設定確認
getent group sudo
getent group wheel

6.4 sudoログ確認

# sudo使用ログ
sudo cat /var/log/auth.log | grep sudo     # Debian/Ubuntu
sudo cat /var/log/secure | grep sudo       # RHEL/CentOS

7. 実践シナリオ

7.1 Web開発チーム環境構築

# 1. グループ作成
sudo groupadd webdev

# 2. ユーザー作成とグループ追加
sudo useradd -m -s /bin/bash -G webdev alice
sudo useradd -m -s /bin/bash -G webdev bob
sudo passwd alice
sudo passwd bob

# 3. プロジェクトディレクトリ設定
sudo mkdir -p /var/www/project
sudo chown root:webdev /var/www/project
sudo chmod 2775 /var/www/project

# 4. 特定sudo権限を付与
sudo visudo
# 追加:%webdev ALL=(ALL) /usr/bin/systemctl restart nginx

7.2 セキュリティ点検チェックリスト

# SUIDファイル検索(セキュリティ監査)
sudo find / -perm -4000 -type f 2>/dev/null

# 所有者のないファイル検索
sudo find / -nouser -o -nogroup 2>/dev/null

# world-writableファイル検索
sudo find / -perm -0002 -type f 2>/dev/null

# 空のパスワードアカウント検索
sudo awk -F: '($2 == "") {print $1}' /etc/shadow

8. よくある間違いと解決策

  • usermod -G vs usermod -aG-aGは既存グループを維持して追加、-Gのみだと既存グループがすべて削除される
  • chmod 777:絶対に使用禁止。セキュリティ脆弱性の原因
  • /etc/sudoersの直接編集:必ずvisudoを使用。構文エラーでシステムアクセス不可になる
  • rootアカウントの直接使用:sudoによる権限昇格を推奨。監査ログ記録のため

まとめ

ユーザーと権限管理はLinuxサーバーセキュリティの基礎です。適切なユーザー分離、最小権限の原則適用、sudoによる権限管理は、安全なサーバー運用の必須要素です。

次の第3編ではパッケージ管理とサービス運用を扱います。