-
Notifications
You must be signed in to change notification settings - Fork 81
Expand file tree
/
Copy pathcgi-bin.xml
More file actions
230 lines (223 loc) · 16.6 KB
/
cgi-bin.xml
File metadata and controls
230 lines (223 loc) · 16.6 KB
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
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 87d3bf2e9ea7da5abbeca3e60ea7cf7abfa6f7f3 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="security.cgi-bin" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>О безопасности PHP в режиме CGI-программы</title>
<sect1 xml:id="security.cgi-bin.attacks">
<title>Возможные атаки</title>
<simpara>
Установка PHP в виде двоичного файла, который взаимодействует с веб-сервером
по протоколу <acronym>CGI</acronym>, представляет альтернативу
интегрированию PHP в серверное ПО наподобие веб-сервера Apache в виде модуля
и альтернативу установкам, которым придётся использовать PHP с набором
<acronym>CGI</acronym>-обёрток, чтобы сделать окружения для скриптов безопасными
в части установки утилитами <command>chroot</command> и <command>setuid</command>
корневого каталога и идентификатора пользователя, от имени которого выполнится скрипт.
При установке PHP в виде CGI-программы исполняемый двоичный файл <command>php</command>
часто устанавливают в каталог веб-сервера <filename class="directory">cgi-bin</filename>.
Компьютерная группа реагирования на чрезвычайные ситуации (англ. Computer Emergency Response Team, CERT)
подготовила рекомендацию <link xlink:href="&url.cert;">CA-96.11</link>, в которой не советует
располагать интерпретаторы в каталоге <filename class="directory">cgi-bin</filename>.
Двоичный файл <command>php</command> спроектировали так, чтобы даже при работе в качестве
автономного интерпретатора файл защищал от атак, риск которых появляется при установке PHP в режиме CGI:
</simpara>
<itemizedlist>
<listitem>
<simpara>
Доступ к системным файлам через запрос вида: <filename
role="url">http://my.host/cgi-bin/php?/etc/passwd</filename>.
</simpara>
<simpara>
Информация в query-компоненте, который URL-адрес запроса содержит
после вопросительного знака (<literal>?</literal>), передаётся
интерпретатору через CGI-интерфейс как аргументы командной строки.
Стандартное поведение интерпретатора — открыть и исполнить в командной строке файл,
который указали как первый аргумент запроса.
</simpara>
<simpara>
В режиме CGI-обработчика <command>php</command> не станет
интерпретировать аргументы командной строки.
</simpara>
</listitem>
<listitem>
<simpara>
Доступ к произвольному документу на сервере:
<filename
role="url">http://my.host/cgi-bin/php/secret/doc.html</filename>.
</simpara>
<simpara>
Информация в path-части URL-адреса наподобие <filename role="uri">/secret/doc.html</filename>,
которая идёт после названия двоичного файла PHP, указывает название файла,
который <acronym>CGI</acronym>-программа откроет и интерпретирует.
Отдельные директивы конфигурации наподобие директивы <literal>Action</literal>
в конфигурации веб-сервера Apache указывают, чтобы перенаправить запрос к документам вида
<filename role="url">http://my.host/secret/script.php</filename> к интерпретатору PHP.
При такой настройке веб-сервер сначала проверяет права доступа к каталогу
<filename role="uri">/secret</filename>, а затем создаёт и перенаправляет запрос к файлу
<filename role="url">http://my.host/cgi-bin/php/secret/script.php</filename>.
К сожалению, веб-сервер проверит права доступа только к файлу <filename role="uri">/cgi-bin/php</filename>,
но не проверит права доступа к файлу <filename role="uri">/secret/script.php</filename>,
если запрос в самом начале задали в полной форме. Поэтому пользователи с доступом
к файлу <filename role="uri">/cgi-bin/php</filename> получат доступ к защищённым документам на сервере.
</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>, которые PHP учитывает при выполнении кода.
Подробнее опции и их комбинации рассматривают следующие главы раздела.
</simpara>
</listitem>
</itemizedlist>
</sect1>
<sect1 xml:id="security.cgi-bin.default">
<title>Вариант 1: обслуживание только общедоступных файлов</title>
<simpara>
Опциями, которые упоминает предыдущая глава раздела, не пользуются,
если на сервере нет файлов, доступ к которым ограничили паролем или фильтром по IP-адресам.
В ситуации, при которой веб-сервер не разрешает выполнять перенаправления
или у сервера нет способа сообщить исполняемому 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>
недоступны.
</simpara>
<simpara>
На веб-сервере Apache перенаправление конфигурируют
через директивы <literal>AddHandler</literal> и <literal>Action</literal>,
которые описывает следующая глава раздела.
</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>
запрещает прямой вызов <command>php</command> по URL-адресу, похожему
на <filename role="php">http://my.host/cgi-bin/php/secretdir/script.php</filename>.
В этом режиме вместо прямого вызова PHP разберёт поступивший запрос,
только если запрос перенаправил веб-сервер.
</simpara>
<simpara>
Перенаправление в конфигурации Apache чаще настраивают
через следующие директивы:
</simpara>
<programlisting role="apache-conf">
<![CDATA[
Action php-script /cgi-bin/php
AddHandler php-script .php
]]>
</programlisting>
<simpara>
Опцию конфигурации протестировали только с веб-сервером Apache/
При установке нестандартной переменной CGI-окружения <envar>REDIRECT_STATUS</envar>
для перенаправленных запросов опция полагается на веб-сервер Apache.
Нельзя пользоваться этой опцией конфигурации, если веб-сервер не поддерживает
способы определения прямых и перенаправленных запросов, и лучше запускать CGI-версии PHP
другими способами, которые описывает раздел.
</simpara>
</sect1>
<sect1 xml:id="security.cgi-bin.doc-root">
<title>Вариант 3: включение директив doc_root или user_dir</title>
<simpara>
Включение в каталоги документов веб-сервера активного содержимого
наподобие скриптов и исполняемых файлов ослабляет безопасность.
Из-за ошибок в конфигурации сервера, когда скрипты не выполняются, а отображаются
в браузере как HTML-документы, утекает интеллектуальная собственность
или конфиденциальная информация наподобие паролей.
Поэтому системные администраторы отдают преимущество настройке другой структуры
каталогов хранения скриптов, к которым открывают доступ только через CGI-интерфейс PHP,
который гарантирует интерпретацию, а не вывод кода скриптов.
</simpara>
<simpara>
Потребуется установить через директиву <link linkend="ini.doc-root">doc_root</link>
корневой каталог, который отличается от корневого каталога веб-документов,
если метод, который проверяет запросы на перенаправление, как описывает предыдущая глава,
недоступен.
</simpara>
<simpara>
Корневой каталог для PHP-скриптов устанавливают
<link linkend="configuration.file">в файле конфигурации PHP</link>
через директиву <link linkend="ini.doc-root">doc_root</link>
или через переменную окружения <envar>PHP_DOCUMENT_ROOT</envar>.
При установке корневого каталога для PHP-скриптов <acronym>CGI</acronym>-версия
двоичного файла PHP сформирует путь к файлу, который требуется открыть,
на основе значения директивы <parameter>doc_root</parameter> и пути,
который указали в запросе. Это гарантирует, что скрипты за пределами
этого каталога, за исключением каталога <parameter>user_dir</parameter>,
не выполнятся.
</simpara>
<simpara>
Другая директива, которая помогает создавать безопасные пути к файлам, —
<link linkend="ini.user-dir">user_dir</link>. Путём к файлу, который требуется открыть,
управляет только директива <parameter>doc_root</parameter>, если директиву
<parameter>user_dir</parameter> не установили. При запросе URL-адреса наподобие
<filename role="url">http://my.host/~user/doc.php</filename> обработчик откроет файл
с названием <filename role="uri">~user/doc.php</filename> (да, название каталога
начинается с символа <literal>~</literal>) в каталоге, который установили в директиве
<parameter>doc_root</parameter>, а не файл в домашнем каталоге пользователей.
</simpara>
<simpara>
Но если для директивы <parameter>user_dir</parameter> установили значение наподобие
<filename role="dir">public_php</filename>, то запрос URL-адреса
<filename role="url">http://my.host/~user/doc.php</filename>
откроет файл <filename>doc.php</filename>, который лежит
в домашнем каталоге пользователя в директории <filename role="dir">public_php</filename>.
Приведём пример. Обработчик выполнит файл <filename>/home/user/public_php/doc.php</filename>,
если домашний каталог пользователя <filename role="dir">/home/user</filename>.
</simpara>
<simpara>
PHP разворачивает значение директивы <parameter>user_dir</parameter>
независимо от настройки директивы <parameter>doc_root</parameter>,
поэтому управлять корневым каталогом документов веб-сервера
и каталогом пользователя разрешается по отдельности.
</simpara>
</sect1>
<sect1 xml:id="security.cgi-bin.shell">
<title>Вариант 4: PHP вне дерева веб-документов</title>
<para>
Безопасность значительно повышается за счёт переноса двоичного файла PHP-парсера
за пределы дерева веб-файлов, в каталог наподобие <filename role="dir">/usr/local/bin</filename>.
Единственный недостаток такого способа
состоит в том, в первую строку каждого файла с PHP-тегами придётся вставить аргумент:
<informalexample>
<programlisting>
<![CDATA[
#!/usr/local/bin/php
]]>
</programlisting>
</informalexample>
Аналогично другим CGI-скриптам, которые написали на языке Perl, sh или другом скриптовом
языке общего назначения, который использует символы <literal>#!</literal> — механизм shell-экранирования
для запуска самого себя, потребуется сделать каждый файл скрипта исполняемым.
</para>
<para>
Для корректной обработки PHP-интерпретатором переменных окружения
<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
-->