タイトル: chmod 権限の変更
SEOタイトル: Linux chmod パーミッション変更完全ガイド — 数値/シンボル/SUID/再帰
| この記事の要点 |
|
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 の合計。
| 数値 | シンボル | 典型用途 |
|---|---|---|
777 | rwxrwxrwx | 全員フルアクセス(危険、原則使わない) |
755 | rwxr-xr-x | 実行ファイル / ディレクトリ標準 |
700 | rwx------ | 所有者のみアクセス可(~/.ssh) |
666 | rw-rw-rw- | 全員読み書き(ログ等) |
644 | rw-r--r-- | 一般ファイル標準 |
600 | rw------- | 秘密鍵 / .env |
444 | r--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 桁を付けると特殊権限を指定できます。
| 値 | 名前 | 意味 |
|---|---|---|
4 | SUID | 実行時に所有者の権限で動く(/usr/bin/passwd 等) |
2 | SGID | ファイル: グループ権限で実行。ディレクトリ: 配下の新規ファイルが親グループを継承 |
1 | Sticky | ディレクトリ内のファイル削除は所有者のみ(/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 を推奨。