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