[PHP-users 13011] Re: PHP+PostgreSQLに特定のIPのみ接続させる

mori php-users@php.gr.jp
Wed, 5 Feb 2003 07:59:22 +0900


もり です。

表題: [PHP-users 12992] Re: PHP+PostgreSQLに特定のIPのみ接続させる
日付: Tue, 04 Feb 2003 17:31:24 +0900
ID:  <20030204170754.3067.KEI@nanet.co.jp>
Katsuyuki Maeda <kei@nanet.co.jp> さんの記された上記メールに関してです。

>  前田@nanetです。
> #元記事書かれた方がどうこうじゃなくて、
> #一般的な話として読んでください。

同じく。


> 注入される可能性がありますし、wwwユーザの権限を奪取される
> 可能性も、減らすことはできても否定することは難しいと思います。

公開している以上、自身の管理している機器についても管理者権限すら奪取さ
れる可能性を考慮すべきだと思います。ましてや、他人の管理する機器につい
てはいわずもがなでしょう。(パケットが他者が管理している機器を通ってくる
可能性があるなら、除き見されていないと決めつける事は避けるべきでしょう
し。)

もし、洩れては困るデータを扱うなら、十分な安全性が望めると思える大きさ
の暗号化鍵を使ってない接続は拒否するだとかいった対処も必要な気がします。
(SSL_PROTOCOL,SSL_CIPHER_ALGKEYSIZE,SSL_CIPHER_USEKEYSIZE辺りをチェック
すれば可能でしょうし[httpsで接続した時のphpinfo()等が参考になるかも])


>  この辺りを考慮に入れると、
>
>  ・ユーザーに公開しているアプリケーションは、wwwユーザの
>  権限で動いている(モジュール版)。
>  ・ひょっとすると、wwwユーザの権限は奪われるかも知れない。
>
>  という仮定をして、
>  データベースに格納するテーブルは、wwwユーザにどうしても
> 必要な権限のみに留めて、コマンドラインかcron、管理者向けの
> CGIプログラム(wwwユーザじゃない権限で動く)で、転記なり何なり
> の処理をするのが良いように思います。

CGIは例え管理者向けのCGIプログラムであっても、ウェブサーバが実行するの
で安全性はかなり劣るでしょうね。普通にアクセスする利用者と全く同じ様に
動かすよりは安全かも知れないけど。(まぁ、運用次第で逆に危険性が高いかも
知れないですね。なんせ別に管理するのだから。PHPのセキュリティ確保とCGI
のセキュリティ確保は別に行なっているだろうしその間でよりしっかり対処
できている方が安全性が高いでしょうから。)


>  PHPに限りませんが、そもそも、wwwユーザに与えちゃいけない
> 権限を与えているWebアプリケーションは非常に多い気がします。

個人的にはウェブサーバ側で動かすスクリプトの置かれているフォルダ(ディレ
クトリ)にウェブサーバが書き込める設定ってのは良くないと思ってます。(ウェ
ブサーバが書き込めるのはデータ用のディレクトリに限定した方が良い。スク
リプトを作った者が設置する時には別の[例えばscp用]アカウントで置いた方が
良い。)


>  wwwユーザ権限を取得されても少なくとも最低限のセキュリティが
> 確保できる作りを目指したいところです。

サーバの管理者権限が略奪されてもデータの内容は見られない様にしましょう。

# 絶対に洩れては困るデータなら。


>  結局、PHPに閉じた世界ではなくて、スキーマの設計を含めて
> 広い部分を考えないとセキュリティ向上させるのは難しい様です。

スキーマの設計って何かな? データベースに閉じた話かな。もっと広い話かな。
情報の分類、どんな種類の情報をどの様に扱うかをしっかり考えて決める(例え
ば、この種の情報は絶対に洩れては困るので物理的に分断された場所でしか
扱えない様にするだとか。役員に閉じたネットワークを作ってそこ以外には出
させない等)
情報を分類すれば、その情報は誰に触れる必要があるかなんて事は絞れる場合
が多い気がします。不要なアクセスも可能になっている場合が非常に多いで
しょうが。


>  PHPよりもメタになってしまいましたが、suExecみたいな仕組みが
> 使えない中でのセキュリティ確保をどうやっていくか…という手法の
> 議論に繋がるとうれしいです。

私は、suExec自体が恐そうに思ってます。ある種、root権限の様な危険性を
感じてます。

例えば、適当なポート叩けば認証後登録するスクリプトが動くようにしておく。
(inetd.confで56789番ポートが叩かれたらweb_regist.shが動くようにしておき
web_regist.shでは/tmp/web_regist_$PIDを読み、一行目のアカウントと2行目
のパスワードをチェックして妥当な要求ならそのデータに従って登録するだと
か。もちろん、cron使っても良いし。)
登録ページでは、/tmp/web_regist_3562を作って56789番ポートを叩く、なんて
やり方(スーパーサーバくんにお任せします)も一つの方法ですね。
スーパーサーバくんなら、apachectl stop ; apachectl startsslの様な管理
者権限が必要となるスクリプトでも動かしてくれますし。