chmodの755は「所有者は読み・書き・実行ができ、グループとその他のユーザーは読み・実行だけできる」、644は「所有者は読み・書きができ、グループとその他のユーザーは読むだけ」という設定です。一般に、ディレクトリと実行するスクリプトには755、それ以外の普通のファイルには644を使います。

この記事では、数字の読み方と計算方法から、ファイルとディレクトリでrwxの意味が違うこと、SSH鍵・.env・Webサーバーなどの用途別の推奨値、chmod -R でよくある失敗、そして「Permission denied」が出たときの切り分けまでを解説します。

755・644の読み方

パーミッションの3桁の数字は、左から所有者(user)・グループ(group)・その他(other)の権限を表します。各桁は、次の3つの数字の合計です。

権限 記号 数字
読み取り(read) r 4
書き込み(write) w 2
実行(execute) x 1
  • 7 = 4+2+1 = rwx(読み・書き・実行)
  • 6 = 4+2 = rw-(読み・書き)
  • 5 = 4+1 = r-x(読み・実行)
  • 4 = r--(読み取りのみ)
  • 0 = ---(権限なし)

つまり、755 = rwxr-xr-x、644 = rw-r--r-- です。

数字と記号の対応一覧

数字 記号 よく使う場面
755 rwxr-xr-x ディレクトリ、実行するスクリプト
644 rw-r--r-- 一般的なファイル(HTML・画像・設定ファイル)
700 rwx------ 本人しか入れないディレクトリ(~/.ssh)
600 rw------- 本人しか読めないファイル(秘密鍵・.env)
750 rwxr-x--- 同じグループだけ入れるディレクトリ
640 rw-r----- 同じグループだけ読めるファイル
775 rwxrwxr-x グループで共同編集するディレクトリ
664 rw-rw-r-- グループで共同編集するファイル
400 r-------- 本人も書き換えない読み取り専用ファイル
777 rwxrwxrwx 全員が何でもできる(原則使わない)

ls -lでパーミッションを確認する

$ ls -l
-rw-r--r-- 1 alice staff  1024 Sep 27 10:00 index.html
drwxr-xr-x 2 alice staff  4096 Sep 27 10:00 images
-rwxr-xr-x 1 alice staff   512 Sep 27 10:00 deploy.sh
lrwxrwxrwx 1 alice staff    10 Sep 27 10:00 current -> releases/3

先頭の10文字のうち、1文字目は種類、残り9文字が権限です。

  • - 通常のファイル d ディレクトリ l シンボリックリンク
  • 続く3文字ずつが、所有者・グループ・その他の権限
  • 3列目(alice)が所有者、4列目(staff)がグループ

権限の末尾に + が付いている場合はACL(後述)が、. が付いている場合はSELinuxのラベルが設定されています。

数字で確認したいときは stat が便利です。

$ stat -c '%a %n' *        # Linux
644 index.html
755 images
$ stat -f '%Lp %N' *       # macOS

ファイルとディレクトリでは、rwxの意味が違う

ここが、パーミッションで最も誤解されやすい点です。

権限 ファイルの場合 ディレクトリの場合
r(読み取り) 中身を読める 中のファイル名の一覧を見られる(ls)
w(書き込み) 中身を書き換えられる 中にファイルを作成・削除・名前変更できる
x(実行) プログラムとして実行できる 中に入れる(cd)・中のファイルにアクセスできる

ここから、次のような実務上のポイントが導かれます。

  • ディレクトリにxがないと、中のファイルが644でも読めない。 だからディレクトリは755(または750・700)にします
  • ファイルを削除できるかどうかは、ファイルではなく親ディレクトリのw(とx)で決まる。 ファイルが400でも、親ディレクトリに書き込み権限があれば削除できます
  • ディレクトリにrだけあってxがないと、ファイル名の一覧は見えても中身にはアクセスできません
  • ディレクトリにxだけあってrがないと、一覧は見えませんが、名前を知っているファイルにはアクセスできます

chmodの使い方:数字指定と記号指定

数字で指定する

chmod 644 index.html
chmod 755 deploy.sh
chmod 600 ~/.ssh/id_ed25519

3桁すべてをまとめて設定し直します。最終的な状態をはっきり決めたいときに向いています。

記号で指定する

chmod u+x deploy.sh     # 所有者に実行権限を追加
chmod g-w config.yml    # グループの書き込み権限を削除
chmod o= secret.txt     # その他の権限をすべて削除
chmod a+r README.md     # 全員に読み取り権限を追加
chmod u=rw,go=r memo.txt  # 644と同じ
  • 対象:u(所有者)・g(グループ)・o(その他)・a(全員)
  • 操作:+(追加)・-(削除)・=(その値にする)

記号指定は、今の権限を保ったまま、一部だけ変えたいときに便利です。chmod +x のように対象を省略すると、umask(後述)で禁止されていない範囲に追加されます。

用途別パーミッション早見表

実務でよく使う設定をまとめました。所有者は、そのファイルを使うユーザー(またはアプリの実行ユーザー)である前提です。

対象 推奨値 理由
~/.ssh ディレクトリ 700 本人以外に中を見せない
SSH秘密鍵(id_ed25519・id_rsa) 600 他人が読めるとSSHが使用を拒否する
SSH公開鍵(.pub) 644 公開してよい情報
~/.ssh/authorized_keys 600 他人が書き換えられると不正ログインの入口になる
~/.ssh/config 600 他人が書き込めるとSSHが読み込みを拒否する
AWSなどクラウドの鍵ファイル(.pem) 400 本人の読み取りのみ
.env・APIキー・DBパスワードを含む設定 600(アプリと別ユーザーで共有するなら640) 秘密情報は本人(とアプリのグループ)だけ
実行するシェルスクリプト 755(本人しか使わないなら700) 実行権限が必要
cronで実行するスクリプト 755または700 実行ユーザーにxが必要
一般的な設定ファイル(秘密情報なし) 644 読めればよい
Webの公開ディレクトリ 755 Webサーバーが中に入れる必要がある
HTML・CSS・JS・画像 644 Webサーバーが読めればよい
WordPressのwp-config.php 600・640・440など DBパスワードを含むため、Webサーバーが読める最小限に
アップロード用ディレクトリ 755(所有者をWebサーバーのユーザーに) 777にせず、所有者で解決する
ログファイル 640 閲覧はグループまで
チームの共有ディレクトリ 2775(setgid付き) 作ったファイルのグループを揃える(後述)

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「chmodの755と644の意味|用途別パーミッション早見表」

迷ったら「ディレクトリは755、ファイルは644、秘密情報は600」を基本にし、そこから必要な分だけ広げるか狭めるかを考えます。

SSH鍵のパーミッションエラーと対処

秘密鍵の権限が広すぎると、SSHは鍵の使用を拒否します。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/alice/.ssh/id_ed25519' are too open.

対処は、権限を本人のみに絞ることです。

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys ~/.ssh/config

サーバー側で公開鍵認証が通らないときは、サーバーの ~/.ssh・authorized_keys、さらにホームディレクトリ自体がグループやその他から書き込み可能になっていないかも確認します。sshdは標準設定(StrictModes)で、これらが緩いと鍵を無視します。

WindowsのファイルシステムをWSLからマウントした場所(/mnt/c 配下)では、chmodが反映されないことがあります。鍵はWSL側のホームディレクトリに置くのが確実です。

chmod -R でよくある失敗と、正しいやり方

-R を付けると、ディレクトリの中身すべてに再帰的に適用されます。ここに典型的な失敗があります。

chmod -R 644 /var/www/html   # × ディレクトリまで644になり、中に入れなくなる
chmod -R 755 /var/www/html   # △ すべてのファイルに実行権限が付く

ファイルとディレクトリで適切な値が違うため、findで分けて設定します。

find /var/www/html -type d -exec chmod 755 {} +
find /var/www/html -type f -exec chmod 644 {} +

記号指定の大文字の X を使う方法もあります。X は、ディレクトリと、すでに誰かに実行権限があるファイルにだけ実行権限を付けます。

chmod -R u=rwX,go=rX /var/www/html   # ディレクトリは755、通常ファイルは644相当になる

777を使わずに解決する

「書き込めないから777にした」は、権限の問題を全員に開放して解決したことになるため、別のユーザーやWebアプリの脆弱性経由で改ざんされる入口になります。多くの場合、原因は所有者やグループが合っていないことです。

よくある状況 777の代わりの解決策
Webアプリがアップロード先に書き込めない chown で所有者をWebサーバーの実行ユーザー(www-data・nginx・apacheなど)にし、755
複数の開発者で同じディレクトリを編集したい 共通のグループを作り、chgrp でグループを設定して775(+setgid)
特定のユーザーにだけ追加で書き込みを許可したい ACL(setfacl)で個別に許可する
Dockerのボリュームで書き込めない コンテナ内の実行ユーザーのUID・GIDに合わせて所有者を設定する
sudo chown -R www-data:www-data /var/www/html/uploads
sudo chmod 755 /var/www/html/uploads

chmodは「何ができるか」、chownは「誰のものか」を変えるコマンドです。権限の問題は、この2つをセットで考えると解決しやすくなります。

umask:新しく作るファイルの初期値

新しく作ったファイルが最初から644になるのは、umaskという「初期値から取り除く権限」の設定によるものです。

$ umask
0022
  • ファイルの基準値666 から 022 を取り除く → 644
  • ディレクトリの基準値777 から 022 を取り除く → 755
  • umaskが002なら、ファイルは664、ディレクトリは775になる(グループで書き込める)

「新しく作ったファイルだけ権限が違う」ときは、umaskの設定(シェルの設定ファイル、systemdのサービス設定の UMask= など)を確認します。

特殊なパーミッション:4桁の数字

chmod 2775 のように4桁で指定すると、先頭の1桁で特殊な権限を設定できます。

数字 名前 効果 代表例
4000 setuid 実行時に、ファイルの所有者の権限で動く /usr/bin/passwd(-rwsr-xr-x)
2000 setgid ディレクトリに付けると、中で作ったファイルのグループが親ディレクトリと同じになる チームの共有ディレクトリ
1000 スティッキービット ディレクトリ内のファイルを、所有者しか削除できなくなる /tmp(drwxrwxrwt)

setuidは強力な権限なので、自作のスクリプトに付けることはまずありません。実務でよく使うのは、共有ディレクトリのsetgid(2775)です。

「Permission denied」が出たときの切り分け

権限エラーは、次の順番で確認すると原因を特定しやすくなります。

▶ 1. 誰として実行しているか

whoami
id        # 所属グループも表示される

cronやWebサーバー、systemdのサービスは、ログインしている自分とは別のユーザーで動いていることがよくあります。

▶ 2. パスの途中のディレクトリまで含めて確認する

namei -l /var/www/html/uploads/photo.jpg

namei -l は、パスの途中にあるすべてのディレクトリの権限を一覧表示します。ファイル自体が644でも、途中のディレクトリにxがなければアクセスできません。

▶ 3. スクリプトの実行で出る場合

$ ./deploy.sh
bash: ./deploy.sh: Permission denied

実行権限がないのが原因なので、chmod +x deploy.sh を実行します(bash deploy.sh のように、シェルに読ませる形なら実行権限なしでも動きます)。

実行権限があるのに動かない場合は、ファイルシステムが noexec でマウントされていないか(mount | grep noexec)も確認します。

▶ 4. 権限が正しいのに拒否される場合

SELinuxやAppArmorといった仕組みが、パーミッションとは別にアクセスを制限していることがあります。ls -Z でSELinuxのラベルを確認し、ログ(/var/log/audit/audit.log など)を見て判断します。

ACL:特定のユーザーだけに権限を追加する

所有者・グループ・その他の3区分では表現できないときは、ACLを使います。

setfacl -m u:bob:rw report.csv   # bobにだけ読み書きを許可
getfacl report.csv               # ACLの確認
setfacl -x u:bob report.csv      # bobのACLを削除

ACLが設定されたファイルは、ls -l で権限の末尾に + が付きます。

Gitとパーミッション

Gitは、ファイルのパーミッションのうち実行権限の有無だけを記録します(644相当か755相当か)。

git update-index --chmod=+x deploy.sh   # Gitに実行権限付きとして登録する
git config core.fileMode false          # 権限の変更を差分として扱わない

Windowsで開発したスクリプトをLinuxで動かすと実行権限がない、という場合は、git update-index --chmod=+x でリポジトリ側に記録しておくと、チーム全員の環境で揃います。

よくある質問

Q. 755と775の違いは何ですか? A. グループに書き込み権限があるかどうかです。775は同じグループのメンバーも中にファイルを作成・削除できます。複数人で共同作業するディレクトリで使います。

Q. chmodの変更はすぐに反映されますか? A. 反映されます。再起動は不要です。ただし、すでにファイルを開いているプロセスには、次に開き直すまで影響しないことがあります。

Q. sudoで実行すれば権限は関係ないのでは? A. rootはほとんどの権限チェックを通過しますが、sudoで作ったファイルはrootの所有になり、あとから通常のユーザーやアプリが書き込めなくなる原因になります。必要な場面に限って使い、作成したファイルの所有者を確認しましょう。

Q. シンボリックリンクにchmodするとどうなりますか? A. リンク自体ではなく、リンク先のファイルの権限が変わります。シンボリックリンクの権限表示は常に rwxrwxrwx で、実際の権限はリンク先で決まります。

Q. 0755のように先頭に0を付けるのは何ですか? A. 4桁目(特殊な権限)が0、つまりsetuid・setgid・スティッキービットなしという意味です。755と同じ設定になります。

まとめ

  • 755はrwxr-xr-x、644はrw-r--r--。r=4・w=2・x=1の合計で表す
  • ディレクトリのxは「中に入れる」。ディレクトリを644にすると中のファイルにアクセスできない
  • 基本はディレクトリ755・ファイル644・秘密情報600・~/.ssh 700
  • chmod -R は、findでファイルとディレクトリを分けるか、大文字のXを使う
  • 書き込めないときは777ではなく、chownで所有者を合わせる
  • Permission deniedは、実行ユーザー → namei -l でパスの途中 → 実行権限・noexec → SELinuxの順に確認する

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「chmodの755と644の意味|用途別パーミッション早見表」

株式会社RJCでは、保険・金融・決済などのシステムの開発・運用に携わっています。パーミッションのような基本の設定を、理由とセットで理解しておくことが、安全に動くシステムの土台になると考えています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。未経験からエンジニアに育てるのが得意な会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?