a193765b27dcf1a8490a35881d2fb459cf2f4bdd
[ach-master.git] / src / practical_settings.tex
1 \section{Recommendations on practical settings}
2
3
4 \subsection{Webservers}
5
6 \subsubsection{Apache}
7
8
9 Note: a "\textbackslash" (backslash) denotes a line continuation which was wrapped due to formatting reasons here. Do not copy it verbatim.
10
11 %-All +TLSv1.1 +TLSv1.2
12 \begin{lstlisting}[breaklines]
13   SSLProtocol All -SSLv2 -SSLv3 
14   SSLHonorCipherOrder On
15   SSLCompression off
16   # Add six earth month HSTS header for all users...
17   Header add Strict-Transport-Security "max-age=15768000"
18   # If you want to protect all subdomains, use the following header
19   # ALL subdomains HAVE TO support https if you use this!
20   # Strict-Transport-Security: max-age=15768000 ; includeSubDomains
21
22   SSLCipherSuite  DHE+AESGCM:\
23     ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:\
24     DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-SHA:\
25     ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:\
26     DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:\
27     DHE-DSS-CAMELLIA256-SHA:!ADH:!AECDH:!MD5:!DSS
28 \end{lstlisting}
29
30 Note again, that any cipher suite starting with ECDHE  can be omitted in case of doubt.
31 %% XXX NOTE TO SELF: remove from future automatically generated lists!
32
33 You should redirect everything to httpS:// if possible. In Apache you can do this with the following setting inside of a VirtualHost environment:
34
35 \begin{lstlisting}[breaklines]
36   <VirtualHost *:80>
37    #...
38    RewriteEngine On
39         RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=permanent]
40    #...
41   </VirtualHost>
42 \end{lstlisting}
43
44 %XXXX   ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5:!DSS
45
46
47 \subsubsection{lighttpd}
48
49
50
51 %% Note: need to be checked / reviewed
52
53 %% Complete ssl.cipher-list with same algo than Apache
54 %% Currently this is only the default proposed lighttpd config for SSL
55 \begin{lstlisting}[breaklines]
56   $SERVER["socket"] == "0.0.0.0:443" {
57     ssl.engine  = "enable"
58     ssl.use-sslv2 = "disable"
59     ssl.use-sslv3 = "disable"
60     ssl.use-compression = "disable"
61     ssl.pemfile = "/etc/lighttpd/server.pem"
62     ssl.cipher-list = "DHE+AESGCM:\
63       ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:\
64       DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-SHA:\
65       ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:\
66       DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:\
67       DHE-DSS-CAMELLIA256-SHA:!ADH:!AECDH:!MD5:!DSS"
68     ssl.honor-cipher-order = "enable"
69   }
70 \end{lstlisting}
71
72 As for any other webserver, you should redirect automatically http traffic toward httpS:\footnote{That proposed configuration is directly coming from lighttpd documentation: \url{http://redmine.lighttpd.net/projects/1/wiki/HowToRedirectHttpToHttps}}
73
74 \begin{lstlisting}[breaklines]
75   $HTTP["scheme"] == "http" {
76     # capture vhost name with regex conditiona -> %0 in redirect pattern
77     # must be the most inner block to the redirect rule
78     $HTTP["host"] =~ ".*" {
79         url.redirect = (".*" => "https://%0$0")
80     }
81   }
82 \end{lstlisting}
83
84 \subsubsection{nginx}
85
86
87
88 \begin{lstlisting}[breaklines]
89   ssl_prefer_server_ciphers on;
90   ssl_protocols -SSLv2 -SSLv3; 
91   ssl_ciphers DHE+AESGCM:\
92     ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:\
93     DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-SHA:\
94     ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:\
95     DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:\
96     DHE-DSS-CAMELLIA256-SHA:!ADH:!AECDH:!MD5:!DSS;
97   add_header Strict-Transport-Security max-age=2592000;
98   add_header X-Frame-Options DENY;
99 \end{lstlisting}
100
101 %% XXX FIXME: do we need to specify dhparams? Parameter: ssl_dhparam = file. See: http://wiki.nginx.org/HttpSslModule#ssl_protocols
102
103
104 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:
105
106 \begin{lstlisting}[breaklines]
107   ssl_ecdh_curve          sect571k1;
108 \end{lstlisting}
109
110 You should redirect everything to httpS:// if possible. In Nginx you can do this with the following setting:
111
112 \begin{lstlisting}[breaklines]
113   rewrite     ^(.*)   https://$host$1 permanent;
114 \end{lstlisting}
115
116 %\subsubsection{openssl.conf settings}
117
118 %\subsubsection{Differences in SSL libraries: gnutls vs. openssl vs. others}
119
120 \subsubsection{MS IIS}
121 \label{sec:ms-iis}
122
123
124
125 When trying to avoid RC4 and CBC (BEAST-Attack) and requiring perfect
126 forward secrecy, Microsoft Internet Information Server (IIS) supports
127 ECDSA, but does not support RSA for key exchange (consider ECC suite
128 B doubts\footnote{\url{http://safecurves.cr.yp.to/rigid.html}}).
129
130 Since \verb|ECDHE_RSA_*| is not supported, a SSL certificate based on
131 elliptic curves needs to be used.
132
133 The configuration of cipher suites MS IIS will use can be configured in one
134 of the following ways:
135 \begin{enumerate}
136 \item Group Policy \footnote{\url{http://msdn.microsoft.com/en-us/library/windows/desktop/bb870930(v=vs.85).aspx}}
137 \item Registry
138 \item IIS Crypto~\footnote{\url{https://www.nartac.com/Products/IISCrypto/}}
139 \end{enumerate}
140
141
142 Table~\ref{tab:MS_IIS_Client_Support} shows the process of turning on
143 one algorithm after another and the effect on the supported Clients
144 tested using https://www.ssllabs.com.
145
146 \verb|SSL 3.0|, \verb|SSL 2.0| and \verb|MD5| are turned off.
147 \verb|TLS 1.0| and \verb|TLS 2.0| are turned on.
148
149 \begin{table}[h]
150   \centering
151   \small
152   \begin{tabular}{|l|l|}
153     \hline
154     Cipher Suite & Client \\
155     \hline
156     \verb|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256| & only IE 10,11, OpenSSL 1.0.1e \\
157     \hline
158     \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256| & Chrome 30, Opera 17, Safari 6+ \\
159     \hline
160     \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA| & FF 10-24, IE 8+, Safari 5, Java 7\\
161     \hline
162   \end{tabular}
163   \caption{Client support}
164   \label{tab:MS_IIS_Client_Support}
165 \end{table}
166
167 Table~\ref{tab:MS_IIS_Client_Support} shows the algoriths from
168 strongest to weakest and why they need to be added in this order. For
169 example insiting on SHA-2 algorithms (only first two lines) would
170 eliminate all versions of Firefox, so the last line is needed to
171 support this browser, but should be placed at the bottom, so capable
172 browsers will choose the stronger SHA-2 algorithms.
173
174 \verb|TLS_RSA_WITH_RC4_128_SHA| or equivalent should also be added if
175 MS Terminal Server Connection is used (make sure to use this only in a
176 trusted environment). This suite will not be used for SSL, since we do
177 not use a RSA Key.
178
179
180 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256| ... only supported by: IE 10,11, OpenSSL 1.0.1e
181 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256| ... Chrome 30, Opera 17, Safari 6+
182 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA| ... Firefox 10-24, IE 8+, Safari 5, Java 7
183
184
185 Not supported Clients:
186 \begin{enumerate}
187 \item Java 6
188 \item WinXP
189 \item Bing
190 \end{enumerate}
191
192
193 \subsection{Mail and POP/IMAP Servers}
194 \subsubsection{Dovecot}
195
196
197
198 Dovecot 2.2:
199
200 % Example: http://dovecot.org/list/dovecot/2013-October/092999.html
201
202 \begin{lstlisting}[breaklines]
203   ssl_cipher_list = DHE+AESGCM:\
204     ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:\
205     DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-SHA:\
206     ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:\
207     DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:\
208     DHE-DSS-CAMELLIA256-SHA:!ADH:!AECDH:!MD5:!DSS
209   ssl_prefer_server_ciphers = yes
210 \end{lstlisting}
211
212 Dovecot 2.1: Almost as good as dovecot 2.2. Does not support ssl\_prefer\_server\_ciphers
213
214
215 \subsubsection{Cyrus}
216
217 \todo{write this subsubsection}
218
219 \subsubsection{UW}
220
221 \todo{write this subsubsection}
222
223 Another option to secure IMAPs servers is to place them behind an stunnel server. 
224
225 % XXX config von Adi?
226 % sslVersion = TLSv1
227 % ciphers = EDH+CAMELLIA256:EDH+aRSA:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED:-AES128:!CAMELLIA128:!ECDSA:AES256-SHA:EDH+AES128;
228 % options = CIPHER_SERVER_PREFERENCE
229 % TIMEOUTclose = 1
230
231 \subsubsection{Postfix}
232
233
234
235 First, you need to generate Diffie Hellman parameters (please first take a look at the section \ref{section:PRNG}):
236
237 \begin{lstlisting}[breaklines]
238   % openssl gendh -out /etc/postfix/dh_param_512.pem -2 512
239   % openssl gendh -out /etc/postfix/dh_param_1024.pem -2 1024
240 \end{lstlisting}
241
242 Next, we specify these DH parameters in the postfix config file:
243
244 \begin{lstlisting}[breaklines]
245   smtpd_tls_dh512_param_file = /etc/postfix/dh_param_512.pem
246   smtpd_tls_dh1024_param_file = /etc/postfix/dh_param_1024.pem
247 \end{lstlisting}
248
249 You usually don't want restrictions on the ciphers for opportunistic
250 encryption, because any encryption is better than plain text. 
251
252 For submission (Port 587) or other special cases, however, you want to
253 enforce strong encryption. In addition to the below entries in
254 main.cf, you need to enable ``mandatory`` encryption for the
255 respective service, e.g. by adding ``-o
256 smtpd\_tls\_security\_level=encrypt'' to the submission smtpd in
257 master.cf.
258
259 % don't -- this influences opportunistic encryption
260 %  smtpd_tls_protocols = !SSLv2, !SSLv3
261
262 \begin{lstlisting}[breaklines]
263   smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
264   tls_ssl_options=NO_COMPRESSION
265   smtpd_tls_mandatory_ciphers=high
266   tls_high_cipherlist=DHE+AESGCM:ECDHE-ECDSA-AES256-SHA384:\
267     ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-SHA:\
268     ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:\
269     DHE-RSA-CAMELLIA256-SHA:DHE-DSS-CAMELLIA256-SHA:!ADH:!AECDH:\
270     !MD5:!DSS
271   tls_preempt_cipherlist = yes
272   tls_random_source = dev:/dev/urandom          
273     %% NOTE: might want to have /dev/random here + Haveged
274 \end{lstlisting}
275   
276 For those users, who want to use ECC key exchange, it is possible to specify this via:
277 \begin{lstlisting}[breaklines]
278   smtpd_tls_eecdh_grade = ultra
279 \end{lstlisting}
280
281 You can check the settings by specifying  smtpd\_tls\_loglevel = 1 and then check the selected ciphers with the following command:
282 \begin{lstlisting}[breaklines]
283 $ zegrep "TLS connection established from.*with cipher" /var/log/mail.log | \
284 > awk '{printf("%s %s %s %s\n", $12, $13, $14, $15)}' | sort | uniq -c | sort -n
285       1 SSLv3 with cipher DHE-RSA-AES256-SHA
286      23 TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384
287      60 TLSv1 with cipher ECDHE-RSA-AES256-SHA
288     270 TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384
289     335 TLSv1 with cipher DHE-RSA-AES256-SHA
290 \end{lstlisting}
291
292 Source: \url{http://www.postfix.org/TLS_README.html}
293
294 \subsubsection{SMTP: opportunistic TLS}
295
296 \todo{write this subsubsection}
297
298 % do we need to documment starttls in detail?
299 %\subsubsection{starttls?}
300
301 \subsection{SSH}
302
303 \begin{lstlisting}[breaklines]
304         RSAAuthentication yes
305         PermitRootLogin no
306         StrictModes yes
307         HostKey /etc/ssh/ssh_host_rsa_key
308         Ciphers aes256-ctr
309         MACs hmac-sha2-512,hmac-sha2-256,hmac-ripemd160
310         KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1
311 \end{lstlisting}
312
313 % XXX: curve25519-sha256@libssh.org only available upstream(!)
314 Note: older linux systems won't support SHA2, PuTTY does not support RIPE-MD160.
315
316 \subsection{OpenVPN}
317
318 \todo{write this subsection}
319
320 \subsection{IPSec}
321 \todo{write this subsection}
322
323 \subsection{PGP}
324
325 \todo{write this subsection}
326
327
328
329 %%% Local Variables: 
330 %%% mode: latex
331 %%% TeX-master: "applied-crypto-hardening"
332 %%% End: