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