forked from php/doc-ja
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcgi-bin.xml
249 lines (240 loc) · 12.9 KB
/
cgi-bin.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 6a5b42e0d34c76890fd96be2b0b57516363b4c8a Maintainer: hirokawa Status: ready -->
<chapter xml:id="security.cgi-bin" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>CGI バイナリとしてインストール</title>
<sect1 xml:id="security.cgi-bin.attacks">
<title>受ける可能性がある攻撃</title>
<simpara>
PHP を <acronym>CGI</acronym> バイナリとして使用するのは、PHP を
モジュールとして(Apache のような)サーバーソフトウエアに組み込み
たくない何らかの理由がある場合や安全な chroot と setuid 環境をス
クリプトに提供する他の <acronym>CGI</acronym> ラッパーと組み合わせて PHP を使用する
場合の設定オプションです。セットアップ時には、通常、PHP 実行バイ
ナリを Web サーバーの cgi-bin ディレクトリにインストールします。
CERT 勧告 <link xlink:href="&url.cert;">CA-96.11</link>は、いかなるイ
ンタプリタを cgi-bin に置くことにも反対しています。
PHP バイナリをスタンドアロンのインタプリタとして使用することが
できる場合でも、PHP は、セットアップにより生じる可能性がある
次のような攻撃を防ぐように設計されています。
</simpara>
<itemizedlist>
<listitem>
<simpara>
システムファイルへのアクセス: <filename
role="url">http://my.host/cgi-bin/php?/etc/passwd</filename>
</simpara>
<simpara>
URL において疑問符 (?) の後のクエリー情報は、CGI インターフェー
スにより、インタプリタにコマンドライン引数として渡されます。通
常、インタプリタは、コマンドライン上の最初の引数に指定されたファ
イルを開き、実行します。
</simpara>
<simpara>
CGI バイナリとして実行された場合、PHP は、コマンドライン引数の
解釈を拒否します。
</simpara>
</listitem>
<listitem>
<simpara>
サーバー上の Web ドキュメントへのアクセス: <filename
role="url">http://my.host/cgi-bin/php/secret/doc.html</filename>
</simpara>
<simpara>
URL の PHP バイナリ名の後のパス情報の部分、つまり<filename
role="uri">/secret/doc.html</filename> は、
<acronym>CGI</acronym> プログラムによりオープンされて実行される
ファイルの名前を指定するために従来より使用されています。
<filename role="url">http://my.host/secret/script.php</filename>
のようなドキュメントへの要求を PHP インタプリタにリダイレクト
するために、通常、何らかの Web サーバー設定用命令(Apache では Action)
が使用されます。この設定により、Web サーバーは、まずディレクトリ
<filename role="uri">/secret</filename> へのアクセス権をチェックし、
リダイレクト要求 <filename
role="url">http://my.host/cgi-bin/php/secret/script.php</filename>
を生成します。残念なことに、リクエストが最初からこの形式で与え
られた場合、Web サーバーによるアクセスチェックは、
<filename role="uri">/secret/script.php</filename> ファイル
ではなく、<filename role="uri">/cgi-bin/php</filename> ファイル
に対して行われます。この手法により、<filename
role="uri">/cgi-bin/php</filename> にアクセス可能なユーザーは、
Web サーバー上の全ての保護されたドキュメントにアクセスできてし
まいます。
</simpara>
<simpara>
PHP では、サーバードキュメントツリーにアクセス制限付きのディレ
クトリがある場合、設定ディレクティブ <link
linkend="ini.cgi.force-redirect">cgi.force_redirect</link>、
<link linkend="ini.doc-root">doc_root</link> および
<link linkend="ini.user-dir">user_dir</link> をこの攻撃を防止す
るために使用することができます。 これらを組み合わせたいくつか
の手法について以下に詳細な説明を示します。
</simpara>
</listitem>
</itemizedlist>
</sect1>
<sect1 xml:id="security.cgi-bin.default">
<title>ケース 1: 配布制限がないファイルのみを配布</title>
<simpara>
サーバー上にパスワードまたは IP アドレスを元にしたアクセス制限に
よる制約を課すコンテンツがない場合、この設定オプションを使用す
る必要はありません。使用する Web サーバーがリダイレクトを許可しな
い場合やサーバーがリダイレクト要求を安全に処理しつつPHP バイナリ
と通信できる手段を有していない場合、ini ディレクティブ
<link linkend="ini.cgi.force-redirect">cgi.force_redirect</link> を有効にできます。
この場合でも、直接
的な方法 <filename
role="php">http://my.host/cgi-bin/php/dir/script.php</filename>
でもなくリダイレクション <filename
role="php">http://my.host/dir/script.php</filename>でもない他の
やり方で PHP スクリプトを呼び出せるようになっていないかどうか確認
する必要があります。
</simpara>
<simpara>
リダイレクションは、例えば Apache では命令 AddHandler および
Action で設定することができます。(以下を参照ください。)
</simpara>
</sect1>
<sect1 xml:id="security.cgi-bin.force-redirect">
<title>ケース 2: <literal>cgi.force_redirect</literal> を使用</title>
<simpara>
設定ディレクティブ <link
linkend="ini.cgi.force-redirect">cgi.force_redirect</link> は、
<filename role="php">http://my.host/cgi-bin/php/secretdir/script.php
</filename> のように URL から直接 PHP を呼び出すことを禁止します。
代わりに、
Web サーバーのリダイレクションにより処理された場合は、
PHP はこのモードでのみ処理を行います。
</simpara>
<simpara>
通常、Apache 用設定でのリダイレクションは、
次の命令を使用して行います。</simpara>
<programlisting role="apache-conf">
<![CDATA[
Action php-script /cgi-bin/php
AddHandler php-script .php
]]>
</programlisting>
<simpara>
このオプションは、Apache Web サーバーでのみテストされており、リク
エストのリダイレクト時に Apache が標準ではないCGI 環境変数
<envar>REDIRECT_STATUS</envar> をセットすることを前提にしています。
リクエストが直接のものであるか間接のものであるかを示す手段をWeb
サーバーが全くサポートしていない場合は、このオプションを使用する
ことはできません。この場合、ここで記した CGI 版を実行する他の方法
の内の一つを使用する必要があります。
</simpara>
</sect1>
<sect1 xml:id="security.cgi-bin.doc-root">
<title>ケース 3: doc_root または user_dir を設定</title>
<simpara>
Web サーバー上のドキュメントディレクトリに
スクリプトや実行ファイルのようなアクティブな内容を読み込むのは、
往々にして危険な行為であるとみなされることがあります。
何らかの設定ミスによりスクリプトが実行されず、通常の HTML ドキュメント
として表示されてしまう場合には、知的著作物またはパスワードのような
セキュリティ情報が漏洩する可能性があります。
このため、多くのシステム管理者は、スクリプトを PHP CGI を通じてのみ
アクセス可能な他のディレクトリ構造にセットアップしたいと思うこと
でしょう。
この場合、常にインタープリタに処理されるため、上記のように表示されること
はありません。
</simpara>
<simpara>
前節で記したようなリクエストがリダイレクトされたものでないことを
確かめる方法が利用可能でない場合、
スクリプト用の doc_root を Web ドキュメント用ルートとは別に
セットアップする必要があります。
</simpara>
<simpara>
設定用命令 <link linkend="ini.doc-root">doc_root</link> により
<link linkend="configuration.file">設定ファイル</link> ファイル中で
PHP スクリプト用ドキュメントルートを設定することができます。
または、環境変数 <envar>PHP_DOCUMENT_ROOT</envar> でも設定する
ことができます。
これを設定した場合、<acronym>CGI</acronym> 版の PHP は、
常に開くファイルの名前をこの <parameter>doc_root</parameter>
リクエストのパス情報を用いて作成し、
(以下の <parameter>user_dir</parameter> を除き、)確実に
このディレクトリの外側でスクリプトが実行されないようにします。
</simpara>
<simpara>
ここで利用可能な別のオプションは、<link
linkend="ini.user-dir">user_dir</link> です。user_dir が設定されていない場合、
開かれるファイル名を制御するのは、<parameter>doc_root</parameter>
のみです。
<filename role="url">http://my.host/~user/doc.php</filename> のような
URL は、ユーザーホームディレクトリ以下のファイルを開かず、
doc_root 以下の <filename role="uri">~user/doc.php</filename>
というファイルを開くことになります。
(ディレクトリ名がチルダ [<literal>~</literal>] で始まっている
ということになります)
</simpara>
<simpara>
user_dir が例えば、<filename role="dir">public_php</filename>に
設定されていた場合、
<filename role="url">http://my.host/~user/doc.php</filename> の
ようなリクエストは、そのユーザー user のホームディレクトリにある
<filename role="dir">public_php</filename> 以下の
<filename>doc.php</filename> という名前のファイルをオープンしま
す。ユーザーのホームディレクトリが、
<filename role="dir">/home/user</filename> である場合、
実行されるファイルは、
<filename>/home/user/public_php/doc.php</filename>
となります。
</simpara>
<simpara>
<parameter>user_dir</parameter> の展開は、
<parameter>doc_root</parameter> の設定によらず行われます。
このため、ドキュメントルートおよびユーザーディレクトリへの
アクセスを別々に制御することができます。
</simpara>
</sect1>
<sect1 xml:id="security.cgi-bin.shell">
<title>ケース 4: Webツリーの外にPHPパーサを置く</title>
<para>
非常に安全性の高いオプションとしてPHP パーサのバイナリをファイル
用 Web ツリーの外側、例えば <filename
role="dir">/usr/local/bin</filename>に置くことが考えられます。こ
のオプションの唯一の欠点は、PHP タグを有する全てのファイルの先頭
行に次のような一行を加える必要があることです。
<informalexample>
<programlisting>
<![CDATA[
#!/usr/local/bin/php
]]>
</programlisting>
</informalexample>
また、ファイルを実行可能にしておく必要があります。この場合、実行
時にシェルエスケープ機能 <literal>#!</literal> を使用する Perl や
sh や他のスクリプト言語で書かれた CGI スクリプトを処理するのと全
く同様に処理を行います。
</para>
<para>
この設定で <envar>PATH_INFO</envar> および
<envar>PATH_TRANSLATED</envar> 情報を正しく処理するためには、
ini ディレクティブ
<link linkend="ini.cgi.discard-path">cgi.discard_path</link> を有効にする必要があります。
</para>
</sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->