Merge pull request #44 from mathisdt/master
[ach-master.git] / src / practical_settings / webserver.tex
1 %%\subsection{Webservers}
2
3 %%---------------------------------------------------------------------- 
4 \subsection{Apache}
5
6 \subsubsection{Tested with Versions} 
7 \begin{itemize}
8 \item Apache 2.2.22 linked against OpenSSL 1.0.1e, Debian Wheezy
9 \item Apache 2.4.6 linked against OpenSSL 1.0.1e, Debian Jessie
10 \end{itemize}
11
12
13 \subsubsection{Settings} 
14
15 Enabled modules \emph{SSL} and \emph{Headers} are required.
16
17 %-All +TLSv1.1 +TLSv1.2
18 \begin{lstlisting}[breaklines]
19   SSLCertificateFile server.crt
20   SSLCertificateKeyFile server.key
21   SSLProtocol All -SSLv2 -SSLv3 
22   SSLHonorCipherOrder On
23   SSLCompression off
24   # Add six earth month HSTS header for all users...
25   Header add Strict-Transport-Security "max-age=15768000"
26   # If you want to protect all subdomains, use the following header
27   # ALL subdomains HAVE TO support https if you use this!
28   # Strict-Transport-Security: max-age=15768000 ; includeSubDomains
29
30   SSLCipherSuite '@@@CIPHERSTRINGB@@@'
31
32 \end{lstlisting}
33
34 Note that any cipher suite starting with EECDH can be omitted, if in doubt.
35 (Compared to the theory section, EECDH in Apache and ECDHE in OpenSSL are
36 synonyms~\footnote{https://www.mail-archive.com/openssl-dev@openssl.org/msg33405.html})
37
38 \subsubsection{Additional settings}
39
40 You might want to redirect everything to http\textbf{s}:// if possible. In Apache you can do this with the following setting inside of a VirtualHost environment:
41
42 \begin{lstlisting}[breaklines]
43   <VirtualHost *:80>
44    #...
45    RewriteEngine On
46         RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=permanent]
47    #...
48   </VirtualHost>
49 \end{lstlisting}
50
51 %\subsubsection{Justification for special settings (if needed)}
52
53 \subsubsection{References}
54 \url{https://httpd.apache.org/docs/2.4/ssl/}
55
56
57 \subsubsection{How to test}
58
59 See appendix \ref{cha:tools}
60
61 %%\end{description}
62
63
64 %%---------------------------------------------------------------------- 
65 \subsection{lighttpd}
66
67 \todo{sebix: add/test ssl.ec-curve and ssl.dh-file; see \url{http://redmine.lighttpd.net/projects/1/wiki/Docsr\_SSL\#Diffie-Hellman-and-Elliptic-Curve-Diffie-Hellman-parameters}}
68
69 %%\begin{description}
70 \subsubsection{Tested with Version}
71 \begin{itemize}
72 \item lighttpd/1.4.31-4 with OpenSSL 1.0.1e on Debian Wheezy
73 \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)
74 \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)
75 \end{itemize}
76
77
78 \subsubsection{Settings}
79
80
81 %% Complete ssl.cipher-list with same algo than Apache
82 \todo{FIXME: this string seems to be wrongly formatted??}
83
84 \begin{lstlisting}[breaklines]
85   $SERVER["socket"] == "0.0.0.0:443" {
86     ssl.engine  = "enable"
87     ssl.use-sslv2 = "disable"
88     ssl.use-sslv3 = "disable"
89     #ssl.use-compression obsolete >= 1.4.3.1
90     ssl.pemfile = "/etc/lighttpd/server.pem"
91     ssl.cipher-list = "@@@CIPHERSTRINGB@@@"
92     ssl.honor-cipher-order = "enable"
93     setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=31536000")
94   }
95 \end{lstlisting}
96
97
98 \subsubsection{Additional settings}
99
100 As for any other webserver, you might want to automatically redirect http
101 traffic toward http\textbf{s}:// It is also recommended to set the environment variable
102 \emph{HTTPS}, so the applications run by the webserver can easily detect, that
103 HTTPS is in use.
104
105
106
107 \begin{lstlisting}[breaklines]
108   $HTTP["scheme"] == "http" {
109     # capture vhost name with regex conditiona -> %0 in redirect pattern
110     # must be the most inner block to the redirect rule
111     $HTTP["host"] =~ ".*" {
112         url.redirect = (".*" => "https://%0$0")
113     }
114   # Set the environment variable properly
115   setenv.add-environment = (
116             "HTTPS" => "on"
117         )
118   }
119 \end{lstlisting}
120
121
122 \subsubsection{Additional information} 
123 The config option \emph{honor-cipher-order} is available since 1.4.30, the
124 supported ciphers depend on the used OpenSSL-version (at runtime). ECDH has to
125 be available in OpenSSL at compile-time, which should be default. SSL
126 compression should by deactivated by default at compile-time (if not, it's
127 active).
128
129 Support for other SSL-libraries like GnuTLS will be available in the upcoming
130 2.x branch, which is currently under development.
131
132
133 \subsubsection{References} 
134
135 \begin{itemize}
136         \item HTTPS redirection: \url{http://redmine.lighttpd.net/projects/1/wiki/HowToRedirectHttpToHttps}
137         \item Lighttpd Docs SSL: \url{http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs\_SSL}
138         \item Release 1.4.30 (How to mitigate BEAST attack) \url{http://redmine.lighttpd.net/projects/lighttpd/wiki/Release-1\_4\_30}
139         \item SSL Compression disabled by default: \url{http://redmine.lighttpd.net/issues/2445}
140 \end{itemize}
141
142
143
144
145 \subsubsection{How to test} 
146 See appendix \ref{cha:tools}
147
148
149
150 %%---------------------------------------------------------------------- 
151 \subsection{nginx}
152
153 %\begin{description}
154 \subsubsection{Tested with Version} 
155 \begin{itemize}
156 \item 1.4.4 with OpenSSL 1.0.1e on OS X Server 10.8.5
157 \item 1.2.1-2.2+wheezy2 with OpenSSL 1.0.1e on Debian Wheezy
158 \item 1.4.4 with OpenSSL 1.0.1e on Debian Wheezy
159 \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)
160 \end{itemize}
161
162
163 \subsubsection{Settings}
164
165 \begin{lstlisting}[breaklines]
166   ssl_prefer_server_ciphers on;
167   ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # not possible to do exclusive
168   ssl_ciphers '@@@CIPHERSTRINGB@@@';
169   add_header Strict-Transport-Security max-age=2592000;
170 \end{lstlisting}
171
172 If you absolutely want to specify your own DH parameters, you can specify them via
173
174 \begin{lstlisting}[breaklines]
175   ssl_dhparam file;
176 \end{lstlisting}
177
178 However, we advise you to read section \ref{section:DH} and stay with the standard IKE/IETF parameters (as long as they are $ > 1024 $ bits).
179
180 \subsubsection{Additional settings}
181
182 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:
183
184 \begin{lstlisting}[breaklines]
185   ssl_ecdh_curve          secp384r1;
186 \end{lstlisting}
187
188 You might want to redirect everything to http\textbf{s}:// if possible. In Nginx you can do this with the following setting:
189
190 \begin{lstlisting}[breaklines]
191   return 301 https://$host$request_uri;
192 \end{lstlisting}
193
194
195 \subsubsection{References} 
196 \begin{itemize}
197 \item \url{http://nginx.org/en/docs/http/ngx_http_ssl_module.html}
198 \item \url{http://wiki.nginx.org/HttpSslModule}
199 \end{itemize}
200
201 \subsubsection{How to test}
202 See appendix \ref{cha:tools}
203
204
205
206
207
208 %%---------------------------------------------------------------------- 
209 \subsection{MS IIS}
210 \label{sec:ms-iis}
211
212
213 \todo{Daniel: add screenshots and registry keys}
214
215 %\begin{description}
216
217 \subsubsection{Tested with Version} \todo{Daniel: add tested version}
218
219 \subsubsection{Settings}
220
221
222 When trying to avoid RC4 and CBC (BEAST-Attack) and requiring perfect
223 forward secrecy, Microsoft Internet Information Server (IIS) supports
224 ECDSA, but does not support RSA for key exchange (consider ECC suite
225 B doubts\footnote{\url{http://safecurves.cr.yp.to/rigid.html}}).
226
227 Since \verb|ECDHE_RSA_*| is not supported, a SSL certificate based on
228 elliptic curves needs to be used.
229
230 The configuration of cipher suites MS IIS will use, can be configured in one
231 of the following ways:
232 \begin{enumerate}
233 \item Group Policy \footnote{\url{http://msdn.microsoft.com/en-us/library/windows/desktop/bb870930(v=vs.85).aspx}}
234 \item Registry
235 \item IIS Crypto~\footnote{\url{https://www.nartac.com/Products/IISCrypto/}}
236 \end{enumerate}
237
238
239 Table~\ref{tab:MS_IIS_Client_Support} shows the process of turning on
240 one algorithm after another and the effect on the supported clients
241 tested using https://www.ssllabs.com.
242
243 \verb|SSL 3.0|, \verb|SSL 2.0| and \verb|MD5| are turned off.
244 \verb|TLS 1.0| and \verb|TLS 2.0| are turned on.
245
246 \begin{table}[h]
247   \centering
248   \small
249   \begin{tabular}{ll}
250     \toprule
251     Cipher Suite & Client \\
252     \midrule
253     \verb|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256| & only IE 10,11, OpenSSL 1.0.1e \\
254     \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256| & Chrome 30, Opera 17, Safari 6+ \\
255     \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA| & FF 10-24, IE 8+, Safari 5, Java 7\\
256     \bottomrule 
257  \end{tabular}
258   \caption{Client support}
259   \label{tab:MS_IIS_Client_Support}
260 \end{table}
261
262 Table~\ref{tab:MS_IIS_Client_Support} shows the algorithms from
263 strongest to weakest and why they need to be added in this order. For
264 example insisting on SHA-2 algorithms (only first two lines) would
265 eliminate all versions of Firefox, so the last line is needed to
266 support this browser, but should be placed at the bottom, so capable
267 browsers will choose the stronger SHA-2 algorithms.
268
269 \verb|TLS_RSA_WITH_RC4_128_SHA| or equivalent should also be added if
270 MS Terminal Server Connection is used (make sure to use this only in a
271 trusted environment). This suite will not be used for SSL, since we do
272 not use a RSA Key.
273
274
275 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256| ... only supported by: IE 10,11, OpenSSL 1.0.1e
276 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256| ... Chrome 30, Opera 17, Safari 6+
277 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA| ... Firefox 10-24, IE 8+, Safari 5, Java 7
278
279
280 Clients not supported:
281 \begin{enumerate}
282 \item Java 6
283 \item WinXP
284 \item Bing
285 \end{enumerate}
286
287 \subsubsection{Additional settings}
288
289 %Here you can add additional settings
290
291 \subsubsection{Justification for special settings (if needed)}
292
293 % 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
294
295 \subsubsection{References}
296
297 \todo{add references}
298
299 % add any further references or best practice documents here
300
301 \subsubsection{How to test}
302 See appendix \ref{cha:tools}
303
304
305 %\end{description}
306
307 %%% Local Variables: 
308 %%% mode: latex
309 %%% TeX-master: "../applied-crypto-hardening"
310 %%% End: