2006年04月15日

パーミッションについての覚書

CGIの配布をしていて面倒なのがパーミッションの問題です。自分用メモも兼ねてまとめてみます。
一般のWindowsユーザーがパーミッションを意識するのはCGIの設置以外にないと思うので、CGIとの関係に限定してます。あしからず。

■パーミッションとは
そのファイルorフォルダに対し、「誰が」「なにを」していいことになっているか(権限)を決めたものです。通常、644とか705とかの3つの数字で表されます。

「誰が」は「所有者」と「グループ」と「他人」の3種類に分類されます。
左の数字が「所有者(root)」の権限、真ん中の数字が「グループ(group)」の権限、右の数字が「他人(nobody)」の権限です。

「なにを」の種類は「読む」「書く」「実行する」です。
そのファイルを「読む」権限があれば4、そのファイルに「書く」権限があれば2、そのファイルを「実行する」権限があれば1を足します。
「読める」「書ける」「実行できる」なら4+2+1で7。
「読める」「書けない」「実行できない」なら4+0+0で4になります。

所有者……「読める」「書ける」「実行できない」(4+2+0)
グループ……「読める」「書けない」「実行できない」(4+0+0)
他人……「読める」「書けない」「実行できない」(4+0+0)
→パーミッションは644

所有者……「読める」「書ける」「実行できる」(4+2+1)
グループ……「読めない」「書けない」「実行できない」(0+0+0)
他人……「読める」「書けない」「実行できる」(4+0+1)
→パーミッションは705


■他人とは
ここではCGIとのからみに限定しますので、「他人」はサイトを見る人のブラウザ、と考えればOKです。
ブラウザからファイルにアクセスする場合(ブラウザのアドレス欄にそのファイルのアドレスが入っている状態)、そのファイルに対して「他人」が「読む」という動作をしている、と考えます。
ですので、「他人」の権限が「4」以上であれば、ブラウザにはそのファイルの中身が表示されます。「4」未満なら、アクセス権がありませんとなります。(403 Forbidden)

フォルダ(ディレクトリ)の中身を見るのに必要なのは「読む」ではなく「実行する」権限です。「他人」に「実行する」権限がないと、そのフォルダの中にあるファイルはブラウザからアクセスできません。
なお、そのフォルダの中にファイルやフォルダを作るのに必要なのは「書く」権限です。

■所有者とは
「所有者」は、イコールそのサイトの管理者(=あなた)と考えてください。
所有者権限が問題になってくるのは、FTPでのアクセス時です。
「所有者」に「読む」権限がないと、そのファイルをダウンロードすることが出来ません。
「所有者」に「書く」権限がないと、そのファイルに上書きすることが出来ません。
「所有者」に「読む」権限がないと、そのフォルダの中身を見ることが出来ません。
「所有者」に「書く」権限がないと、そのフォルダの中にファイルやフォルダを作成することが出来ません。
「所有者」に「実行する」権限がないと、そのフォルダを開くことが出来ません。
ファイルに対する「所有者」の「実行」権限はFTPにはあんまり関係しません。(たぶん)
つまり、ついうっかりファイルの属性を「000」とかにしてしまうと、そのファイルを消すこともダウンロードすることも上書きすることもできないんですね。
(実際には、属性の変更だけはその状態でもできます。うっかり変えてしまっても戻せますので大丈夫)

■グループとは
CGIとのからみにでは、気にする必要なし。

■CGIの実行権限
CGIの場合(=そのサーバーにおいて、このフォルダ内ではこの拡張子はCGIとして動かしますよ、と定義された拡張子を持つファイルの場合)、ブラウザからアクセスされた際に「読む」に加えて「実行する」という動作をします。
このときに「誰」が「実行する」のかが、サーバーの設定によって異なります。

特にサーバーの設定に手を加えなければ、「他人」の権限で実行することになります。昔からあるプロバイダなどは、こちらの設定が多いようです。以下、このようなサーバーを「Aタイプのサーバー」とします。
これに対して、最近増えてきたのが「所有者」の権限でCGIを実行するサーバーです。CGI設置の解説に「suEXEC環境です」とか「CGI Wrap環境です」とか「CGIは所有者権限(root権限)で実行できます」とか書いてあるサーバーはこちらです。以下、このようなサーバーを「Bタイプのサーバー」とします。
CGIからログファイルや設定ファイル、ライブラリファイルなどを読み書きする場合も、AタイプかBタイプかで「他人」と「所有者」のどちらかの権限を使うかが変わります。
なお、CGI配布サイトの解説は、ほとんどがAタイプのサーバーに合わせて書いてあります。


■実際の設定
さて、一般に配布されているCGIには、実行ファイルがひとつだけのものもありますが、複数のファイルがまとめて配布されている場合もあります。

これらのファイル群は

・実行ファイル(CGIファイル)
・ライブラリファイル
・設定ファイル
・ログファイル
・その他のファイル(画像、Flash、HTMLなど)

に分類されます。

<実行ファイル>
実行ファイルは、ブラウザからアクセスして動作させるためのファイルです。必ず拡張子が「cgi」になっているはずです。
まず、FTPでアップしたり、バックアップ用にダウンロードしたり、バージョンアップの際には上書きしたりするので、「所有者」に「読む」と「書く」の権限が必要です。ですから「所有者」の権限は最低でも「6」になります。(この点は以下の全てのファイルで共通です)
更に、そのサーバーの設定における「CGIの実行者」に「読む」と「実行する」の権限が必要です。Aタイプでは「他人」に、Bタイプでは「所有者」に「5」以上が必要ということですね。

というわけで、

Aタイプのサーバー … 605以上
Bタイプのサーバー … 700以上

となります。……が、実際はAタイプでは「所有者」にも「実行」の権限が必要なところが多いので、

Aタイプのサーバー … 705以上
Bタイプのサーバー … 700以上

となります。

<ライブラリファイル>
ライブラリファイルは、実行ファイルから参照されるファイルです。CGIでよく使う動作をまとめたもので、「jcode.pl」や「cgi-lib.pl」などが有名です。もちろんCGI配布者が自作する場合もあります。
「所有者」に「読む」「書く」(FTPでのアップロード・ダウンロード)、CGIに「読む」が必要ですから、

Aタイプのサーバー … 604以上
Bタイプのサーバー … 600以上

となります。

<設定ファイル>
設定ファイルは、CGIのつくりによって、エディタで開いて直接設定を書き込んでおき、CGIからは読むだけというものと、CGIから設定の書き換えも行うものがあります。管理画面を持つCGIでは後者の場合が多いです。
前者の場合はライブラリファイルと同じです。後者の場合は、次に書くログファイルと同じです。

<ログファイル>
ログファイルは、掲示板の投稿ログなど、CGIから読み込み、また、CGIから書き出されるファイルです。CGIに「読む」に加え「書く」が必要ですから、

Aタイプのサーバー … 606以上
Bタイプのサーバー … 600以上

となります。


<フォルダ>
データファイルがフォルダに入っている場合(CGIと同じ階層にない場合)、CGIに「読む」と「実行する」の権限が必要なので、フォルダのパーミッションは

Aタイプのサーバー … 705以上
Bタイプのサーバー … 700以上

となります。


<その他のファイル>
基本的に変更不要です。(ふつう644になっています)


このように、Bタイプのサーバーでは「他人」に権限を与えない(右の数字がゼロ)状態でCGIを動かすことができます。これがセキュリティ上、たいへん有利なのです。
たとえば、CGIの管理画面にログインするパスワードが「pass.dat」というファイルに書いてあるとします。「他人」で実行するAタイプのサーバーでは、「pass.dat」のパーミッションは「604」か「606」になりますが、これは「他人」であるところのブラウザから「pass.dat」にアクセスすると、ファイルの中身が見えてしまうということです。ファイル名さえ分かれば、パスワードが簡単にわかってしまうということです。
しかし、Bタイプのサーバーでは「pass.dat」のパーミッションを「600」にできますから、ブラウザからアクセスしても「403 Forbidden」となり、パスワードを見られてしまうことはありません。
更に、ログファイルなどを格納するフォルダのパーミッションも、もBタイプのサーバーでは「700」にできます。こうすると、そのフォルダ内のファイルにブラウザからアクセスすることはできません。

※実際にはパスワードを暗号化してから書き込んだり、パスワードのファイルは拡張子をブラウザから読めないものにする、パスワードのファイル名の変更を指示する、.htaccessのアクセス制限を併用するなど、ブラウザからは簡単に読めないようにCGI作者が対策している場合が多いです。
ログファイルや設定ファイルなど、実行ファイルではないファイルの拡張子を「cgi」にするというのも、こういった対策のひとつです。拡張子が「cgi」になっていれば、ブラウザは実行ファイルと見なしてファイルを実行しようとします。ですが実際には実行ファイルではありませんから、ブラウザにはエラーが表示され、ファイルの中身を見られることは防げるのです。

ちなみにパーミッションは基本的に必要な数字より大きければいいので、BタイプのサーバーでAタイプのサーバー用のパーミッションにしても、たいていは動きます。サーバーのタイプを調べるのが面倒なら、Aタイプだという前提で設定すれば大抵は動くということです。(サーバーによっては、不必要に大きなパーミッションにしていると危険だとしてエラーになることもあります)
もちろん、適切なパーミッションの設定をしていなければ、BタイプのサーバーでもセキュリティレベルはAタイプのサーバーと同程度となり、せっかくの高いセキュリティを活かすことはできません。
posted by 文月夕 at 16:05| Comment(1) | TrackBack(0) | web雑文 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
色々と注文の多い人ですみません。

モバイルドワーフは現在のままでもかなり素晴らしいツールなので、正式版が発表される日を楽しみにしています。
Posted by 高村紀和子 at 2006年04月17日 13:54
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

PR