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