Linux: フェーズ2ミニプロジェクト — マルチユーザー開発環境の設定

これはフェーズ2の総合プロジェクトです。ユーザー管理、ファイル権限、環境変数の知識を応用して、「単一ユーザーの混沌」から協業可能なマルチユーザー開発サーバーへと変えます。

📋 前提条件:まず以下を完了していること

1. このレッスンで学ぶこと


2. 小明のチーム協業の悪夢

(1) 悩み:3人でサーバーを共有、ファイルが混在

小明の3人開発チームはクラウドサーバーを共有していました。全員がrootでログインし、誰もファイル権限を管理していません — 小明のスクリプトは同僚に3回誤削除され、自分のファイルが/tmpの中に混在して見つかりませんでした。

(2) 標準化されたマルチユーザー環境

ボブが標準的なマルチユーザー環境を設計してくれました:

BASH
# 1. Each person has their own account and home directory
sudo useradd -m -s /bin/bash alice
sudo useradd -m -s /bin/bash bob
sudo useradd -m -s /bin/bash charlie

# 2. Shared project directory (SGID ensures group inheritance)
sudo mkdir -p /srv/project
sudo chgrp developers /srv/project
sudo chmod 2775 /srv/project

(3) 得られるもの:各人が自分のスペースを持ち、共有エリアに秩序が

ファイルが消えることはなくなり、各人が独立したホームディレクトリとシェル設定を持ち、共有ディレクトリには正しい権限が — 誰かのファイルを誤削除することはありません。


3. 知識ポイント

(1) マルチユーザー環境の設計原則

原則 説明
最小権限 各ユーザーは業務に必要な最小限の権限のみを持つ
職務分離 異なる役割は異なるユーザーを使用、「root一本やり」を避ける
グループポリシー ユーザーごとではなくグループで権限セットを管理
監査証跡 直接rootではなくsudoを使用 — すべてのコマンドがログに記録される

(2) 共有ディレクトリ権限戦略

チーム共有ディレクトリにはSGIDを使用:新規作成ファイルが自動的にディレクトリのグループを継承します。

BASH
# /srv/project is the shared directory
sudo chown root:developers /srv/project
sudo chmod 2775 /srv/project
# 2 = SGID (new files inherit group)
# 775 = Owner and group can read/write/execute, others can read/execute

> ⚠️ 注意:`chmod 2775`の`2`はSGIDを表します — 共有ディレクトリにSGIDが設定されると、そこで作成される新規ファイルは自動的にディレクトリのグループを継承します(作成者のプライマリグループではなく)。これがチーム協業のキーメカニズムです。SGIDがなければ、新規ファイルは作成者のプライマリグループに属し、他のチームメンバーが修正できない可能性があります。

(3) /etc/skel — ユーザーテンプレートディレクトリ

/etc/skel/内のファイルは、新しいユーザーアカウント作成時に自動的にホームディレクトリにコピーされます。カスタムデフォルト設定を追加できます:

BASH
# View default skel contents
ls -la /etc/skel/

# Add custom configuration for all new users
sudo tee -a /etc/skel/.bashrc << 'EOF'

# ---- Team standard configuration ----
alias ll='ls -la'
alias ..='cd ..'
export EDITOR=vim
EOF

(4) ▶ サンプル:完全なチームユーザーシステムの作成

BASH
# Create a shared group
sudo groupadd developers

# Create accounts for three developers
for user in alice bob charlie; do
    sudo useradd -m -s /bin/bash "$user"
    sudo passwd "$user"      # Set password interactively
    sudo usermod -aG developers "$user"
    echo "User $user created"
done

# Verify
grep developers /etc/group

出力:

TEXT
User alice created
User bob created
User charlie created
developers:x:1005:alice,bob,charlie

(5) ▶ サンプル:SGID共有ディレクトリの設定

BASH
# Create shared project directory
sudo mkdir -p /srv/project/{src,docs,scripts}

# Set the group
sudo chgrp -R developers /srv/project

# Set SGID + standard permissions
sudo chmod 2775 /srv/project
# 2 = SGID
# 7 = Owner (rwx)
# 7 = Group (rwx)
# 5 = Others (r-x)

# Test: create a file as a different user and verify group inheritance
sudo -u alice touch /srv/project/test.txt
ls -l /srv/project/test.txt
# -rw-r--r-- 1 alice developers 0 Jul 7 12:00 test.txt
# File belongs to developers group ✅

出力:

TEXT
-rw-r--r-- 1 alice developers 0 Jul  7 12:00 test.txt

(6) ▶ サンプル:デフォルトumaskの設定

BASH
# Set a unified umask for the team (so shared files are writable by default)
echo 'umask 002' | sudo tee -a /etc/bash.bashrc

# Effect of 002:
# File: 666 - 002 = 664 (rw-rw-r--)
# Directory: 777 - 002 = 775 (rwxrwxr-x)
# This way group members can modify each other's files

> ℹ️ 注意:チーム協業では、統一umask 002によりグループメンバーが互いのファイルを修正できます。ただしセキュリティに注意 — 複数チームが共有するサーバーでは002は緩すぎる可能性があります。SGID + 002は共有ディレクトリのみに使用し、ユーザーのホームディレクトリはデフォルト022を維持することを推奨します。

出力:

TEXT
umask 002

(7) ▶ サンプル:個別.bashrc設定

BASH
# Xiao Ming likes a colorful prompt
cat >> ~/.bashrc << 'EOF'
export PS1='\[\033[1;32m\]\u\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]\$ '
alias ll='ls -lah'
EOF
source ~/.bashrc

# Bob likes it simple
cat >> ~/.bashrc << 'EOF'
export PS1='\w\$ '
alias l='ls -CF'
EOF
source ~/.bashrc

出力:

TEXT
alice:~/projects$ ls -lah
drwxr-x--- 2 alice developers 4096 Jul  7 10:30 .

(8) ▶ サンプル:グループ別sudo権限管理

BASH
# Create a group
sudo groupadd devops

# Add Xiao Ming to the devops group (he can manage system services)
sudo usermod -aG devops charlie

# Configure sudo privileges by group
echo '%developers ALL=(ALL) ALL' | sudo tee /etc/sudoers.d/developers
echo '%devops ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/apt' | sudo tee /etc/sudoers.d/devops

> 💡 ヒント:sudo権限管理の推奨アプローチは「グループ原則」 — 役割別にグループを作成し(例:developers、devops)、各グループごとに`/etc/sudoers.d/`に個別ファイルを作成します。これにより、ユーザーの追加・削除はグループのメンバーシップを変更するだけで済み、sudoersファイルを繰り返し編集する必要がありません。

# Set permissions
sudo chmod 440 /etc/sudoers.d/*

出力:

TEXT
%developers ALL=(ALL) ALL
%devops ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/apt

(9) ▶ 総合例:マルチユーザー環境デプロイスクリプトの完成

BASH
#!/bin/bash
# setup-multi-user.sh - Set up a multi-user team development environment
set -e

echo "=== Setting up multi-user development environment ==="

# 1. Create users
TEAM_MEMBERS=("alice" "bob" "charlie")
sudo groupadd developers 2>/dev/null || true

for user in "${TEAM_MEMBERS[@]}"; do
    if id "$user" &>/dev/null; then
        echo "User $user already exists, skipping creation"
    else
        sudo useradd -m -s /bin/bash "$user"
        echo "Please set password for $user:"
        sudo passwd "$user"
    fi
    sudo usermod -aG developers "$user"
done
echo "✅ Users created"

# 2. Create shared directory
sudo mkdir -p /srv/project/{src,docs,scripts,tests}
sudo chgrp -R developers /srv/project
sudo chmod 2775 /srv/project
sudo chmod 2775 /srv/project/*/
echo "✅ Shared directory created (SGID set)"

# 3. Configure team umask
echo 'umask 002' | sudo tee -a /etc/bash.bashrc
echo "✅ Team umask configured"

# 4. Configure sudo privileges
echo '%developers ALL=(ALL) ALL' | sudo tee /etc/sudoers.d/developers
sudo chmod 440 /etc/sudoers.d/developers
echo "✅ sudo privileges configured"

# 5. Create README
cat | sudo tee /srv/project/README.md << 'EOF'
# Team Project Directory

---
## 4. Directory Structure
- src/ — Source code
- docs/ — Documentation
- scripts/ — Scripts
- tests/ — Tests

---
## 5. Rules
- umask 002, group members can modify each other's files
- Don't use root in this directory
- Confirm before using `sudo` to install software
EOF
echo "✅ README created"

echo ""
echo "=== Environment Ready ==="
echo "Users: ${TEAM_MEMBERS[*]}"
echo "Shared directory: /srv/project"
echo ""
echo "Verification:"
echo "  1. Create files as different users and check group is developers"
echo "  2. Use who to view online users"
echo "  3. Use sudo -l to view privileges"

❓ よくある質問

Q: 共有ディレクトリにSGIDが必要な理由は? A: SGIDにより、共有ディレクトリで作成されるファイルやサブディレクトリが自動的に親ディレクトリのグループを継承します。SGIDがなければ、ユーザーが作成したファイルはそのユーザーのプライベートグループに属し、他のチームメンバーには修正権限がありません。SGIDがあれば、ファイルは自動的にdevelopersグループに属します。

Q: /etc/skelディレクトリの役割は? A: useradd -mで新しいユーザーを作成する際、/etc/skel/内のすべてのファイルが新しいユーザーのホームディレクトリに自動的にコピーされます。デフォルトの.bashrc.profile.vimrcなどのテンプレートを配置できます。

Q: umaskを007に設定するとどうなりますか? A: umask 007は「その他」に一切権限を付与しません。ファイル:666-007=660(rw-rw----)、ディレクトリ:777-007=770(rwxrwx---)。チーム専用サーバーに適しています。

Q: ユーザーのホームディレクトリ権限はどうあるべきですか? A: 標準は755(rwxr-xr-x)— 所有者がフルコントロール、他者は読み取りと実行のみ(cdは可能だが書き込み不可)。プライバシー重視なら750または700に設定。

Q: ユーザーのsudo権限を制限するには? A: /etc/sudoers.d/に個別ファイルを作成し、許可するコマンドを明示的に指定:alice ALL=(ALL) /usr/bin/systemctl, /usr/bin/apt。これにより、ユーザーはsudoでsystemctlとaptのみ実行可能になります。


📖 まとめ


📝 練習問題

  1. 基本(難易度 ⭐):2人のユーザーdev1dev2を作成し、teamグループに追加し、SGID付きの共有ディレクトリ/srv/team-project(2775)を作成する
  2. 中級(難易度 ⭐⭐)dev1dev2としてそれぞれ共有ディレクトリにファイルを作成し、ファイルが自動的にteamグループに属することを確認し、dev1sudo aptsudo systemctlのみ実行できるよう設定する(コマンド制限)
  3. 上級(難易度 ⭐⭐⭐):上記の全設定を一括実行するスクリプトを作成(ユーザー、グループ、ディレクトリ、SGID、sudo制限の作成)、引数チェックとエラーハンドリングを含む
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%