- 技術 💻
chmodの755と644の意味|用途別パーミッション早見表
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期連続の黒字決算。