- PR -

シンボリックリンクを利用したプログラムの共有とセキュリティ

1
投稿者投稿内容
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2006-09-19 10:30
投稿前に内容を吟味したつもりですが、Linuxシステムに関して知識が浅いため、
的を外した内容もあるかと思いますがその際はご指摘ください。

[概要]
PHP にて作成したプログラムを、1つのサーバー上にて
複数のユーザで共有し、動作させようとしています。

しかし、そのために PHP の open_basedir を設定しない
(他のユーザのディレクトリの参照を許可?)にしており、
PHPプログラムにより他のユーザーのファイルの内容が見れてしまうという
問題をどうしようかと悩んでいます。

[詳細]
プログラムの共有は、
/home/share/public_html/program/pg1.php
/home/share/public_html/program/pg2.php
これらのPHPファイルを各ユーザの public_html ディレクトリから
シンボリックリンクにより共有し、実行させるという形で行っています。

各ユーザのディレクトリ:
/home/user1/public_html/program/pg1.php -> 上記の共有ファイルへのシンボリックリンク
/home/user1/public_html/program/pg2.php -> 上記の共有ファイルへのシンボリックリンク
/home/user2/public_html/program/pg1.php -> 上記の共有ファイルへのシンボリックリンク
/home/user2/public_html/program/pg2.php -> 上記の共有ファイルへのシンボリックリンク

そして、各ユーザ毎に設定ファイル(DBパスワードなど)が存在します。
これはもちろんシンボリックリンクではなくユーザ個別に持ちます。

/home/user1/public_html/config/config.ini
/home/user2/public_html/config/config.ini

ここで問題が発生します。

プログラムファイルを共有するために、PHP の open_basedir を設定していませんが、
これにより悪意のあるユーザが以下の様なプログラムを作成・実行する事で、
他のユーザの設定ファイルを盗み見る事が可能になってしまいます。

<?php
print file_get_contents("/home/user3/public_html/config/config.ini");
?>

[質問]

・上記のような状況で、設定ファイルを他のユーザのプログラム
 から見れないようにする良い手段はありますでしょうか?

・1つのサーバー上にて複数のユーザーからプログラムを共有してもらうために、
 シンボリックリンク以外の解決方法はありますでしょうか?

※プログラムは複数のユーザから使用されるようには作成されていません。
※ユーザーは個別にドメインを持っており、それらのドメイン上で
 プログラムを実行する事が前提になります。
※メンテナンス作業量を考え、できれば各ユーザ毎に
 プログラムのコピーを作成する事は避けたいと考えています。

[ メッセージ編集済み 編集者: Shin 編集日時 2006-09-19 10:32 ]

[ メッセージ編集済み 編集者: Shin 編集日時 2006-09-19 10:51 ]
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2006-09-19 14:06
>・1つのサーバー上にて複数のユーザーからプログラムを共有してもらうために、
> シンボリックリンク以外の解決方法はありますでしょうか?

全ユーザーに唯一の URI /home/share/public_html/program/pg1.php を教えて上げたら共有できる。
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2006-09-19 14:47
引用:

Shinさんの書き込み (2006-09-19 10:30) より:
プログラムファイルを共有するために、PHP の open_basedir を設定していませんが、
これにより悪意のあるユーザが以下の様なプログラムを作成・実行する事で、
他のユーザの設定ファイルを盗み見る事が可能になってしまいます。

<?php
print file_get_contents("/home/user3/public_html/config/config.ini");
?>


同様の悩みを持った事が無いので外しているかもしれませんが、「php suExec」あたりで検索してみると、結構興味深そうな情報が出てきます。

(ここらへん、PHPのプロセスの権限、グループが鍵となってくると思いますが。プロバイダによっては「使用したいスクリプトは送ってくれれば設置します」という方法でやってる所もあるので、完全にユーザまかせにするのは結構難しいのかもしれません。)
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2006-09-19 14:57
コブラさん、コメントありがとうございます。

> 全ユーザーに唯一の URI /home/share/public_html/program/pg1.php を教えて上げたら共有できる。

と言うことですが、それは上記URLをHTTPでアクセスするという事でしょうか?

その場合、実行するURLは http://共通プログラムのURL/program/pg1.php のようになってしまうと思います。

私の説明が足りなかったかと思いますが、これはユーザ個別のドメインで http://個別ユーザーのURL/program/pg1.php のように実行させたいのです。それを実現するためにシンボリックリンクを利用してみましたが、前述のように個別設定ファイルの問題でつまづいた次第です。
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2006-09-19 16:36
冬寂さん、コメントありがとうございます。

suexec について調べてみました。あまり深くは理解していないかもしれませんが、私の使用するサーバーは共有サーバーなので導入は不可能だと思います。(open_basedir はサーバー全体では有効になっていますが、管理者に自分達のアカウントだけ解除してもらう事ができました)

自分でもいろいろ考えていたのですが、例えば設定ファイルの内容をDBに入れてしまったとしても、DBのID/パスワードは入れることができない(入れてしまったらDBにアクセスできない)のでどうしても残ってしまいます。

・open_basedir を設定する → 設定ファイルは見れないがシンボリックリンクによるプログラムも共有できない

・open_basedir を設定しない → シンボリックリンクによりプログラムは共有できるが、他のユーザーの設定ファイル等も読もうと思えば読めてしまう

シンボリックリンクによる共有の方法は難しいのでしょうか?無理であれば open_basedir を有効にして各ユーザのディレクトリにコピーを配布する方法しかないかもしれません。どなたかよいアイディアがありましたらご指導ください。
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2006-09-19 16:55
こんにちは

プログラムの性質にもよりますが

・ユーザディレクトリのphpは許可しない
・ユーザディレクトリには設定ファイル(phpコードでない)のみを置きphpからデータとして読み込むようにする。
・mod_rewriteモジュールなどでURL書換
コード:
http://hoge.jp/<USERID>/pg1.php => http://hoge.jp/pg1.php?user=<USERID>



でどうでしょうか?
1

スキルアップ/キャリアアップ(JOB@IT)