chmod 644 と 755:ファイルとディレクトリはどう選ぶ?
通常ファイルは 644、ディレクトリや実行ファイルは 755 と言われますが、機械的に当てはめると危険です。再帰 chmod、umask、共有ディレクトリの setgid まで実務目線で整理します。
サーバーへプロジェクトを配置するときや、スクリプトが動かないとき、まず 644 や 755 を試す人は多いでしょう。よく使われる値だからこそ、どこに使うかを考えずに貼り付けがちです。数字の意味から確認したい場合は、chmod 755 とは何かを先に読んでください。ここでは、ファイルとディレクトリにどのモードを選ぶかに絞ります。
まず覚えるルール
ほとんどの場合は次の出発点で十分です。
- 通常ファイル →
644(rw-r--r--):所有者は読み書きでき、ほかの利用者は読むだけです。 - ディレクトリと実行するプログラム →
755(rwxr-xr-x):所有者はすべて操作でき、ほかの利用者は読んで、ディレクトリなら入る、プログラムなら実行できます。
差は実行ビットです。テキスト、JSON、画像、CSS のようなデータファイルに実行権は不要なので、通常は 644 です。一方でディレクトリとプログラムには実行ビットが必要です。
ただし、ディレクトリの x は「実行する」意味ではありません。これは検索/通過権限で、cd したり、名前を指定して中の項目へ到達したりするための権限です。ディレクトリが 644 なら x はありません。読み取り権を持つ人は項目名を見られることがありますが、ディレクトリに入ることも、名前で項目へアクセスすることも、その下へ進むこともできません。したがって 644 は、通常使用するディレクトリの既定値には向きません。支柱記事では、この違いを詳しく扱っています。
再帰 chmod の落とし穴
ファイルとサブディレクトリが混在するプロジェクトに、次を実行するとします。
chmod -R 755 myproject/ # 通常ファイルにも実行ビットが付く
chmod -R 644 myproject/ # すべてのディレクトリが通過不能になる
chmod -R 755 は README や設定ファイルまで実行可能にします。すぐ障害になるとは限りませんが、意図が曖昧で監査もしづらくなります。chmod -R 644 はさらに悪く、すべてのディレクトリから x を外すため、ツリーに入れなくなります。
一つの絶対数値モードでは、この二つを同時に表せません。ツリーを確認済みで、通常ファイルの基本 rwx ビットを 644、ディレクトリの基本 rwx ビットを 755 にしたい場合は、種類ごとに設定します。
# 種類ごとに正規化する
find myproject -type f -exec chmod 644 {} +
find myproject -type d -exec chmod 755 {} +
# 別の相対操作:読み取りと条件付き実行を加えるが、
# 既存の書き込み権限は変えない
chmod -R a+rX myproject/
この二つは置き換え可能ではなく、万能な修復コマンドでもありません。
findの二行は種類ごとに基本 rwx ビットを設定しますが、a+rXは相対変更で、既存の書き込み権限を変えません。そのため、もともと777のディレクトリは777のままです。特殊ビットは別途確認し、実行前に.env、秘密鍵、デプロイ用認証情報を除外してください。
覚えるべきは大文字の X です。小文字の x は無条件で実行ビットを足し、大文字の X はディレクトリ、または誰かに実行ビットが既にあるファイルにだけ足します。chmod -R a+rX はデータファイルを実行可能にはしませんが、読み取り範囲は広げます。基本 rwx ビットを 644/755 にリセットするのではなく、ビットを足して既存の書き込み権限を残すだけです。基本 rwx ビットを種類ごとに設定したいなら、種類ごとの方法を使います。記号モードが最終的に何になるかは、chmod 計算機で確認できます。
よく使うモード
ファイル
| モード | 記号表記 | 用途 |
|---|---|---|
644 | rw-r--r-- | ソース、文書、通常の設定、静的資産 |
600 | rw------- | SSH 秘密鍵、.env、認証情報 |
640 | rw-r----- | 所有者が書き、特定グループが読む |
664 | rw-rw-r-- | 同じグループで共同編集するファイル |
755 | rwxr-xr-x | 誰でも実行できるスクリプトやバイナリ |
700 | rwx------ | 所有者だけが実行する私用スクリプト |
ディレクトリ
| モード | 記号表記 | 用途 |
|---|---|---|
755 | rwxr-xr-x | 一般的なディレクトリ |
700 | rwx------ | 私用ディレクトリ。例:~/.ssh |
750 | rwxr-x--- | 所有者とグループだけが利用 |
775 | rwxrwxr-x | グループで書き込む共有ディレクトリ |
考え方は、よく使う基準から始めて意図的に調整することです。自分だけなら 600/700、グループに読ませるなら 640/750、グループにも書かせるなら、意図してグループ書き込みを足す 664/775 を検討します。777 を使いたくなったら、先に所有者や親ディレクトリを疑ってください。
既定値を決める umask
新しいファイルが 644、新しいディレクトリが 755 になりやすいのは umask のためです。既定 ACL がない通常の作成では、プログラムは一般にファイルへ 666、ディレクトリへ 777 を要求し、umask が不要なビットを外します。よく使われる 022 は group と other の書き込みを外します。
- 新規ファイル:
666から022を除く →644 - 新規ディレクトリ:
777から022を除く →755
厳密には umask は引き算ではなくビットマスクで、カーネルが計算するのは 666 & ~022 です。日常的な値では引き算と同じ結果になりますが、023 のような値では違います。666 & ~023 は 644 のままで、引き算なら 643 になってしまいます。
新規ファイルに実行ビットがないのも同じ理由です。出発点の 666 に x がなく、umask は権限を足せません。実行可能にしたいときだけ chmod +x を明示します。
共同開発環境では umask 002 を使い、グループ書き込みを残すことがあります。
- 新規ファイル:
666から002を除く →664 - 新規ディレクトリ:
777から002を除く →775
計算機の umask モードで結果を確認できます。umask は新規項目だけに効き、既存のファイルを書き換えるものではありません。
共有ディレクトリでは 775 だけでは不十分なことがあります。新規項目は作成者の主グループに属するため、同僚が編集できない場合があるからです。ディレクトリを 2775 にして setgid を付けると、新規項目はディレクトリのグループを継承します。ただし setgid が決めるのはグループだけです。新しいファイルにグループ書き込みを残すには、002 のような umask、または適切な既定 ACL も必要です。
迷ったときの順番
- ファイルかディレクトリか。 ファイルは
644、ディレクトリは755から考えます。 - 実行する必要があるか。 スクリプトやバイナリは
755、私用なら700です。 - 誰が使うか。 自分だけなら
600/700、グループに読ませるなら640/750、書かせるなら664/775です。 - 再帰的に変えるか。 混在ツリーへ単一の数値モードを再帰適用しません。型ごとに分けるか、読み取り範囲が広がることを確認してから
chmod -R a+rXを使います。 777を打ちたくなったか。 所有者、親ディレクトリ、マウント設定を先に確認します。
ファイルとディレクトリを区別できれば、後はかなり判断しやすくなります。八進数と rwxr-xr-x を並べて確かめたいときや、umask の結果を見たいときは、chmod 計算機が便利です。なお、モードを正しく設定してもファイルが開けない・実行できない場合、原因はモードではありません。所有権、親ディレクトリ、その下の層をたどることになります。その手順はchmod しても Permission denied のまま?で扱っています。