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