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

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 計算機で確認できます。

よく使うモード

ファイル

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

ディレクトリ

モード記号表記用途
755rwxr-xr-x一般的なディレクトリ
700rwx------私用ディレクトリ。例:~/.ssh
750rwxr-x---所有者とグループだけが利用
775rwxrwxr-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 も必要です。

迷ったときの順番

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

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