Merge https://github.com/BetterCrypto/Applied-Crypto-Hardening
[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 \configfile{default-ssl}{162-170}{SSL configuration for an Apache vhost}
18
19 \subsubsection{Additional settings}
20 You might want to redirect everything to \emph{https://} if possible. In Apache
21 you can do this with the following setting inside of a VirtualHost environment:
22
23 \configfile{hsts-vhost}{}{https auto-redirect vhost}
24
25 %\subsubsection{Justification for special settings (if needed)}
26
27 \subsubsection{References}
28 \begin{itemize*}
29   \item Apache2 Docs on SSL and TLS: \url{https://httpd.apache.org/docs/2.4/ssl/}
30 \end{itemize*}
31
32
33 \subsubsection{How to test}
34 See appendix \ref{cha:tools}
35
36
37 %%---------------------------------------------------------------------- 
38 \subsection{lighttpd}
39
40 \subsubsection{Tested with Versions}
41 \begin{itemize*}
42   \item lighttpd/1.4.31-4 with OpenSSL 1.0.1e on Debian Wheezy
43   \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)
44   \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)
45 \end{itemize*}
46
47
48 \subsubsection{Settings}
49 \configfile{10-ssl.conf}{3-14}{SSL configuration for lighttpd}
50
51 Starting with lighttpd version 1.4.29 Diffie-Hellman and Elliptic-Curve Diffie-Hellman key agreement protocols are supported.
52 By default, elliptic curve "prime256v1" (also "secp256r1") will be used, if no other is given.
53 To select special curves, it is possible to set them using the configuration options \verb|ssl.dh-file| and \verb|ssl.ec-curve|.
54
55 \configfile{10-ssl-dh.conf}{11-12}{SSL EC/DH configuration for lighttpd}
56
57 Please read section \ref{section:DH} for more information on Diffie Hellman key exchange and elliptic curves.
58
59 \subsubsection{Additional settings}
60 As for any other webserver, you might want to automatically redirect \emph{http://}
61 traffic toward \emph{https://}. It is also recommended to set the environment variable
62 \emph{HTTPS}, so the PHP applications run by the webserver can easily detect,
63 that HTTPS is in use.
64
65 \configfile{11-hsts.conf}{}{https auto-redirect configuration}
66
67 \subsubsection{Additional information} 
68 The config option \emph{honor-cipher-order} is available since 1.4.30, the
69 supported ciphers depend on the used OpenSSL-version (at runtime). ECDHE has to
70 be available in OpenSSL at compile-time, which should be default. SSL
71 compression should by deactivated by default at compile-time (if not, it's
72 active).
73
74 Support for other SSL-libraries like GnuTLS will be available in the upcoming
75 2.x branch, which is currently under development.
76
77
78 \subsubsection{References} 
79 \begin{itemize*}
80   \item HTTPS redirection: \url{http://redmine.lighttpd.net/projects/1/wiki/HowToRedirectHttpToHttps}
81   \item Lighttpd Docs SSL: \url{http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs\_SSL}
82   \item Release 1.4.30 (How to mitigate BEAST attack) \url{http://redmine.lighttpd.net/projects/lighttpd/wiki/Release-1\_4\_30}
83   \item SSL Compression disabled by default: \url{http://redmine.lighttpd.net/issues/2445}
84 \end{itemize*}
85
86
87 \subsubsection{How to test} 
88 See appendix \ref{cha:tools}
89
90
91 %%---------------------------------------------------------------------- 
92 \subsection{nginx}
93
94 \subsubsection{Tested with Version} 
95 \begin{itemize*}
96   \item 1.4.4 with OpenSSL 1.0.1e on OS X Server 10.8.5
97   \item 1.2.1-2.2+wheezy2 with OpenSSL 1.0.1e on Debian Wheezy
98   \item 1.4.4 with OpenSSL 1.0.1e on Debian Wheezy
99   \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)
100 \end{itemize*}
101
102
103 \subsubsection{Settings}
104 \configfile{default}{113-118}{SSL settings for nginx}
105 If you absolutely want to specify your own DH parameters, you can specify them via
106
107 \begin{lstlisting}
108 ssl_dhparam file;
109 \end{lstlisting}
110
111 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).
112
113 \subsubsection{Additional settings}
114 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:
115
116 \configfile{default-ec}{119-119}{SSL EC/DH settings for nginx}
117
118 You might want to redirect everything to \emph{https://} if possible. In Nginx you can do this with the following setting:
119
120 \configfile{default-hsts}{29-29}{https auto-redirect in nginx}
121
122 \subsubsection{References} 
123 \begin{itemize*}
124   \item \url{http://nginx.org/en/docs/http/ngx_http_ssl_module.html}
125   \item \url{http://wiki.nginx.org/HttpSslModule}
126 \end{itemize*}
127
128 \subsubsection{How to test}
129 See appendix \ref{cha:tools}
130
131
132 %%---------------------------------------------------------------------- 
133 \subsection{MS IIS}
134 \label{sec:ms-iis}
135 \todo{Daniel: add screenshots and registry keys}
136
137
138 \subsubsection{Tested with Version} \todo{Daniel: add tested version}
139
140
141 \subsubsection{Settings}
142 When trying to avoid RC4 and CBC (BEAST-Attack) and requiring perfect
143 forward secrecy, Microsoft Internet Information Server (IIS) supports
144 ECDSA, but does not support RSA for key exchange (consider ECC suite
145 B doubts\footnote{\url{http://safecurves.cr.yp.to/rigid.html}}).
146
147 Since \verb|ECDHE_RSA_*| is not supported, a SSL certificate based on
148 elliptic curves needs to be used.
149
150 The configuration of cipher suites MS IIS will use, can be configured in one
151 of the following ways:
152 \begin{enumerate}
153   \item Group Policy \footnote{\url{http://msdn.microsoft.com/en-us/library/windows/desktop/bb870930(v=vs.85).aspx}}
154   \item Registry
155   \item IIS Crypto~\footnote{\url{https://www.nartac.com/Products/IISCrypto/}}
156 \end{enumerate}
157
158
159 Table~\ref{tab:MS_IIS_Client_Support} shows the process of turning on
160 one algorithm after another and the effect on the supported clients
161 tested using https://www.ssllabs.com.
162
163 \verb|SSL 3.0|, \verb|SSL 2.0| and \verb|MD5| are turned off.
164 \verb|TLS 1.0| and \verb|TLS 2.0| are turned on.
165
166 \ctable[%
167 caption={Client support},
168 label=tab:MS_IIS_Client_Support,
169 ]{ll}{}{%
170 \FL    Cipher Suite & Client
171 \ML    \lstinline+TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256+ & only IE 10,11, OpenSSL 1.0.1e
172 \NN    \lstinline+TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256+ & Chrome 30, Opera 17, Safari 6+
173 \NN    \lstinline+TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA+ & FF 10-24, IE 8+, Safari 5, Java 7
174 \LL}
175
176 Table~\ref{tab:MS_IIS_Client_Support} shows the algorithms from
177 strongest to weakest and why they need to be added in this order. For
178 example insisting on SHA-2 algorithms (only first two lines) would
179 eliminate all versions of Firefox, so the last line is needed to
180 support this browser, but should be placed at the bottom, so capable
181 browsers will choose the stronger SHA-2 algorithms.
182
183 \verb|TLS_RSA_WITH_RC4_128_SHA| or equivalent should also be added if
184 MS Terminal Server Connection is used (make sure to use this only in a
185 trusted environment). This suite will not be used for SSL, since we do
186 not use a RSA Key.
187
188 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256| ... only supported by: IE 10,11, OpenSSL 1.0.1e
189 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256| ... Chrome 30, Opera 17, Safari 6+
190 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA| ... Firefox 10-24, IE 8+, Safari 5, Java 7
191
192 Clients not supported:
193 \begin{enumerate}
194   \item Java 6
195   \item WinXP
196   \item Bing
197 \end{enumerate}
198
199
200 \subsubsection{Additional settings}
201 %Here you can add additional settings
202
203
204 \subsubsection{Justification for special settings (if needed)}
205 % 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
206
207
208 \subsubsection{References}
209 \todo{add references}
210
211 % add any further references or best practice documents here
212
213
214 \subsubsection{How to test}
215 See appendix \ref{cha:tools}
216
217 %%---------------------------------------------------------------------- 
218 \subsection{Supporting older clients}
219 % hack.
220 \gdef\currentsectionname{Webservers-legacy}
221
222 Older clients like Internet Explorer on Windows XP (actually the Windows XP
223 crypto stack), Java 6 and Java 7 aren't supported by the recommended Variant B
224 cipher string.
225 To catch most of those old clients you might use their inability to understand
226 SNI to create a catchall page with a default SSL server. On the default page
227 you should provide information about upgrading their browser to the user.
228 This will not work with Java 7 because Java 7 understands SNI.
229
230 \subsubsection{Apache}
231 % hack.
232 \gdef\currentsubsectionname{Apache}
233
234 Create a default SSL server:
235
236 \configfile{ports.conf}{12-13}{SNI for SSL on Apache}
237 \configfile{000-default-ssl}{2-14}{SNI catchall on Apache}
238
239 The catchall virtual server needs to be the first server in the config.
240 You also should not use snakeoil certificates (as in the snipplet above)
241 but the very same certificate as you use for the real service. In case you
242 provide several virtual servers via SNI, the certificate for the catchall page
243 needs to include all their names.
244
245 \subsubsection{lighttpd}
246 % hack.
247 \gdef\currentsubsectionname{lighttpd}
248
249 \todo{someone needs to write that section or we just omit it}
250
251 \subsubsection{nginx}
252 % hack.
253 \gdef\currentsubsectionname{nginx}
254
255 Create a default SSL server:
256 \configfile{default}{125-139}{SNI catchall on nginx}
257
258 The real service then needs to be in its own server definition omitting the
259 \texttt{default} keyword in the \texttt{listen} directive.
260 You should not use snakeoil certificates (as in the snipplet above) but the
261 very same certificate as you use for the real service. In case you provide
262 several virtual servers via SNI, the certificate for the catchall page needs
263 to include all their names.
264
265 %%% Local Variables: 
266 %%% mode: latex
267 %%% TeX-master: "../applied-crypto-hardening"
268 %%% End: