Linuxのファイルパーミッションはほぼすべての開発者が一度は混乱します。755が必要な場面で644にロックされたファイル、あるいは本番環境のディレクトリを誤って777に設定してしまう——これらはよくある間違いですが、実際のセキュリティ上の影響があります。このガイドでは各パーミッション値が正確に何を意味し、いつ使うべきかを解説します。

Unixパーミッションモデル

Linuxシステム上のすべてのファイルとディレクトリには3つのパーミッションセットがあります:

  • オーナー — ファイルを所有するユーザー
  • グループ — ファイルに割り当てられたグループのユーザー
  • その他 — それ以外のすべての人

各セットには3種類のパーミッションがあります:

記号名前ファイルの場合ディレクトリの場合
rreadファイル内容を表示ディレクトリ内容を一覧表示(ls
wwriteファイル内容を変更内部のファイルを作成・名前変更・削除
xexecuteプログラムとして実行ディレクトリに入る(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進パーミッション
7111rwx
6110rw-
5101r-x
4100r—
0000---

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): 実行ファイルに設定すると、プログラムはファイルのオーナーとして実行されます(実行したユーザーではなく)。sudopasswd などで使用されています。

Setgid(2xxx): ディレクトリに設定すると、新しいファイルは作成者のプライマリグループではなくディレクトリのグループを継承します。共有プロジェクトディレクトリに便利です。

スティッキービット(1xxx): ディレクトリに設定すると、ユーザーは自分が所有していないファイルを削除できなくなります。ユーザーがお互いの一時ファイルを削除できないよう /tmp に設定されています。

ls -la /
# drwxrwxrwt  ... tmp   (スティッキービット = 末尾の't')

ls -la /usr/bin/passwd
# -rwsr-xr-x  ... passwd  (setuid = 's')

クイックリファレンス

8進記号形式一般的な用途
400r--------オーナーのみ読み取り
600rw-------プライベートファイル、SSHキー、.env
644rw-r—r—Webファイル、設定、通常ファイル
700rwx------プライベートスクリプト、個人ディレクトリ
755rwxr-xr-xスクリプト、バイナリ、公開ディレクトリ
775rwxrwxr-x共有グループプロジェクトディレクトリ
777rwxrwxrwx本番環境では避ける

計算なしでchmod値を確認

8進数を頭の中で計算しているなら、計算機を使ってください。ZeroTool chmodカリキュレーターを試す →

オーナー・グループ・その他の読み・書き・実行をチェックオンするだけで、8進数値が即座に更新されます。8進数値を貼り付けて付与される正確なパーミッションを確認することもできます——他の人のデプロイスクリプトを読む際に便利です。

まとめ

90%の場合に使うのは、ファイルには 644、ディレクトリと実行ファイルには 755 の2つです。プライベートにすべきものには 600 を使用してください。重要な環境では 777 は避けてください。

特定の8進数値の意味について確信が持てない場合は、推測せずに chmodカリキュレーターで確認 してください。