ファイルパーミッション

ファイルパーミッション（file permission）とは、ファイルごとに定義された、読み出し・書込みなどのアクセスに対する許可情報。通常は、ファイルシステム内のファイルごとに、特定のユーザーやグループに対してアクセス権を設定する。これによって、ユーザーごとのファイルシステムの見え方に影響を与え、ファイルシステムに対する変更を制限する。単にパーミッションとも言う。
オペレーティングシステムによる違い.
Unix系やPOSIX準拠のシステムは、Linuxや macOS も含めて個々のファイルを単純な方式で管理する。それらシステムの多くは何らかのアクセス制御リスト (ACL) もサポートしており、独自方式（例えば、古いHP-UXのACL）、POSIX.1e のACL方式（かつてPOSIXのドラフト版で規定されたが結局規格化されなかった）、NFSv4標準の一部のACLなどがある。
MS-DOS系のオペレーティングシステム（PC DOS、Windows 95、Windows 98、Windows Meなどを含む）はパーミッションを持たない。単に「リードオンリー（読み込みのみ）」というファイル属性を任意のユーザーがファイル単位に設定できるだけである。リードオンリー属性を設定しても、どのユーザーでもプログラムでもその設定を変更できるので、ファイルを変更したり削除したりするのを防げない。また、ユーザーがファイルを読めないように設定する属性が存在しない（隠すことはできるが、パス名を知っていれば読むことは可能）。
他のMS-DOS互換OS（DR-DOS 3.31 およびそれ以降、PalmDOS、Novell DOS、OpenDOS、、4680 OS、、、Concurrent DOS、Datapac System Manager、IMS REAL/32 など）は、ファイルやディレクトリ毎にリード/ライト/実行/削除のファイルパーミッションをFATボリューム上でサポートしている。FlexOS、4680 OS、4690 OS 以外のOSでは、ファイルやディレクトリ毎にパスワードも設定できる。DR DOS、PalmDOS、Novell DOS、OpenDOS 以外のOSでは、ファイルやディレクトリ毎に「ワールド/グループ/所有者」という所有権のクラスをサポートしている。なお、DR DOS 6.0 およびそれ以降、PalmDOS、Novell DOS、OpenDOS は個人用OSなので、マルチユーザー用セキュリティモジュールをロードしないと所有権クラスは使用できない。
OpenVMSや Windows NT との派生OS（Windows 2000、Windows XP など）はアクセス制御リスト (ACL) を使用してもっと複雑で多様なパーミッションを管理している。OpenVMSはまたUnix系と同様のパーミッション方式も使えるが、Unix系よりも複雑である。後述のクラスが4つあり（システム、オーナー、グループ、ワールド）、アクセスパーミッションも4つある（リード、ライト、実行、削除）。クラスは包含関係にあり、ワールドにはグループが含まれ、グループにはオーナーが含まれる。システムクラスにはシステムユーザーしか属さない（Unix系のスーパーユーザーに相当する）。
古い Mac OS はDOS系やDOSベースのWindowsと同様パーミッションを持たないが、"Protected" という属性だけをサポートしていた。
AmigaのAmigaDOSは当時のシングルユーザーOSとしては進んだパーミッション体系をサポートしていた。AmigaOS 1.x では、アーカイブ/リード/ライト/実行/削除というパーミッションを備えていた。AmigaOS 2.x およびそれ以降では、さらに Hold/Script/Pure というパーミッションもサポートしている。
Mac OS X v10.3 (Panther) およびそれ以前は、POSIX準拠のパーミッションを使用していた。Mac OS X v10.4 (Tiger) 以降では NFSv4 ACL もサポートしている。従来からのUnix系のファイルパーミッション方式もサポートしており、"Apple Mac OS X Server version 10.4+ File Services Administration Manual" では従来からのパーミッション方式のみを使用することを推奨していた。また、Classic Mac OS での "Protected" 属性もサポートしている。
Solaris でのACLサポートは使用するファイルシステムに依存する。古いUFSは POSIX.1e ACL をサポートしており、ZFSは NFSv4 ACL のみをサポートしている。
Linuxは POSIX.1e ACL をサポートしている。ext3ファイルシステム向けに実験的に NFSv4 ACL をサポートした例がある。
FreeBSDは UFS では POSIX.1e ACL をサポートし、UFS と ZFS では NFSv4 ACL をサポートしている。
IBM z/OS ではファイルセキュリティを RACF (Resource Access Control Facility) で実装している。
Unix系のパーミッション.
Unix系システムのパーミッションは3つの「クラス」に分けて管理される。そのクラスとは「ユーザー; user」、「グループ; group」、「その他; others」である。事実上、UNIXのパーミッションはアクセス制御リストを単純化したものと言える。
クラス.
UNIXのファイルシステムでは、全てのファイルやディレクトリは特定のユーザーが「所有」している。オブジェクトの所有者がその「ユーザークラス」に対応する。ユーザークラスのパーミッションはその特定のユーザーにのみ適用される。
ファイルにはグループも対応付けられていて、それが「グループクラス」に対応する。グループクラスのパーミッションはそのグループのメンバー（所有者以外）にのみ適用される。
どちらでもないそれ以外のユーザーには「その他クラス」のパーミッションが適用される。
あるユーザーに適用される実際のパーミッションは、これらの論理的優先順位に従って決定される。例えば、あるファイルを所有するユーザーはグループやその他のクラスがどうであれ、ユーザークラスのパーミッションの適用を受ける。
基本パーミッション.
Unix系システムでは、いずれのクラスにも以下の3種類のパーミッションが存在する。
パーミッションがセットされていないと、その権利は行使できない。ACLベースのシステムとは異なり、Unix系システムのパーミッションは「継承」されない。ディレクトリ内のファイル群はディレクトリと同じパーミッションであるとは限らない。割り当てられるパーミッションはumaskを使って決定される。
その他のパーミッション.
Unix系システムは他に3種類のパーミッション（またはモード）を持つ。これらの特殊なパーミッションはクラスに寄らず、そのファイルやディレクトリ全体に適用される。
これらのパーミッションはそれぞれ1ビットで表されることから、「setuidビット」、「setgidビット」、「スティッキービット」とも呼ばれる。
パーミッションの表記法.
記号表記(シンボリックモード).
UNIXのパーミッションを表示する形式は様々である。最も一般的な形式が記号表記 (symbolic notation) である。この形式ではパーミッションを10文字の文字列で表記する。
最初の1文字はファイルの種別（UNIXファイルタイプ）を表す：
各クラスのパーミッションは、3文字で構成される。先頭の3文字はユーザー（所有者）クラスを表す。中間の3文字はグループクラスを表す。末尾の3文字はその他クラスを表す。
各クラスの3文字のパーミッションは、順にリード（読出し）、ライト（書込み）、実行を表す。
記号表記の例を、以下に示す。
記号表記とその他のパーミッション.
その他のパーミッションが加わると、記号表記は若干複雑になる。
以下に例を示す。
八進表記(絶対モード).
UNIXのパーミッションの別の表記法として「八進表記」がある。八進表記は3桁か4桁の八進数値である。
3桁の八進表記では、各桁がユーザークラス、グループクラス、その他クラスに対応している。
これら3桁の値はパーミッションをビットとしてそれを集めたものである。つまり、ある値を加算することで特定のパーミッションが付与されていることを表す。
これにより、不明確な組合せはなく、常にあるパーミッションの組合せを表示することができる。
以下は前述の記号表記での例に八進表記を対応させたものである：
八進表記とその他のパーミッション.
4桁の八進表記もある。この場合、前述の3桁表記に加えて、先頭に1桁加えて追加のパーミッションを表示する。システムによっては最初の1桁を省略して表示することができず、常に4桁表示となる（追加パーミッションが設定されていなければ、先頭の1桁はゼロとなる）。
この最初の桁は以下のビットの合計である：
記号表記の例 "-rwsr-Sr-x" は 6745 と表示される。また、3桁表示の例は4桁表示では、それぞれ 0755、0664、0500 となる。
パーミッションの一覧表示.
UNIX 系 OS におけるコマンド ls -l は、そのディレクトリにあるファイルなどのパーミッション（記号表記）の一覧を表示する。
コマンド stat -c '%n %a %A' は、パーミッションを八進表記として表示する。
ユーザープライベートグループ.
一部のシステムは伝統的な POSIX のユーザーとグループのモデルから離れ、各ユーザーごとに新たなグループ「ユーザープライベートグループ」を生成する。ユーザープライベートグループは様々な理由で好ましいとされている。例えば、通常のUNIXでは umask を 022 に設定してグループの書込み権をマスクするが、ユーザーごとにグループを作るので umask を 002 にしてもかまわない。