ファイルパーミッション
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ファイルパーミッション(File Permission)とは、ファイルシステム内のファイル毎に特定のユーザーやグループに対してアクセス権を設定する手法。単にパーミッションとも言う。これによりユーザー毎のファイルシステムの見え方に影響を与え、ファイルシステムへの変更を制限する。
目次 |
[編集] オペレーティングシステムによる違い
UNIX系やPOSIX準拠のシステムは個々のファイルを単純な方式で管理する。POSIXにはアクセス制御リスト方式も規定されているが、それを実装しているのは一部のファイルシステムやオペレーティングシステムだけである。
MS-DOS系のオペレーティングシステム(Windows 95、Windows 98、Windows Meなどを含む)はパーミッションを持たない。単に「リードオンリー(読み込みのみ)」という属性を任意のユーザーがファイル単位に設定できるだけである。
Mac OS X、Windows NTおよびその派生(Windows 2000とWindows XPを含む)、OpenVMSはアクセス制御リスト(ACL)を使用してもっと複雑で多様なパーミッションを管理している。
[編集] UNIX系のパーミッション
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での性能向上策であり、最近のOSでは必ずしもイメージを保持しているとは限らない)。ディレクトリに設定すると、配下のファイル群の改名や削除が(そのファイルの)所有者以外ではできなくなる。所有者以外のユーザーはファイルに書き足す(あるいは他のファイルを連結する)ことしかできない。
これらのパーミッションはそれぞれ1ビットで表されることから、「setuidビット」、「setgidビット」、「スティッキービット」とも呼ばれる。
[編集] パーミッションの表記法
[編集] 記号表記(シンボリックモード)
UNIXのパーミッション方式を表示する方法は様々である。最も一般的な形式が記号表記(symbolic notation)である。この形式ではパーミッションを10文字の文字列で表示する。
先頭の文字 | |
---|---|
- | 通常ファイル |
d | ディレクトリ |
l | シンボリックリンク |
クラス毎の3文字グループ | |
1番目 | 所有者のパーミッション |
2番目 | グループのパーミッション |
3番目 | その他のユーザーのパーミッション |
その3文字の内容 | |
1文字目 | r: リード可、-: リード不可 |
2文字目 | w: ライト可、-: ライト不可 |
3文字目 | x: 実行可、-: 実行不可 |
先頭の一文字はファイルの種別を表す:
- '-' は一般のファイル
- 'd' はディレクトリ
- 'b' はブロックデバイスのスペシャルファイル
- 'c' はキャラクターデバイスのスペシャルファイル
- 'l' はシンボリックリンク
- 'p' は名前付きパイプ
- 's' はUNIXドメインのソケット
各クラスのパーミッションは3文字で表示される。1番目の3文字でユーザークラスを表す。2番目でグループクラスを表す。3番目でその他クラスを表す。
その3文字は順にリード、ライト、実行パーミッションをそれぞれ表す。
- 'r' ならばリード可で、'-' ならばリード不可。
- 'w' ならばライト可で、'-' ならばライト不可。
- 'x' ならば実行可で、'-' ならば実行不可。
記号表記の実例を以下に示す。
- "-rwxr-xr-x" 通常ファイルで、所有者は全操作可、それ以外のユーザーはリードと実行のみ可能。
- "crw-rw-r--" キャラクタースペシャルファイルで、所有者およびグループはリード/ライト可能、それ以外のユーザーはリードのみ可能。
- "dr-x------" ディレクトリで、所有者がリードとそこへの移動が可能、それ以外のユーザーはなにもできない。
[編集] 記号表記とその他のパーミッション
その他のパーミッションが加わると、記号表記は若干複雑になる。非特権ユーザーはこれらを使うことがあまりないので、これらの表記法を知っておく必要性はあまりない。
パーミッション | クラス | 実行可1 | 実行不可2 |
---|---|---|---|
Set User ID (setuid) | ユーザー | s | S |
Set Group ID (setgid) | グループ | s | S |
Sticky | その他 | t | T |
- 実行可であることも同時に示す文字
- 実行不可であることも同時に示す文字
以下に例を示す。
- "-rwsr-Sr-x" はユーザークラスがリード/ライト/実行可能で setuid パーミッションも付与されている。グループクラスはリード可で setgid パーミッションが付与されている。その他クラスはリード/実行可能である。
[編集] 八進表記(絶対モード)
UNIXのパーミッションの別の表記法として「八進表記」がある。八進表記は3桁か4桁の八進数値である。
3桁の八進表記では、各桁がユーザークラス、グループクラス、その他クラスに対応している。
これら3桁の値はパーミッションをビットとしてそれを集めたものである。つまり、ある値を加算することで特定のパーミッションが付与されていることを表す。
- 4 を加算するとリード可となる
- 2 を加算するとライト可となる
- 1 を加算すると実行可となる
これにより、不明確な組合せはなく、常にあるパーミッションの組合せを表示することができる。
以下は前述の記号表記での例に八進表記を対応させたものである:
- "-rwxr-xr-x" は3桁八進表記では 755 となる。
- "-rw-rw-r--" は3桁八進表記では 664 となる。
- "-r-x------" は3桁八進表記では 500 となる。
[編集] 八進表記とその他のパーミッション
4桁の八進表記もある。この場合、前述の3桁表記に加えて、先頭に1桁加えて追加のパーミッションを表示する。システムによっては最初の1桁を省略して表示することができず、常に4桁表示となる(追加パーミッションが設定されていなければ、先頭の1桁はゼロとなる)。
この最初の桁は以下のビットの合計である:
- setuidビットは4を合計に加算する。
- setgidビットは2を合計に加算する。
- stickyビットは1を合計に加算する。
記号表記の例 "-rwsr-Sr-x" は 6745 と表示される。また、3桁表示の例は4桁表示では、それぞれ 0755、0664、0500 となる。