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