Add information about DH param compatibility
[ach-master.git] / src / practical_settings / webserver.tex
index c8e6222..d39de0c 100644 (file)
 %%---------------------------------------------------------------------- 
-Please note, that any cipher suite starting with ECDHE can be omitted, if in doubt.
-
 \subsection{Apache}
 
+Note that any cipher suite starting with EECDH can be omitted, if in doubt.
+(Compared to the theory section, EECDH in Apache and ECDHE in OpenSSL are
+synonyms~\footnote{https://www.mail-archive.com/openssl-dev@openssl.org/msg33405.html})
 
 \subsubsection{Tested with Versions}
-\begin{itemize}
-  \item Apache2/2.2.22-13 with OpenSSL 1.0.1e on Debian Wheezy (Forward Secrecy does not work on Windows!)
-\end{itemize}
-
+\begin{itemize*}
+  \item Apache 2.2.22 linked against OpenSSL 1.0.1e, Debian Wheezy
+  \item Apache 2.4.6 linked against OpenSSL 1.0.1e, Debian Jessie
+\end{itemize*}
 
 \subsubsection{Settings}
 Enabled modules \emph{SSL} and \emph{Headers} are required.
 
-\begin{lstlisting}[breaklines]
-  SSLCertificateFile server.crt
-  SSLCertificateKeyFile server.key
-  SSLProtocol All -SSLv2 -SSLv3 
-  SSLHonorCipherOrder On
-  SSLCompression off
-  SSLSessionCache shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
-  SSLSessionCacheTimeout 300
-  # Add six earth month HSTS header for all users...
-  Header always set Strict-Transport-Security "max-age=15768000"
-  # If you want to protect all subdomains, use the following header
-  # ALL subdomains HAVE TO support https if you use this!
-  # Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains"
-
-  SSLCipherSuite '@@@CIPHERSTRINGB@@@'
-\end{lstlisting}
-
+\configfile{default-ssl}{162-170}{SSL configuration for an Apache vhost}
 
 \subsubsection{Additional settings}
 You might want to redirect everything to \emph{https://} if possible. In Apache
 you can do this with the following setting inside of a VirtualHost environment:
 
-\begin{lstlisting}[breaklines]
-  <VirtualHost *:80>
-    RewriteEngine On
-    RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=permanent]
-  </VirtualHost>
-\end{lstlisting}
+\configfile{hsts-vhost}{}{https auto-redirect vhost}
+
+%\subsubsection{Justification for special settings (if needed)}
 
 \subsubsection{References}
-\begin{itemize}
+\begin{itemize*}
   \item Apache2 Docs on SSL and TLS: \url{https://httpd.apache.org/docs/2.4/ssl/}
-\end{itemize}
+\end{itemize*}
+
 
 \subsubsection{How to test}
+See appendix \ref{cha:tools}
 
-See section \ref{section:Tools}
 
 %%---------------------------------------------------------------------- 
 \subsection{lighttpd}
 
 \subsubsection{Tested with Versions}
-\begin{itemize}
+\begin{itemize*}
   \item lighttpd/1.4.31-4 with OpenSSL 1.0.1e on Debian Wheezy
   \item lighttpd/1.4.33 with OpenSSL 0.9.8o on Debian Squeeze (note that TLSv1.2 does not work in openssl 0.9.8 thus not all ciphers actually work)
   \item lighttpd/1.4.28-2 with OpenSSL 0.9.8o on Debian Squeeze (note that TLSv1.2 does not work in openssl 0.9.8 thus not all ciphers actually work)
-\end{itemize}
+\end{itemize*}
 
 
 \subsubsection{Settings}
-\begin{lstlisting}[breaklines]
-  $SERVER["socket"] == "0.0.0.0:443" {
-    ssl.engine  = "enable"
-    ssl.use-sslv2 = "disable"
-    ssl.use-sslv3 = "disable"
-    ssl.pemfile = "/etc/lighttpd/server.pem"
-    ssl.cipher-list = "@@@CIPHERSTRINGB@@@"
-    ssl.honor-cipher-order = "enable"
-    setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=15768000") # six months
-    # use this only if all subdomains support HTTPS!
-    # setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=15768000; includeSubDomains")
-  }
-\end{lstlisting}
+\configfile{10-ssl.conf}{3-14}{SSL configuration for lighttpd}
+
+Starting with lighttpd version 1.4.29 Diffie-Hellman and Elliptic-Curve Diffie-Hellman key agreement protocols are supported.
+By default, elliptic curve "prime256v1" (also "secp256r1") will be used, if no other is given.
+To select special curves, it is possible to set them using the configuration options \verb|ssl.dh-file| and \verb|ssl.ec-curve|.
+
+\configfile{10-ssl-dh.conf}{11-13}{SSL EC/DH configuration for lighttpd}
 
+Please read section \ref{section:DH} for more information on Diffie Hellman key exchange and elliptic curves.
 
 \subsubsection{Additional settings}
-As for any other webserver, you might want to automatically redirect http
-traffic towards \emph{https://}. It is also recommended to set the environment
-variable \emph{HTTPS}, PHP applications can then detect that HTTPS is in use.
+As for any other webserver, you might want to automatically redirect \emph{http://}
+traffic toward \emph{https://}. It is also recommended to set the environment variable
+\emph{HTTPS}, so the PHP applications run by the webserver can easily detect
+that HTTPS is in use.
 
-\begin{lstlisting}[breaklines]
-  $HTTP["scheme"] == "http" {
-    # capture vhost name with regex conditiona -> %0 in redirect pattern
-    # must be the most inner block to the redirect rule
-    $HTTP["host"] =~ ".*" {
-        url.redirect = (".*" => "https://%0$0")
-    }
-  }
-  server.modules += ( "mod_setenv" ) # if not already activated before
-  $HTTP["scheme"] == "https" {
-    # Set the environment variable properly
-    setenv.add-environment = (
-      "HTTPS" => "on"
-    )
-  }
-\end{lstlisting}
+\configfile{11-hsts.conf}{}{https auto-redirect configuration}
 
 \subsubsection{Additional information} 
 The config option \emph{honor-cipher-order} is available since 1.4.30, the
@@ -110,119 +74,145 @@ active).
 Support for other SSL-libraries like GnuTLS will be available in the upcoming
 2.x branch, which is currently under development.
 
+
 \subsubsection{References} 
-\begin{itemize}
+\begin{itemize*}
   \item HTTPS redirection: \url{http://redmine.lighttpd.net/projects/1/wiki/HowToRedirectHttpToHttps}
   \item Lighttpd Docs SSL: \url{http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs\_SSL}
   \item Release 1.4.30 (How to mitigate BEAST attack) \url{http://redmine.lighttpd.net/projects/lighttpd/wiki/Release-1\_4\_30}
   \item SSL Compression disabled by default: \url{http://redmine.lighttpd.net/issues/2445}
-\end{itemize}
+\end{itemize*}
+
 
 \subsubsection{How to test} 
-See section \ref{section:Tools}
+See appendix \ref{cha:tools}
+
 
 %%---------------------------------------------------------------------- 
 \subsection{nginx}
 
-
 \subsubsection{Tested with Version} 
-\begin{itemize}
+\begin{itemize*}
   \item 1.4.4 with OpenSSL 1.0.1e on OS X Server 10.8.5
   \item 1.2.1-2.2+wheezy2 with OpenSSL 1.0.1e on Debian Wheezy
   \item 1.4.4 with OpenSSL 1.0.1e on Debian Wheezy
   \item 1.2.1-2.2~bpo60+2 with OpenSSL 0.9.8o on Debian Squeeze (note that TLSv1.2 does not work in openssl 0.9.8 thus not all ciphers actually work)
-\end{itemize}
+\end{itemize*}
 
 
 \subsubsection{Settings}
-\begin{lstlisting}[breaklines]
-  ssl_prefer_server_ciphers on;
-  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # not possible to do exclusive
-  ssl_ciphers '@@@CIPHERSTRINGB@@@';
-  add_header Strict-Transport-Security "max-age=15768000; includeSubDomains"
-\end{lstlisting}
-
+\configfile{default}{113-118}{SSL settings for nginx}
 If you absolutely want to specify your own DH parameters, you can specify them via
-\begin{lstlisting}[breaklines]
-  ssl_dhparam file;
+
+\begin{lstlisting}
+ssl_dhparam file;
 \end{lstlisting}
 
 However, we advise you to read section \ref{section:DH} and stay with the standard IKE/IETF parameters (as long as they are \textgreater 1024 bits).
 
-
-\vspace{0.5em} % tempoary workaround
 \subsubsection{Additional settings}
 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:
 
-\begin{lstlisting}[breaklines]
-  ssl_ecdh_curve          secp384r1;
-\end{lstlisting}
-
-You might want to redirect everything to httpS:// if possible. In Nginx you can do this with the following setting:
+\configfile{default-ec}{119-119}{SSL EC/DH settings for nginx}
 
-\begin{lstlisting}[breaklines]
-  rewrite     ^(.*)   https://$host$1 permanent;
-\end{lstlisting}
+You might want to redirect everything to \emph{https://} if possible. In Nginx you can do this with the following setting:
 
+\configfile{default-hsts}{29-29}{https auto-redirect in nginx}
 
 \subsubsection{References} 
-\begin{itemize}
+\begin{itemize*}
   \item \url{http://nginx.org/en/docs/http/ngx_http_ssl_module.html}
   \item \url{http://wiki.nginx.org/HttpSslModule}
-\end{itemize}
+\end{itemize*}
 
 \subsubsection{How to test}
-See section \ref{section:Tools}
+See appendix \ref{cha:tools}
+
 
 %%---------------------------------------------------------------------- 
 \subsection{MS IIS}
 \label{sec:ms-iis}
 
-\todo{Daniel: add screenshots and registry keys}
+To configure SSL/TLS on Windows Server IIS Crypto can be used.~\footnote{\url{https://www.nartac.com/Products/IISCrypto/}}
+Simply start the Programm, no installation required. The tool changes the registry keys described below.
+A restart is required for the changes to take effect.
+
+\begin{figure}[p]
+  \centering
+  \includegraphics[width=0.411\textwidth]{img/IISCryptoConfig.png}
+  \caption{IIS Crypto Tool}
+  \label{fig:IISCryptoConfig}
+\end{figure}
+
+Instead of using the IIS Crypto Tool the configuration can be set
+using the Windows Registry. The following Registry keys apply to the
+newer Versions of Windows (Windows 7, Windows Server 2008, Windows
+Server 2008 R2, Windows Server 2012 and Windows Server 2012 R2). For detailed
+information about the older versions see the Microsoft knowledgebase
+article. \footnote{\url{http://support.microsoft.com/kb/245030/en-us}}
+\begin{lstlisting}[breaklines]
+  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel] 
+  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Ciphers] 
+  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\CipherSuites] 
+  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Hashes] 
+  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\KeyExchangeAlgorithms] 
+  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols] 
+\end{lstlisting}
+
+\subsubsection{Tested with Version} 
+\begin{itemize*}
+  \item Windows Server 2008
+  \item Windows Server 2008 R2
+  \item Windows Server 2012
+  \item Windows Server 2012 R2
+\end{itemize*}
+
+\begin{itemize*}
+  \item Windows Vista and Internet Explorer 7 and upwards
+  \item Windows 7 and Internet Explorer 8 and upwards
+  \item Windows 8 and Internet Explorer 10 and upwards
+  \item Windows 8.1 and Internet Explorer 11
+\end{itemize*}
 
-\subsubsection{Tested with Version} \todo{Daniel: add tested version}
 
 
-\subsubsection{Settings}
 
-When trying to avoid RC4 and CBC (BEAST-Attack) and requiring perfect
-forward secrecy, Microsoft Internet Information Server (IIS) supports
-ECDSA, but does not support RSA for key exchange (consider ECC suite
+
+
+\subsubsection{Settings}
+When trying to avoid RC4 (RC4 biases) as well as CBC (BEAST-Attack) by using GCM and to support perfect
+forward secrecy, Microsoft SChannel (SSL/TLS, Auth,.. Stack) supports
+ECDSA but lacks support for RSA signatures (see ECC suite
 B doubts\footnote{\url{http://safecurves.cr.yp.to/rigid.html}}).
 
-Since \verb|ECDHE_RSA_*| is not supported, a SSL certificate based on
-elliptic curves needs to be used.
+Since one is stuck with ECDSA, an elliptic curve certificate needs to be used.
 
 The configuration of cipher suites MS IIS will use, can be configured in one
 of the following ways:
 \begin{enumerate}
   \item Group Policy \footnote{\url{http://msdn.microsoft.com/en-us/library/windows/desktop/bb870930(v=vs.85).aspx}}
-  \item Registry
+  \item Registry  \footnote{\url{http://support.microsoft.com/kb/245030 }}
   \item IIS Crypto~\footnote{\url{https://www.nartac.com/Products/IISCrypto/}}
+  \item Powershell 
 \end{enumerate}
 
+
 Table~\ref{tab:MS_IIS_Client_Support} shows the process of turning on
 one algorithm after another and the effect on the supported clients
 tested using https://www.ssllabs.com.
 
 \verb|SSL 3.0|, \verb|SSL 2.0| and \verb|MD5| are turned off.
-\verb|TLS 1.0| and \verb|TLS 2.0| are turned on.
-
-\begin{table}[h]
-  \centering
-  \small
-  \begin{tabular}{ll}
-    \toprule
-    Cipher Suite & Client \\
-    \midrule
-    \verb|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256| & only IE 10,11, OpenSSL 1.0.1e \\
-    \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256| & Chrome 30, Opera 17, Safari 6+ \\
-    \verb|TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA| & FF 10-24, IE 8+, Safari 5, Java 7\\
-    \bottomrule 
-  \end{tabular}
-  \caption{Client support}
-  \label{tab:MS_IIS_Client_Support}
-\end{table}
+\verb|TLS 1.0| and \verb|TLS 1.2| are turned on.
+
+\ctable[%
+caption={Client support},
+label=tab:MS_IIS_Client_Support,
+]{ll}{}{%
+\FL    Cipher Suite & Client
+\ML    \lstinline+TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256+ & only IE 10,11, OpenSSL 1.0.1e
+\NN    \lstinline+TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256+ & Chrome 30, Opera 17, Safari 6+
+\NN    \lstinline+TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA+ & FF 10-24, IE 8+, Safari 5, Java 7
+\LL}
 
 Table~\ref{tab:MS_IIS_Client_Support} shows the algorithms from
 strongest to weakest and why they need to be added in this order. For
@@ -250,18 +240,38 @@ Clients not supported:
 
 \subsubsection{Additional settings}
 %Here you can add additional settings
+It's recommended to use Strict-Transport-Security: max-age=15768000 
+for detailed information visit the
+\footnote{\url{http://www.iis.net/configreference/system.webserver/httpprotocol/customheaders}}
+Microsoft knowledgebase.
 
+You might want to redirect everything to http\textbf{s}:// if possible. In IIS you can do this with the following setting by Powershell:
+
+\begin{lstlisting}[breaklines]
+Set-WebConfiguration -Location "$WebSiteName/$WebApplicationName" `
+    -Filter 'system.webserver/security/access' `
+    -Value "SslRequireCert"
+\end{lstlisting}
 
 \subsubsection{Justification for special settings (if needed)}
 % 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
 
 
 \subsubsection{References}
-\todo{add references}
+\begin{itemize*}
+\item \url{http://support.microsoft.com/kb/245030/en-us}
+\item \url{http://support.microsoft.com/kb/187498/en-us}
+\end{itemize*}
 
 % add any further references or best practice documents here
 
+
 \subsubsection{How to test}
-See section \ref{section:Tools}
+See appendix \ref{cha:tools}
+
+%%---------------------------------------------------------------------- 
 
-%\end{description}
+%%% Local Variables: 
+%%% mode: latex
+%%% TeX-master: "../applied-crypto-hardening"
+%%% End: