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
|
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
<!-- English Revision : 1174747 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<manualpage metafile="dns-caveats.xml.meta">
<title>Problèmes liés au DNS avec le serveur HTTP Apache</title>
<summary>
<p>Cette page pourrait se résumer ainsi : configurez le
serveur HTTP Apache de façon
à ce qu'il n'ait pas besoin de résolution DNS pour interpréter les
fichiers de configuration. Si httpd doit effectuer des résolutions
DNS pour interpréter les fichiers de configuration, votre serveur
pourra présenter des problèmes de fiabilité (en d'autres termes,
il est possible qu'il refuse de démarrer), ou d'attaques par déni ou
usurpation de service (y compris l'attribution de requêtes à un
serveur virtuel autre que le serveur virtuel voulu).</p>
</summary>
<section id="example">
<title>Un exemple simple</title>
<example>
# Cet exemple de configuration est invalide, ne l'utilisez pas comme base
# de configuration
<VirtualHost www.example.dom> <br />
ServerAdmin webgirl@example.dom <br />
DocumentRoot /www/example <br />
</VirtualHost>
</example>
<p>Pour fonctionner correctement, le serveur a absolument besoin de deux
informations à propos de chaque serveur virtuel : le nom du serveur
défini par la directive <directive
module="core">ServerName</directive>, et au moins une adresse IP à
laquelle le serveur va se rattacher et répondre. L'exemple ci-dessus
ne comporte pas d'adresse IP, si bien que httpd devra utiliser le
DNS pour trouver l'adresse IP de <code>www.example.dom</code>. Si pour
une raison quelconque, le DNS n'est pas disponible au moment où
votre serveur interprète son fichier de configuration, ce serveur
virtuel <strong>ne sera pas pris en compte dans la
configuration</strong>. Il sera incapable de
répondre à toute requête pour ce serveur virtuel.</p>
<p>Supposons que l'adresse de <code>www.example.dom</code> soit
192.0.2.1, et examinons cet extrait de configuration :</p>
<example>
# Cet exemple de configuration est invalide, ne l'utilisez pas comme base
# de configuration
<VirtualHost 192.0.2.1> <br />
ServerAdmin webgirl@example.dom <br />
DocumentRoot /www/example <br />
</VirtualHost>
</example>
<p>Cette fois, httpd doit effectuer une recherche DNS inverse pour
trouver le nom <code>ServerName</code> de ce serveur virtuel. Si
cette recherche inverse échoue, le serveur virtuel sera
partiellement désactivé. Si le serveur
virtuel est à base de nom, il sera en fait totalement désactivé,
mais s'il est à base d'adresse IP, il fonctionnera probablement.
Cependant, httpd échouera s'il doit générer une URL complète pour
le serveur qui inclut ce nom de serveur (comme dans le cas d'une
redirection).</p>
<p>Voici un extrait de configuration qui permet d'éviter ces deux
types de problèmes :</p>
<example>
<VirtualHost 192.0.2.1> <br />
ServerName www.example.dom <br />
ServerAdmin webgirl@example.dom <br />
DocumentRoot /www/example <br />
</VirtualHost>
</example>
</section>
<section id="denial">
<title>Déni de service</title>
<p>Considérons cet extrait de configuration :</p>
<example>
<VirtualHost www.example1.dom><br />
<indent>
ServerAdmin webgirl@example1.dom<br />
DocumentRoot /www/example1<br />
</indent>
</VirtualHost><br />
<br />
<VirtualHost www.example2.dom><br />
<indent>
ServerAdmin webguy@example2.dom<br />
DocumentRoot /www/example2<br />
</indent>
</VirtualHost>
</example>
<p>Supposons que vous ayez assigné 192.0.2.1 à
<code>www.example1.dom</code> et 192.0.2.2 à <code>www.example2.dom</code>. En
outre, supposons que <code>example1.dom</code> gère son propre DNS. Avec
cette configuration, <code>example1.dom</code> sera en mesure de
détourner tout trafic destiné à <code>example2.dom</code>. Pour y
parvenir, tout ce qu'ils ont à faire consiste à
assigner 192.0.2.2 à
<code>www.example1.dom</code>. Comme ils gèrent leur propre DNS, vous ne
pouvez pas les empêcher de faire pointer l'enregistrement
<code>www.example1.dom</code> vers l'adresse qu'ils veulent.</p>
<p>Les requêtes à destination de 192.0.2.2 (y compris toutes celles
où l'utilisateur à tapé une URL de la forme
<code>http://www.example2.dom/quelquepart</code>), seront toutes servies
par le serveur virtuel <code>example1.dom</code>. Une meilleur
compréhension de la raison pour laquelle ceci peut se produire
nécessite une discussion plus approfondie à propos de la manière
dont httpd associe les requêtes entrantes aux différents serveurs
virtuels qui vont les servir. Un document de base décrivant ceci <a
href="vhosts/details.html">est disponible</a>.</p>
</section>
<section id="main">
<title>L'adresse du "serveur principal"</title>
<p><a href="vhosts/name-based.html">Le support des
serveurs virtuels à base de nom</a> oblige httpd à
connaître la/les adresse(s) IP de l'hôte sur
lequel <program>httpd</program> s'exécute. Pour obtenir cette
adresse, soit il utilise la directive <directive
module="core">ServerName</directive> globale (si elle est présente),
soit il fait appel à la fonction C <code>gethostname</code> (qui
doit renvoyer le même nom que la commande shell "hostname"). Il
effectue ensuite une recherche DNS sur cette adresse. Pour le
moment, il n'existe aucun moyen d'éviter cette recherche DNS.</p>
<p>Si vous craignez que cette recherche DNS échoue parce que votre
serveur DNS est arrêté, vous pouvez insérer le nom d'hôte dans le
fichier <code>/etc/hosts</code> (où il est probablement déjà
enregistré afin que la machine démarre correctement). Assurez-vous
ensuite que la machine est configurée pour utiliser
<code>/etc/hosts</code> dans le cas où la recherche DNS échoue.
Suivant le système d'exploitation que vous utilisez, vous y
parviendrez en éditant <code>/etc/resolv.conf</code>, ou
<code>/etc/nsswitch.conf</code>.</p>
<p>Si votre serveur n'a aucune autre raison d'effectuer des
recherches DNS, vous pouvez définir la variable d'environnement
<code>HOSTRESORDER</code> à "local", et vous serez alors en mesure
d'exécuter httpd. Tout dépend du système d'exploitation et des
bibliothèques de résolution de noms que vous utilisez. Elle affecte
aussi les programmes CGI, à moins que vous n'utilisiez
<module>mod_env</module> pour contrôler l'environnement. Il est
conseillé de consulter les pages de manuel ou les FAQs de votre
système d'exploitation.</p>
</section>
<section id="tips">
<title>Conseils pour éviter ce genre de problème</title>
<ul>
<li>
utilisez des adresses IP au sein des <directive
module="core">VirtualHost</directive>
</li>
<li>
utilisez des adresses IP avec la directive <directive
module="mpm_common">Listen</directive>
</li>
<li>
vérifiez que tous les serveurs virtuels possèdent un nom
<directive module="core">ServerName</directive> explicite
</li>
<li>créez un serveur virtuel <code><VirtualHost
_default_:*></code> qui n'a aucune page à servir</li>
</ul>
</section>
</manualpage>
|