60032ef99f221c72d9f1bca614d56ea453c5364e
[ach-master.git] / src / practical_settings.tex
1 \section{Recommendations on practical settings}
2
3
4 \subsection{SSL}
5
6 %%% NOTE: we do not need to list this all here, can move to an appendix
7 %At the time of this writing, SSL is defined in RFCs:   
8 %
9 %\begin{itemize}
10 %\item RFC2246 - TLS1.0         
11 %\item RFC3268 - AES            
12 %\item RFC4132 - Camelia                
13 %\item RFC4162 - SEED           
14 %\item RFC4279 - PSK            
15 %\item RFC4346 - TLS 1.1                
16 %\item RFC4492 - ECC            
17 %\item RFC4785 - PSK\_NULL              
18 %\item RFC5246 - TLS 1.2                
19 %\item RFC5288 - AES\_GCM               
20 %\item RFC5289 - AES\_GCM\_SHA2\_ECC            
21 %\item RFC5430 - Suite B                
22 %\item RFC5487 - GCM\_PSK               
23 %\item RFC5489 - ECDHE\_PSK             
24 %\item RFC5932 - Camelia                
25 %\item RFC6101 - SSL 3.0                
26 %\item RFC6209 - ARIA           
27 %\item RFC6367 - Camelia                
28 %\item RFC6655 - AES\_CCM               
29 %\item RFC7027 - Brainpool Curves               
30 %\end{itemize}
31
32 \subsubsection{Overview of SSL Server settings}
33
34 Most Server software (Webservers, Mail servers, etc.) can be configured to prefer certain cipher suites over others. 
35 We followed the recommendations by Ivan Ristic's SSL/TLS Deployment Best Practices\footnote{\url{https://www.ssllabs.com/projects/best-practices/index.html}} document (see section 2.2 "Use Secure Protocols") and arrived at a list of recommended cipher suites for SSL enabled servers.
36
37 The results of following his adivce is a categorisation of cipher suites.
38
39 \begin{center}
40 \begin{tabular}{| l | l | l | l | l|}
41 \hline
42 & Version   & Key\_Exchange  & Cipher    & MAC       \\ \hline
43 \cellcolor{green}prefer  & TLS 1.2   & DHE\_DSS   & AES\_256\_GCM   & SHA384        \\ \hline
44     &   & DHE\_RSA   & AES\_256\_CCM   & SHA256        \\ \hline
45     &   & ECDHE\_ECDSA   & AES\_256\_CBC   &       \\ \hline
46     &   & ECDHE\_RSA &   &       \\ \hline
47     &   &   &   &       \\ \hline
48 \cellcolor{orange}consider    & TLS 1.1   & DH\_DSS    & AES\_128\_GCM   & SHA       \\ \hline
49     & TLS 1.0   & DH\_RSA    & AES\_128\_CCM   &       \\ \hline
50     &   & ECDH\_ECDSA    & AES\_128\_CBC   &       \\ \hline
51     &   & ECDH\_RSA  & CAMELLIA\_256\_CBC  &       \\ \hline
52     &   & RSA   & CAMELLIA\_128\_CBC  &       \\ \hline
53     &   &   &   &       \\ \hline
54 \cellcolor{red}avoid   
55 & SSL 3.0   & NULL  & NULL  & NULL      \\ \hline
56     &   & DH\_anon   & RC4\_128   & MD5       \\ \hline
57     &   & ECDH\_anon & 3DES\_EDE\_CBC  &       \\ \hline
58     &   &   & DES\_CBC   &       \\ \hline
59     &   &   &   &       \\ \hline
60 \cellcolor{blue}{\color{white}special }
61 &   & PSK   & CAMELLIA\_256\_GCM  &       \\ \hline
62     &   & DHE\_PSK   & CAMELLIA\_128\_GCM  &       \\ \hline
63     &   & RSA\_PSK   & ARIA\_256\_GCM  &       \\ \hline
64     &   & ECDHE\_PSK & ARIA\_256\_CBC  &       \\ \hline
65     &   &   & ARIA\_128\_GCM  &       \\ \hline
66     &   &   & ARIA\_128\_CBC  &       \\ \hline
67     &   &   & SEED  &       \\ \hline
68 \end{tabular}
69 \end{center}
70
71 A remark on the ``consider'' section: the BSI (Bundesamt f\"ur Sicherheit in der Informationstechnik, Germany) recommends in its technical report TR-02102-2\footnote{\url{https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.html}} to \textbf{avoid} non-ephemeral\footnote{ephemeral keys are session keys which are destroyed upon termination of the encrypted session. In TLS/SSL, they are realized by the DHE cipher suites. } keys for any communication which might contain personal or sensitive data. In this document, we follow BSI's advice and therefore only keep cipher suites containing (EC)DH\textbf{E} variants. System administrators, who can not use forward secrecy can still use the cipher suites in the consider section. We however, do not recommend them in this document.
72
73 %% NOTE: s/forward secrecy/perfect forward secrecy???
74
75 Note that the entries marked as "special" are cipher suites which are not common to all clients (webbrowsers etc).
76
77
78 \subsubsection{Client recommendations}
79  
80 Next we tested the cipher suites above on the following clients:
81
82 \begin{itemize}
83 \item Chrome 30.0.1599.101 Mac OS X 10.9
84 \item Safari 7.0 Mac OS X 10.9
85 \item Firefox 25.0 Mac OS X 10.9
86 \item Internet Explorer 10 Windows 7
87 \item Apple iOS 7.0.3
88 \end{itemize}
89
90
91 The result of testing the cipher suites with these clients gives us a preference order as shown in table \ref{table:prefOrderCipherSuites}. 
92 Should a client not be able to use a specific cipher suite, it will fall back to the next possible entry as given by the ordering.
93
94 \begin{center}
95 \begin{table}[h]
96 \small
97     \begin{tabular}{|l|l|l|l|l|}
98     \hline
99     Pref & Cipher Suite                                   & ID         & Browser                     \\ \hline
100     1    & TLS\_DHE\_RSA\_WITH\_AES\_256\_GCM\_SHA384     &     0x009f & OpenSSL command line client \\ \hline
101     2    & TLS\_ECDHE\_ECDSA\_WITH\_AES\_256\_CBC\_SHA384 &     0xC024 & Safari                      \\ \hline
102     3    & TLS\_ECDHE\_RSA\_WITH\_AES\_256\_CBC\_SHA384   &     0xC028 & Safari                      \\ \hline
103     4    & TLS\_DHE\_RSA\_WITH\_AES\_256\_CBC\_SHA256     &     0x006B & Safari, Chrome              \\ \hline
104     5    & TLS\_ECDHE\_ECDSA\_WITH\_AES\_256\_CBC\_SHA    &     0xC00A & Safari, Chrome, Firefox, IE \\ \hline
105     6    & TLS\_ECDHE\_RSA\_WITH\_AES\_256\_CBC\_SHA      &     0xC014 & Safari, Chrome, Firefox, IE \\ \hline
106     7    & TLS\_DHE\_RSA\_WITH\_AES\_256\_CBC\_SHA        &     0x0039 & Safari, Chrome, Firefox     \\ \hline
107     8    & TLS\_DHE\_DSS\_WITH\_AES\_256\_CBC\_SHA        &     0x0038 & Firefox, IE                 \\ \hline
108     9    & TLS\_DHE\_RSA\_WITH\_CAMELLIA\_256\_CBC\_SHA   &     0x0088 & Firefox                     \\ \hline
109     10   & TLS\_DHE\_DSS\_WITH\_CAMELLIA\_256\_CBC\_SHA   &     0x0087 & Firefox                     \\ \hline
110     \end{tabular}
111 \caption{Preference order of cipher suites}
112 \label{table:prefOrderCipherSuites}
113 \end{table}
114 \end{center}
115
116
117 Table \ref{table:prefOrderOpenSSLNames} shows the same data again with specifying the corresponding OpenSSL name.
118
119 \begin{center}
120 \begin{table}[h]
121 \small
122     \begin{tabular}{|l|l|l|}
123     \hline
124     Cipher Suite                                   & ID         & OpenSSL Name                  \\ \hline
125     TLS\_DHE\_RSA\_WITH\_AES\_256\_GCM\_SHA384     &     0x009f &         DHE-RSA-AES256-GCM-SHA384 \\ \hline
126     TLS\_ECDHE\_ECDSA\_WITH\_AES\_256\_CBC\_SHA384 &     0xC024 &     ECDHE-ECDSA-AES256-SHA384 \\ \hline
127     TLS\_ECDHE\_RSA\_WITH\_AES\_256\_CBC\_SHA384   &     0xC028 &     ECDHE-RSA-AES256-SHA384   \\ \hline
128     TLS\_DHE\_RSA\_WITH\_AES\_256\_CBC\_SHA256     &     0x006B &     DHE-RSA-AES256-SHA256     \\ \hline
129     TLS\_ECDHE\_ECDSA\_WITH\_AES\_256\_CBC\_SHA    &     0xC00A &     ECDHE-ECDSA-AES256-SHA    \\ \hline
130     TLS\_ECDHE\_RSA\_WITH\_AES\_256\_CBC\_SHA      &     0xC014 &     ECDHE-RSA-AES256-SHA      \\ \hline
131     TLS\_DHE\_RSA\_WITH\_AES\_256\_CBC\_SHA        &     0x0039 &     DHE-RSA-AES256-SHA        \\ \hline
132     TLS\_DHE\_DSS\_WITH\_AES\_256\_CBC\_SHA        &     0x0038 &     DHE-DSS-AES256-SHA        \\ \hline
133     TLS\_DHE\_RSA\_WITH\_CAMELLIA\_256\_CBC\_SHA   &     0x0088 &     DHE-RSA-CAMELLIA256-SHA   \\ \hline
134     TLS\_DHE\_DSS\_WITH\_CAMELLIA\_256\_CBC\_SHA   &     0x0087 &     DHE-DSS-CAMELLIA256-SHA   \\ \hline
135     \end{tabular}
136 \caption{Preference order of cipher suites, with OpenSSL names}
137 \label{table:prefOrderOpenSSLNames}
138 \end{table}
139 \end{center}
140
141 Note: the tables \ref{table:prefOrderOpenSSLNames} and \ref{table:prefOrderCipherSuites} contains Eliptic curve key exchanges. There are currently strong doubts\footnote{\url{http://safecurves.cr.yp.to/rigid.html}} concerning ECC.
142 If unsure, remove the cipher suites starting with ECDHE in the table above.
143
144
145 Based on this ordering, we can now define the corresponding settings for servers. We will start with the most common web servers
146
147 \subsubsection{Apache}
148
149 Note: a "\textbackslash" (backslash) denotes a line continuation which was wrapped due to formatting reasons here. Do not copy it verbatim.
150
151 %-All +TLSv1.1 +TLSv1.2
152 \begin{verbatim}
153   SSLProtocol All -SSLv2 -SSLv3 
154   SSLHonorCipherOrder On
155   SSLCompression off
156   # Add six earth month HSTS header for all users...
157   Header add Strict-Transport-Security "max-age=15768000"
158   # If you want to protect all subdomains, use the following header
159   # Strict-Transport-Security: max-age=15768000 ; includeSubDomains
160
161   SSLCipherSuite  DHE+AESGCM:\
162     ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:\
163     DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-SHA:\
164     ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:\
165     DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:\
166     DHE-DSS-CAMELLIA256-SHA:!ADH:!AECDH:!MD5:!DSS
167 \end{verbatim}
168
169 Note again, that any cipher suite starting with ECDHE  can be omitted in case of doubt.
170 %% XXX NOTE TO SELF: remove from future automatically generated lists!
171
172 You should redirect everything to httpS:// if possible. In Apache you can do this with the following setting inside of a VirtualHost environment:
173
174 \begin{verbatim}
175   <VirtualHost *:80>
176    #...
177    RewriteEngine On
178         RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=permanent]
179    #...
180   </VirtualHost>
181 \end{verbatim}
182
183 %XXXX   ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5:!DSS
184
185
186
187 \subsubsection{nginx}
188
189 \begin{verbatim}
190   ssl_prefer_server_ciphers on;
191   ssl_protocols -SSLv2 -SSLv3; 
192   ssl_ciphers DHE+AESGCM:\
193     ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:\
194     DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-SHA:\
195     ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:\
196     DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:\
197     DHE-DSS-CAMELLIA256-SHA:!ADH:!AECDH:!MD5:!DSS;
198   add_header Strict-Transport-Security max-age=2592000;
199   add_header                X-Frame-Options DENY
200 \end{verbatim}
201
202 %% XXX FIXME: do we need to specify dhparams? Parameter: ssl_dhparam = file. See: http://wiki.nginx.org/HttpSslModule#ssl_protocols
203
204
205 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:
206
207 \begin{verbatim}
208   ssl_ecdh_curve          sect571k1;
209 \end{verbatim}
210
211 You should redirect everything to httpS:// if possible. In Nginx you can do this with the following setting:
212
213 \begin{verbatim}
214   rewrite     ^(.*)   https://$host$1 permanent;
215 \end{verbatim}
216
217 %\subsubsection{openssl.conf settings}
218
219 %\subsubsection{Differences in SSL libraries: gnutls vs. openssl vs. others}
220
221 \subsubsection{Dovecot}
222
223 Dovecot 2.2:
224
225 % Example: http://dovecot.org/list/dovecot/2013-October/092999.html
226
227 \begin{verbatim}
228   ssl_cipher_list = DHE+AESGCM:\
229     ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:\
230     DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-SHA:\
231     ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:\
232     DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:\
233     DHE-DSS-CAMELLIA256-SHA:!ADH:!AECDH:!MD5:!DSS
234   ssl_prefer_server_ciphers = yes
235 \end{verbatim}
236
237 Dovecot 2.1: Almost as good as dovecot 2.2. Does not support ssl\_prefer\_server\_ciphers
238
239
240 \subsubsection{Cyrus}
241
242 \subsubsection{UW}
243
244 Another option to secure IMAPs servers is to place them behind an stunnel server. 
245
246 % XXX config von Adi?
247 % sslVersion = TLSv1
248 % ciphers = EDH+CAMELLIA256:EDH+aRSA:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED:-AES128:!CAMELLIA128:!ECDSA:AES256-SHA:EDH+AES128;
249 % options = CIPHER_SERVER_PREFERENCE
250 % TIMEOUTclose = 1
251
252 \subsubsection{Postfix}
253
254 First, you need to generate Diffie Hellman parameters (please first take a look at the section \ref{section:PRNG}):
255
256 \begin{verbatim}
257   % openssl gendh -out /etc/postfix/dh_param_512.pem -2 512
258   % openssl gendh -out /etc/postfix/dh_param_1024.pem -2 1024
259 \end{verbatim}
260
261 Next, we specify these DH parameters in the postfix config file:
262
263 \begin{verbatim}
264   smtpd_tls_dh512_param_file = /etc/postfix/dh_param_512.pem
265   smtpd_tls_dh1024_param_file = /etc/postfix/dh_param_1024.pem
266   smtpd_tls_protocols = !SSLv2, !SSLv3
267   smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
268   tls_preempt_cipherlist = yes
269   tls_random_source = dev:/dev/urandom          
270     %% NOTE: might want to have /dev/random here + Haveged
271 \end{verbatim}
272   
273 For those users, who want to use ECC key exchange, it is possible to specify this via:
274 \begin{verbatim}
275   smtpd_tls_eecdh_grade = ultra
276 \end{verbatim}
277
278 You can check the settings by specifying  smtpd\_tls\_loglevel = 1 and then check the selected ciphers with the following command:
279 \begin{verbatim}
280 $ zegrep "TLS connection established from.*with cipher" /var/log/mail.log | \
281 > awk '{printf("%s %s %s %s\n", $12, $13, $14, $15)}' | sort | uniq -c | sort -n
282       1 SSLv3 with cipher DHE-RSA-AES256-SHA
283      23 TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384
284      60 TLSv1 with cipher ECDHE-RSA-AES256-SHA
285     270 TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384
286     335 TLSv1 with cipher DHE-RSA-AES256-SHA
287 \end{verbatim}
288
289 Source: \url{http://www.postfix.org/TLS_README.html}
290
291 \subsubsection{SMTP: opportunistic TLS}
292 % do we need to documment starttls in detail?
293 %\subsubsection{starttls?}
294
295 \subsection{SSH}
296
297 \begin{verbatim}
298         RSAAuthentication yes
299         PermitRootLogin no
300         StrictModes yes
301         Ciphers aes256-ctr
302         MACs hmac-sha2-512,hmac-sha2-256,hmac-ripemd160
303 \end{verbatim}
304
305 Note: older linux systems won't support SHA2, PuTTY does not support RIPE-MD160.
306
307 \subsection{OpenVPN}
308
309 \subsection{IPSec}
310
311 \subsection{PGP}
312
313 \subsection{PRNG settings}
314 \label{section:PRNG}
315