Add information about DH param compatibility
[ach-master.git] / src / practical_settings / webserver.tex
index 3696de9..d39de0c 100644 (file)
@@ -14,62 +14,13 @@ synonyms~\footnote{https://www.mail-archive.com/openssl-dev@openssl.org/msg33405
 \subsubsection{Settings}
 Enabled modules \emph{SSL} and \emph{Headers} are required.
 
-\begin{lstlisting}
-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}
+\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}
-<VirtualHost *:80>
-  RewriteEngine On
-  RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=permanent]
-</VirtualHost>
-\end{lstlisting}
-
-In case you want to catch those old clients that do not support the recommended
-cipher string (eg. WinXP or Java 6) you might use their inability to understand
-SNI to create a catchall page with a default SSL server:
-
-\begin{lstlisting}
-# Debian: add this to /etc/apache2/ports.conf
-NameVirtualHost *:443
-Listen 443
-
-# this setting is needed to allow non SNI aware clients to connect too
-SSLStrictSNIVHostCheck off
-
-# This needs to be the first virtual host entry; on Debian systems put this
-# in /etc/apache2/sites-enabled/000-default-ssl
-<VirtualHost *:443>
-    DocumentRoot /var/www/bad-ssl
-    SSLEngine on
-    SSLProtocol All
-    SSLCipherSuite ALL:!ADH:!NULL:!EXPORT:+HIGH:+MEDIUM:+LOW:+SSLv3
-    SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
-    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
-</VirtualHost>
-\end{lstlisting}
-
-The catchall virtual server needs to be the first server in the config. On the
-default page you should provide information about upgrading the browser to the
-user. You also should not use snakeoil certificates (as in the snipplet above)
-but the very same certificate as you use for the real service. In case you
-provide several virtual servers via SNI, the certificate for the catchall page
-needs to include all their names.
+\configfile{hsts-vhost}{}{https auto-redirect vhost}
 
 %\subsubsection{Justification for special settings (if needed)}
 
@@ -95,49 +46,23 @@ See appendix \ref{cha:tools}
 
 
 \subsubsection{Settings}
-\begin{lstlisting}
-$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|.
-\begin{lstlisting}
-ssl.dh-file = "/etc/lighttpd/ssl/dh2048.pem"
-ssl.ec-curve = "secp521r1"
-\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,
+\emph{HTTPS}, so the PHP applications run by the webserver can easily detect
 that HTTPS is in use.
 
-\begin{lstlisting}
-$HTTP["scheme"] == "http" {
-  # capture vhost name with regex condition -> %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
@@ -176,15 +101,7 @@ See appendix \ref{cha:tools}
 
 
 \subsubsection{Settings}
-\begin{lstlisting}
-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; # six months
-# use this only if all subdomains support HTTPS!
-# 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}
@@ -196,44 +113,11 @@ However, we advise you to read section \ref{section:DH} and stay with the standa
 \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}
-ssl_ecdh_curve          secp384r1;
-\end{lstlisting}
+\configfile{default-ec}{119-119}{SSL EC/DH settings for nginx}
 
 You might want to redirect everything to \emph{https://} if possible. In Nginx you can do this with the following setting:
 
-\begin{lstlisting}
-return 301 https://$host$request_uri;
-\end{lstlisting}
-
-In case you want to catch those old clients that do not support the recommended
-cipher string (eg. WinXP or Java 6) you might use their inability to understand
-SNI to create a catchall page with a default SSL server:
-
-\begin{lstlisting}
-server {
-    listen 443 default;
-    listen [::]:443 default ipv6only=on;
-    root /var/www/bad-ssl;
-    index index.html
-    ssl on;
-    ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
-    ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
-
-    ssl_session_timeout 5m;
-
-    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
-    ssl_ciphers ALL:!ADH:!NULL:!EXPORT:+HIGH:+MEDIUM:+LOW:+SSLv3;
-}
-\end{lstlisting}
-
-The real service then needs to be in its own server definition omitting the
-\texttt{default} keyword in the \texttt{listen} directive. On the default page
-you should provide information about upgrading the browser to the user. You
-should not use snakeoil certificates (as in the snipplet above) but the very
-same certificate as you use for the real service. In case you provide several
-virtual servers via SNI, the certificate for the catchall page needs to include
-all their names.
+\configfile{default-hsts}{29-29}{https auto-redirect in nginx}
 
 \subsubsection{References} 
 \begin{itemize*}
@@ -248,27 +132,68 @@ 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
+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}
 
 
@@ -277,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
@@ -321,14 +240,28 @@ 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
 
@@ -336,6 +269,8 @@ Clients not supported:
 \subsubsection{How to test}
 See appendix \ref{cha:tools}
 
+%%---------------------------------------------------------------------- 
+
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "../applied-crypto-hardening"