Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I enable perfect forward secrecy by default on Apache?

Warning: please only use the recommendations for Apache configuration from the answers below. For which cipher(s) to use - security norms change over time and some of the security advice below is already out of date.

In the wake of recent events, I have been reconsidering my Apache setup. Currently, my apache site config looks something like this:

 <IfModule mod_ssl.c>     <VirtualHost *:80>             ServerName example.com             ServerAlias www.example.com             Redirect permanent / https://example.com     </VirtualHost>      <VirtualHost *:443>             ServerAdmin webmaster@localhost             ServerName example.com              DocumentRoot /var/www-wordpress             <Directory />                     Options FollowSymLinks                     AllowOverride None             </Directory>             <Directory /var/www-wordpress>                     Options Indexes FollowSymLinks MultiViews                     AllowOverride FileInfo                     Order allow,deny                     allow from all             </Directory>              ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/             <Directory "/usr/lib/cgi-bin">                     AllowOverride None                     Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch                     Order allow,deny                     Allow from all             </Directory>              ErrorLog ${APACHE_LOG_DIR}/error.log             LogLevel warn              CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined             SSLCertificateFile    /etc/ssl/certs/example.com.crt             SSLCertificateKeyFile /etc/ssl/private/example.com.key             SSLCertificateChainFile /etc/ssl/certs/sub.class1.server.ca.pem             <FilesMatch "\.(cgi|shtml|phtml|php)$">                     SSLOptions +StdEnvVars             </FilesMatch>             <Directory /usr/lib/cgi-bin>                     SSLOptions +StdEnvVars             </Directory>              BrowserMatch "MSIE [2-6]" \                     nokeepalive ssl-unclean-shutdown \                     downgrade-1.0 force-response-1.0             BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown     </VirtualHost> 

What do I have to do to support perfect forward secrecy? How can I enable SSL perfect forward secrecy by default? How could I enforce it?

like image 549
Jannik Jochem Avatar asked Jun 25 '13 22:06

Jannik Jochem


People also ask

Does TLS 1.2 have forward secrecy?

Security Fans are Forward Secrecy FansWith TLS 1.2 and earlier versions, a bad actor who discovered a server's private key could use it to decrypt network traffic that had been sent earlier.

Is Ecdhe more secure than DHE?

ECDHE is significantly faster than DHE (here). There are rumors that the NSA can break DHE keys and ECDHE keys are preferred (here). On other sites it is indicated DHE is more secure (here). The calculation used for the keys is also different.

How do I configure Apache for forward secrecy?

To configure Apache for Forward Secrecy, you configure the server to actively choose cipher suites and then activate the right OpenSSL cipher suite configuration string. Locate your SSL Protocol Configuration on your Apache server. In this example, /etc/apache is the base directory for the Apache installation.

Does Apache prefer perfect forward secrecy or perfect cipher?

This will prefer perfect forward secrecy, but not at the expense of being vulnerable to the BEAST attack. Since Apache lacks a way to configure cipher preference based on protocol version, I fake it by referring to ciphers only available in the newer protocols. Specifically, AES was only available with SHA1 hashing until TLSv1.2.

What is perfect forward secrecy (PFS)?

In contrast, when you enable Perfect Forward Secrecy (PFS), there is no link between your server’s private key and each session key. If an attacker ever gets access to your server’s private key, the attacker cannot use the private key to decrypt any of your archived sessions, which is why it is called “Perfect Forward Secrecy”.

How do I know if my server supports perfect forward secrecy?

To see if your server supports Perfect Forward Secrecy, use Discovery to test it. Instead of using the RSA method for exchanging session keys, you should use the Elliptic Curve Diffie-Hellman (ECDHE) key exchange. Note that you can still use the RSA public-key cryptosystem as the encryption algorithm, just not as the key exchange algorithm.


2 Answers

How about:

SSLProtocol all -SSLv2 -SSLv3 SSLHonorCipherOrder On SSLCipherSuite EECDH+AES:EDH+AES:-SHA1:EECDH+RC4:EDH+RC4:RC4-SHA:EECDH+AES256:EDH+AES256:AES256-SHA:!aNULL:!eNULL:!EXP:!LOW:!MD5 

Note the addition of the -SSLv3 flag to disable SSLv3. This is added to protect against the POODLE attack.

This will prefer perfect forward secrecy, but not at the expense of being vulnerable to the BEAST attack. Since Apache lacks a way to configure cipher preference based on protocol version, I fake it by referring to ciphers only available in the newer protocols. Specifically, AES was only available with SHA1 hashing until TLSv1.2. Thus the list starts with the TLSv1.2 ephemeral Diffie-Hellman ciphers, then RC4 (first with ephemeral DH, then without), and finally a BEAST-vulnerable AES option. Excluding no auth / weak encryption / weak hashing at the end is just for good hygiene and could be omitted since no such ciphers were introduced. If performance is a concern, use EECDH only and omit EDH.

In combination with Apache 2.2 (thus no EECDH as @Bruno says), per https://www.ssllabs.com/ssltest/analyze.html, this achieves PFS for iOS Safari only. IE and Firefox are TLSv1.0 so they get RC4 to avoid BEAST. (Alas, there is no such thing as EDH RC4, so without EECDH, you give up PFS). This is, I believe, the best one could hope for with those browsers on Apache 2.2. Chrome is the only one poorly served, since it supports TLSv1.1 and could use EDH AES without being vulnerable to BEAST. Instead, it gets RC4-RSA like Firefox and IE. Upgrading Apache to enable EECDH RC4 should get PFS for Firefox, IE, and Chrome.

Update 2013-11-09:

I've found a few alternate recommendations around the web. They put less emphasis on BEAST protection (perhaps wise; BEAST is mostly mitigated client-side now) and more emphasis on perfect forward secrecy. To varying degrees they also have stronger preferences for GCM and greater reluctance to accept RC4.

Of particular note are, I think, the following recommendations:

  • Mozilla OpSec
  • Ivan Ristic (of Qualys)
  • Geoffroy Gramaize

Personally, I'm going to go with Mozilla OpSec's. Their reasoning is well explained on their page. Of note, they prefer AES128 over AES256. In their words: "[AES128] provides good security, is really fast, and seems to be more resistant to timing attacks."

Noteworthy in Ivan Ristic's and Geoffroy Gramaize's recommendation is that SSLv3 is disabled. I think this mostly just breaks IE6, though some security related differences between SSLv3 and TLS v1.0 are mentioned on Wikipedia.

Also before I didn't talk about CRIME and BREACH. To protect against CRIME, disable SSL compression. This is included in the examples linked. To protected against BREACH, you need to disable compression at the HTTP level. For Apache 2.4, just do this once globally:

<Location />   SetEnvIfExpr "%{HTTPS} == 'on'" no-gzip </Location> 

For older versions of Apache, place this in each VirtualHost where SSLEngine is on:

<Location />     SetEnv no-gzip </Location> 

Update 2014-10-14: The Mozilla OpSec guide is now split into recommendations for old/intermediate/modern compatibility. With the settings from intermediate or modern, you end up with SSLv3 disabled. That will protect against the POODLE attack.

like image 81
Lorrin Avatar answered Oct 20 '22 00:10

Lorrin


From my own understanding, you need to activate SSLHonorCipherOrder and to prepend SSLCipherSuite with ECDHE and DHE ciphers from openssl ciphers -v

From my /etc/apache2/mods-available/ssl.conf:

SSLHonorCipherOrder on SSLCipherSuite ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:DHE-RSA-CAMELLIA128-SHA:AES128-SHA:RC4-SHA:HIGH:!aNULL:!MD5:!ADH 

To test your website, you can use: https://www.ssllabs.com/ssltest

Note: Eliptic Curve DHE only seems to work with Apache 2.3.3 or higher (see source and Bruno's comment).

like image 26
kunnix Avatar answered Oct 20 '22 01:10

kunnix