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