DevKitLab Logo DevKitLab
chmod / Unix / ファイル権限 / Linux

chmod 644 と 755:ファイルとディレクトリはどう選ぶ?

通常ファイルは 644、ディレクトリや実行ファイルは 755 と言われますが、機械的に当てはめると危険です。再帰 chmod、umask、共有ディレクトリの setgid まで実務目線で整理します。

サーバーへプロジェクトを配置するときや、スクリプトが動かないとき、まず 644755 を試す人は多いでしょう。よく使われる値だからこそ、どこに使うかを考えずに貼り付けがちです。数字の意味から確認したい場合は、chmod 755 とは何かを先に読んでください。ここでは、ファイルとディレクトリにどのモードを選ぶかに絞ります。

まず覚えるルール

ほとんどの場合は次の出発点で十分です。

  • 通常ファイル → 644rw-r--r--):所有者は読み書きでき、ほかの利用者は読むだけです。
  • ディレクトリと実行するプログラム → 755rwxr-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 ビットを 644755 にリセットするのではなく、ビットを足して既存の書き込み権限を残すだけです。基本 rwx ビットを種類ごとに設定したいなら、種類ごとの方法を使います。記号モードが最終的に何になるかは、chmod 計算機で確認できます。

よく使うモード

ファイル

モード記号表記用途
644rw-r--r--ソース、文書、通常の設定、静的資産
600rw-------SSH 秘密鍵、.env、認証情報
640rw-r-----所有者が書き、特定グループが読む
664rw-rw-r--同じグループで共同編集するファイル
755rwxr-xr-x誰でも実行できるスクリプトやバイナリ
700rwx------所有者だけが実行する私用スクリプト

ディレクトリ

モード記号表記用途
755rwxr-xr-x一般的なディレクトリ
700rwx------私用ディレクトリ。例:~/.ssh
750rwxr-x---所有者とグループだけが利用
775rwxrwxr-xグループで書き込む共有ディレクトリ

考え方は、よく使う基準から始めて意図的に調整することです。自分だけなら 600700、グループに読ませるなら 640750、グループにも書かせるなら、意図してグループ書き込みを足す 664775 を検討します。777 を使いたくなったら、先に所有者や親ディレクトリを疑ってください。

既定値を決める umask

新しいファイルが 644、新しいディレクトリが 755 になりやすいのは umask のためです。既定 ACL がない通常の作成では、プログラムは一般にファイルへ 666、ディレクトリへ 777 を要求し、umask が不要なビットを外します。よく使われる 022 は group と other の書き込みを外します。

  • 新規ファイル:666 から 022 を除く → 644
  • 新規ディレクトリ:777 から 022 を除く → 755

厳密には umask は引き算ではなくビットマスクで、カーネルが計算するのは 666 & ~022 です。日常的な値では引き算と同じ結果になりますが、023 のような値では違います。666 & ~023644 のままで、引き算なら 643 になってしまいます。

新規ファイルに実行ビットがないのも同じ理由です。出発点の 666x がなく、umask は権限を足せません。実行可能にしたいときだけ chmod +x を明示します。

共同開発環境では umask 002 を使い、グループ書き込みを残すことがあります。

  • 新規ファイル:666 から 002 を除く → 664
  • 新規ディレクトリ:777 から 002 を除く → 775

計算機の umask モードで結果を確認できます。umask は新規項目だけに効き、既存のファイルを書き換えるものではありません。

共有ディレクトリでは 775 だけでは不十分なことがあります。新規項目は作成者の主グループに属するため、同僚が編集できない場合があるからです。ディレクトリを 2775 にして setgid を付けると、新規項目はディレクトリのグループを継承します。ただし setgid が決めるのはグループだけです。新しいファイルにグループ書き込みを残すには、002 のような umask、または適切な既定 ACL も必要です。

迷ったときの順番

  1. ファイルかディレクトリか。 ファイルは 644、ディレクトリは 755 から考えます。
  2. 実行する必要があるか。 スクリプトやバイナリは 755、私用なら 700 です。
  3. 誰が使うか。 自分だけなら 600700、グループに読ませるなら 640750、書かせるなら 664775 です。
  4. 再帰的に変えるか。 混在ツリーへ単一の数値モードを再帰適用しません。型ごとに分けるか、読み取り範囲が広がることを確認してから chmod -R a+rX を使います。
  5. 777 を打ちたくなったか。 所有者、親ディレクトリ、マウント設定を先に確認します。

ファイルとディレクトリを区別できれば、後はかなり判断しやすくなります。八進数と rwxr-xr-x を並べて確かめたいときや、umask の結果を見たいときは、chmod 計算機が便利です。なお、モードを正しく設定してもファイルが開けない・実行できない場合、原因はモードではありません。所有権、親ディレクトリ、その下の層をたどることになります。その手順はchmod しても Permission denied のまま?で扱っています。