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