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