Unixのファイルパーミッションとchmodコマンドを求める
このchmod計算ツールは、LinuxやmacOSのファイルパーミッションを必要なあらゆる形式に変換します。所有者・グループ・その他それぞれの読み取り・書き込み・実行にチェックを入れるか、<code>755</code>のような8進数や<code>rwxr-xr-x</code>のような記号表記を入力すると、ほかの表示もすべて連動します。数値形式と記号形式の<code>chmod</code>コマンド、setuid・setgid・スティッキービット、そして誰が何をできるかのわかりやすい説明が得られます。計算はすべてブラウザー内で行われます。
chmodのパーミッションを計算する方法
- 1所有者・グループ・その他に付けたい権限にチェックを入れるか、
644のような8進数やrw-r--r--のような記号表記を入力します。ls -lの列をそのまま貼り付けることもできます(例:drwxr-sr-x)。 - 2ファイルかディレクトリを選びます。読み取り・書き込み・実行の意味はそれぞれで異なり、説明もそれに合わせて変わります。
- 3必要に応じてsetuid・setgid・スティッキービットを追加するか、755や600などのよく使うプリセットから始めます。
- 4パスを入力し、ディレクトリ全体に適用するなら再帰をオンにして、chmodコマンドをコピーします。
8進数パーミッションの仕組み
各ファイルには3組のパーミッションがあります。所有者(u)、グループ(g)、そしてそれ以外の全員であるその他(o)です。各組は読み取り・書き込み・実行の3ビットで、8進数の1桁はその合計にすぎません。読み取りが4、書き込みが2、実行が1です。つまり7はrwx(4+2+1)、6はrw-(4+2)、5はr-x(4+1)、4はr--だけを表します。
3桁で全体のモードになり、順番は所有者・グループ・その他です。したがってchmod 755は所有者にrwx、それ以外にr-xを与え、rwxr-xr-xと書きます。chmod 644は所有者にrw-、それ以外にr--を与え、rw-r--r--と書きます。先頭に4桁目を付けると特殊ビットを表し、setuidが4、setgidが2、スティッキーが1です(例:chmod 1777)。
よく使うchmodの値
- 644 (rw-r--r--)
- 通常のファイルの標準。所有者は編集でき、全員が読めます。HTML、画像、ほとんどの設定ファイルに適しています。
- 755 (rwxr-xr-x)
- ディレクトリやスクリプト、プログラムの標準。全員が読み取りと実行ができ、変更できるのは所有者だけです。
- 600 (rw-------)
- 所有者だけが読める非公開ファイル。SSH秘密鍵、.envファイル、認証情報など。他人が読める秘密鍵はsshが使用を拒否します。
- 700 (rwx------)
- ~/.sshのように、所有者だけが入れる非公開ディレクトリ。
- 664 / 775
- 644や755と同じですが、グループも書き込めます。同僚が同じグループを共有するプロジェクトフォルダー向けです。
- 777 (rwxrwxrwx)
- 誰でも読み取り・変更・実行ができます。パーミッションエラーの正しい対処になることはほとんどなく、Webサーバーではセキュリティリスクです。
- 1777 (rwxrwxrwt)
- /tmpと同じく、全員が書き込めてスティッキービット付き。誰でもファイルを作れますが、削除できるのはそのファイルの所有者だけです。
ディレクトリのパーミッション
ディレクトリでは3つの文字の意味が変わります。読み取りは中の名前の一覧表示、書き込みは中のエントリの作成・名前変更・削除、実行(検索とも呼ばれます)はcdで入ったり、名前を指定して中のファイルにアクセスしたりすることを許可します。実行がなければ読み取りや書き込みはほとんど役に立たないため、ディレクトリではrがあるところにほぼ必ずxも付けます。644ではなく755になるのはそのためです。
ファイルの削除はディレクトリへの変更であり、ファイル自体への変更ではありません。ディレクトリに書き込みと実行の権限があれば、自分が所有していない読み取り専用のファイルでも削除できます。ただし、そのディレクトリにスティッキービットがある場合は別です。
setuid・setgid・スティッキービット
記号表記では、特殊ビットは実行の文字の位置に表示されます。実行も付いていればs、付いていなければS、スティッキービットはtまたはTです。大文字は通常ミスを意味します。誰も実行できないsetuidプログラムは何もしないからです。
GNU coreutilsの癖がひとつあります。ディレクトリにchmod 755を実行しても、既存のsetuid・setgidビットは残ります。数字で消すにはchmod 00755のように5桁で書くか、chmod g-sを使います。
- Setuid (4000, u+s)
- 実行ファイルが、呼び出した人ではなく所有者の権限で実行されます。passwdはこれを使ってrootとして/etc/shadowに書き込みます。Linuxではスクリプトとディレクトリでは無視されます。
- Setgid (2000, g+s)
- 実行ファイルがグループの権限で実行されます。ディレクトリに設定すると、中に作られる新しいファイルは作成者のプライマリグループではなくディレクトリのグループを継承します。チーム共有フォルダーの一般的な設定です(2775)。
- Sticky bit (1000, +t)
- ディレクトリに設定すると、中のファイルを削除・名前変更できるのはファイルの所有者、ディレクトリの所有者、rootだけになります。現代のLinuxではファイルに対しては無視されます。
数値形式と記号形式、どちらを使う?
chmod 644 fileのような数値形式はすべてのビットを一度に設定するので、最終的な状態がわかっているときに向いています。記号形式はより柔軟です。chmod u=rw,g=r,o=r fileは同じ設定になりますが、chmod g+w fileやchmod o-rwx fileは指定したビットだけを変更し、残りはそのままにします。
chmod -Rには注意してください。ツリー内のすべてのファイルとディレクトリに同じモードを付けると、たいていファイルに不要な実行ビットが付きます。find . -type d -exec chmod 755 {} +とfind . -type f -exec chmod 644 {} +で別々に扱うか、chmod -R u=rwX,go=rXのように大文字のXを使えば、ディレクトリと元から実行可能だったファイルにだけ実行を付けられます。新しいファイルの初期パーミッションはumaskで決まり、umaskが022ならファイルは644、ディレクトリは755になります。シェルスクリプトでファイル名をマッチさせるなら、正規表現テスターを試してください。
よくある質問
- chmod 755とはどういう意味ですか?
- 755は所有者に読み取り・書き込み・実行(7)を、グループとその他に読み取りと実行(5と5)を与え、rwxr-xr-xと書きます。ディレクトリ、スクリプト、プログラムでよく使われるモードです。
- chmod 644とはどういう意味ですか?
- 644は所有者に読み取りと書き込み(6)を、それ以外には読み取りのみ(4と4)を与え、rw-r--r--と書きます。Webページ、画像、設定ファイルなどの通常のファイルでよく使われるモードです。
- 755と644の違いは何ですか?
- 755は全員に実行権限を追加します。ファイルならプログラムとして実行でき、ディレクトリなら中に入れるようになります。読み取るだけのファイルには644、ディレクトリと実行ファイルには755を使います。
- chmod 777は安全ですか?
- ほとんどの場合、安全ではありません。777はシステム上のすべてのユーザーにファイルの変更や置き換えを許し、Webサーバーでは1つのサイトから侵入した攻撃者が他のサイトまで改ざんできるおそれがあります。代わりにchownで所有者を直すか、グループにアクセス権を与えてください(775や664)。
- SSHの秘密鍵にはどのパーミッションを設定すべきですか?
- 600(rw-------)、読み取り専用なら400にし、~/.ssh自体は700にします。OpenSSHは他のユーザーが読める秘密鍵の使用を拒否し、"UNPROTECTED PRIVATE KEY FILE"と表示します。
- rwsr-xr-xのsやtは何を意味しますか?
- 所有者やグループの位置にあるsは、実行も付いた状態のsetuidまたはsetgidビットです。その他の位置にあるtはスティッキービットです。大文字のSやTは、その下の実行権限なしで特殊ビットが設定されていることを意味します。
- rwxr-xr-xを数字に変換するには?
- rwx、r-x、r-xの3組に分け、それぞれr=4、w=2、x=1を足します。7、5、5で755になります。上の記号表記の欄に入力すれば、すぐに変換できます。
- このツールはファイルを変更しますか?
- いいえ。モードとコマンドを計算するだけで、コマンドはご自身で実行します。処理はすべてブラウザー内で行われます。