Linuxのファイルパーミッションはほぼすべての開発者が一度は混乱します。755が必要な場面で644にロックされたファイル、あるいは本番環境のディレクトリを誤って777に設定してしまう——これらはよくある間違いですが、実際のセキュリティ上の影響があります。このガイドでは各パーミッション値が正確に何を意味し、いつ使うべきかを解説します。
Unixパーミッションモデル
Linuxシステム上のすべてのファイルとディレクトリには3つのパーミッションセットがあります:
- オーナー — ファイルを所有するユーザー
- グループ — ファイルに割り当てられたグループのユーザー
- その他 — それ以外のすべての人
各セットには3種類のパーミッションがあります:
| 記号 | 名前 | ファイルの場合 | ディレクトリの場合 |
|---|---|---|---|
r | read | ファイル内容を表示 | ディレクトリ内容を一覧表示(ls) |
w | write | ファイル内容を変更 | 内部のファイルを作成・名前変更・削除 |
x | execute | プログラムとして実行 | ディレクトリに入る(cd)・ファイルにアクセス |
ls -la
# -rwxr-xr-- 1 alice dev 4096 Apr 5 10:00 deploy.sh
# ^^^ ^^^ ^^^
# | | その他: r-- (4)
# | グループ: r-x (5)
# オーナー: rwx (7)
8進数表記
各パーミッションのトリプレットは2進数の重みを使って1桁にマッピングされます:
r = 4 (2進数 100)
w = 2 (2進数 010)
x = 1 (2進数 001)
各セットの値を合計します:
| 8進 | 2進 | パーミッション |
|---|---|---|
| 7 | 111 | rwx |
| 6 | 110 | rw- |
| 5 | 101 | r-x |
| 4 | 100 | r— |
| 0 | 000 | --- |
3桁の8進数値(例:755)はオーナー/グループ/その他の順を表します。
よく使うchmod値
chmod 755
オーナー: rwx (7) — 読み・書き・実行
グループ: r-x (5) — 読み・実行
その他: r-x (5) — 読み・実行
使い所: 実行ファイル・シェルスクリプト・他のユーザーが書き込みできないが公開アクセス可能なディレクトリ。バイナリ・アプリケーションディレクトリ・Webサーバールートの標準値。
chmod 755 /var/www/html
chmod 755 deploy.sh
chmod 644
オーナー: rw- (6) — 読み・書き
グループ: r-- (4) — 読み取り専用
その他: r-- (4) — 読み取り専用
使い所: 設定ファイル・HTMLファイル・画像・テキストドキュメントなど通常のファイル。オーナーは変更できますが、他は読み取りのみ。
chmod 644 index.html
chmod 644 /etc/nginx/nginx.conf
chmod 600
オーナー: rw- (6) — 読み・書き
グループ: --- (0) — アクセス不可
その他: --- (0) — アクセス不可
使い所: オーナーのみがアクセスすべきプライベートファイル——SSHの秘密鍵(~/.ssh/id_rsa)・パスワードファイル・シークレットトークン。SSHは秘密鍵のパーミッションがこの値でない場合、使用を拒否します。
chmod 600 ~/.ssh/id_rsa
chmod 600 .env
chmod 777
オーナー: rwx (7) — 読み・書き・実行
グループ: rwx (7) — 読み・書き・実行
その他: rwx (7) — 読み・書き・実行
危険ゾーン。 システム上のだれでも読み・書き・実行できます。本番サーバーでは絶対に使用しないでください。特にWebルート内のディレクトリでは、任意のプロセスやユーザーが任意のファイルを書き込めるようになります。
唯一の正当な使用例:パーミッションが問題の原因かどうかを切り分けるためのローカル開発環境でのクイックデバッグ。必ず元に戻してください。
chmod 775 vs 755
775 はグループに書き込みアクセスを与えます。複数のチームメンバー(同じグループ内)が共有ファイルを変更する必要がある共同環境で使用します:
chown -R :developers /var/www/project
chmod -R 775 /var/www/project
記号表記
8進数形式は正確ですが暗算が必要です。記号表記は増分的な変更に読みやすいです:
# オーナーに実行権限を追加
chmod u+x script.sh
# グループとその他から書き込みを削除
chmod go-w sensitive.cfg
# 正確なパーミッションを設定: rw-r--r--
chmod u=rw,go=r file.txt
# すべてに実行ビットを追加
chmod a+x script.sh
記号:u = オーナー(ユーザー)、g = グループ、o = その他、a = すべて。
演算子:+ = 追加、- = 削除、= = 正確に設定。
再帰的パーミッション
ディレクトリとその中のすべてのものにパーミッションを適用:
chmod -R 755 /var/www/html
注意: -R はファイルとディレクトリの両方に同じモードを適用します。ディレクトリには入るための x が必要ですが、通常のファイルは x を必要としません。chmod -R 777 をコードベースに盲目的に実行すると、すべてのファイルに実行パーミッションが付いてしまいます。
より良いアプローチ:find を使ってファイルとディレクトリに異なるパーミッションを適用:
# ディレクトリ: 755
find /var/www/html -type d -exec chmod 755 {} \;
# ファイル: 644
find /var/www/html -type f -exec chmod 644 {} \;
特殊ビット
標準的な9ビット以外に、3つの特殊モードがあります:
Setuid(4xxx): 実行ファイルに設定すると、プログラムはファイルのオーナーとして実行されます(実行したユーザーではなく)。sudo・passwd などで使用されています。
Setgid(2xxx): ディレクトリに設定すると、新しいファイルは作成者のプライマリグループではなくディレクトリのグループを継承します。共有プロジェクトディレクトリに便利です。
スティッキービット(1xxx): ディレクトリに設定すると、ユーザーは自分が所有していないファイルを削除できなくなります。ユーザーがお互いの一時ファイルを削除できないよう /tmp に設定されています。
ls -la /
# drwxrwxrwt ... tmp (スティッキービット = 末尾の't')
ls -la /usr/bin/passwd
# -rwsr-xr-x ... passwd (setuid = 's')
クイックリファレンス
| 8進 | 記号形式 | 一般的な用途 |
|---|---|---|
| 400 | r-------- | オーナーのみ読み取り |
| 600 | rw------- | プライベートファイル、SSHキー、.env |
| 644 | rw-r—r— | Webファイル、設定、通常ファイル |
| 700 | rwx------ | プライベートスクリプト、個人ディレクトリ |
| 755 | rwxr-xr-x | スクリプト、バイナリ、公開ディレクトリ |
| 775 | rwxrwxr-x | 共有グループプロジェクトディレクトリ |
| 777 | rwxrwxrwx | 本番環境では避ける |
計算なしでchmod値を確認
8進数を頭の中で計算しているなら、計算機を使ってください。ZeroTool chmodカリキュレーターを試す →
オーナー・グループ・その他の読み・書き・実行をチェックオンするだけで、8進数値が即座に更新されます。8進数値を貼り付けて付与される正確なパーミッションを確認することもできます——他の人のデプロイスクリプトを読む際に便利です。
まとめ
90%の場合に使うのは、ファイルには 644、ディレクトリと実行ファイルには 755 の2つです。プライベートにすべきものには 600 を使用してください。重要な環境では 777 は避けてください。
特定の8進数値の意味について確信が持てない場合は、推測せずに chmodカリキュレーターで確認 してください。