この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:6
ページ更新者:T
更新日時:2026-06-11 07:10:02

タイトル: chmod 権限の変更
SEOタイトル: Linux chmod パーミッション変更完全ガイド — 数値/シンボル/SUID/再帰

この記事の要点
  • Linux のパーミッション = 所有者 / グループ / その他 × read / write / execute
  • 数値表記: chmod 755 file(rwxr-xr-x)/ 644(rw-r--r--)/ 777(全許可、危険)
  • シンボル表記: chmod u+x(所有者に実行追加)/ g-w(グループ書き込み削除)/ o=r(その他は読み取りのみ)
  • 再帰 -R、SUID/SGID/Sticky は4 桁の数値(4755 / 2755 / 1777)
  • Web サーバ推奨: ファイル 644 / ディレクトリ 755、書き込みが必要な場所だけ 775 + 所有者を Web ユーザに

Linux パーミッションの基本

Linux/Unix のファイルとディレクトリには3 種類のユーザ × 3 種類のアクション の権限ビットが付与されています。

$ ls -l file.txt
-rw-r--r-- 1 user group  120 Jun  1 10:00 file.txt
 │└─┬┘└─┬┘└─┬┘
 │ │   │   └─ その他 (others)        : r--  読取のみ
 │ │   └───── グループ (group)       : r--  読取のみ
 │ └───────── 所有者 (user / owner)  : rw-  読み書き
 └─────────── ファイル種別 (- ファイル / d ディレクトリ / l シンボリックリンク)

各文字の意味:
r = read    (読取)        4
w = write   (書込)        2
x = execute (実行)        1
- = なし                  0

数値表記(最頻出)

各桁が「所有者 / グループ / その他」に対応。r=4, w=2, x=1 の合計。

数値シンボル典型用途
777rwxrwxrwx全員フルアクセス(危険、原則使わない)
755rwxr-xr-x実行ファイル / ディレクトリ標準
700rwx------所有者のみアクセス可(~/.ssh)
666rw-rw-rw-全員読み書き(ログ等)
644rw-r--r--一般ファイル標準
600rw-------秘密鍵 / .env
444r--r--r--読み取り専用
000---------誰もアクセス不可
# 数値で変更
chmod 644 file.txt
chmod 755 script.sh
chmod 600 ~/.ssh/id_ed25519

# 結果確認
ls -l file.txt
# -rw-r--r-- 1 user group  120 Jun  1 10:00 file.txt

シンボル表記

# 構文: chmod [対象][演算子][権限] file
# 対象: u(owner) / g(group) / o(others) / a(all)
# 演算子: + (追加) / - (削除) / = (上書き)
# 権限: r / w / x

# 所有者に実行権限を追加
chmod u+x script.sh

# グループの書き込みを削除
chmod g-w shared.txt

# その他は読み取りのみに上書き
chmod o=r public.txt

# 全員に読み取り追加
chmod a+r doc.txt
chmod +r doc.txt    # a は省略可

# 複数同時 (カンマ区切り)
chmod u+x,g+x,o-w script.sh

# X (大文字) : ディレクトリ or 既に x がある場合のみ追加
# → ファイル/ディレクトリ混在で安全
chmod -R u+rwX,g+rX,o+rX project/

再帰的変更 (-R)

# ディレクトリ配下全部
chmod -R 755 project/

# ❌ よくあるミス: ファイルにも 755 を当てると実行ビットが立つ
# 例) PHP ファイルが実行可能になっても害は少ないが意図せず

# ✅ ファイルとディレクトリで権限を分ける (find と組み合わせ)
find project/ -type d -exec chmod 755 {} \;
find project/ -type f -exec chmod 644 {} \;

# ✅ chmod の X 機能でも可
chmod -R u=rwX,go=rX project/

特殊権限: SUID / SGID / Sticky

通常の 3 桁の前にもう 1 桁を付けると特殊権限を指定できます。

名前意味
4SUID実行時に所有者の権限で動く(/usr/bin/passwd 等)
2SGIDファイル: グループ権限で実行。ディレクトリ: 配下の新規ファイルが親グループを継承
1Stickyディレクトリ内のファイル削除は所有者のみ/tmp
# SUID 付き 755 = 4755
chmod 4755 /usr/local/bin/myprog
ls -l /usr/local/bin/myprog
# -rwsr-xr-x   ← 所有者 x の位置が "s"

# SGID 付き 755 = 2755 (ディレクトリ向け)
chmod 2775 /var/shared
# drwxrwsr-x   ← グループ x の位置が "s"

# Sticky 付き 777 = 1777 (典型: /tmp)
ls -ld /tmp
# drwxrwxrwt   ← その他 x の位置が "t"

# シンボル表記
chmod u+s file        # SUID
chmod g+s dir         # SGID
chmod +t dir          # Sticky

umask: デフォルトパーミッション

新規ファイル/ディレクトリ作成時の初期パーミッションumask で決まります。666 - umask(ファイル)/ 777 - umask(ディレクトリ)。

# 現在の umask 確認
umask
# 0022

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

# 厳しめに(自分以外見せない)
umask 077
# ファイル = 600, ディレクトリ = 700

# 永続化
echo "umask 022" >> ~/.bashrc

所有者・グループ変更(併用)

# 所有者変更
chown nginx:nginx /var/www/html

# 所有者だけ
chown nginx file.txt

# グループだけ
chgrp www-data file.txt
chown :www-data file.txt    # 等価

# 再帰
chown -R nginx:nginx /var/www/html

# シンボリックリンク自体を変更(リンク先ではなく)
chown -h nginx symlink

Web サーバ推奨パーミッション

# 一般的な PHP / Laravel / WordPress の推奨

# ファイル: 644
find /var/www/html -type f -exec chmod 644 {} \;

# ディレクトリ: 755
find /var/www/html -type d -exec chmod 755 {} \;

# Web サーバが書き込む必要があるディレクトリ: 775
chmod -R 775 /var/www/html/storage          # Laravel
chmod -R 775 /var/www/html/bootstrap/cache   # Laravel
chmod -R 775 /var/www/html/wp-content/uploads # WordPress

# 所有者を Web サーバユーザに
chown -R www-data:www-data /var/www/html

# ❌ NG: 全部 777 にすると誰でも改ざん可能(マルウェア混入)
# 必ず 755 / 775 までに留める

# 秘密情報は 600 で所有者のみ
chmod 600 .env
chmod 600 ~/.ssh/id_*

SELinux / AppArmor との関係

CentOS / RHEL のSELinux、Ubuntu のAppArmor 環境では、chmod だけでは不十分なことがあります。MAC(強制アクセス制御)がブロックします。

# SELinux 状態確認
getenforce
# Enforcing / Permissive / Disabled

# ファイルのコンテキスト確認
ls -lZ /var/www/html
# system_u:object_r:httpd_sys_content_t:s0

# Web 書き込みを許可するコンテキスト付与
chcon -R -t httpd_sys_rw_content_t /var/www/html/storage
restorecon -R /var/www/html      # ポリシー通りに戻す

# ポート開放 (例: Web 8080)
semanage port -a -t http_port_t -p tcp 8080

# AppArmor 確認
sudo aa-status
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx    # 一時的に緩和

FAQ

Q: chmod 777 にしても動かない
A: ① 親ディレクトリの x が無いと辿れない、② SELinux 等の MAC、③ ACL (getfacl) で別途制限、④ マウントオプション(noexec)。

Q: シンボリックリンクの権限は意味がある?
A: ほぼ意味なし(lrwxrwxrwx 固定)。リンク先のパーミッションが効きます。

Q: Windows でも chmod は動く?
A: WSL / Git Bash / Cygwin では動きますが、NTFS の ACL に完全マッピングはされません。本番運用は WSL2 を推奨。