Merge branch 'master' of https://git.bettercrypto.org/ach-master
authorAaron Kaplan <aaron@lo-res.org>
Tue, 17 Dec 2013 17:28:14 +0000 (18:28 +0100)
committerAaron Kaplan <aaron@lo-res.org>
Tue, 17 Dec 2013 17:28:14 +0000 (18:28 +0100)
src/PKIs.tex
src/further_research.tex
src/practical_settings/mailserver.tex
src/practical_settings/proxy_solutions.tex
src/practical_settings/ssh.tex
src/practical_settings/vpn.tex
src/practical_settings/webserver.tex
src/reviewers.tex
src/scope.tex
src/security.bib

index 257c641..fd152c2 100644 (file)
@@ -13,20 +13,19 @@ given how you can improve the security of PKIs.
 
 \section{Certificate Authorities}
 \label{sec:cas}
-In order to get a certificate, you either go to a CA which, will issue a certificate,
-or you run your own CA. In the later case you normally speak of self-signed 
-certificates. For both cases there are pro and contra points and the decision is
+In order to get a certificate, you either go to a CA which will issue a certificate for you,
+or you run your own CA. In the latter case one normally speaks of self-signed 
+certificates. For both cases there are pros and contras and the decision is
 as always security versus usability.
 
 \subsubsection{Signed Certificates form a trusted Certificate Authority}
 \label{sec:signcertfromca}
-Trusted certificates are mostly issued by commercial CAs, such as Verisign, Teletrust, etc.
-These certificates are mostly issued for specified time period and cost money. Nevertheless
+Trusted certificates are mostly issued by commercial CAs, such as Verisign, GoDaddy, Teletrust, etc.
+These certificates are mostly issued for specified time period and cost money. Nevertheless
 there are also free trusted CAs available, such as StartSSL, or CACert.
 
-If you consider getting a signed certificate from a trusted CA, you should not generate the 
-private key not on the CAs system. You can generate a private key and a corresponding 
-certificate request as follows:
+If you consider getting a signed certificate from a trusted CA, you should not let the CA generate the 
+private key for you. You can generate a private key and a corresponding certificate request as follows:
 
 \begin{lstlisting}[breaklines]
 % openssl req -new -nodes -keyout <servername>.key -out <servername>.csr -newkey rsa:<keysize>
@@ -46,9 +45,9 @@ An optional company name []:
 
 \subsubsection{Setting up your own Certificate Authority}
 \label{sec:setupownca}
-In some situations it is sufficient to use your own CA certificates. An example is a own OpenVPN
-installation or if only systems communicate with each other, which do not act with users. Creating
-a own CA can be accomplished using OpenSSL:
+In some situations it is sufficient to use your own certificate authority. An example is an OpenVPN
+installation or if only internal systems communicate with each other, without interaction with users. 
+Creating a CA can be accomplished using OpenSSL (Debian):
 
 \begin{lstlisting}
 % cd /usr/lib/ssl/misc
@@ -66,18 +65,21 @@ issued a new root certificate. Now you can issue new certificates as follows:
 \subsection{Hardening PKI}
 \label{sec:hardeningpki}
 In recent years several CAs were compromised by attackers in order to
-get trusted certificates for malicious activities. In 2011 the Dutch
-CA Diginotar was hacked and all certificates were
+get ahold of trusted certificates for malicious activities. In 2011 
+the Dutch CA Diginotar was hacked and all certificates were
 revoked~\cite{diginotar-hack}. Recently Google found certificates
 issued to them, which were not used by the
 company~\cite{googlecahack}. The concept of PKIs heavily depends on the
 security of CAs.  If they get compromised the whole PKI system will
-fail.
+fail. Some CAs tend to incorrectly issue certificates that were designated
+to do a different job than what they were intended to by the CA~\cite{gocode}.
 
 Therefore several security enhancements were introduced by different
 organisations and vendors~\cite{tschofenig-webpki}. Currently two
 methods are used, DANE~\cite{rfc6698} and Certificate
-Pinning~\cite{draft-ietf-websec-key-pinning}.
+Pinning~\cite{draft-ietf-websec-key-pinning}. Google recently proposed
+a new system to detect malicous CAs and certificates  called Certificate 
+Transparency~\cite{certtransparency}.
 
 % \subsubsection{DANE}
 % \label{sec:dane}
index b746957..fcb7f47 100644 (file)
@@ -1,5 +1,6 @@
+\newpage
 \section{Further research}
-
+\label{section:furtherresearch}
 The following is a list of services, software packages, hardware devices or protocols that we considered documenting but either did not manage to document yet or might be able to document later. We encourage input from the Internet community. 
 
 \vline{}
@@ -23,8 +24,9 @@ The following is a list of services, software packages, hardware devices or prot
 \item NNTP 
 \item NTPs tlsdate 
 \item BGP / OSPF 
-\item silc 
-\item LDAP 
+\item SILC
+\item LDAP
+\item Commerical network equipment vendors
 \end{itemize}
 \end{minipage}
 \begin{minipage}[b]{0.5\linewidth}
@@ -33,7 +35,7 @@ The following is a list of services, software packages, hardware devices or prot
 \item Moxa , APC, und co... ICS . Ethernet to serial 
 \item telnet (only sensible reocmmendation: \emph{DON't!!}
 \item rsyslog 
-\item v6 spoofing (look at work by Ferndo Gont et. al)
+\item v6 spoofing (look at work by Ferndo Gont, Marc Heuse, et. al.)
 \item tinc
 \item rsync 
 \item telnets 
index 1a1675e..693d11e 100644 (file)
@@ -61,7 +61,7 @@ Limiting the ciphers provided may force (especially older) clients to connect wi
 
 If you still want to force strong encryption use
 \begin{lstlisting}[breaklines]
-  tls_cipher_list: <...recommended ciphersuite...>
+  tls_cipher_list: @@@CIPHERSTRINGB@@@
 \end{lstlisting}
 
 cyrus-imapd loads hardcoded 1024 bit DH parameters using get\_rfc2409\_prime\_1024() by default. If you want to load your own DH parameters add them PEM encoded to the certificate file given in tls\_cert\_file. Do not forget to re-add them after updating your certificate.\\
index 1d9b003..b686232 100644 (file)
@@ -1,15 +1,16 @@
 %%\subsection{Intercepting proxy solutions and reverse proxies}
 
-Within enterprise networks and corporations with increased levels of paranoia or at least some defined security requirements it is common NOT to allow direct connections to the public internet.
+Within enterprise networks and corporations with increased levels of paranoia or at least some defined security requirements it is common \textbf{not} to allow direct connections to the public internet.
 
-For this reasons proxy solutions are installed to intercept and scan the traffic for potential threats within the sessions.
+For this reason proxy solutions are deployed on corporate networks to intercept and scan the traffic for potential threats within sessions.\\
 
-As soon as one wants to establish an encrypted connection to a server, there are three choices:
+For encrypted traffic there are four options:
 
 \begin{itemize}
-\item Block the connection, because it cannot be scanned for threats
-\item Bypass the threat-mitigation and pass the encrypted session to the client, which results in a situation where malicious content is transferred directly to the client without visibility for the security system.
-\item Intercept (i.e. terminate) the session at the proxy, scan there and re-encrypt the session towards the client.
+\item Block the connection because it cannot be scanned for threats.
+\item Bypass the threat-mitigation and pass the encrypted session to the client, which results in a situation where malicious content is transferred directly to the client without visibility to the security system.
+\item Intercept (i.e. terminate) the session at the proxy, scan there and re-encrypt the session towards the client (effectively MITM).
+\item Deploy special Certificate Authorities to enable Deep Packet Inspection on the wire.
 \end{itemize}
 
 While the latest solution might be the most "up to date", it arises a new front in the context of this paper, because the most secure part of a client's connection could only be within the corporate network, if the proxy-server handles the connection to the destination server in an insecure manner.
@@ -27,15 +28,7 @@ squid.conf
 \todo{UNTESTED!}
 \begin{lstlisting}[breaklines]
 options=NO_SSLv2,NO_TLSv1,NO_Compression,CIPHER_SERVER_PREFERENCE 
-cipher=ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH [...]
-\end{lstlisting}
-
-
-
-\todo{UNTESTED!}
-\begin{lstlisting}[breaklines]
-options=NO_SSLv2,NO_TLSv1,NO_Compression,CIPHER_SERVER_PREFERENCE 
-cipher=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
+cipher=@@@CIPHERSTRINGB@@@
 \end{lstlisting}
 
 
@@ -155,7 +148,7 @@ ListenHTTPS
     AddHeader    "Front-End-Https: on"
     Cert         "/path/to/your/cert.pem"
     ## See 'man ciphers'.
-    Ciphers     "      TLSv1.2:!SSLv3:!SSLv2:AES256:!aNULL:!eNULL:!NULL"
+    Ciphers      "TLSv1.2:TLSv1.1:!SSLv3:!SSLv2:@@@CIPHERSTRINGB@@@"
     Service
         BackEnd
             Address 10.20.0.10
index b886f25..960c14e 100644 (file)
@@ -1,4 +1,4 @@
-\subsubsection{OpenSSH}
+\subsection{OpenSSH}
 
 
 \begin{description}
@@ -37,16 +37,68 @@ algorithms and MACs.
 
 Note that the setting \texttt{ServerKeyBits 4096}  has no effect until you re-generate new ssh host keys. There might be issues if you have users which rely on the fingerprint of the old ssh host key being stored in their clients' \texttt{.ssh/known\_hosts} file.
 
-\item[References:] The openssh sshd\_config  man page is the best reference: \url{http://www.openssh.org/cgi-bin/man.cgi?query=sshd_config}
+\item[References:]
+The openssh sshd\_config  man page is the best reference: \url{http://www.openssh.org/cgi-bin/man.cgi?query=sshd_config}
 
 
 \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.
+Connect a client with verbose logging enabled to the SSH server \\
+\begin{lstlisting}[breaklines]
+$ ssh -vvv myserver.com
+\end{lstlisting}and observe the key exchange in the output.
+\end{description}
+
+\subsection{Cisco ASA}
+
+
+\begin{description}
+\item[Tested with Version:]9.1(3) 
 
-Connect with a client to an ssh server like this: \\
+\item[Settings:] \mbox{}
+\begin{lstlisting}[breaklines]
+crypto key generate rsa modulus 2048
+ssh version 2
+ssh key-exchange group dh-group14-sha1
+line vty 0 4
+ transport input ssh
+\end{lstlisting}
+Note: When the ASA is configured for SSH, by default both SSH versions 1 and 2 are allowed. In addition to that, only a group1 DH-key-exchange is used. This should be changed to allow only SSH version 2 and to use a key-exchnage with group14. The generated RSA key should be 2048 bit (the actual supported maximum). A non-cryptographic best practice is to reconfigure the lines to only allow SSH-logins.
+\item[References:]
+http://www.cisco.com/en/US/docs/security/asa/asa91/configuration/general/admin\_management.html 
+
+
+\item[How to test:]
+Connect a client with verbose logging enabled to the SSH server \\
 \begin{lstlisting}[breaklines]
 $ ssh -vvv myserver.com
+\end{lstlisting}and observe the key exchange in the output.
+\end{description}
+
+
+\subsection{Cisco IOS}
+
+
+\begin{description}
+\item[Tested with Version:] 15.0, 15.1, 15.2
+
+\item[Settings:] \mbox{}
+\begin{lstlisting}[breaklines]
+crypto key generate rsa modulus 2048 label SSH-KEYS
+ip ssh rsa keypair-name SSH-KEYS
+ip ssh version 2
+ip ssh dh min size 2048
 \end{lstlisting}
-and observe the key exchange in the verbose output.
+Note: Same as with the ASA, also on IOS by default both SSH versions 1 and 2 are allowed and the DH-key-exchange only use a DH-group of 768 Bit.
+In IOS, a dedicated Key-pair can be bound to SSH to reduce the usage of individual keys-pairs.
+
+\item[References:]
+http://www.cisco.com/en/US/docs/ios/sec\_user\_services/configuration/guide/sec\_secure\_shell\_v2.html 
+
+% add any further references or best practice documents here
 
+\item[How to test:]
+Connect a client with verbose logging enabled to the SSH server \\
+\begin{lstlisting}[breaklines]
+$ ssh -vvv myserver.com
+\end{lstlisting}and observe the key exchange in the output.
 \end{description}
index bdb7764..a572ada 100644 (file)
@@ -28,7 +28,8 @@ If you need to use Pre-Shared Key authentication:
 
 The size of the PSK should not be shorter than the output size of
 the hash algorithm used in IKE \footnote{It is used in a HMAC, see
-RFC2104\cite{rfc2104}.}.
+RFC2104\cite{rfc2104} and the discussion starting
+in \url{http://www.vpnc.org/ietf-ipsec/02.ipsec/msg00268.html}.}.
 
 For a key composed of upper- and lowercase letters, numbers, and two
 additional symbols\footnote{64 possible values = 6 bits},
@@ -70,8 +71,8 @@ table~\ref{tab:IPSEC_suites}.
     \toprule
     Configuration A & Configuration B & Notes\\
     \midrule
-    \verb|Suite-B-GCM-256| \newline \verb|Suite-B-GMAC-256| &
-    \verb|Suite-B-GCM-128| \newline \verb|Suite-B-GMAC-128| \newline
+    \verb|Suite-B-GCM-256| &
+    \verb|Suite-B-GCM-128| \newline
     \verb|VPN-B| 
     & All Suite-B variants use NIST elliptic curves\\
     \bottomrule
@@ -101,7 +102,7 @@ vulnerabilities \footnote{\url{http://ikecrack.sourceforge.net/}}.
     Mode & Main Mode & Main Mode \\
     Encryption & AES-256 & AES, CAMELLIA (-256 or -128) \\
     Hash & SHA2-* & SHA2-*, SHA1 \\
-    DH Group & Group 14--18, 19--21 & Group 14--21 \\
+    DH Group & Group 14, 18 & Group 14, 18 \\
 %    Lifetime & \todo{need recommendations; 1 day seems to be common
 %      practice} & \\
     \bottomrule
@@ -129,7 +130,7 @@ parameters are shown in table \ref{tab:IPSEC_ph2_params}.
     &
     \parbox[t]{5cm}{\raggedright
     \mbox{AES-GCM-16}, \mbox{AES-CTR}, \mbox{AES-CCM-16}, \mbox{AES-256}, \mbox{CAMELLIA-256}, \mbox{AES-128}, \mbox{CAMELLIA-128}} \\
-    Hash & SHA2-* (or none for AES-GCM) & SHA2-*, SHA1 (or none for AES-GCM) \\
+    Hash & SHA2-* (or none for AEAD) & SHA2-*, SHA1 (or none for AEAD) \\
     DH Group & Same as Phase 1 & Same as Phase 1 \\
 %    Lifetime & \todo{need recommendations; 1-8 hours is common} & \\
     \bottomrule
@@ -277,8 +278,6 @@ client and server.
 tls-cipher DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
 cipher AES-256-CBC
 auth SHA384
-# generate with 'openssl dhparam -out dh2048.pem 2048':
-dh dh2048.pem
 \end{lstlisting}
 
 \paragraph{Client Configuration}\mbox{}
@@ -414,25 +413,25 @@ crypto map Outside-DMZ_map interface Outside-DMZ
 crypto ikev2 policy 1
  encryption aes-gcm-256
  integrity null
- group 24 14
+ group 14
  prf sha512 sha384 sha256 sha
  lifetime seconds 86400
 crypto ikev2 policy 2
  encryption aes-gcm-256 aes-gcm-192 aes-gcm
  integrity null
- group 24 14 5
+ group 14
  prf sha512 sha384 sha256 sha
  lifetime seconds 86400
 crypto ikev2 policy 3
  encryption aes-256 aes-192 aes
  integrity sha512 sha384 sha256
- group 24 14
+ group 14
  prf sha512 sha384 sha256 sha
  lifetime seconds 86400
 crypto ikev2 policy 4
  encryption aes-256 aes-192 aes
  integrity sha512 sha384 sha256 sha
- group 24 14 5
+ group 14
  prf sha512 sha384 sha256 sha
  lifetime seconds 86400
 crypto ikev2 enable Outside-DMZ client-services port 443
index 786343d..4eb1eba 100644 (file)
@@ -44,7 +44,7 @@ You should redirect everything to httpS:// if possible. In Apache you can do thi
 
 \subsubsection{How to test}
 
-See ssllabs in section \ref{section:Tools}
+See section \ref{section:Tools}
 
 %%\end{description}
 
@@ -72,7 +72,7 @@ See ssllabs in section \ref{section:Tools}
     ssl.use-sslv3 = "disable"
     #ssl.use-compression obsolete >= 1.4.3.1
     ssl.pemfile = "/etc/lighttpd/server.pem"
-    ssl.cipher-list = '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'
+    ssl.cipher-list = '@@@CIPHERSTRINGB@@@'
     ssl.honor-cipher-order = "enable"
     setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=31536000")
   }
@@ -100,7 +100,7 @@ lighttpd httpS:// redirection: \url{http://redmine.lighttpd.net/projects/1/wiki/
 
 
 \subsubsection{How to test} 
-See ssllabs in section \ref{section:Tools}
+See section \ref{section:Tools}
 
 % 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}
@@ -123,14 +123,11 @@ See ssllabs in section \ref{section:Tools}
 
 \begin{lstlisting}[breaklines]
   ssl_prefer_server_ciphers on;
-  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
-  ssl_ciphers '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';
+  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}
 
-%% XXX FIXME: do we need to specify dhparams? Parameter: ssl_dhparam = file. See: http://wiki.nginx.org/HttpSslModule#ssl_protocols
-%% NO, use IETF/IKE
-
 If you absolutely want to specify your own DH parameters, you can specify them via
 
 \begin{lstlisting}[breaklines]
@@ -158,7 +155,7 @@ You should redirect everything to httpS:// if possible. In Nginx you can do this
 \subsubsection{References} \todo{add references}
 
 \subsubsection{How to test}
-See ssllabs in section \ref{section:Tools}
+See section \ref{section:Tools}
 
 %\end{description}
 
@@ -260,7 +257,7 @@ Clients not supported:
 % add any further references or best practice documents here
 
 \subsubsection{How to test}
-See ssllabs in section \ref{section:Tools}
+See section \ref{section:Tools}
 
 
 %\end{description}
index 362ed37..d020cc5 100644 (file)
@@ -1,3 +1,4 @@
+\newpage
 \section{Reviewers}
 \label{section:Reviewers}
 
index 5859ca3..9f719b7 100644 (file)
@@ -1,7 +1,6 @@
 \section{Scope}
 \label{section:Scope}
-
-In this guide, we restricted ourselves to:
+\newline In this guide, we restricted ourselves to:
 \begin{itemize}
 \item Internet-facing services
 \item Commonly used services
index 70299df..9dbd614 100644 (file)
   year = 2013,
   month = Nov,
 }
+
+@misc{gocode,
+  author = {{Adam Langley, et. al.}},
+  title = {{Go X.509 Verification Source Code}},
+  howpublished = {\url{https://code.google.com/p/go/source/browse/src/pkg/crypto/x509/verify.go#173}},
+  year = 2013,
+  month = 12,
+}
+
+@misc{certtransparency,
+  author = {{Adam Langley, Ben Laurie, Emilia Kasper}},
+  title = {{Certificate Transparency}},
+  howpublished = "\url{http://www.certificate-transparency.org}
+               \url{http://datatracker.ietf.org/doc/rfc6962/}",
+  year = 2013,
+  month = 07,
+}