メインコンテンツまでスキップ

ユーザーと権限

Linuxのユーザー管理、グループ、パーミッションの基礎を学びます。


目次

  1. 全体像
  2. ユーザーとグループ
  3. パーミッション
  4. 特殊なパーミッション
  5. sudo
  6. コンテナでの権限

全体像

なぜユーザーと権限が必要か

LinuxはマルチユーザーOSです。複数のユーザーが同時に使うことを前提に設計されています。そのため、「誰が」「何を」できるかを制御する仕組みが必要です。

┌─────────────────────────────────────────────────────────────┐
│ ユーザーと権限の目的 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. セキュリティ │
│ - 他人のファイルを勝手に見られない │
│ - システムファイルを誤って壊せない │
│ - 悪意あるプログラムの被害を限定 │
│ │
│ 2. 責任の分離 │
│ - 誰が何をしたかを追跡できる │
│ - 管理者と一般ユーザーを分ける │
│ │
│ 3. リソースの管理 │
│ - ユーザーごとにディスク容量を制限 │
│ - 特定の機能へのアクセスを制御 │
│ │
└─────────────────────────────────────────────────────────────┘

ユーザーと権限の全体像

Linuxでは、すべての操作にユーザーと権限が関わっています:

┌─────────────────────────────────────────────────────────────┐
│ ユーザーと権限が関わる場所 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ │ ユーザー │ │
│ │ (UID/GID) │ │
│ └──────┬──────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ プロセス │ │ ファイル │ │ ネットワーク │ │
│ │ │ │ │ │ │ │
│ │ 誰が実行? │ │ 誰がアクセス? │ │ 誰が接続? │ │
│ │ 何ができる? │ │ 読む?書く? │ │ ポート開く? │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

プロセスとユーザー

すべてのプロセスは、必ず誰かのユーザー権限で動いています

┌─────────────────────────────────────────────────────────────┐
│ プロセスとユーザーの関係 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 【プロセス起動時】 │
│ │
│ ユーザー「taro」がコマンドを実行: │
│ │
│ taro@server:~$ vim file.txt │
│ │
│ ↓ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ vim プロセス │ │
│ │ ├── 実効UID: 1000 (taro) │ │
│ │ ├── 実効GID: 1000 (taro) │ │
│ │ └── taroの権限でしかファイルにアクセスできない │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ │
│ 【これが意味すること】 │
│ │
│ taro が実行したプロセスは... │
│ ✓ taro が読めるファイルを読める │
│ ✓ taro が書けるファイルに書ける │
│ ✗ root しか読めないファイルは読めない │
│ ✗ 他のユーザーのファイルは(権限がなければ)操作できない │
│ │
└─────────────────────────────────────────────────────────────┘

ファイルとユーザー

すべてのファイルには、所有者と権限が設定されています

┌─────────────────────────────────────────────────────────────┐
│ ファイルとユーザーの関係 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 【ファイルに記録されている情報】 │
│ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ /home/taro/document.txt │ │
│ │ ├── 所有者 (owner): taro │ │
│ │ ├── グループ (group): developers │ │
│ │ └── パーミッション: rw-r----- │ │
│ │ │ │ │ │ │
│ │ │ │ └── その他: アクセス不可 │ │
│ │ │ └──── グループ: 読み取りのみ │ │
│ │ └────── 所有者: 読み書き可能 │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ 【アクセス判定の流れ】 │
│ │
│ プロセス(UID=1001)が document.txt にアクセス │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 1. 所有者(taro/UID=1000)と一致? → NO │ │
│ │ 2. グループ(developers)に所属? → YES │ │
│ │ 3. グループ権限を適用 → 読み取りのみ可能 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

システム全体でのユーザーと権限

┌─────────────────────────────────────────────────────────────┐
│ Linuxシステムでの権限の流れ │
├─────────────────────────────────────────────────────────────┤
│ │
│ ログイン │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 認証 (/etc/passwd, /etc/shadow) │ │
│ │ → ユーザーを識別、UID/GIDを取得 │ │
│ └────────────────────────┬────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ シェル起動 (bash) │ │
│ │ → UID/GIDを継承して起動 │ │
│ └────────────────────────┬────────────────────────────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ コマンド │ │ コマンド │ │ コマンド │ │
│ │ ls │ │ vim │ │ nginx │ │
│ │ │ │ │ │ │ │
│ │ UID継承 │ │ UID継承 │ │ UID継承 │ │
│ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ カーネルによる権限チェック │ │
│ │ │ │
│ │ ファイルアクセス時: │ │
│ │ プロセスのUID/GID と ファイルの権限を照合 │ │
│ │ │ │
│ │ システムコール時: │ │
│ │ 必要な権限(capability)を持っているか確認 │ │
│ │ │ │
│ │ → 許可 or 拒否 (Permission denied) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

重要なユーザーとグループ

UIDユーザー役割
0rootスーパーユーザー(全権限)
1-999システムサービス用(sshd, nginx など)
1000+一般ユーザー人間のユーザー
GIDグループ用途
0root管理者グループ
27sudosudo実行可能
999dockerDockerソケットアクセス

権限が関わる具体例

┌─────────────────────────────────────────────────────────────┐
│ 日常的な例 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 【例1: ファイルの読み書き】 │
│ $ cat /etc/shadow │
│ cat: /etc/shadow: Permission denied │
│ → rootしか読めないファイル │
│ │
│ 【例2: サービスの起動】 │
│ $ systemctl restart nginx │
│ Failed to restart nginx.service: Access denied │
│ → root権限が必要な操作 │
│ │
│ $ sudo systemctl restart nginx │
│ → sudoでroot権限を借りて実行 │
│ │
│ 【例3: ポート80でのリッスン】 │
│ $ python -m http.server 80 │
│ PermissionError: Permission denied │
│ → 1024以下のポートはroot権限が必要 │
│ │
│ 【例4: Docker操作】 │
│ $ docker ps │
│ permission denied while trying to connect │
│ → dockerグループに所属していない │
│ │
│ $ sudo usermod -aG docker $USER │
│ → dockerグループに追加して解決 │
│ │
└─────────────────────────────────────────────────────────────┘

コンテナとの関係

Dockerコンテナでも、ユーザーと権限の仕組みは同じです:

┌─────────────────────────────────────────────────────────────┐
│ コンテナでのユーザーと権限 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 【ホスト】 【コンテナ】 │
│ │
│ UID/GID はホストと共有される(User Namespace未使用時) │
│ │
│ ホスト コンテナ │
│ ┌────────────────┐ ┌────────────────┐ │
│ │ /data/file.txt │ │ /app/data │ (マウント)│
│ │ owner: 1000 │ ◄────────► │ owner: 1000 │ │
│ │ mode: 644 │ │ mode: 644 │ │
│ └────────────────┘ └────────────────┘ │
│ │
│ コンテナ内のプロセスが UID=0 (root) で動くと... │
│ → ホスト側のファイルも root として操作してしまう │
│ → セキュリティリスク! │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ベストプラクティス: │ │
│ │ - コンテナ内は非rootユーザーで実行 │ │
│ │ - USER命令でユーザーを切り替え │ │
│ │ - 必要な権限(capability)のみ付与 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

ユーザーとグループ

ユーザー情報

# 現在のユーザー
whoami
id

# 出力例
# uid=1000(user) gid=1000(user) groups=1000(user),27(sudo),999(docker)

# ユーザー情報ファイル
cat /etc/passwd
# 形式: username:x:UID:GID:comment:home:shell
# root:x:0:0:root:/root:/bin/bash
# user:x:1000:1000:User Name:/home/user:/bin/bash

# シャドウファイル(パスワードハッシュ)
sudo cat /etc/shadow

グループ情報

# グループ一覧
cat /etc/group
# 形式: groupname:x:GID:members
# docker:x:999:user

# ユーザーのグループ
groups
groups username

ユーザー管理

# ユーザー作成
sudo useradd -m -s /bin/bash username
sudo useradd -m -s /bin/bash -G sudo,docker username

# パスワード設定
sudo passwd username

# ユーザー変更
sudo usermod -aG docker username # グループ追加
sudo usermod -s /bin/zsh username # シェル変更

# ユーザー削除
sudo userdel username
sudo userdel -r username # ホームディレクトリも削除

グループ管理

# グループ作成
sudo groupadd groupname

# グループにユーザー追加
sudo gpasswd -a username groupname

# グループからユーザー削除
sudo gpasswd -d username groupname

# グループ削除
sudo groupdel groupname

パーミッション

パーミッションの構造

┌─────────────────────────────────────────────────────────────┐
│ パーミッション構造 │
│ │
│ -rwxr-xr-x 1 user group 1234 Jan 15 10:00 file.txt │
│ │└┬┘└┬┘└┬┘ └─┬─┘ └──┬─┘ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ └── グループ所有者 │
│ │ │ │ │ └───────── ユーザー所有者 │
│ │ │ │ └────────────────── その他(other)の権限 │
│ │ │ └───────────────────── グループの権限 │
│ │ └──────────────────────── ユーザー(owner)の権限 │
│ └────────────────────────── ファイルタイプ │
│ │
│ 権限の意味: │
│ r (4) = read 読み取り │
│ w (2) = write 書き込み │
│ x (1) = execute 実行 │
│ │
└─────────────────────────────────────────────────────────────┘

ファイル vs ディレクトリ

権限ファイルディレクトリ
r内容を読める一覧を見れる
w内容を変更できるファイルを作成/削除できる
x実行できる中に入れる(cd)

chmod コマンド

# 記号モード
chmod u+x file.txt # owner に実行権限追加
chmod g-w file.txt # group から書き込み権限削除
chmod o=r file.txt # other を読み取りのみに設定
chmod a+r file.txt # all に読み取り権限追加
chmod u=rwx,g=rx,o=r file.txt

# 数値モード
chmod 755 file.txt # rwxr-xr-x
chmod 644 file.txt # rw-r--r--
chmod 600 file.txt # rw-------
chmod 700 directory # rwx------

# 再帰的に変更
chmod -R 755 directory

# よく使うパーミッション
# 755 = ディレクトリ、実行ファイル
# 644 = 通常ファイル
# 600 = 機密ファイル(鍵など)
# 700 = プライベートディレクトリ

chown コマンド

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

# 所有者とグループ変更
sudo chown user:group file.txt

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

# 再帰的に変更
sudo chown -R user:group directory

特殊なパーミッション

SetUID / SetGID / Sticky bit

┌─────────────────────────────────────────────────────────────┐
│ 特殊パーミッション │
├─────────────────────────────────────────────────────────────┤
│ │
│ SetUID (4000) - s in user execute │
│ └── 実行時、ファイル所有者の権限で実行 │
│ └── 例: /usr/bin/passwd (root権限でパスワード変更) │
│ │
│ SetGID (2000) - s in group execute │
│ └── ファイル: グループ所有者の権限で実行 │
│ └── ディレクトリ: 作成ファイルが親のグループを継承 │
│ │
│ Sticky bit (1000) - t in other execute │
│ └── ディレクトリ内のファイルは所有者のみ削除可能 │
│ └── 例: /tmp (誰でも書き込めるが他人のファイルは削除不可) │
│ │
└─────────────────────────────────────────────────────────────┘
# 確認
ls -l /usr/bin/passwd
# -rwsr-xr-x (s = SetUID)

ls -ld /tmp
# drwxrwxrwt (t = Sticky bit)

# 設定
chmod u+s file # SetUID
chmod g+s directory # SetGID
chmod +t directory # Sticky bit

chmod 4755 file # SetUID + 755
chmod 2755 directory # SetGID + 755
chmod 1777 directory # Sticky bit + 777

umask

新規作成ファイルのデフォルトパーミッションを制御します。

# 現在の umask
umask
# 022

# umask の計算
# ファイル: 666 - 022 = 644 (rw-r--r--)
# ディレクトリ: 777 - 022 = 755 (rwxr-xr-x)

# umask 設定
umask 027 # ファイル:640, ディレクトリ:750
umask 077 # ファイル:600, ディレクトリ:700

sudo

sudo の基本

# root権限でコマンド実行
sudo command

# rootシェルを起動
sudo -i
sudo su -

# 別のユーザーとして実行
sudo -u username command

# 環境変数を引き継ぐ
sudo -E command

# sudoキャッシュをクリア
sudo -k

sudoers 設定

# 編集(visudo を使用)
sudo visudo

# /etc/sudoers の例
# ユーザー ホスト=(実行ユーザー) コマンド
root ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL
user ALL=(ALL) NOPASSWD: ALL
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp

# /etc/sudoers.d/ にファイルを追加
echo "user ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/user

コンテナでの権限

非rootユーザーでの実行

# Dockerfile
FROM alpine:3.19

# ユーザーとグループを作成
RUN addgroup -g 1000 appgroup && \
adduser -u 1000 -G appgroup -D -s /sbin/nologin appuser

# ファイルの所有者を変更
COPY --chown=appuser:appgroup app /app

# 非rootユーザーに切り替え
USER appuser

CMD ["/app/run"]

UID/GID マッピング

# コンテナ内のユーザー
docker run alpine id
# uid=0(root) gid=0(root)

docker run --user 1000:1000 alpine id
# uid=1000 gid=1000

# ホストのユーザーと一致させる
docker run --user $(id -u):$(id -g) alpine id

Capabilities

# 必要な capability のみ付与
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx

# コンテナの capabilities 確認
docker exec container-name cat /proc/1/status | grep Cap

# 主な capabilities
# CAP_NET_BIND_SERVICE - 1024以下のポートにバインド
# CAP_SYS_ADMIN - 様々な管理操作
# CAP_CHOWN - ファイル所有者変更
# CAP_SETUID/SETGID - UID/GID変更

SecurityContext (Kubernetes)

apiVersion: v1
kind: Pod
metadata:
name: secure-pod
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000

containers:
- name: app
image: myapp
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL

まとめ

パーミッションのベストプラクティス

ファイルタイプ推奨パーミッション
通常ファイル644
実行ファイル755
機密ファイル(秘密鍵等)600
ディレクトリ755
プライベートディレクトリ700

コンテナセキュリティ

  • 非rootユーザーで実行
  • 必要な capabilities のみ付与
  • 読み取り専用ファイルシステム
  • allowPrivilegeEscalation: false

次のステップ


参考リソース