chmod 755 / 644 / 600 完全ガイド — setuid と sticky の罠まで一気に理解する
DDEVELOPER
開発(更新: 2026-08-19)11 分で読める

chmod 755 / 644 / 600 完全ガイド — setuid と sticky の罠まで一気に理解する

Linux で chmod 755 script.shchmod 600 ~/.ssh/id_rsa を、 なんとなく覚えて打っていませんか? この 3 桁 (または 4 桁) の 8 進数には明快な構造があり、 一度仕組みが分かると暗記不要で使い分けできます。 本記事では、 「4=read / 2=write / 1=execute」 の合算ルールから始め、 シンボリック表記 (rwxr-xr-x) との対応、 setuid / setgid / sticky の特殊ビット、 そして「SSH 秘密鍵の group / other に権限があると OpenSSH に拒否される」 「/tmp が 1777 になっている」 「shell script の setuid に権限設計を依存できない」 といった頻出パターンを、 POSIX.1-2024、 GNU chmod、 OpenSSH の一次資料で押さえます。

#chmod#パーミッション#Linux#Unix#setuid#sticky#POSIX

基本構造 ― 3 桁 8 進数の各桁は「所有者 / グループ / その他」

Linux/Unix のファイルパーミッションは 3 つのアクター × 3 種類の権限 = 9 ビットで表します。 3 アクターは:

  • u (user / owner) ― ファイルの所有者
  • g (group) ― ファイルが属するグループのメンバー
  • o (other) ― それ以外の全員

3 権限は:

  • r (read, 値 4) ― ファイルなら内容を読める、 dir なら ls で中身を一覧できる
  • w (write, 値 2) ― ファイルなら書き換えできる、 dir なら項目を追加・削除する権限に関係する (名前へアクセスするため通常はx権限も必要。 ファイル自身の権限とは別)
  • x (execute, 値 1) ― ファイルなら実行できる、 dir なら cd で中に入れる (一覧は r が別途必要)

3 つの値 (4 + 2 + 1) を足し算するだけで、 各アクターの権限が 0〜7 の 1 桁 8 進数で表せます。 これを 3 つ並べた 3 桁 8 進数が「755」 等のお馴染みの表記です。

桁の値 2 進 (rwx) シンボリック 意味
7111rwx読 + 書 + 実
6110rw-読 + 書
5101r-x読 + 実
4100r--読のみ
3011-wx書 + 実
2010-w-書のみ (実用ほぼ無し)
1001--x実のみ
0000---無権限

よく使う 8 進数の意味 ― 755 / 644 / 600 / 700

覚えるべきは結局この 4〜5 パターンです。

8 進 シンボリック 用途
755 rwxr-xr-x 実行ファイル・ディレクトリでよく使う例。 所有者は全権、 他は読み取り + 実行 (ディレクトリでは検索・通過)
644 rw-r--r-- 一般ファイルでよく使う例。 所有者は読み書き、 他は read のみ
600 rw------- 所有者専用ファイル。 SSH 秘密鍵 (~/.ssh/id_rsa) / API キー / .env
700 rwx------ 所有者専用ディレクトリ。 ~/.ssh / GnuPG ホームディレクトリ
444 r--r--r-- 全員の書込ビットを外す例。 所有者や特権ユーザーがモードを変更できるため、 不変化するロックではない
777 rwxrwxrwx 全員にrwxを付与する値。 共有用途でもstickyや所有者設計を含め、 必要性を確認

新規作成時は、 作成するプログラムが要求したモードをプロセスの umask で制限します。 たとえばプログラムが通常ファイルに 0666、 ディレクトリに 0777 を要求し、 umask が 0022 なら、 通常は 0644 / 0755 になります。 0666 / 0777 は chmod の基準値ではなく作成側の要求例で、 POSIX ACLなどが最終モードに影響する環境もあります:

# umask 022 のとき
ファイル: 666 & ~022 = 644 (rw-r--r--)
dir:      777 & ~022 = 755 (rwxr-xr-x)

# umask 002 のとき (グループ共有環境でよく見る)
ファイル: 666 & ~002 = 664 (rw-rw-r--)
dir:      777 & ~002 = 775 (rwxrwxr-x)

シンボリック表記 ― u=rwx,g=rx,o=rx

POSIX 標準は 8 進と並んで シンボリックの構文も定義しています。 1つ以上のwho (u/g/o/a)、 演算子 (+/-/=)、 権限文字を組み合わせ、 複数の操作はカンマで区切ります。 GNU chmodでは r/w/x/X/s/t のほか、 u/g/oで別クラスの権限をコピーできます:

chmod u=rwx,g=rx,o=rx,u-s,g-s,o-t file  # 特殊ビットも含め0755を明示
chmod u+x script.sh             # 所有者だけ実行権を追加
chmod -R go-w /path             # group + other から書き権限を一括除去
chmod a+r file                  # 全員 (all = ugo) に読み権限

記号と意味:

  • who: u 所有者 / g グループ / o その他 / a = ugo
  • op: + 追加 / - 除去 / = 完全置き換え
  • perm: r w x / s setuid・setgid / t sticky / X 対象がディレクトリ、 またはいずれかのクラスにxがある場合だけxを追加 (再帰的 chmod で便利)

シンボリックは「変更したい場所だけ触る」 のが強み。 「サーバー上の特定ファイルから書き権限だけ消したい」 のような部分修正は chmod go-w の方が安全で意図が明確になります。 数値指定は通常権限の目標値を簡潔に表せますが、 GNU chmod はディレクトリの既存 setuid / setgid を保持する場合があるため、 特殊ビットも含めて確認してください。

特殊ビット ― setuid / setgid / sticky (4 桁目の意味)

4 桁の 8 進数 (例: 4755) を見かけたら、 先頭の桁は 特殊ビットです。 値は同じく 4+2+1 の合算:

  • setuid (値 4, 8 進 4000) ― 実行ファイルでは、 実行時のプロセスの実効ユーザーIDをファイル所有者へ設定する
  • setgid (値 2, 8 進 2000) ― 実行ファイルでは実効グループIDを所有グループへ設定し、 ディレクトリではその中に作成された新規項目が親dirのグループを継承する
  • sticky (値 1, 8 進 1000) ― ディレクトリ内の項目を削除・改名できる主体を、 項目所有者、 ディレクトリ所有者、 特権ユーザーへ制限

シンボリック表記では x の位置に s / S / t / T が現れます (小文字は x も立っている、 大文字は x が立っていない)。

表示したモードは設定意図を表しますが、 実際の適用結果を保証するものではありません。 GNU chmodでは、 通常ファイルの所有グループが実行者の実効グループまたは補助グループと一致しない場合、 適切な特権がなければsetgidが解除されます。 OSやファイルシステムの追加制約でsetuid / setgidの設定要求が無視される場合もあるため、 適用後はstatls -lで確認してください。

8 進 シンボリック 代表例
4755 rwsr-xr-x /usr/bin/passwd (一般ユーザーが /etc/shadow を書き換えるために root 権限が必要)
2755 rwxr-sr-x Git の共有リポジトリディレクトリ。 中に作るファイルが自動でリポジトリのグループになる
1777 rwxrwxrwt /tmp。 誰でも書けるが、 削除・改名できる主体を所有者などへ制限

なぜ /tmp が 1777 なのか

Filesystem Hierarchy Standardは、 一時ファイルを必要とするプログラムが /tmp を利用できることを求めていますが、 権限値を1777に固定してはいません。 多くのUnix系環境では共有一時ディレクトリを1777に設定します。 全員へrwxを与えるだけでは別ユーザーの項目を削除・改名できるため、 stickyビットを加えて、 その操作を項目所有者、 ディレクトリ所有者、 特権ユーザーへ制限する構成です。 1777はその一般的な例です。

setuid の注意点 ― 必要性と代替を検討する

setuid は強力なため、 実装と配置を慎重に扱う必要があります。 特にroot所有のsetuid実行ファイルは、 一般ユーザーのプロセスへrootの実効ユーザーIDを与える経路になり、 バグが権限昇格につながり得ます。 一律に不適切とは限りませんが、 必要な操作と攻撃面を確認し、 特権を持つ範囲を小さくします:

  • 不要なsetuid実行ファイルを置かず、 対象バイナリ、 所有者、 書込可能な主体を確認する
  • Linuxでは、 必要な操作に対応するcapabilityだけで足りるか検討する (例: setcap cap_net_bind_service+ep)
  • sudo / polkit 経由で個別承認に切り替える
  • shell script の setuid に権限設計を依存させない (多くのカーネルが無視する)

実践 ― 「弾かれる」 ファイルパーミッションの例

他者からアクセス可能な SSH 秘密鍵を OpenSSH が拒否

$ ssh -i ~/.ssh/id_rsa user@host
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/user/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.

対処: chmod 600 ~/.ssh/id_rsa (または 400 で書き換えも禁止)。 OpenSSH は秘密鍵の group / other に少しでも権限があると起動時にエラーで止まります。 シェル機能ではなく ssh(1) のセキュリティ要件です。

~/.ssh ディレクトリは 700 相当を推奨

OpenSSH の資料は、 ~/.ssh を所有者だけが読書き・実行できる 700 相当とすることを推奨していますが、 700 だけを唯一の許可値とはしていません。 サーバー側の StrictModes、 所有者、 group / other の書込権限も確認してください。

Web サーバーで実行ファイルに x が付いていない

CGI スクリプトや実行型バイナリは Web サーバープロセスから実行できる権限が必要です。 Apache/Nginx が www-data ユーザーで動いているなら、 所有者・所属グループ・other のどの権限で実行させるかを決めます。 755 は一例であり、 配置先とサービス設定に合わせて必要最小限を選びます。

git clone 後にスクリプトが動かない

Linux の git は実行ビット (x) を保存しますが、 Windows 側で clone したり ZIP 経由でコピーすると x が落ちることがあります。 chmod +x script.shgit update-index --chmod=+x script.sh で復活させます。

暗記不要に ― 仕組みで覚える

結局のところ、 8 進のパーミッションは次の 1 行で要約できます:

[特殊 1 桁] [所有者 1 桁] [グループ 1 桁] [その他 1 桁] = それぞれ 4 (read) + 2 (write) + 1 (execute) の合計

あとは、 「755 = 自分が全部、 他は読み取り + 実行 (ディレクトリでは検索・通過)」 「644 = 自分は読み書き、 他は読みのみ」 「600 = 自分専用」 という代表パターンを押さえると、 基本的なモードを読みやすくなります。 setuid・setgid・sticky を見たら、 4 桁目の「特殊操作」 だと意識してください。

頭の中で計算するのに自信がないときは chmod 計算機ツール をどうぞ。 チェックボックスで rwx を切ると 8 進・シンボリック・ugo の 3 表記が同時に更新され、 setuid / setgid / sticky の意味も画面下に表示されます。 特殊ビットの設定・解除も含むコマンド例を表示しますが、 使用前に対象パスと適用先 OS の仕様を確認してください。

パーミッション設定はサーバーセキュリティの基礎の基礎です。 「とりあえず 777 にしておけば動く」 で済ませず、 必要最小限の権限 (= 最小権限の原則) を選ぶ習慣をつけると、 後から起きる事故の多くを未然に防げます。

参考文献・ソース

記事作成に関する注記

本記事は AI(大規模言語モデル)を編集補助として活用して作成しています。 公開前に編集者が内容を確認していますが、事実誤認・仕様の解釈ミス・最新情報との齟齬が含まれる可能性があります。 重要な判断を行う際は、本文中の一次ソースや公式ドキュメントを必ずご自身でご確認ください。 誤りにお気づきの場合は、お問い合わせフォームよりご連絡いただけると助かります。

🔧 関連ツール

📚 関連記事