Merge pull request #35 from Ardobras/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.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 http\textbf{s}:// 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 http\textbf{s}:// 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   # Set the environment variable properly
112   setenv.add-environment = (
113             "HTTPS" => "on"
114         )
115   }
116 \end{lstlisting}
117
118
119 \subsubsection{Additional information} 
120 The config option \emph{honor-cipher-order} is available since 1.4.30, the
121 supported ciphers depend on the used OpenSSL-version (at runtime). ECDH has to
122 be available in OpenSSL at compile-time, which should be default. SSL
123 compression should by deactivated by default at compile-time (if not, it's
124 active).
125
126 Support for other SSL-libraries like GnuTLS will be available in the upcoming
127 2.x branch, which is currently under development.
128
129
130 \subsubsection{References} 
131
132 \begin{itemize}
133         \item HTTPS redirection: \url{http://redmine.lighttpd.net/projects/1/wiki/HowToRedirectHttpToHttps}
134         \item Lighttpd Docs SSL: \url{http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs\_SSL}
135         \item Release 1.4.30 (How to mitigate BEAST attack) \url{http://redmine.lighttpd.net/projects/lighttpd/wiki/Release-1\_4\_30}
136         \item SSL Compression disabled by default: \url{http://redmine.lighttpd.net/issues/2445}
137 \end{itemize}
138
139
140
141
142 \subsubsection{How to test} 
143 See appendix \ref{cha:tools}
144
145
146
147 %%---------------------------------------------------------------------- 
148 \subsection{nginx}
149
150 %\begin{description}
151 \subsubsection{Tested with Version} 
152 \begin{itemize}
153 \item 1.4.4 with OpenSSL 1.0.1e on OS X Server 10.8.5
154 \item 1.2.1-2.2+wheezy2 with OpenSSL 1.0.1e on Debian 7.0
155 \item 1.4.4 with OpenSSL 1.0.1e on Debian 7.0
156 \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)
157 \end{itemize}
158
159
160 \subsubsection{Settings}
161
162 \begin{lstlisting}[breaklines]
163   ssl_prefer_server_ciphers on;
164   ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # not possible to do exclusive
165   ssl_ciphers '@@@CIPHERSTRINGB@@@';
166   add_header Strict-Transport-Security max-age=2592000;
167 \end{lstlisting}
168
169 If you absolutely want to specify your own DH parameters, you can specify them via
170
171 \begin{lstlisting}[breaklines]
172   ssl_dhparam file;
173 \end{lstlisting}
174
175 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).
176
177 \subsubsection{Additional settings}
178
179 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:
180
181 \begin{lstlisting}[breaklines]
182   ssl_ecdh_curve          secp384r1;
183 \end{lstlisting}
184
185 You might want to redirect everything to http\textbf{s}:// if possible. In Nginx you can do this with the following setting:
186
187 \begin{lstlisting}[breaklines]
188   return 301 https://$host$request_uri;
189 \end{lstlisting}
190
191
192 \subsubsection{References} 
193 \begin{itemize}
194 \item \url{http://nginx.org/en/docs/http/ngx_http_ssl_module.html}
195 \item \url{http://wiki.nginx.org/HttpSslModule}
196 \end{itemize}
197
198 \subsubsection{How to test}
199 See appendix \ref{cha:tools}
200
201
202
203
204
205 %%---------------------------------------------------------------------- 
206 \subsection{MS IIS}
207 \label{sec:ms-iis}
208
209
210 \todo{Daniel: add screenshots and registry keys}
211
212 %\begin{description}
213
214 \subsubsection{Tested with Version} \todo{Daniel: add tested version}
215
216 \subsubsection{Settings}
217
218
219 When trying to avoid RC4 and CBC (BEAST-Attack) and requiring perfect
220 forward secrecy, Microsoft Internet Information Server (IIS) supports
221 ECDSA, but does not support RSA for key exchange (consider ECC suite
222 B doubts\footnote{\url{http://safecurves.cr.yp.to/rigid.html}}).
223
224 Since \verb|ECDHE_RSA_*| is not supported, a SSL certificate based on
225 elliptic curves needs to be used.
226
227 The configuration of cipher suites MS IIS will use, can be configured in one
228 of the following ways:
229 \begin{enumerate}
230 \item Group Policy \footnote{\url{http://msdn.microsoft.com/en-us/library/windows/desktop/bb870930(v=vs.85).aspx}}
231 \item Registry
232 \item IIS Crypto~\footnote{\url{https://www.nartac.com/Products/IISCrypto/}}
233 \end{enumerate}
234
235
236 Table~\ref{tab:MS_IIS_Client_Support} shows the process of turning on
237 one algorithm after another and the effect on the supported clients
238 tested using https://www.ssllabs.com.
239
240 \verb|SSL 3.0|, \verb|SSL 2.0| and \verb|MD5| are turned off.
241 \verb|TLS 1.0| and \verb|TLS 2.0| are turned on.
242
243 \begin{table}[h]
244   \centering
245   \small
246   \begin{tabular}{ll}
247     \toprule
248     Cipher Suite & Client \\
249     \midrule
250     \verb|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256| & only 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| & FF 10-24, IE 8+, Safari 5, Java 7\\
253     \bottomrule 
254  \end{tabular}
255   \caption{Client support}
256   \label{tab:MS_IIS_Client_Support}
257 \end{table}
258
259 Table~\ref{tab:MS_IIS_Client_Support} shows the algorithms from
260 strongest to weakest and why they need to be added in this order. For
261 example insisting on SHA-2 algorithms (only first two lines) would
262 eliminate all versions of Firefox, so the last line is needed to
263 support this browser, but should be placed at the bottom, so capable
264 browsers will choose the stronger SHA-2 algorithms.
265
266 \verb|TLS_RSA_WITH_RC4_128_SHA| or equivalent should also be added if
267 MS Terminal Server Connection is used (make sure to use this only in a
268 trusted environment). This suite will not be used for SSL, since we do
269 not use a RSA Key.
270
271
272 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256| ... only supported by: IE 10,11, OpenSSL 1.0.1e
273 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256| ... Chrome 30, Opera 17, Safari 6+
274 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA| ... Firefox 10-24, IE 8+, Safari 5, Java 7
275
276
277 Clients not supported:
278 \begin{enumerate}
279 \item Java 6
280 \item WinXP
281 \item Bing
282 \end{enumerate}
283
284 \subsubsection{Additional settings}
285
286 %Here you can add additional settings
287
288 \subsubsection{Justification for special settings (if needed)}
289
290 % 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
291
292 \subsubsection{References}
293
294 \todo{add references}
295
296 % add any further references or best practice documents here
297
298 \subsubsection{How to test}
299 See appendix \ref{cha:tools}
300
301
302 %\end{description}
303
304 %%% Local Variables: 
305 %%% mode: latex
306 %%% TeX-master: "../applied-crypto-hardening"
307 %%% End: