Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

パーミッションのこと

研究内容

Linuxにはパーミッションというものがあります。 Perl/CGIで最初に戸惑ったことの1つがこれでした。 これもしっかり研究しておかないと後で困るかも。

解説

パーミッションとは

パーミッション。Permission。日本語だと許可。 ファイルのパーミッションといったら、ファイルの許可。 これ、なにかというと、「そのファイルに対して誰が何をできるか」ということを表しています。

Windowsでもパーミッションあります

Windowsにも、Linuxほど細かくはありませんがこの許可がありましたね。 それは、「読み取り専用」というやつです。 読み取り専用ということは、書き込み禁止ということです。 つまり書き込む許可を与えないっていうことですね。 これは結構分かりやすいです。特に不思議なことはなかったです。

Linuxのパーミッション

Linuxだと、これがちょっと複雑になるんですよね。複雑というか厳密というか? Windowsの場合、書き込みという処理に対する許可を与えるか否かという設定しか ありませんでしたが、Linuxの場合、読み込み、書き込み、実行という3つの処理に 対して、許可、禁止のどちらかを設定することができます。

読み込み禁止、なんて設定したらどうなるんでしょう? そのまんまですが、読めなくなります。エディタで開いたりできません。 ブラウザでそのファイルを読み込むこともできません。 つまりほとんどなにもできません。だから読み込み禁止にするなんて、 意味ないじゃん?と思うところですが…そこが複雑なところなんですよね。

Linuxには、ユーザー、グループ、という概念があります。 ユーザーっていうのは人のことですね。グループっていうのは人の集まりです。 で、これらの言葉を使って、人を「自分」「同じグループの他のユーザー」「別のグループのユーザー」 という3種類に分けることができます。自分、友達、他人、という感じでしょうか。 Linuxでは、この3種類の人に対して、それぞれ、読み込み、書き込み、実行という3つの処理に 対して、許可、禁止のどちらかを設定することができるのです。

先に例にあげた、読み込み禁止っていう、あんまり使い道の無さそうな設定ですが、 こういう風に考えるとしっくり来ます。「このファイルは友達には見られてもいいけど 他人には見られたくないなぁ」とか「このファイルは秘密だから自分だけ見れるようにしよう」 とか「他人には見せてもいいけど身内には見せられないなぁ…恥」とか。 こうなると、読み込み禁止っていう設定がすごく便利だって感じがしませんか? そんなわけで、Linuxではファイルに対するパーミッション、許可を細かく設定できるように なっています。

パーミッションの表現のしかた

パーミッションの設定は、読み込み r、書き込み w、実行 x という文字を使って、 rwxrwxrwx なんていう文字で表したりします。最初のrwxは自分の許可、 真ん中のrwxは同じグループの人の許可、後ろのrwxは他のグループの人の許可です。 許可が無い場合は - という文字で表します。そうすると、自分にだけ見れて、他のことは なにも出来ないファイルというのは r-------- となりますね。誰でも見れて、 でも中身を変更できないというのは r--r--r-- とか。で、これを簡単に数字で表すことも あります。704とか644とかの3桁の数字でこのパーミッションを表すんですが、 これは --x=1、-w-=2、-wx=3、r--=4、r-x=5、rw-=6、rwx=7 というようにrwxを数字に 割り当てて表現しようっていうものです。2進数っていうのを知っていると簡単なんですが、 知らなくても覚える必要もないですねコレは。

CGIプログラムには実行許可を

ファイルには、実行できるものと実行できないものが ありますが、Linuxでは、実際に実行できるかどうかよりも、 そのファイルを実行する権利があるかどうかということが先に問題になります。 ここまで既にでてきた実行 x の権利ですね。htmファイルなどは読まれるだけですから、実行権は 必要ありません。でもCGIプログラムは、実行されてなんぼですから、必ず、実行権を設定する必要があります。 面倒なんですけど、そういう決まりです。実行権が与えられていないCGIプログラムは、実行できず、 実行しようとするとエラーになってしまいます。

CGIプログラムへの実行許可はちょっと複雑

で、CGIプログラムに(cgiファイルに)実行権を与えるわけですが、上に書いた 自分、友達、他人の どれに実行権を与えたらいいんでしょうか?ここでまた話がちょっと複雑になってしまうんですが、 サーバーがsuExecという機能を持っているかどうかなどで、どれに実行権を与えるべきかっていうのが 変わるんですよね。とりあえず、suExec機能が無い場合、ブラウザでそのファイルを閲覧 しようとしている人は、「他人」としてそのcgiファイルにアクセスするみたいです。 ですからcgiファイルには「他人が実行できる」という 設定が必要です。この場合、例えばrwxr-xr-xとかになります。数字では755ですね。 一方、suExecがある場合です。 大抵の場合、suExec機能は持っているはずなので、こちらの話がメインです。 ちょっと詳しく考えてみましょう。

suExec機能がある場合、ブラウザでそのファイルを閲覧しようとしている人が誰になるのか というのは設定によって違ったりします。 本当は他人なんだけど、「自分(ファイルの持ち主)」として ファイルにアクセスするなんてことができるんです。 実際にブラウザでそのファイルを見ている人は、自分が誰としてそのファイルにアクセスしているか なんてことは意識しませんし知ることもできないんですけど。suExecが勝手にやってくれます。 で、他人が自分としてファイルにアクセスするっていうと、なんか嫌な感じというか、 怖い感じもありますよね。というのは、他人には見せないつもりで r-------- という設定 (自分だけ読み込み可)に してあるファイルが、ブラウザを通して 他人である不特定多数の人から丸見えになってしまうんですから。 でもこの機能、むしろセキュリティのためにそうなっているんですね。 サーバーというのは、1台を大勢の人が使っているという場合がほとんどですね。 そういうサーバーを共有サーバーといいますが、 共有サーバーの場合、そのサーバーをだれが使っているかというのは分かりません。 いろんな人がそのサーバーを使っています。そういう人たちって、「他人」ですよね? ですから、自分で作ったファイルを勝手に見たり、書き換えたり、実行されたりしたら 嫌です。 だから、パーミッションとしては、他人にはファイルをいじれないように したいです。一方、インターネットで接続してくる人たちも「他人」なわけですから、 他人に見えないようにしたら、誰もそのファイルを見れなくなっちゃいます。 もともと人に見せるつもりで作ったファイルなんだから、他人から丸見えでもいいじゃん? という感じもしますが、同じサーバーの中の「他人」とブラウザでそのファイルを見る「他人」では 違いがあるんです。たとえばcgiファイルが他人に読み込み可能、実行可能という設定になっていたと しましょう。同じサーバーの人は、読み込み許可があるということでそのcgiファイルの "中身"、Perlのソースコードを見ることができます。 でも、ブラウザを通してそのファイルを見ようとしても、 そのcgiの出力が画面に表示されるだけで、そのファイルの"中身"、Perlのソースコードは 見ることができません。 あるいは、「他人」に書き込み許可のあるファイルの場合を考えてみましょう。同じサーバーの人は、 そのファイルを勝手に書き換えることが出来てしまいますが、ブラウザでそのファイルに アクセスする人は、ブラウザにはそのファイルを書き換えるという機能がありませんから、 どう頑張ってもそのファイルを書き換えることはできません。 このように、同じ「他人」でも、ブラウザを通してアクセスする人は、ブラウザの機能に よって制限が加わりますから、安全な「他人」なのです。

長くなってしまいました。つまり「ブラウザからアクセスする人は、 ファイルのパーミッション以外にブラウザとサーバーの機能制限によりファイルへの アクセスが制限されているから安全」ということです。なので、「他人」にアクセス許可を 与えるよりも、ブラウザからのアクセスの場合は「自分」としてアクセスするっていうことにして、 「他人」には許可を与えないようにようにした方が、結局、安全だっていうことなんですね! そんなワケで、suExec機能があるサーバーで、他人が自分としてアクセスするように 設定されている場合は、ファイルへのアクセス許可は 他人には与える必要がなくて、自分に与えればいいっていうことになります。 この場合、cgiファイルは実行権を含めてrwx------とかでOKだっていうことですね。 数字だと700というパーミッションになります。それか、他人には実行させたくないけど 見てもいいよ、という場合はrwx---r--、数字で704、あるいはrwxr--r--、数字で744 なんていうパーミッションになります。

セキュリティ的に、他人に実行権を与えるっていうのは結構危険なことなんです。 suExecが無い場合のようにrwxr-xr-x、755なんていうパーミッションは実は 危険なんですね。suExecがあれば他人に実行権を与える必要が無く、ずっと安全ってことです。

もう1つ、注意が必要なことがあります。 他人に書き込み許可があるCGIプログラムは、ブラウザから閲覧(実行)することができません! パーミッションなんて良く分からないし面倒だ、えーい777にしちゃえ、誰でもこのファイルを 好きなようにしてくれよう!なんていう設定は、セキュリティ的に危険極まりなく、 そのようなファイルはインターネットを通して実行できないようになっています。 詳しく考えてみると、他人に書き込み許可がある、rwx----w-というパーミッションの CGIプログラムを考えてみましょう。 このCGIプログラムは、画面に「こんにちは」と表示するだけの無害なものだったとします。 でもある日、悪意のある他人さんが、このプログラムを書き換えて、ハードディスク内の ファイルを片っ端から削除してしまうものに変えてしまったとしましょう。 あら大変!ある日のこと、ファイルが全部無くなっていました…なんてことになってしまいます。 危険なんです、他人に書き込み許可のあるCGIプログラムは。 そこで、そんなことが出来ないように、他人に書き込み許可のあるCGIプログラムは 実行できないというようになっているんです。よく出来てますよね! (管理人はこれを知らなくて、どうしてもCGIプログラムが動かなくて困ったことがありました。 それで、ここに書いておきました。)

パーミッションの設定方法

パーミッションは、FTPソフトを使って設定することができます。 InternetExplorerのFTP機能でもパーミッションの設定はできます。 cgiファイルには正しいパーミッションを設定しないと、ブラウザで アクセスしたときにエラーになったりします。 いろいろパーミッションを 変えてみて研究すると面白いですよ!

分かったこと

  1. パーミッションはアクセスの許可、禁止を設定するものです。
  2. rwxとか数字とかでパーミッションを表現します。
  3. CGIプログラムには実行許可というパーミッションを設定する必要があります。
  4. 具体的なパーミッションはsuExec機能などによっても異なりますが、
    自分に実行許可、他人には書き込み禁止が基本です。たとえばrwxr--r--で744です。
  5. パーミッションはFTPソフトで設定することができます。
Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。