Add information about DH param compatibility
[ach-master.git] / src / practical_settings / webserver.tex
index f19d06a..d39de0c 100644 (file)
-%%\subsection{Webservers}
-
 %%---------------------------------------------------------------------- 
 \subsection{Apache}
 
-\subsubsection{Tested with Versions} 
-\begin{itemize}
-\item Apache 2.4.6 linked against OpenSSL 1.0.1e, Debian jessie
-\end{itemize}
-
+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{Settings} 
+\subsubsection{Tested with Versions}
+\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.
 
-%-All +TLSv1.1 +TLSv1.2
-\begin{lstlisting}[breaklines]
-  SSLCertificateFile server.crt
-  SSLCertificateKeyFile server.key
-  SSLProtocol All -SSLv2 -SSLv3 
-  SSLHonorCipherOrder On
-  SSLCompression off
-  # Add six earth month HSTS header for all users...
-  Header add 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!
-  # Strict-Transport-Security: max-age=15768000 ; includeSubDomains
-
-  SSLCipherSuite '@@@CIPHERSTRINGB@@@'
-
-\end{lstlisting}
-
-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})
+\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:
 
-You might want to redirect everything to http\textbf{s}:// 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}
-\url{https://httpd.apache.org/docs/2.4/ssl/}
+\begin{itemize*}
+  \item Apache2 Docs on SSL and TLS: \url{https://httpd.apache.org/docs/2.4/ssl/}
+\end{itemize*}
 
 
 \subsubsection{How to test}
-
 See appendix \ref{cha:tools}
 
-%%\end{description}
-
 
 %%---------------------------------------------------------------------- 
 \subsection{lighttpd}
 
-\todo{sebix: add/test ssl.ec-curve and ssl.dh-file; see \url{http://redmine.lighttpd.net/projects/1/wiki/Docsr\_SSL\#Diffie-Hellman-and-Elliptic-Curve-Diffie-Hellman-parameters}}
-
-%%\begin{description}
-\subsubsection{Tested with Version}
-\begin{itemize}
-\item lighttpd/1.4.31-4 with OpenSSL 1.0.1e on Debian 7.0
-\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}
+\subsubsection{Tested with Versions}
+\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*}
 
 
 \subsubsection{Settings}
+\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|.
 
-%% Complete ssl.cipher-list with same algo than Apache
-\todo{FIXME: this string seems to be wrongly formatted??}
-
-\begin{lstlisting}[breaklines]
-  $SERVER["socket"] == "0.0.0.0:443" {
-    ssl.engine  = "enable"
-    ssl.use-sslv2 = "disable"
-    ssl.use-sslv3 = "disable"
-    #ssl.use-compression obsolete >= 1.4.3.1
-    ssl.pemfile = "/etc/lighttpd/server.pem"
-    ssl.cipher-list = "@@@CIPHERSTRINGB@@@"
-    ssl.honor-cipher-order = "enable"
-    setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=31536000")
-  }
-\end{lstlisting}
+\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 \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.
 
-As for any other webserver, you might want to automatically redirect http
-traffic toward http\textbf{s}:// It is also recommended to set the environment variable
-\emph{HTTPS}, so the 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")
-    }
-  # 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
-supported ciphers depend on the used OpenSSL-version (at runtime). ECDH has to
+supported ciphers depend on the used OpenSSL-version (at runtime). ECDHE has to
 be available in OpenSSL at compile-time, which should be default. SSL
 compression should by deactivated by default at compile-time (if not, it's
 active).
@@ -130,108 +76,124 @@ Support for other SSL-libraries like GnuTLS will be available in the upcoming
 
 
 \subsubsection{References} 
-
-\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}
-
-
+\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*}
 
 
 \subsubsection{How to test} 
 See appendix \ref{cha:tools}
 
 
-
 %%---------------------------------------------------------------------- 
 \subsection{nginx}
 
-%\begin{description}
 \subsubsection{Tested with Version} 
-\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 7.0
-\item 1.4.4 with OpenSSL 1.0.1e on Debian 7.0
-\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}
+\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*}
 
 
 \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=2592000;
-\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 $ > 1024 $ bits).
+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).
 
 \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}
+\configfile{default-ec}{119-119}{SSL EC/DH settings for nginx}
 
-You might want to redirect everything to http\textbf{s}:// if possible. In Nginx you can do this with the following setting:
-
-\begin{lstlisting}[breaklines]
-  return 301 https://$host$request_uri;
-\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}
-\item \url{http://nginx.org/en/docs/http/ngx_http_ssl_module.html}
-\item \url{http://wiki.nginx.org/HttpSslModule}
-\end{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*}
 
 \subsubsection{How to test}
 See appendix \ref{cha:tools}
 
 
-
-
-
 %%---------------------------------------------------------------------- 
 \subsection{MS IIS}
 \label{sec:ms-iis}
 
+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*}
 
-\todo{Daniel: add screenshots and registry keys}
 
-%\begin{description}
 
-\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 IIS Crypto~\footnote{\url{https://www.nartac.com/Products/IISCrypto/}}
+  \item Group Policy \footnote{\url{http://msdn.microsoft.com/en-us/library/windows/desktop/bb870930(v=vs.85).aspx}}
+  \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}
 
 
@@ -240,23 +202,17 @@ 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
@@ -270,38 +226,50 @@ MS Terminal Server Connection is used (make sure to use this only in a
 trusted environment). This suite will not be used for SSL, since we do
 not use a RSA Key.
 
-
 % \verb|TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256| ... only supported by: 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| ... Firefox 10-24, IE 8+, Safari 5, Java 7
 
-
 Clients not supported:
 \begin{enumerate}
-\item Java 6
-\item WinXP
-\item Bing
+  \item Java 6
+  \item WinXP
+  \item Bing
 \end{enumerate}
 
-\subsubsection{Additional settings}
 
+\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.
 
-\subsubsection{Justification for special settings (if needed)}
+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}
+\subsubsection{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 appendix \ref{cha:tools}
 
-
-%\end{description}
+%%---------------------------------------------------------------------- 
 
 %%% Local Variables: 
 %%% mode: latex