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