hiromasa.zone : o)

2006/8/12 Saturday 投稿時の月齢:18.3  月名:寝待月  潮汐:中潮 Moon:18.3[寝待月]今日の心技体 : 低調期低調期好調前不安定期

セーフモードの束縛 このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加

日記 - 曇時々晴 ひろまさ @ 13:18

WordPress ユーザの間ではおなじみ「セーフモードの束縛」。 WP のプラグインを動かすと、

Warning: fopen() [function.fopen]: SAFE MODE Restriction in effect. The script whose uid is 10358 is not allowed to access cache-phase2.php on line 79

なーんてでちゃって、げんなりという例のアレです。 有名なサーバでは XREA さんがこの PHP のセーフモードに対応しています。

これってなにがセーフなのか、いれてないと何がやばいのか、あほな言葉で解説しているサイトもあまりなさそうなので、おばかな hiromasa.zone でそっと書いてみます。 🙂

セーフモードを説明をするには、まずはファイルパーミッション (FTP で777 とか 666 とかするあれ)のことを書かねばなりません。

時は戻り、インターネット・アンダーグラウンド全盛期。(←戻ってばっか

2000 年より前のインターネット。 「ホームページ」全盛期で、Perl / CGI なんかつかって掲示板とか自前でもっているとちょっとおしゃれな時。 CGI プログラマもレンタルサーバ会社も手探り状態、試行錯誤。 CGI が動く無料サーバを探して一生懸命作った掲示板システムを設置。 パーミッション?よぉくわからないから、とりあえず 777 でいーやみたいな。  動くし。

次の日みたら、何者かの連続投稿で埋め尽くされ、その次の日みたさっぱりした感じに全部消えていた orz

懐かしいね。 連続投稿はともかく、なぁんでログが消え去ったのでしょう? これ、あらかたは同一サーバにいる悪意のユーザに消されたのが原因です。

PHP のセーフモードの存在意義は、上のログ削除のような「共有サーバ上で同じサーバの他人のファイルを勝手に書き換える」ことを防ぐことにあります。 そうです、セーフがはいっていなくて、ある条件がそろうとこれができてしまうのです。

なぜそんなことが起こせるのか。 これには UNIX のパーミッションと PHP の動作が深く関わってきます。

まずは、設置した「ホームページ(html) /CGI/ PHP」がどうやって、ブラウザに表示されているかということろから。

Web で公開されるファイルは一般的に UNIX というオペレーティングシステム上に置かれます。 パーミッションという考え方は UNIX のファイル管理の考え方です。

UNIX 上のファイルを見るには、必ずそのオペレーティングシステムにログインする必要があります。 え、ブラウザでアクセスするとき UNIX にログインなんかしてないじゃん…。 もうその通りで、実際のところは間に Web サーバというソフトウェアが UNIX サーバで動作していて、Web サーバソフトが「UNIXログインの仲介」をしてくれます。 このWeb サーバソフトで一番有名なのが、よくきく Apache というソフトです。

Apache は、ブラウザからのアクセスをうけると、指定された URI (アドレスね) に従って UNIX サーバ上のファイルを抽出し、ブラウザに返してくれます。 Apache が UNIX に常にログインしていて、ブラウザとの間を受け持つイメージです。

次に、パーミッションのお話。

UNIX のパーミッションは、「自分」「グループ」「他人」という3つの登場人物に対して、「読み込み」「書き込み」「実行」という権限を組み合わせてつけることができます。 FTP で数字が3つ並んでいるのは、左から「自分」「グループ」「他人」に対して、「読み込み」「書き込み」「実行」の組み合わせた数字です。 この辺はみなさんご存じでしょう。

また、ファイルには所有者の考え方があり、誰のファイルであるか、どこのグループのファイルであるか。 という情報が付与されます。

FTP でファイルをアップロードするということは、自分のユーザID で UNIX にログインしてファイルを作成していることになりますので、そのファイルの所有者にはそのユーザID(自分)が付与されます。(FFFTP などでみることができるでしょう)

適切にファイルのパーミッションを設定することで、他の人から見えないファイルやグループで共有したいファイルを設定することができ、さらに読み込み、書き込み、実行、の権限をつけることができるわけです。 UNIX はひとつのマシンをみんなで使おうという、マルチユーザ OS ですのでこういった制御が必要になります。

しかしここで話がややこしくなるのが、Apache を介してアクセスしてくる不特定多数の”ユーザ”。

このユーザが誰になるのかってーと、Apache が UNIX 上で動作するのに使っているユーザになります。 詳しくはあれですが、よくあるのは apache とか www って名前のユーザ。 ブラウザからの閲覧者はこの apache とか www とかって名前のユーザに全員なります。(もちろんサイトマスターも、ブラウザでアクセスした場合は apache さんになります)

FTP でアップロードしたファイルの視点からみると、apache とか www ユーザへのアクセス制限は三桁数字一番右の「他人」が適応されます。

そしてもっと話がややこしいのが、 .php などの「動作するファイル」の場合。 ブラウザからアクセスされたとき、だれがプログラムを動作させたことになるのかって話ですが、これも apache さんになります。

たとえば、動作させた PHP の中でプログラムが自動的にディレクトリを作った場合、この所有者は apache さんになります。 動作させた人が、apache さんなのでそうなってしまうのです。

ここまでは、セーフモードとは関係なく、Apache(mod_php) と UNIX の仕様です。

さぁ、PHP セーフモードの束縛の原因がなんとなく分かってきました(?)。

ここで PHP のセーフモードの仕様を読んでみます。 たとえば、ファイル読み書きに使われる fopen 関数。

処理を行うディレクトリが実行するスクリプトと同じ UID を有しているかどうかを確認します。

UID というのは所有者だと思ってください。

FTP で作成した PHP ファイルの UID は、まぎれもなく「あなた」です。 しかしながら、PHP の中で自動的に作られたディレクトリは apache さんになります。 この自動的につくられたディレクトリの中で「あなたがアップロードした」プログラムがファイル操作をしようとすると、これはセーフモードの制約にかかってしまうのです。 ファイルをアップロードした人と、アクセス先のディレクトリの所有者が違うからです。

この所有者のミスマッチこそがセーフモードの”束縛”です。

「あなた」と apache の関係だけみると、これはとても都合が悪いのです。 しかし、共有サーバにはいろいろなひとがいっしょにはいっています。「あなた」と「同じ共有サーバの他のユーザ」の関係もあります。

例えば他の人のファイル/ディレクトリ(当然FTP ログインアカウントが違うので UID もちがう)へのアクセスの場合はいい方向(セーフモードの存在意義通り)に”制約”が働き、共有サーバ内どうしのユーザでファイルを書き換えたり(改ざん)することを防ぐことができます。 これがセーフモードの役割です。

よくセーフモードの制約を回避するために、apache 所有者でできちゃったディレクトリを削除して、FTP で作り直すのは、PHP とディレクトリの所有者を合わせるためにあります。

さて、セーフが入っていないサーバで、なぜ「改ざん」ができてしまうかというと、データファイルにはファイルパーミッションの「他人」に書き込み権限をつける必要があるからです。 なぜならば、PHP の動作ユーザは apache さんになるから。 しかし「他人」に権限をつけた瞬間、共有サーバの「他のユーザのプログラム」(これも同じく apache さん)からも、同じように(時には悪意の)書き込みできてしまうことになります。

まぁ実際のところ改ざんをするには、URI ではなく “UNIX 的な”ファイルのありか(フルパス)を知る必要があったり、そのフルパスを調べる行為に別のセキュリティがかかっていたりしますので、そうそう簡単にはできなくはなっています。(みれちゃうサーバもいまだあるみたいだけど…) ただ、エラーメッセージにはフルパスがでてしまうので、この点は注意が必要です。 エラーログを掲示板などにはるときは、フルパスは隠したほうが良いでしょう。 たとえばこんなのね。

/home/******/public_html

****** にはユーザID とかはいるので、これは隠し通してください。 🙂

全ては、PHP(mod_php)  の動作ユーザが全て apache になってしまう仕様に起因していて、これをなんとかしようとしたのが PHP のセーフモードです。 PHP のマニュアルにも、

PHP のセーフモードは、共有サーバでのセキュリティの問題を解決するための試みです。 この問題を PHP のレベルで解決しようとするのはアーキテクチャ上正しくありません。 しかし、Web サーバや OS レベルでの代替策はあまり現実的ではないため、 多くのユーザ、特に ISP ではセーフモードが現在使用されています。

と書かれていて、また PHP 6.0 では削除される予定とのことです。

Perl のCGI 動作などでは、suExec と呼ばれる Apche ラッパーにより、スクリプト所有者 = スクリプト動作ユーザにするという理想的な環境をつくることができます。 もちろん、PHP でも CGI 動作できるサーバではこの方式を使うことが出来ます。 この場合、パーミッションを「700」とかに設定できますので、「他人」からのアクセスは一切出来なくなり、セキュリティ的には一番高くなるでしょう。

2000 年より前くらいのホスティングサーバ(主に無料)は、この suExec もはいっていないところが多く、同一サーバ間で書き換え戦争していて笑っちゃった時期もありました。 で、日本で suExec が入っている数少ないサーバがここだったのです。 なのでみんな使っていたんですね。 :-) まぁPHP は関係ない話ですが。

最近はこの手のはやりもなくなって、やるひともいなくなった、、と思いきやアジア圏ではいまだこの手のお遊びが流行っているようです。 というわけでみなさん、セキュリティには気をつけましょう。

以上、セーフモードの説明でした。(変なところあったら教えてください)

13 Comments

Trackback

  1. From: PukiWiki/TrackBack 0.2 - 2006/8/25 Friday Nighttime (Trackback)

    MEMO/雑多リンク…

    apacheとphpとパーミッションのわかりやすい解説 http://zone.maple4ever.net/blog/archives/657/ (more…)

  2. From: PHPセーフモード対策 - : 鷹峰みのぶ - 2009/7/29 Wednesday Morning (Pingback)

    […]  XREA関連サーバーは、共有サーバでのセキュリティの問題を解決するため現在多くのインターネットサービスプロバイダー等で で使用されているPHP セーフモードが使用されています。 参考:hiromasa.zone-セーフモードの束縛 […]

  3. From: PHPセーフモード対策 - : 鷲峰みのぶ - 2009/8/21 Friday Morning (Pingback)

    […]  XREA関連サーバーは、共有サーバでのセキュリティの問題を解決するため現在多くのインターネットサービスプロバイダー等で で使用されているPHP セーフモードが使用されています。 参考:hiromasa.zone-セーフモードの束縛 […]

  4. From: WordPressプラグインディレクトリが見つかりません。 | blog.paz-para.com - 2009/9/6 Sunday Nighttime (Pingback)

    […] さらに調べてみるとこちらのサイトでセーフモードの仕様というか挙動について説明がありました。 […]

  5. From: WordPressを設定したい! ① « お嬢さん、内緒話です - 2009/9/22 Tuesday Daytime (Pingback)

  6. From: CoreserverにWordPressをインストールする仕事 - 2010/4/24 Saturday Nighttime (Pingback)

    […] http://zone.maple4ever.net/blog/archives/657/ また後でじっくり読もうと思う。他の記事もおもしろそう。 Coreserver, […]

  7. From: WP-DBManager 導入 | シュシュ - 2011/4/10 Sunday Daytime (Pingback)

    […] セーフモードの束縛 […]

  8. From: CORESERVERにWordPressをインストール : memo - 2012/7/19 Thursday Nighttime (Pingback)

    […] hiromasa.zone ) » セーフモードの束縛 […]

  9. From: php でよく出てくる、safe_mode(セーフモード)ってなに?きになるこまめ | きになるこまめ - 2013/4/6 Saturday Daytime (Pingback)

    […] hiromasa.zone ) » セーフモードの束縛 […]

  10. From: CoreserverでWordPressを使う際のエラー対処ゲージツ的生き方のススメ | ゲージツ的生き方のススメ - 2013/9/28 Saturday Nighttime (Pingback)

    […] セーフモードについては、こちらが参考になりました。 セーフモードの束縛 […]

  11. From: CoreserverでWordPressを使う(プラグイン) | WordPress入門 - 2014/10/18 Saturday Morning (Pingback)

    […] 「セーフモードの束縛」 […]

Comment

  1. From: yutaka - 2006/8/12 Saturday Nighttime (Comment)

    いつもながらわかりやすい説明ですねぇ。このセーフモードには、かなり泣かされましたが、FedoraCoreを使うようになってからは、やっとその辺の理屈が理解出来るようになりました。セーフモードのためにそのままでは動かないプラグイン結構たくさんありますよね:oops:

  2. From: ひろまさ - 2006/8/13 Sunday Nighttime (Comment)

    yutaka さんこんばんわ!

    UNIX 使われていないと、これってとても難しいですよね。 😀

    とりあえず、プラグインでディレクトリつくるものは手で生成すればなんとか動くみたいです。 でも予想のつかないディレクトリ名をつくるものは×ですね。 うーむ。。


このサイトはコンテンツをフリーズしました。トラックバック・コメントは閉じられています。

新しいサイトは、

hiromasa.another :o)

です。 :-)

このサイトについて

このブログは引っ越しを行いコンテンツはフリーズしています。hiromasa.anotherへどうぞ。

Powerd By WordPress

We (Heart) WordPress

WordPressME Logo
WordPress Plugins

ブログ内検索

Todays Popular

WordPress Ring

はてなリング - WordPress -

情報

30 queries. 0.093 seconds.

このページの先頭へ