てぶら

chmod 755と644の違いとは?パーミッションの数字の意味と使い分け

公開日:

サーバーにファイルを置いたりスクリプトを書いたりすると、「chmod 755」「chmod 644」といったコマンドをよく目にします。何となく使っていても、なぜその数字なのか、どちらをどの場面で使うべきかを説明するのは意外と難しいものです。この記事では、パーミッションの数字の意味から、755と644の使い分け、600や777を使う場面と避けるべき理由までを解説します。

パーミッションの基本: 3者×3種類の権限

LinuxやmacOSなどUnix系OSのファイルとディレクトリには、所有者(user)・グループ(group)・その他(other)の3者それぞれに、読み取り(r)・書き込み(w)・実行(x)の3種類の権限が設定されています。ls -l で表示される左端の文字列がその設定です。

text
$ ls -l
-rw-r--r--  1 alice staff  1024 10月  3 10:00 index.html
-rwxr-xr-x  1 alice staff   512 10月  3 10:00 deploy.sh
drwxr-xr-x  2 alice staff  4096 10月  3 10:00 images

先頭の1文字はファイルの種類(- は通常のファイル、d はディレクトリ)で、続く9文字が3文字ずつ所有者・グループ・その他の権限を表します。「-」はその権限がないことを意味します。

数字の計算方法: r=4・w=2・x=1

chmodの数字は、r=4・w=2・x=1 を足した値を、所有者・グループ・その他の順に3桁並べたものです。各桁は0〜7の値で、8進数として扱われます。

  • 7 = 4+2+1 → rwx(読み取り・書き込み・実行)
  • 6 = 4+2 → rw-(読み取り・書き込み)
  • 5 = 4+1 → r-x(読み取り・実行)
  • 4 → r--(読み取りのみ)
  • 0 → ---(権限なし)

つまり755は「所有者が rwx、グループとその他が r-x」で rwxr-xr-x、644は「所有者が rw-、グループとその他が r--」で rw-r--r-- です。どちらも所有者だけが書き込めて他のユーザーは読み取れる設定で、違いは実行権限(x)が付いているかどうかです。

ファイルは644、ディレクトリは755にする理由

HTML・画像・設定ファイルなどの通常のファイルは、所有者だけが編集でき、他のユーザーやWebサーバーのプロセスは読み取れればよいので644が基本です。シェルスクリプトなど、直接実行するファイルだけを755にします。なお bash deploy.sh のようにインタプリタに渡して実行する場合は、ファイル自体に実行権限がなくても動きます。

ディレクトリでは、各権限の意味がファイルと少し異なります。

  • r(読み取り): ディレクトリ内のファイル名の一覧を取得できる
  • w(書き込み): ディレクトリ内にファイルを作成・削除・名前変更できる(x も必要)
  • x(実行): ディレクトリに入る(cd する)、中のファイルに名前でアクセスする

ディレクトリの x がないと、中のファイルが644でも読めません。そのため他のユーザーにも中身を見せたいディレクトリは755にするのが一般的です。また、ファイルを削除できるかどうかはファイル自身の権限ではなく、置かれているディレクトリの書き込み権限(と x)で決まります。ただし、スティッキービットが付いたディレクトリ(後述の /tmp など)では、書き込み権限があっても他人のファイルは削除できません。

既存のディレクトリをまとめて「ディレクトリは755、ファイルは644」にそろえるには、find を使うか、記号モードの大文字 X を使います。chmod -R 644 をディレクトリに実行すると、ディレクトリの x まで外れて中に入れなくなるので注意してください。

bash
# ディレクトリは755、ファイルは644にそろえる
find ./public -type d -exec chmod 755 {} +
find ./public -type f -exec chmod 644 {} +

# X は「ディレクトリ」と「すでに誰かに実行権限があるファイル」にだけ x を付ける
chmod -R u=rwX,go=rX ./public

600・700はどんなときに使う?

パスワードや秘密鍵など、所有者以外に読まれては困るファイルには600(rw-------)、所有者だけが使うディレクトリには700(rwx------)を使います。代表的な例がSSHの設定です。

bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519      # 秘密鍵
chmod 644 ~/.ssh/id_ed25519.pub  # 公開鍵
chmod 600 ~/.ssh/authorized_keys

OpenSSHのクライアントは、秘密鍵にグループやその他のユーザーの権限が1つでも付いていると(読み取りに限らず、書き込みや実行も含みます)「UNPROTECTED PRIVATE KEY FILE!」という警告を出し、その鍵を使いません。接続先のサーバーでも、ホームディレクトリや ~/.ssh、authorized_keys に他のユーザーの書き込み権限があると、設定(StrictModes)によっては公開鍵認証が拒否されます。鍵認証がうまくいかないときは、まずパーミッションを確認しましょう。書き換える必要のない鍵ファイルには、400(r--------)を使うこともあります。

777が危険な理由

777(rwxrwxrwx)は、そのサーバーのすべてのユーザーが読み書き・実行できる設定です。「権限エラーが出たので777にしたら動いた」という対処はよく見かけますが、他のユーザーや、脆弱性を突かれて乗っ取られたプロセスからもファイルを書き換えられる状態になります。Webサーバーで公開しているディレクトリが777だと、不正なスクリプトを置かれる危険が高まります。

権限エラーの多くは、ファイルの所有者やグループが、Webサーバーやアプリの実行ユーザーと合っていないことが原因です。777にする前に ls -l で所有者を確認し、chown で所有者を変えるか、グループに書き込み権限を与える(775・664など)方法を検討しましょう。

なお /tmp が drwxrwxrwt(1777)になっているように、誰でも書き込める共有ディレクトリには、他人のファイルを削除できないようにするスティッキービット(t)を付けるのが一般的です。

umask: 新しいファイルが644になる理由

新しく作ったファイルが最初から644、ディレクトリが755になっていることが多いのは、umaskの働きです。ファイルは666、ディレクトリは777を基準に、umaskで指定したビットを取り除いた値が初期のパーミッションになります。多くの環境の既定値である umask 022 では、ファイルが644、ディレクトリが755です(umask 002 なら664と775)。

umaskは引き算ではなく「ビットを落とす」処理である点に注意してください。例えば umask 033 の場合、666から033を引くと633になりそうですが、もともと付いていない実行ビットを落としても変わらないため、実際には644になります。

記号モードと特殊ビット

数字で全体を指定する代わりに、記号で「誰に」「何を」「追加・削除・設定」するかを指定することもできます。u(所有者)・g(グループ)・o(その他)・a(全員)と、+(追加)・-(削除)・=(設定)を組み合わせます。他の権限はそのままで実行権限だけ付けたい、といった部分的な変更に便利です。

bash
chmod u+x deploy.sh          # 所有者に実行権限を追加
chmod go-w config.yml        # グループとその他から書き込み権限を削除
chmod u=rwx,go=rx deploy.sh  # 755 と同じ

4桁で指定するときの先頭の桁は特殊ビットで、setuid(4000)・setgid(2000)・スティッキービット(1000)を表します。setuidは /usr/bin/passwd のように実行時にファイル所有者の権限で動くプログラムに、setgidはディレクトリに付けて、中に作ったファイルにそのディレクトリのグループを引き継がせる用途によく使われます。ただし、GNU coreutilsのchmodではディレクトリのsetgidが3桁の数値指定では外れないなど、細かな挙動はOSによって異なることがあります。

このサイトのchmod計算機では、チェックボックスで権限を選ぶと8進数と rwxr-xr-x 形式が連動して変わり、ls -l の出力を貼り付けて数字に直すこともできます。数値・記号それぞれのchmodコマンドもそのままコピーできます。

関連ツール