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