Merge github.com:BetterCrypto/Applied-Crypto-Hardening
[ach-master.git] / src / practical_settings / mailserver.tex
index 68acc90..7e281c2 100644 (file)
@@ -5,8 +5,10 @@ This section documents the most common mail (SMTP) and IMAPs/POPs servers. Anoth
 \subsubsection{Dovecot}
 
 
-Dovecot 2.2:
+\begin{description}
+\item[Tested with Version:] Dovecot 2.2:
 
+\item[Settings:] \mbox{}
 % Example: http://dovecot.org/list/dovecot/2013-October/092999.html
 
 \begin{lstlisting}[breaklines]
@@ -14,15 +16,35 @@ Dovecot 2.2:
   ssl_prefer_server_ciphers = yes
 \end{lstlisting}
 
-Dovecot 2.1: Almost as good as dovecot 2.2. Does not support ssl\_prefer\_server\_ciphers
+\item[Additional info:] \mbox{}
 
-\paragraph*{Limitations}\mbox{}\\
+Dovecot 2.1: Almost as good as dovecot 2.2. Does not support
+ssl\_prefer\_server\_ciphers
 
-Dovecot currently does not support disabling TLS compression. Furthermore, DH parameters
-greater than 1024bit aren't possible. The most recent version 2.2.7 of Dovecot implements
-configurable DH parameter length
+\item[Limitations:] \mbox{}
+
+Dovecot currently does not support disabling TLS compression. Furthermore, DH
+parameters greater than 1024bit are not supported. The most recent version
+2.2.7 of Dovecot implements configurable DH parameter length
 \footnote{\url{http://hg.dovecot.org/dovecot-2.2/rev/43ab5abeb8f0}}.
 
+%\item[Justification for special settings (if needed):] \mbox{}
+
+% in case you have the need for further justifications why you chose this and that setting or if the settings do not fit into the standard Variant A or Variant B schema, please document this here
+
+\item[References:] \url{http://wiki2.dovecot.org/SSL}
+
+% add any further references or best practice documents here
+
+\item[How to test:]
+% describe here or point the admin to tools (can be a simple footnote or \ref{} to  the tools section) which help the admin to test his settings.
+
+\todo{FIXME}
+
+\end{description}
+
+%% ---------------------------------------------------------------------- 
+
 \subsubsection{cyrus-imapd (based on 2.4.17)}
 
 \paragraph*{imapd.conf}\mbox{}\\
@@ -68,7 +90,7 @@ To support POP3S/IMAPS on ports 995/993 add
 
 \paragraph*{Limitations}\mbox{}\\
 
-cyrus-imapd currently (2.4.17, trunk) does not support elliptic curves. ECDHE will not work even if defined in your cipher list.\\
+cyrus-imapd currently (2.4.17, trunk) does not support elliptic curve cryptography. Hence, ECDHE will not work even if defined in your cipher list.\\
 
 Currently there is no way to prefer server ciphers or to disable compression.\\
 
@@ -85,9 +107,12 @@ There is a working patch for all three features:
 % options = CIPHER_SERVER_PREFERENCE
 % TIMEOUTclose = 1
 
+%% ---------------------------------------------------------------------- 
+
 \subsubsection{SMTP in general}
+\label{subsection:smtp_general}
 
-SMTP usually uses opportunistic TLS. This means that an MTA will accept TLS connections when asked for it during handshake but will not require it. One should always support incoming opportunistic TLS and always try TLS handshake outgoing.\\
+SMTP usually makes use of opportunistic TLS. This means that an MTA will accept TLS connections when asked for it during handshake but will not require it. One should always support incoming opportunistic TLS and always try TLS handshake outgoing.\\
 
 Furthermore a mailserver can operate in three modes:
 \begin{itemize}
@@ -126,6 +151,8 @@ For MSA operation we recommend:
 We strongly recommend to allow all cipher suites for anything but MSA
 mode, because the alternative is plain text transmission.
 
+%% ---------------------------------------------------------------------- 
+
 \subsubsection{Postfix}
 
 \begin{description}
@@ -137,25 +164,40 @@ mode, because the alternative is plain text transmission.
 
 \item[Settings:] \mbox{}
 
-First, you need to generate Diffie Hellman parameters (please first take a look at the section \ref{section:PRNG}):
-
-\todo{FIXME: this is a really weak setting! See also: http://postfix.1071664.n5.nabble.com/postfix-hardening-what-can-we-do-td61874.html}
-\begin{lstlisting}[breaklines]
-  % openssl gendh -out /etc/postfix/dh_param_512.pem -2 512
-  % openssl gendh -out /etc/postfix/dh_param_1024.pem -2 1024
-\end{lstlisting}
-
-Next, we specify these DH parameters in \verb|main.cf|:
-
-\begin{lstlisting}[breaklines]
-  smtpd_tls_dh512_param_file = /etc/postfix/dh_param_512.pem
-  smtpd_tls_dh1024_param_file = /etc/postfix/dh_param_1024.pem
-\end{lstlisting}
+%% I (cm) consider the generation of own DH parameters to be voodoo until
+%% someone can explain the contrary. They are, after all, public, and
+%% I found no research that would show that long-term use of a
+%% parameter set would weaken the DH exchange. Also notice that IPSEC
+%% uses fixed parameter sets only.
+%& 
+%% also notice the following comment from  src/tls/tls_dh.c:
+%% * Compiled-in EDH primes (the compiled-in generator is always 2). These are
+%% * used when no parameters are explicitly loaded from a site-specific file.
+%% * 
+%% * 512-bit parameters are used for export ciphers, and 1024-bit parameters are
+%% * used for non-export ciphers. An ~80-bit strong EDH key exchange is really
+%% * too weak to protect 128+ bit keys, but larger DH primes are
+%% * computationally expensive. When greater security is required, use EECDH.
+
+%% First, you need to generate Diffie Hellman parameters (please first take a look at the section \ref{section:RNGs}):
+
+%% \todo{FIXME: this is a really weak setting! See also: http://postfix.1071664.n5.nabble.com/postfix-hardening-what-can-we-do-td61874.html}
+%% \begin{lstlisting}[breaklines]
+%%   % openssl gendh -out /etc/postfix/dh_param_512.pem -2 512
+%%   % openssl gendh -out /etc/postfix/dh_param_1024.pem -2 1024
+%% \end{lstlisting}
+
+%% Next, we specify these DH parameters in \verb|main.cf|:
+
+%% \begin{lstlisting}[breaklines]
+%%   smtpd_tls_dh512_param_file = /etc/postfix/dh_param_512.pem
+%%   smtpd_tls_dh1024_param_file = /etc/postfix/dh_param_1024.pem
+%% \end{lstlisting}
 
 \paragraph*{MX and SMTP client configuration}\mbox{}\\
 
-As discussed above, because of opportunistic encryption we do not
-restrict the list of ciphers. There's still some steps needed to
+As discussed in section \ref{subsection:smtp_general}, because of opportunistic encryption we do not
+restrict the list of ciphers. There are still some steps needed to
 enable TLS, all in \verb|main.cf|:
 
 \begin{lstlisting}[breaklines]
@@ -168,8 +210,7 @@ enable TLS, all in \verb|main.cf|:
   smtp_tls_security_level = may
   # if you have authentication enabled, only offer it after STARTTLS
   smtpd_tls_auth_only = yes
-  tls_ssl_options=NO_COMPRESSION
-  tls_random_source = dev:/dev/urandom         
+  tls_ssl_options = NO_COMPRESSION
 \end{lstlisting}
 
 \paragraph*{MSA}\mbox{}\\
@@ -181,7 +222,7 @@ acceptable for the ``mandatory'' security level, again in
 \begin{lstlisting}[breaklines]
   smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
   smtpd_tls_mandatory_ciphers=high
-  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
+  tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
 \end{lstlisting}
 
 Then, we configure the MSA smtpd in \verb|master.cf| with two
@@ -211,8 +252,18 @@ you can leave the statement in for older versions.
 Refer to \url{http://www.postfix.org/TLS_README.html} for an in-depth
 discussion.
 
-% \item[Additional settings:]
-% no additional settings
+\item[Additional settings:]
+
+Postfix has two sets of built-in DH parameters that can be overridden
+with the \verb|smtpd_tls_dh512_param_file|
+and \verb|smtpd_tls_dh1024_param_file| options. The ``dh512''
+parameters are used for export ciphers, while the ``dh1024'' ones are
+used for all other ciphers.
+
+The ``bit lenght'' in those parameter names is just a name, so one
+could use stronger parameter sets; it should be possible to e.g. use the
+IKE Group14 parameters (see section \ref{section:DH}) without much
+interoperability risk, but we have not tested this yet.
 
 % \item[Justification for special settings (if needed):]
 % no special settings
@@ -231,6 +282,9 @@ $ zegrep "TLS connection established from.*with cipher" | /var/log/mail.log | aw
 
 \end{description}
 
+
+%% ---------------------------------------------------------------------- 
+
 \subsubsection{Exim (based on 4.82)}
 
 It is highly recommended to read
@@ -271,7 +325,7 @@ Add the following rules on top of your acl\_smtp\_mail:
   warn    hosts           = *
           control         = submission/sender_retain
 \end{lstlisting}
-This switches Exim to submission mode and allows addition of missing Message-ID: and Date: headers.\\
+This switches Exim to submission mode and allows addition of missing ``Message-ID'' and ``Date'' headers.\\
 
 It is not advisable to restrict the default cipher list for MSA mode if you don't know all connecting MUAs. If you still want to define one please consult the Exim documentation or ask on the exim-users mailinglist.\\
 % Exim maintainers do not recommend to change default ciphers
@@ -378,7 +432,7 @@ GnuTLS is different in only some respects to OpenSSL:
 
 \paragraph*{Exim string expansion}\mbox{}\\
 
-Note that most of the options accept expansion strings. This way you can eg. set cipher lists or STARTTLS advertisment conditionally. Please follow the link to the official Exim documentation to get more information.
+Note that most of the options accept expansion strings. This way you can eg. set cipher lists or STARTTLS advertisement conditionally. Please follow the link to the official Exim documentation to get more information.
 
 \paragraph*{Limitations}\mbox{}\\
 
@@ -390,23 +444,38 @@ There already is a working patch to provide support:\\
 % do we need to documment starttls in detail?
 %\subsubsection{starttls?}
 
-\subsection{OpenSSH}
-\paragraph*{sshd_config}
+%% ----------------------------------------------------------------------
+\subsubsection{Exchange}
+
+\todo{FIXME: write this section}
+
+\begin{description}
+\item[Tested with Version:] \todo{version?}
+
+\item[Settings:] \mbox{}
+
 \begin{lstlisting}[breaklines]
-       # ...
-
-       Protocol 2
-       PermitEmptyPasswords no
-       PermitRootLogin no
-       StrictModes yes
-       HostKey /etc/ssh/ssh_host_rsa_key
-       Ciphers aes256-gcm@openssh.com aes128-gcm@openssh.com aes256-ctr aes128-ctr
-       MACs umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160
-       KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1
+    %Here goes your setting string
 \end{lstlisting}
 
-% XXX: curve25519-sha256@libssh.org only available upstream(!)
-Note: Older linux systems won't support SHA2. PuTTY (Windows) does not support RIPE-MD160. Curve25519, AES-GCM and UMAC are only available upstream (OpenSSH 6.1). DSA host keys have been removed on purpose, the DSS standard does not support for DSA keys stronger than 1024bit
-\footnote{\url{https://bugzilla.mindrot.org/show_bug.cgi?id=1647}} 
-which is far below current standards (see section \ref{section:keylengths}). Legacy systems can use this configuration and simply omit unsupported ciphers, key exchange algorithms and MACs.
-\\
\ No newline at end of file
+\item[Additional settings:] \mbox{}
+
+%Here you can add additional settings
+
+\begin{lstlisting}[breaklines]
+    %copy \& paste additional settings
+\end{lstlisting}
+
+\item[Justification for special settings (if needed):] \mbox{}
+
+% in case you have the need for further justifications why you chose this and that setting or if the settings do not fit into the standard Variant A or Variant B schema, please document this here
+
+\item[References:] \todo{add references}
+
+% add any further references or best practice documents here
+
+\item[How to test:]
+% describe here or point the admin to tools (can be a simple footnote or \ref{} to  the tools section) which help the admin to test his settings.
+
+\end{description}
+