created a new old clients subsection for web servers and moved config hints in there
[ach-master.git] / src / practical_settings / webserver.tex
1 %%---------------------------------------------------------------------- 
2 \subsection{Apache}
3
4 Note that any cipher suite starting with EECDH can be omitted, if in doubt.
5 (Compared to the theory section, EECDH in Apache and ECDHE in OpenSSL are
6 synonyms~\footnote{https://www.mail-archive.com/openssl-dev@openssl.org/msg33405.html})
7
8 \subsubsection{Tested with Versions}
9 \begin{itemize*}
10   \item Apache 2.2.22 linked against OpenSSL 1.0.1e, Debian Wheezy
11   \item Apache 2.4.6 linked against OpenSSL 1.0.1e, Debian Jessie
12 \end{itemize*}
13
14 \subsubsection{Settings}
15 Enabled modules \emph{SSL} and \emph{Headers} are required.
16
17 \begin{lstlisting}
18 SSLCertificateFile server.crt
19 SSLCertificateKeyFile server.key
20 SSLProtocol All -SSLv2 -SSLv3 
21 SSLHonorCipherOrder On
22 SSLCompression off
23 # Add six earth month HSTS header for all users...
24 Header add Strict-Transport-Security "max-age=15768000"
25 # If you want to protect all subdomains, use the following header
26 # ALL subdomains HAVE TO support HTTPS if you use this!
27 # Strict-Transport-Security: max-age=15768000 ; includeSubDomains
28
29 SSLCipherSuite '%*\cipherStringB*)'
30 \end{lstlisting}
31
32 \subsubsection{Additional settings}
33 You might want to redirect everything to \emph{https://} if possible. In Apache
34 you can do this with the following setting inside of a VirtualHost environment:
35
36 \begin{lstlisting}
37 <VirtualHost *:80>
38   RewriteEngine On
39   RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=permanent]
40 </VirtualHost>
41 \end{lstlisting}
42
43 %\subsubsection{Justification for special settings (if needed)}
44
45 \subsubsection{References}
46 \begin{itemize*}
47   \item Apache2 Docs on SSL and TLS: \url{https://httpd.apache.org/docs/2.4/ssl/}
48 \end{itemize*}
49
50
51 \subsubsection{How to test}
52 See appendix \ref{cha:tools}
53
54
55 %%---------------------------------------------------------------------- 
56 \subsection{lighttpd}
57
58 \subsubsection{Tested with Versions}
59 \begin{itemize*}
60   \item lighttpd/1.4.31-4 with OpenSSL 1.0.1e on Debian Wheezy
61   \item lighttpd/1.4.33 with OpenSSL 0.9.8o on Debian Squeeze (note that TLSv1.2 does not work in openssl 0.9.8 thus not all ciphers actually work)
62   \item lighttpd/1.4.28-2 with OpenSSL 0.9.8o on Debian Squeeze (note that TLSv1.2 does not work in openssl 0.9.8 thus not all ciphers actually work)
63 \end{itemize*}
64
65
66 \subsubsection{Settings}
67 \begin{lstlisting}
68 $SERVER["socket"] == "0.0.0.0:443" {
69   ssl.engine  = "enable"
70   ssl.use-sslv2 = "disable"
71   ssl.use-sslv3 = "disable"
72   ssl.pemfile = "/etc/lighttpd/server.pem"
73   ssl.cipher-list = "%*\cipherStringB*)"
74   ssl.honor-cipher-order = "enable"
75   setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=15768000") # six months
76   # use this only if all subdomains support HTTPS!
77   # setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=15768000; includeSubDomains")
78 }
79 \end{lstlisting}
80
81 Starting with lighttpd version 1.4.29 Diffie-Hellman and Elliptic-Curve Diffie-Hellman key agreement protocols are supported.
82 By default, elliptic curve "prime256v1" (also "secp256r1") will be used, if no other is given.
83 To select special curves, it is possible to set them using the configuration options \verb|ssl.dh-file| and \verb|ssl.ec-curve|.
84 \begin{lstlisting}
85 ssl.dh-file = "/etc/lighttpd/ssl/dh2048.pem"
86 ssl.ec-curve = "secp521r1"
87 \end{lstlisting}
88 Please read section \ref{section:DH} for more information on Diffie Hellman key exchange and elliptic curves.
89
90 \subsubsection{Additional settings}
91 As for any other webserver, you might want to automatically redirect \emph{http://}
92 traffic toward \emph{https://}. It is also recommended to set the environment variable
93 \emph{HTTPS}, so the PHP applications run by the webserver can easily detect,
94 that HTTPS is in use.
95
96 \begin{lstlisting}
97 $HTTP["scheme"] == "http" {
98   # capture vhost name with regex condition -> %0 in redirect pattern
99   # must be the most inner block to the redirect rule
100   $HTTP["host"] =~ ".*" {
101     url.redirect = (".*" => "https://%0$0")
102   }
103   # Set the environment variable properly
104   setenv.add-environment = (
105     "HTTPS" => "on"
106   )
107 }
108 \end{lstlisting}
109
110
111 \subsubsection{Additional information} 
112 The config option \emph{honor-cipher-order} is available since 1.4.30, the
113 supported ciphers depend on the used OpenSSL-version (at runtime). ECDHE has to
114 be available in OpenSSL at compile-time, which should be default. SSL
115 compression should by deactivated by default at compile-time (if not, it's
116 active).
117
118 Support for other SSL-libraries like GnuTLS will be available in the upcoming
119 2.x branch, which is currently under development.
120
121
122 \subsubsection{References} 
123 \begin{itemize*}
124   \item HTTPS redirection: \url{http://redmine.lighttpd.net/projects/1/wiki/HowToRedirectHttpToHttps}
125   \item Lighttpd Docs SSL: \url{http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs\_SSL}
126   \item Release 1.4.30 (How to mitigate BEAST attack) \url{http://redmine.lighttpd.net/projects/lighttpd/wiki/Release-1\_4\_30}
127   \item SSL Compression disabled by default: \url{http://redmine.lighttpd.net/issues/2445}
128 \end{itemize*}
129
130
131 \subsubsection{How to test} 
132 See appendix \ref{cha:tools}
133
134
135 %%---------------------------------------------------------------------- 
136 \subsection{nginx}
137
138 \subsubsection{Tested with Version} 
139 \begin{itemize*}
140   \item 1.4.4 with OpenSSL 1.0.1e on OS X Server 10.8.5
141   \item 1.2.1-2.2+wheezy2 with OpenSSL 1.0.1e on Debian Wheezy
142   \item 1.4.4 with OpenSSL 1.0.1e on Debian Wheezy
143   \item 1.2.1-2.2~bpo60+2 with OpenSSL 0.9.8o on Debian Squeeze (note that TLSv1.2 does not work in openssl 0.9.8 thus not all ciphers actually work)
144 \end{itemize*}
145
146
147 \subsubsection{Settings}
148 \begin{lstlisting}
149 ssl_prefer_server_ciphers on;
150 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # not possible to do exclusive
151 ssl_ciphers '%*\cipherStringB*)';
152 add_header Strict-Transport-Security max-age=15768000; # six months
153 # use this only if all subdomains support HTTPS!
154 # add_header Strict-Transport-Security "max-age=15768000; includeSubDomains";
155 \end{lstlisting}
156
157 If you absolutely want to specify your own DH parameters, you can specify them via
158
159 \begin{lstlisting}
160 ssl_dhparam file;
161 \end{lstlisting}
162
163 However, we advise you to read section \ref{section:DH} and stay with the standard IKE/IETF parameters (as long as they are \textgreater 1024 bits).
164
165 \subsubsection{Additional settings}
166 If you decide to trust NIST's ECC curve recommendation, you can add the following line to nginx's configuration file to select special curves:
167
168 \begin{lstlisting}
169 ssl_ecdh_curve          secp384r1;
170 \end{lstlisting}
171
172 You might want to redirect everything to \emph{https://} if possible. In Nginx you can do this with the following setting:
173
174 \begin{lstlisting}
175 return 301 https://$host$request_uri;
176 \end{lstlisting}
177
178 \subsubsection{References} 
179 \begin{itemize*}
180   \item \url{http://nginx.org/en/docs/http/ngx_http_ssl_module.html}
181   \item \url{http://wiki.nginx.org/HttpSslModule}
182 \end{itemize*}
183
184 \subsubsection{How to test}
185 See appendix \ref{cha:tools}
186
187
188 %%---------------------------------------------------------------------- 
189 \subsection{MS IIS}
190 \label{sec:ms-iis}
191 \todo{Daniel: add screenshots and registry keys}
192
193
194 \subsubsection{Tested with Version} \todo{Daniel: add tested version}
195
196
197 \subsubsection{Settings}
198 When trying to avoid RC4 and CBC (BEAST-Attack) and requiring perfect
199 forward secrecy, Microsoft Internet Information Server (IIS) supports
200 ECDSA, but does not support RSA for key exchange (consider ECC suite
201 B doubts\footnote{\url{http://safecurves.cr.yp.to/rigid.html}}).
202
203 Since \verb|ECDHE_RSA_*| is not supported, a SSL certificate based on
204 elliptic curves needs to be used.
205
206 The configuration of cipher suites MS IIS will use, can be configured in one
207 of the following ways:
208 \begin{enumerate}
209   \item Group Policy \footnote{\url{http://msdn.microsoft.com/en-us/library/windows/desktop/bb870930(v=vs.85).aspx}}
210   \item Registry
211   \item IIS Crypto~\footnote{\url{https://www.nartac.com/Products/IISCrypto/}}
212 \end{enumerate}
213
214
215 Table~\ref{tab:MS_IIS_Client_Support} shows the process of turning on
216 one algorithm after another and the effect on the supported clients
217 tested using https://www.ssllabs.com.
218
219 \verb|SSL 3.0|, \verb|SSL 2.0| and \verb|MD5| are turned off.
220 \verb|TLS 1.0| and \verb|TLS 2.0| are turned on.
221
222 \begin{table}[h]
223   \centering
224   \small
225   \begin{tabular}{ll}
226     \toprule
227     Cipher Suite & Client \\
228     \midrule
229     \verb|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256| & only IE 10,11, OpenSSL 1.0.1e \\
230     \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256| & Chrome 30, Opera 17, Safari 6+ \\
231     \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA| & FF 10-24, IE 8+, Safari 5, Java 7\\
232     \bottomrule 
233   \end{tabular}
234   \caption{Client support}
235   \label{tab:MS_IIS_Client_Support}
236 \end{table}
237
238 Table~\ref{tab:MS_IIS_Client_Support} shows the algorithms from
239 strongest to weakest and why they need to be added in this order. For
240 example insisting on SHA-2 algorithms (only first two lines) would
241 eliminate all versions of Firefox, so the last line is needed to
242 support this browser, but should be placed at the bottom, so capable
243 browsers will choose the stronger SHA-2 algorithms.
244
245 \verb|TLS_RSA_WITH_RC4_128_SHA| or equivalent should also be added if
246 MS Terminal Server Connection is used (make sure to use this only in a
247 trusted environment). This suite will not be used for SSL, since we do
248 not use a RSA Key.
249
250 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256| ... only supported by: IE 10,11, OpenSSL 1.0.1e
251 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256| ... Chrome 30, Opera 17, Safari 6+
252 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA| ... Firefox 10-24, IE 8+, Safari 5, Java 7
253
254 Clients not supported:
255 \begin{enumerate}
256   \item Java 6
257   \item WinXP
258   \item Bing
259 \end{enumerate}
260
261
262 \subsubsection{Additional settings}
263 %Here you can add additional settings
264
265
266 \subsubsection{Justification for special settings (if needed)}
267 % in case you have the need for further justifications why you chose this and that setting or if the settings do not fit into the standard Variant A or Variant B schema, please document this here
268
269
270 \subsubsection{References}
271 \todo{add references}
272
273 % add any further references or best practice documents here
274
275
276 \subsubsection{How to test}
277 See appendix \ref{cha:tools}
278
279 %%---------------------------------------------------------------------- 
280 \subsection{Supporting older clients}
281
282 Older clients like Internet Explorer on Windows XP (actually the Windows XP
283 crypto stack), Java 6 and Java 7 aren't supported by the recommended Variant B
284 cipher string.
285 To catch most of those old clients you might use their inability to understand
286 SNI to create a catchall page with a default SSL server. On the default page
287 you should provide information about upgrading their browser to the user.
288 This will not work with Java 7 because Java 7 understands SNI.
289
290 \subsubsection{Apache}
291
292 Create a default SSL server:
293
294 \begin{lstlisting}
295 # Debian: add this to /etc/apache2/ports.conf
296 NameVirtualHost *:443
297 Listen 443
298
299 # this setting is needed to allow non SNI aware clients to connect too
300 SSLStrictSNIVHostCheck off
301
302 # This needs to be the first virtual host entry; on Debian systems put this
303 # in /etc/apache2/sites-enabled/000-default-ssl
304 <VirtualHost *:443>
305     DocumentRoot /var/www/bad-ssl
306     SSLEngine on
307     SSLProtocol All
308     SSLCipherSuite ALL:!ADH:!NULL:!EXPORT:+HIGH:+MEDIUM:+LOW:+SSLv3
309     SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
310     SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
311 </VirtualHost>
312 \end{lstlisting}
313
314 The catchall virtual server needs to be the first server in the config.
315 You also should not use snakeoil certificates (as in the snipplet above)
316 but the very same certificate as you use for the real service. In case you
317 provide several virtual servers via SNI, the certificate for the catchall page
318 needs to include all their names.
319
320 \subsubsection{lighttpd}
321
322 \todo{someone needs to write that section or we just omit it}
323
324 \subsubsection{nginx}
325
326 Create a default SSL server:
327
328 \begin{lstlisting}
329 server {
330     listen 443 default;
331     listen [::]:443 default ipv6only=on;
332     root /var/www/bad-ssl;
333     index index.html
334     ssl on;
335     ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
336     ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
337
338     ssl_session_timeout 5m;
339
340     ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
341     ssl_ciphers ALL:!ADH:!NULL:!EXPORT:+HIGH:+MEDIUM:+LOW:+SSLv3;
342 }
343 \end{lstlisting}
344
345 The real service then needs to be in its own server definition omitting the
346 \texttt{default} keyword in the \texttt{listen} directive.
347 You should not use snakeoil certificates (as in the snipplet above) but the
348 very same certificate as you use for the real service. In case you provide
349 several virtual servers via SNI, the certificate for the catchall page needs
350 to include all their names.
351
352 %%% Local Variables: 
353 %%% mode: latex
354 %%% TeX-master: "../applied-crypto-hardening"
355 %%% End: