
chmod 755 / 644 / 600 完全ガイド — setuid と sticky の罠まで一気に理解する
Linux で chmod 755 script.sh や chmod 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 の一次資料で押さえます。
基本構造 ― 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) | シンボリック | 意味 |
|---|---|---|---|
| 7 | 111 | rwx | 読 + 書 + 実 |
| 6 | 110 | rw- | 読 + 書 |
| 5 | 101 | r-x | 読 + 実 |
| 4 | 100 | r-- | 読のみ |
| 3 | 011 | -wx | 書 + 実 |
| 2 | 010 | -w- | 書のみ (実用ほぼ無し) |
| 1 | 001 | --x | 実のみ |
| 0 | 000 | --- | 無権限 |
よく使う 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:
rwx/ssetuid・setgid /tsticky /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の設定要求が無視される場合もあるため、 適用後はstatやls -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.sh や git 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 にしておけば動く」 で済ませず、 必要最小限の権限 (= 最小権限の原則) を選ぶ習慣をつけると、 後から起きる事故の多くを未然に防げます。
参考文献・ソース
- The Open Group - POSIX.1-2024 chmod ↗
- GNU coreutils - chmod invocation ↗
- GNU coreutils - Setting Permissions ↗
- GNU coreutils - Directory Setuid and Setgid ↗
- Linux man-pages ― chmod(2) システムコール (パーミッションビット定義) ↗
- Linux man-pages - capabilities(7) ↗
- The Open Group - POSIX.1-2024 open() ↗
- Filesystem Hierarchy Standard 3.0 - /tmp ↗
- OpenSSH ssh(1) - FILES ↗
- OpenSSH sshd_config(5) - StrictModes ↗
記事作成に関する注記
本記事は AI(大規模言語モデル)を編集補助として活用して作成しています。 公開前に編集者が内容を確認していますが、事実誤認・仕様の解釈ミス・最新情報との齟齬が含まれる可能性があります。 重要な判断を行う際は、本文中の一次ソースや公式ドキュメントを必ずご自身でご確認ください。 誤りにお気づきの場合は、お問い合わせフォームよりご連絡いただけると助かります。




