3 つずつ 3 組のビット
すべての Unix ファイルは 9 個のパーミッションビットを持ち、3 個ずつ 3 組に分かれています。1 組目はファイル所有者、2 組目はファイルのグループ、3 組目はシステム上のその他すべてのユーザーに対応します。各組の 3 ビットは読み取り・書き込み・実行を意味し、それぞれ 4、2、1 の重みを持ちます。必要なビットの値を足すと 0 から 7 までの 1 桁の数になり、これがパーミッションを 3 桁の 8 進数で書く慣習の理由です。
755 のような数値もこの仕組みから来ています。所有者の桁は 7、つまり 4 + 2 + 1 なので読み取り・書き込み・実行がすべて可能です。グループとその他の桁はどちらも 5、つまり 4 + 1 なので、読み取りと実行はできても変更はできません。同じ値を記号で書くと rwxr-xr-x となり、これはまさに ls -l がファイル種別文字の後に表示する内容です。
この 3 つの動詞はディレクトリでは少し意味が変わります。読み取りは中の名前を一覧表示でき、書き込みはエントリの作成と削除ができ、実行はディレクトリを通り抜けて既知のパスへ到達できることを意味します。読み取りだけあって実行がないディレクトリはほぼ役に立ちません。名前は見えても、その先を開けないからです。
実際に入力する値
実務のほとんどは数種類の組み合わせで足ります。644(rw-r--r--)は文書やソースファイルの標準的なモードで、所有者が編集し他の人が読みます。755(rwxr-xr-x)はディレクトリや実行可能スクリプトの標準的なモードで、どちらも実行ビットがなければ使えません。600(rw-------)はファイルを所有者だけのものに保ち、これは OpenSSH が秘密鍵に要求する設定です。ディレクトリなら 700 が相当します。
他者に書き込みを許すモードは慎重に扱うべきです。777 はマシン上のどのアカウントからもファイルを上書き・削除できる状態にし、正解であることはまずありません。理解しないままパーミッションエラーを最速で消す手段にすぎないのです。Web サーバーがアップロードディレクトリに書き込めないときの本当の修正は、たいてい chown で所有ユーザーやグループを変えることであり、ファイルを世界に開放することではありません。
パーミッションは umask とも相互作用します。新規ファイルはデフォルトモードから umask の値を差し引いて作成され、一般的な umask は 022 です。新しく作ったファイルが 666 ではなく 644 になるのはこのためです。
setuid、setgid、スティッキービット
おなじみの 3 桁の前にはもう 1 桁を置くことができ、そこには setuid(4)、setgid(2)、スティッキービット(1)という 3 つの特殊ビットが入ります。これらはプログラムが誰の権限で動くか、ディレクトリが内部に作られたファイルをどう扱うかを変えます。
実行ファイルの setuid は、起動したユーザーではなくファイル所有者の権限でプログラムを動かします。passwd が一般ユーザーの実行でシステムファイルを更新できるのはこの仕組みによるもので、setuid バイナリが厳しく監査される理由でもあります。1 つの不具合が所有者権限への近道になるからです。setgid はグループについて同じ働きをします。ディレクトリの setgid はより穏やかな意味を持ち、内部に作られた新規ファイルがそのディレクトリのグループを継承するため、共有プロジェクトフォルダを誰が書き込んでも一貫した状態に保てます。
スティッキービットは /tmp でおなじみで、通常 1777 と書かれます。誰でもディレクトリ内にファイルを作成できる一方、削除は各ファイルの所有者だけに制限されるため、ユーザーが互いの一時ファイルを消すことはできません。ロング形式の一覧ではこれらのビットが実行文字を置き換えます。x の代わりの s は setuid か setgid が有効、大文字の S はビットは立っているが実行権限がない状態、t はスティッキービットを示します。