chmod の数値表記を理屈で読めるようにする:755 や 644 の中身

約7分

chmod 755 のような数値表記は、Unix 系システムを触っていれば必ず登場します。意味を都度調べているといつまでも頭に入らないタイプの記号でもあるので、本記事では chmod の数値の中身を理屈で整理します。

権限は3グループ × 3種類の9ビット

ファイルやディレクトリの権限は、誰が何ができるかの組み合わせで表現されます。

誰が(3グループ)

  • 所有者(user, owner)
  • グループ(group)
  • その他(other, world)

何ができるか(3種類)

  • 読み(read, r
  • 書き(write, w
  • 実行(execute, x

3グループ × 3種類 = 9ビットで、これがファイル権限の基本構造です。ls -l で表示される -rwxr-xr-x の9文字(先頭のファイル種別を除く)はこれを表しています:

-rwxr-xr-x
 ├─┤├─┤├─┤
 │  │  └── その他: r-x(読み・実行可)
 │  └───── グループ: r-x(読み・実行可)
 └──────── 所有者: rwx(読み・書き・実行可)

数値表記:3桁8進数

各グループの権限を 3 bit にまとめると、0〜7 の範囲になります:

2進数8進数表記意味
0000---何もできない
0011—x実行のみ
0102-w-書き込みのみ
0113-wx書き込み + 実行
1004r—読みのみ
1015r-x読み + 実行
1106rw-読み + 書き込み
1117rwx読み + 書き込み + 実行

r = 4、w = 2、x = 1 と覚えれば、足し算で各桁を計算できます:

  • rwx = 4 + 2 + 1 = 7
  • r-x = 4 + 0 + 1 = 5
  • rw- = 4 + 2 + 0 = 6
  • r-- = 4 + 0 + 0 = 4

定番の値の意味

実務でよく使う組み合わせ:

数値表記用途
755rwxr-xr-x実行可能ファイル(CGI / スクリプト)、ディレクトリ
644rw-r—r—一般のテキストファイル、設定ファイル
700rwx------所有者のみアクセス可(秘密鍵など)
600rw-------所有者のみ読み書き(SSH 秘密鍵の必須権限)
777rwxrwxrwx全員すべて可(ほぼ間違い、セキュリティ上避ける)
666rw-rw-rw-全員読み書き可(あまり使わない)

なぜ 644 がデフォルトなのか

新規ファイル作成時のデフォルト権限は、666 から umask を引いた値で決まります。多くのシステムで umask は 022 なので:

666 - 022 = 644

ディレクトリは 777 から umask を引いた値で:

777 - 022 = 755

これで一般ファイルが 644、ディレクトリが 755 という組み合わせが生まれます。

700 / 600 が必須の場面:SSH

SSH の秘密鍵ファイル(~/.ssh/id_rsa など)は、所有者以外が読めると ssh が読み込みを拒否します。これは秘密鍵の流出を防ぐための仕様です:

$ ssh -i ~/.ssh/id_rsa user@host
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/user/.ssh/id_rsa' are too open.

chmod 600 ~/.ssh/id_rsa に修正する必要があります。

ディレクトリの x の特殊な意味

ファイルの x は「実行可能」ですが、ディレクトリの x は「そのディレクトリに入れる(cd できる、配下のファイルにアクセスできる)」という意味になります。

  • r-- のディレクトリ:中身を ls できるが、配下のファイルにはアクセスできない
  • --x のディレクトリ:ls はできないが、ファイル名を直接指定すればアクセスできる
  • r-x のディレクトリ:両方できる(標準的な状態)

ディレクトリは x が無いと事実上使えないので、ディレクトリには必ず x を付ける、と覚えておきます。

特殊権限:4桁目

chmod 4755 のように4桁を指定する場合、先頭の桁は特殊権限を表します。

名前意味
4setuid (suid)実行時に所有者の権限で動作
2setgid (sgid)実行時に所有者グループの権限で動作
1sticky bitディレクトリで「自分のファイルしか削除できない」

組み合わせて 7(4+2+1)まで表現できます。

setuid の典型例:/usr/bin/passwd

passwd コマンドはユーザー自身がパスワードを変更するコマンドで、/etc/shadow に書き込む必要があります。/etc/shadow は root しか書けないので、普通のユーザーが passwd を実行しても権限不足になるはず——ところが setuid が立っているため、実行中だけ root 権限になります。

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root ... /usr/bin/passwd
   ↑
   setuid が立っている(s が見える)

setuid を悪意のあるバイナリに付けると root 権限を奪取される脆弱性になるので、信頼できないバイナリには絶対に setuid を付けないことが重要です。

sticky bit の典型例:/tmp

/tmp は誰でも書き込み可能なディレクトリですが、他人のファイルを勝手に削除されると困ります。sticky bit を立てると「そのディレクトリ内のファイルは所有者だけが削除できる」というルールが追加されます。

$ ls -ld /tmp
drwxrwxrwt 22 root root ... /tmp
         ↑
         sticky bit が立っている(t が見える)

chmod の記号表記との対応

数値表記以外に、chmod u+x file のような記号表記もあります:

  • u(user)/ g(group)/ o(other)/ a(all)
  • + 追加 / - 削除 / = 設定
  • r / w / x
chmod u+x file        # 所有者に実行権限を追加
chmod go-w file       # グループとその他から書き込み権限を削除
chmod a=r file        # 全員に読みのみ設定

数値表記は「何にする」、記号表記は「何を変える」を表現するのに向いています。複数のファイルに一括で「実行可能を付け足す」ような操作は記号表記のほうが書きやすく、新規にパーミッションを設定するなら数値表記のほうが明示的です。

まとめ

  • r=4, w=2, x=1 の足し算で各桁が決まる
  • 3桁の数値は「所有者・グループ・その他」の順
  • 一般ファイル 644、ディレクトリ 755、秘密鍵 600 を覚える
  • 4桁目は setuid / setgid / sticky bit

数値と記号、または rwx 表記の対応を即座に確認したいときは、本サイトの chmod 計算機にチェックボックスや数値を入力すると、3つの表記が同時に表示されます。記号表記しか覚えていない人にも、数値しか覚えていない人にも便利です。