ファイルパーミッション

ファイルパーミッションとは、ファイルごとに定義された、読み出し・書込みなどのアクセスに対する許可情報。通常は、ファイルシステム内のファイルごとに、特定のユーザーやグループに対してアクセス権を設定する。これによって、ユーザーごとのファイルシステムの見え方に影響を与え、ファイルシステムに対する変更を制限する。単にパーミッションとも言う。

1. オペレーティングシステムによる違い
--------------------

Unix系やPOSIX準拠のシステムは、Linuxや macOS も含めて個々のファイルを単純な方式で管理する。それらシステムの多くは何らかのアクセス制御リスト  もサポートしており、独自方式、POSIX.1e のACL方式、NFSv4標準の一部のACLなどがある。

MS-DOS系のオペレーティングシステムはパーミッションを持たない。単に「リードオンリー」というファイル属性を任意のユーザーがファイル単位に設定できるだけである。リードオンリー属性を設定しても、どのユーザーでもプログラムでもその設定を変更できるので、ファイルを変更したり削除したりするのを防げない。また、ユーザーがファイルを読めないように設定する属性が存在しない。

他のMS-DOS互換OSは、ファイルやディレクトリ毎にリード/ライト/実行/削除のファイルパーミッションを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はアクセス制御リスト  を使用してもっと複雑で多様なパーミッションを管理している。OpenVMSはまたUnix系と同様のパーミッション方式も使えるが、Unix系よりも複雑である。後述のクラスが4つあり、アクセスパーミッションも4つある。クラスは包含関係にあり、ワールドにはグループが含まれ、グループにはオーナーが含まれる。システムクラスにはシステムユーザーしか属さない。

古い Mac OS はDOS系やDOSベースのWindowsと同様パーミッションを持たないが、"Protected" という属性だけをサポートしていた。

AmigaのAmigaDOSは当時のシングルユーザーOSとしては進んだパーミッション体系をサポートしていた。AmigaOS 1.x では、アーカイブ/リード/ライト/実行/削除というパーミッションを備えていた。AmigaOS 2.x およびそれ以降では、さらに Hold/Script/Pure というパーミッションもサポートしている。

Mac OS X v10.3  およびそれ以前は、POSIX準拠のパーミッションを使用していた。Mac OS X v10.4  以降では 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  で実装している。

2. Unix系のパーミッション
----------------

Unix系システムのパーミッションは3つの「クラス」に分けて管理される。そのクラスとは「ユーザー; user」、「グループ; group」、「その他; others」である。事実上、UNIXのパーミッションはアクセス制御リストを単純化したものと言える。

2.1. クラス
--------

UNIXのファイルシステムでは、全てのファイルやディレクトリは特定のユーザーが「所有」している。オブジェクトの所有者がその「ユーザークラス」に対応する。ユーザークラスのパーミッションはその特定のユーザーにのみ適用される。

ファイルにはグループも対応付けられていて、それが「グループクラス」に対応する。グループクラスのパーミッションはそのグループのメンバーにのみ適用される。

どちらでもないそれ以外のユーザーには「その他クラス」のパーミッションが適用される。

あるユーザーに適用される実際のパーミッションは、これらの論理的優先順位に従って決定される。例えば、あるファイルを所有するユーザーはグループやその他のクラスがどうであれ、ユーザークラスのパーミッションの適用を受ける。

2.2. 基本パーミッション
--------------

Unix系システムでは、いずれのクラスにも以下の3種類のパーミッションが存在する。

「リード; read」パーミッション：ファイルを読むことが許可される。ディレクトリの場合、ディレクトリ内に存在するファイルの一覧を読むことが許可される。
「ライト; write」パーミッション：ファイルの変更が許可される。ディレクトリの場合、ツリーの構造変更が許可される。
「実行; execute」パーミッション：ファイルを実行することが許可される。このパーミッションはバイナリファイル以外でも設定でき、設定されたファイルは実行される。ディレクトリに設定されると、そのディレクトリに移動することができ、中のファイルにアクセスすることができる。パーミッションがセットされていないと、その権利は行使できない。ACLベースのシステムとは異なり、Unix系システムのパーミッションは「継承」されない。ディレクトリ内のファイル群はディレクトリと同じパーミッションであるとは限らない。割り当てられるパーミッションはumaskを使って決定される。

2.3. その他のパーミッション
----------------

Unix系システムは他に3種類のパーミッションを持つ。これらの特殊なパーミッションはクラスに寄らず、そのファイルやディレクトリ全体に適用される。

//set user ID//、//setuid//、SUIDパーミッション：このパーミッションが設定されたファイルを実行すると、生成されるプロセスの実効ユーザーIDはそのファイルのユーザークラスのものとなる。
//set group ID//、//setgid//、SGIDパーミッション：このパーミッションが設定されたファイルを実行すると、生成されるプロセスの実効グループIDはそのファイルのグループクラスのものとなる。ディレクトリの場合、その配下に作られるファイルのグループはディレクトリのグループを継承する。
//Sticky// パーミッション：実行ファイルでは、生成されたプロセスのメモリ上のイメージをプロセス終了後も保持される。ディレクトリに設定すると、配下のファイル群の改名や削除が所有者以外ではできなくなる。所有者以外のユーザーはファイルに書き足すことしかできない。これらのパーミッションはそれぞれ1ビットで表されることから、「setuidビット」、「setgidビット」、「スティッキービット」とも呼ばれる。

3. パーミッションの表記法
--------------

3.1. 記号表記
--------------------

UNIXのパーミッションを表示する形式は様々である。最も一般的な形式が記号表記  である。この形式ではパーミッションを10文字の文字列で表記する。

最初の1文字はファイルの種別を表す：

'-' は一般のファイル
'd' はディレクトリ
'b' はブロックデバイスのスペシャルファイル
'c' はキャラクターデバイスのスペシャルファイル
'l' はシンボリックリンク
'p' は名前付きパイプ
's' はUNIXドメインソケット各クラスのパーミッションは、3文字で構成される。先頭の3文字はユーザークラスを表す。中間の3文字はグループクラスを表す。末尾の3文字はその他クラスを表す。

各クラスの3文字のパーミッションは、順にリード、ライト、実行を表す。

'r' ならばリード可で、'-' ならばリード不可。
'w' ならばライト可で、'-' ならばライト不可。
'x' ならば実行可で、'-' ならば実行不可。記号表記の例を、以下に示す。

"-rwxr-xr-x" は、通常ファイルであり、ユーザーは全ての操作が可能、それ以外のクラスはリードと実行だけが可能。
"crw-rw-r--" は、キャラクタースペシャルファイルであり、所有者およびグループはリードとライトが可能、その他のクラスはリードだけが可能。
"dr-x------" は、ディレクトリであり、ユーザーがリードとそこへの移動が可能、それ以外のクラスは何もできない。

3.2. 記号表記とその他のパーミッション
---------------------

その他のパーミッションが加わると、記号表記は若干複雑になる。



実行可であることも同時に示す文字
実行不可であることも同時に示す文字

以下に例を示す。

"-rwsr-Sr-x" はユーザークラスがリード/ライト/実行可能で setuid パーミッションも付与されている。グループクラスはリード可で setgid パーミッションが付与されている。その他クラスはリード/実行可能である。

3.3. 八進表記
----------------

UNIXのパーミッションの別の表記法として「八進表記」がある。八進表記は3桁か4桁の八進数値である。

3桁の八進表記では、各桁がユーザークラス、グループクラス、その他クラスに対応している。

これら3桁の値はパーミッションをビットとしてそれを集めたものである。つまり、ある値を加算することで特定のパーミッションが付与されていることを表す。

4 を加算するとリード可となる
2 を加算するとライト可となる
1 を加算すると実行可となるこれにより、不明確な組合せはなく、常にあるパーミッションの組合せを表示することができる。

以下は前述の記号表記での例に八進表記を対応させたものである：

"-rwxr-xr-x" は3桁八進表記では 755 となる。
"-rw-rw-r--" は3桁八進表記では 664 となる。
"-r-x------" は3桁八進表記では 500 となる。

3.4. 八進表記とその他のパーミッション
---------------------

4桁の八進表記もある。この場合、前述の3桁表記に加えて、先頭に1桁加えて追加のパーミッションを表示する。システムによっては最初の1桁を省略して表示することができず、常に4桁表示となる。

この最初の桁は以下のビットの合計である：

setuidビットは4を合計に加算する。
setgidビットは2を合計に加算する。
stickyビットは1を合計に加算する。記号表記の例 "-rwsr-Sr-x" は 6745 と表示される。また、3桁表示の例は4桁表示では、それぞれ 0755、0664、0500 となる。

3.5. パーミッションの一覧表示
-----------------

UNIX 系 OS におけるコマンド ls -l は、そのディレクトリにあるファイルなどのパーミッションの一覧を表示する。

コマンド stat -c '%n %a %A' は、パーミッションを八進表記として表示する。

4. ユーザープライベートグループ
-----------------

一部のシステムは伝統的な POSIX のユーザーとグループのモデルから離れ、各ユーザーごとに新たなグループ「ユーザープライベートグループ」を生成する。ユーザープライベートグループは様々な理由で好ましいとされている。例えば、通常のUNIXでは umask を 022 に設定してグループの書込み権をマスクするが、ユーザーごとにグループを作るので umask を 002 にしてもかまわない。

5. 脚注
-----

6. 関連項目
-------

chmod：UNIX系システムでパーミッションを設定するコマンド
アクセス制御リスト
POSIX
ファイルシステム
ユーザー識別子
グループ識別子

7. 外部リンク
--------

[1]
[2] by Brian Hatch 2003.
[3] by Brian Hatch 2003.
[4] by Michael Stutz 2004