ファイルパーミッション
ファイルパーミッション(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、FlexOS、4680 OS、4690 OS、Multiuser DOS、Concurrent DOS、Datapac System Manager、IMS REAL/32 など)は、ファイルやディレクトリ毎にリード/ライト/実行/削除のファイルパーミッションをボリューム上でサポートしている。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系システムのパーミッションは3つの「クラス」に分けて管理される。そのクラスとは「ユーザー; user」、「グループ; group」、「その他; others」である。事実上、UNIXのパーミッションはアクセス制御リストを単純化したものと言える。
UNIXのでは、全てのやディレクトリは特定のユーザーが「所有」している。オブジェクトの所有者がその「ユーザークラス」に対応する。ユーザークラスのパーミッションはその特定のユーザーにのみ適用される。
ファイルにはグループも対応付けられていて、それが「グループクラス」に対応する。グループクラスのパーミッションはそのグループのメンバー(所有者以外)にのみ適用される。
どちらでもないそれ以外のユーザーには「その他クラス」のパーミッションが適用される。
あるユーザーに適用される実際のパーミッションは、これらの論理的優先順位に従って決定される。例えば、あるファイルを所有するユーザーはグループやその他のクラスがどうであれ、ユーザークラスのパーミッションの適用を受ける。
Unix系システムでは、いずれのクラスにも以下の3種類のパーミッションが存在する。
「リード; read」パーミッション:ファイルを読むことが許可される。ディレクトリの場合、ディレクトリ内に存在するファイルの一覧を読むことが許可される。
「ライト; write」パーミッション:ファイルの変更が許可される。ディレクトリの場合、ツリーの構造変更(ファイルの新規作成、作成したファイルのパーミッション設定、ファイルの削除など)が許可される。
「実行; execute」パーミッション:ファイルを実行することが許可される。このパーミッションはバイナリファイル以外でも設定でき、設定されたファイルは実行される(少なくとも要求されれば実行しようと試みる)。ディレクトリに設定されると、そのディレクトリに移動することができ、中のファイルにアクセスすることができる。
パーミッションがセットされていないと、その権利は行使できない。ACLベースのシステムとは異なり、Unix系システムのパーミッションは「継承」されない。ディレクトリ内のファイル群はディレクトリと同じパーミッションであるとは限らない。割り当てられるパーミッションはumaskを使って決定される。
Unix系システムは他に3種類のパーミッション(またはモード)を持つ。これらの特殊なパーミッションはクラスに寄らず、そのファイルやディレクトリ全体に適用される。
set user ID、setuid、SUIDパーミッション:このパーミッションが設定されたファイルを実行すると、生成されるプロセスの実効ユーザーIDはそのファイルのユーザークラスのものとなる。
set group ID、setgid、SGIDパーミッション:このパーミッションが設定されたファイルを実行すると、生成されるプロセスの実効グループIDはそのファイルのグループクラスのものとなる。ディレクトリの場合、その配下に作られるファイルのグループはディレクトリのグループを継承する(デフォルトでは実効ユーザーの一次グループが設定される)。
Sticky パーミッション:実行ファイルでは、生成されたプロセスのメモリ上のイメージをプロセス終了後も保持される(これは古いOSでの性能向上策であり、2022年10月のOSでは必ずしもイメージを保持しているとは限らない)。ディレクトリに設定すると、配下のファイル群の改名や削除が(そのファイルの)所有者以外ではできなくなる。所有者以外のユーザーはファイルに書き足す(あるいは他のファイルを連結する)ことしかできない。
これらのパーミッションはそれぞれ1ビットで表されることから、「setuidビット」、「setgidビット」、「スティッキービット」とも呼ばれる。
UNIXのパーミッションを表示する形式は様々である。最も一般的な形式が記号表記 (symbolic notation) である。この形式ではパーミッションを10文字の文字列で表記する。
最初の1文字はファイルの種別(UNIXファイルタイプ)を表す:
<tt>'-'</tt> は一般のファイル
<tt>'d'</tt> はディレクトリ
<tt>'b'</tt> はブロックデバイスのスペシャルファイル
<tt>'c'</tt> はキャラクターデバイスのスペシャルファイル
<tt>'l'</tt> はシンボリックリンク
<tt>'p'</tt> は名前付きパイプ
<tt>'s'</tt> はUNIXドメインソケット
各クラスのパーミッションは、3文字で構成される。先頭の3文字はユーザー(所有者)クラスを表す。中間の3文字はグループクラスを表す。末尾の3文字はその他クラスを表す。
各クラスの3文字のパーミッションは、順にリード(読出し)、ライト(書込み)、実行を表す。
<tt>'r'</tt> ならばリード可で、<tt>'-'</tt> ならばリード不可。
<tt>'w'</tt> ならばライト可で、<tt>'-'</tt> ならばライト不可。
<tt>'x'</tt> ならば実行可で、<tt>'-'</tt> ならば実行不可。
記号表記の例を、以下に示す。
<tt>"-rwxr-xr-x"</tt> は、通常ファイルであり、ユーザーは全ての操作が可能、それ以外のクラスはリードと実行だけが可能。
<tt>"crw-rw-r--"</tt> は、キャラクタースペシャルファイルであり、所有者およびグループはリードとライトが可能、その他のクラスはリードだけが可能。
<tt>"dr-x------"</tt> は、ディレクトリであり、ユーザーがリードとそこへの移動が可能、それ以外のクラスは何もできない。
その他のパーミッションが加わると、記号表記は若干複雑になる。
以下に例を示す。
<tt>"-rwsr-Sr-x"</tt> はユーザークラスがリード/ライト/実行可能で setuid パーミッションも付与されている。グループクラスはリード可で setgid パーミッションが付与されている。その他クラスはリード/実行可能である。
UNIXのパーミッションの別の表記法として「八進表記」がある。八進表記は3桁か4桁の八進数値である。
3桁の八進表記では、各桁がユーザークラス、グループクラス、その他クラスに対応している。
これら3桁の値はパーミッションをビットとしてそれを集めたものである。つまり、ある値を加算することで特定のパーミッションが付与されていることを表す。
4 を加算するとリード可となる
2 を加算するとライト可となる
1 を加算すると実行可となる
これにより、不明確な組合せはなく、常にあるパーミッションの組合せを表示することができる。
以下は前述の記号表記での例に八進表記を対応させたものである:
<tt>"-rwxr-xr-x"</tt> は3桁八進表記では <tt>755</tt> となる。
<tt>"-rw-rw-r--"</tt> は3桁八進表記では <tt>664</tt> となる。
<tt>"-r-x------"</tt> は3桁八進表記では <tt>500</tt> となる。
4桁の八進表記もある。この場合、前述の3桁表記に加えて、先頭に1桁加えて追加のパーミッションを表示する。システムによっては最初の1桁を省略して表示することができず、常に4桁表示となる(追加パーミッションが設定されていなければ、先頭の1桁はゼロとなる)。
この最初の桁は以下のビットの合計である:
setuidビットは4を合計に加算する。
setgidビットは2を合計に加算する。
stickyビットは1を合計に加算する。
記号表記の例 <tt>"-rwsr-Sr-x"</tt> は <tt>6745</tt> と表示される。また、3桁表示の例は4桁表示では、それぞれ <tt>0755</tt>、<tt>0664</tt>、<tt>0500</tt> となる。
UNIX 系 OS におけるコマンド ls -l は、そのディレクトリにあるファイルなどのパーミッション(記号表記)の一覧を表示する。
コマンド stat -c '%n %a %A' は、パーミッションを八進表記として表示する。
一部のシステムは伝統的な POSIX のユーザーとグループのモデルから離れ、各ユーザーごとに新たなグループ「ユーザープライベートグループ」を生成する。ユーザープライベートグループは様々な理由で好ましいとされている。例えば、通常のUNIXでは umask を 022 に設定してグループの書込み権をマスクするが、ユーザーごとにグループを作るので umask を 002 にしてもかまわない。