MediaWiki 新しいページはコチラ
提供: yonewiki
(ページの作成:「== '''Media Wikiとは?'''== このページの仕組みそのものです。<br /> ウィキペディアは公式に活動している百科事典になりますが、...」) |
|||
77行: | 77行: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | == '''131011事件:WikiMediaシステム半壊状態です。''' == | ||
+ | PHP5を利用するMediaWiki Ver1.19にはSafeMode(セーフモードとかsafe_modeとかとも書けます。)とかっていうモードがあるらしくて、 | ||
+ | そのせいで画像のサムネイルが作れないため、大量のエラーを吐き出すページがありました。 | ||
+ | その際はエラーにびっくりせずに。そのまま、ご帰宅いただければとのたまっておりました。 | ||
+ | |||
+ | 当時の時系列メモ(2件)<br /> | ||
+ | 13-10-11<br /> | ||
+ | ImageMagickが動作していない模様。LocalSettings.phpとGlobalFunction.phpいろいろ変えたけど動ていない気がする。<br /> | ||
+ | 連休明けに考えてみようと思う。フォルダ生成はftpに任せたのでその辺のUID関係の問題はクリアしたと思う。<br /> | ||
+ | convertのありかはあってる。あとは何だ?xreaが何か別のセキュリティ仕様変更をやったのやもしれん。<br /> | ||
+ | シングルクォートつけてきたり、引数の無効かとかはクリア。つうか、これどうやってデバッグするんだ。<br /> | ||
+ | ものすごい地味な方法でやってるんだけど…。xreaでできないと意味ない気がするし。<br /> | ||
+ | 自分のPCにPHPインストールしたり、あんまり使わないから嫌だ。ってそこか。<br /> | ||
+ | あと変に動かすと、MediaWikiのシステムそのものが破綻するという罠もあるのが凄まじい。<br /> | ||
+ | こんな巨大プロジェクトの構造。理解しきれない気がする。<br /> | ||
+ | 一人でしか使わないからファイルロックとかあんまり意味ないのに無駄に凄い技術が仕込まれてたり<br /> | ||
+ | 考えさせられる。<br /> | ||
+ | なんだこのPHP5の高すぎるセキュリティ。素人集団がサーバ使う向けの仕様のような気がする。<br /> | ||
+ | あ、それがxreaか<br /> | ||
+ | フフフ♪<br /> | ||
+ | ・サムネイル生成までの道筋を改めて追う。<br /> | ||
+ | ・ImageMagickのコマンド実行するところまで来ているか確認する。<br /> | ||
+ | ・だとしたらどんなコマンドを実行しようとしているのかをつかむ。<br /> | ||
+ | ・imagesのtmpフォルダにしこたまたまったtransform_xxxxx-1.jpg達の後始末をどうするか考える。<br /> | ||
+ | ・あとはFlashを埋め込んだり、動画を埋め込んだりできるようにしたいかも<br /> | ||
+ | たぶん2年くらいかかる。<br /> | ||
+ | <br /> | ||
+ | メモ<br /> | ||
+ | 13-10-17<br /> | ||
+ | ま、なんやかんやで、Safemodeの回避方法はわかりました。要するにPHPではなくPerlを使えということですな。<br /> | ||
+ | 意味ねぇ。PHPの崇高な思想による機能はプログラミングのインタラクティブ性を大いに損なうものであると思います。<br /> | ||
+ | そんなに楽しくないプログラミングさせるなら、いっそのことサーバごと吹き飛んでしまえばいいと思った。<br /> | ||
+ | 恐ろしいほど、Mediawikiへの変更を加えたので、ここでは伝授することができません。お許しを。<br /> | ||
+ | 要するに最初から全部作った方がはえー気もする。2年くらいかかる予定でしたが、まぁ一週間ありゃなんとでもなるってことですね。<br /> | ||
+ | <br /> | ||
+ | 総括<br /> | ||
+ | http://php.net/manual/ja/features.safe-mode.functions.php<br /> | ||
+ | 上記リンクに記載されている関数はSafeModeでは使えません。重要な関数がびっしりでてくるので、リンク先を見た後はかなりげんなりします。<br /> | ||
+ | 要するに、危険な関数だからUIDが一致しないとだめよ。ってこと。<br /> | ||
+ | ん?つまり?<br /> | ||
+ | 普通は、ftpでログインしてあらかじめ作ったおいたフォルダにphpのファイルを置くと思います。 | ||
+ | そうするとUIDはftpでログインしたときのUIDがフォルダに付きます。そして、phpを実行しているときはUIDがXREAだとApacheを実行するUIDで<br /> | ||
+ | 食い違うことになります。つまりSafemodeの機能が働いて、関数は動きません。となると動的(PHP実行による処理)に、ディレクトリを生成したり<br /> | ||
+ | 動的にディレクトリを削除することもできません。その他、いろいろなことが出来ません。<br /> | ||
+ | その結果、一般に配布されているようなphpで高度なコンテンツマネージメントシステムはだいたい、そのままでは動きません。<br /> | ||
+ | それは、どういうことか?<br /> | ||
+ | サーバ屋さん的にはphpのエンジン設定の権限によりsafemodeを切ることもできるが、この機能を有効にしているってことは、<br /> | ||
+ | そのサーバ屋さんを利用しているユーザ同志によるモメゴトのもとになるようなPHPのコマンドを実行させないということが、<br /> | ||
+ | ユーザ個人にとっては使いにくいんでしょうけど、それよかモメゴトが消えるんならそれでOKOK。サーバ屋としてもなんら影響ないし、業績に響かない。<br /> | ||
+ | むしろ、ありがたい。ということなんだと思います。<br /> | ||
+ | 結果、プログラミングを熟知している人だけが、高度なシステムを改造して、使うし、問題も起こしにくい。<br /> | ||
+ | そういうことになっているのかもしれません。あるいは、そういった機能を欲しない無欲なユーザに使ってもらえている<br /> | ||
+ | というあたりなのでしょうか?想像ですけど。<br /> | ||
+ | <br /> | ||
+ | で、回避策なんですけど。思うに余計に危なっかしい案ではありますが、<br /> | ||
+ | 一つはphpのftpに関連する関数を使う。どこかにソースのどこかにftpのIDとかパスワードとかを書くんで、スペシャルなハッキング技術をお持ちの人なら、<br /> | ||
+ | まぁ簡単にやられる可能性もあります。dbへのアクセス情報とかはMediaWikiやその他システムで入力してるんで、そう簡単ではないでしょうけれども。リスクが少し大きくなります程度。<br /> | ||
+ | 加えて、phpからcgiを呼び出してフォルダの生成や削除をする。という処理をさせる。これもうまいことチェック機能をいれとかないと、危ない。<br /> | ||
+ | あるいは<br /> | ||
+ | xreaに限れば、phpをcgi版で動かす。という宣言を.htaccesを配置、記述する。php.iniを配置、記述する<br /> | ||
+ | という対策があります。<br /> | ||
+ | ftpでフォルダを作るのは出来るかもしれない。<br /> | ||
+ | ただしftpだけで制御するには疲れるかもしれない。なぜならfopen関数で第二引数に'x'を指定する場合は<br /> | ||
+ | ファイルがなければ、フォルダも全部作って、ファイルを作るっていう便利な関数だから。<br /> | ||
+ | そうするとphpからcgiを呼び出して、同じようにフォルダの生成や削除をするという処理をさせる必要があります。<br /> | ||
+ | これもスーパーハッカーなら、このcgiを利用して、呼び出し方をして、ファイルの削除しまくりとかできるわけです。<br /> | ||
+ | そんなスーパーハッカーいるのかどうかは知りませんが。<br /> | ||
+ | で、そのセキュリティ的な対策は各自やっていただくとして、セキュリティ的な提案とやりかただけを語るならば、<br /> | ||
+ | safemodeで影響を受ける関数の置き換え処理の記述をします。MediaWikiの場合。かなりの数の置き換えが必要になります。やれる人はやってみて。<br /> | ||
+ | 例えば、今回の目的ではないですが、chmod関数を置き換える場合だと。<br /> | ||
+ | chmod関数の引数が$this->pathだとしたら<br /> | ||
+ | file_get_contents('http://xxxxx.xx/xxxxx/yyyyyyy.pl?Path='.$this->path&Secure=xxxxxxxxx); | ||
+ | として.plや.cgiを実行する関数に置き換えます。<br /> | ||
+ | 動作結果がどうなるかわからないので、呼び出し結果がチェックができないのが辛いところです。<br /> | ||
+ | 実行した後にチェック用のファイルを生成させたりして、読み込んでみるという方法もありでしょう。自分はそこまでやってませんが…<br /> | ||
+ | Perlもわかる!という人にしかできない技です。<br /> | ||
+ | …の部分には必要に応じてuse関数で、外部の関数を読みこむ宣言をしないとダメでしょう。Copyの関数とかね。<br /> | ||
+ | さらには、第三者に実行されたときのために、呼び出し元が自分のサーバであることの確認処理もいれた方がいい。<br /> | ||
+ | でyyyyyyy.plっていうファイルにchmodを実行するPerlスクリプトを書く。<br /> | ||
+ | <br /> | ||
+ | 例えば<br /> | ||
+ | <syntaxhighlight lang="cgi" line start="1"> | ||
+ | #!/usr/local/bin/perl | ||
+ | print "Content-Type: text/html\n\n"; | ||
+ | |||
+ | … | ||
+ | |||
+ | $formInput = $ENV{'QUERY_STRING'}; | ||
+ | @InputData = split (/&/,$formInput); | ||
+ | foreach $tmp (@InputData) | ||
+ | { | ||
+ | ($name,$value) = split (/=/,$tmp); | ||
+ | if ($name eq 'Path'){ | ||
+ | $path = $value; | ||
+ | } | ||
+ | elsif($name eq 'Secure'){ | ||
+ | $secure = $value; | ||
+ | } | ||
+ | } | ||
+ | if($secure eq 'xxxxxxxx') chmod 0777, 'xxxx'.$path; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | <br /> | ||
+ | という感じです。<br /> | ||
+ | この調子で必要となるsafemodeの影響を受ける関数の動作をperlに置き換えたものを作ります。<br /> | ||
+ | こんな対処方法を取る人がどれくらいいるのか知りませんが…<br /> | ||
+ | 参考になればと思います。xreaで、ここまでやるやついねぇな。<br /> | ||
+ | Perlはさっぱりわからへんという人は、さっさと引っ越しした方がええね。<br /> | ||
+ | わたくしめに助言できるのはココまでです。Perlを熟知している方にやって欲しいからです。自分もこれが安全か?と言われれば、それほど自信ありません。<br /> | ||
+ | むしろ教えてほしいくらいです。<br /> | ||
+ | こんなことやってたらxreaから追い出されたりして、そしたら最初からphpなんて使わせてもらえないと思うので、大丈夫だと思いますけど<br /> | ||
+ | かくいう自分も最初はxreaをやめようかと思ったくらいです。もしくはMediaWikiをやめようかとも思いました。<br /> | ||
+ | 上記のサンプルではsecureという変数を使ってパスワード的な確認も入れてます。こんなものが役に立つかどうかしりませんけど。<br /> | ||
+ | <br /> | ||
+ | safemodeはこんな風に余計にあがく奴がいて、むしろ危ないってことだな。だから新しいPHPの現行Versionでは廃止になったのかもしれない。<br /> | ||
+ | でも、そのsafemodeの機能がついたサーバ500台近く抱えているxrea。恐るべし!<br /> | ||
+ | グダグダ言ってても、だれも救われないかもしれないので、この件はこれでおしまい。<br /> | ||
+ | <br /> |