Disabling SSLv3 in Apache

Dark Knight Poodle Some rights reserved by greg westfall.
Dark Knight Poodle
Some rights reserved by greg westfall.

Yesterday I wrote a post about disabling SSLv3 in Postfix and today we take a close look at Apache. While taking a closer look at the current installation of Apache and the version shipped with Debian 8 that was released a few days back it showed that or the Apache project or Debian has taken the responsibility to completely disable SSLv2. Hopefully SSLv3 will get the same treatment soon, as broken security is worse than no security due to the false sense of security.

After a clean install on Debian Wheezy /etc/apache2/mods-available/ssl.conf contains the following entries:

SSLProtocol all -SSLv2

After a clean install on Debian Jessie /etc/apache2/mods-available/ssl.conf contains the following entries:

SSLCipherSuite HIGH:!aNULL
SSLProtocol all -SSLv3

First we see that the cipher suite are different between both and for now I’ll ignore them. Those will be touched in a later posting as RC4 also needs to be phased-out. For Debian Jessie installations everything is well on protocol level, but for Wheezy the option “-SSLv3” is missing and since TLS is compiled into Apache and OpenSSL on Debian Wheezy it is pretty safe to turn SSLv3 off unless you want to keep servicing Internet Explorer 6.

SSLProtocol all -SSLv3 -SSLv2

As with Postfix also for Apache a hard restart to enforce this on all connection from that point forward to make sure no one keeps an old connection with SSLv3.

$ sudo systemctl restart apache2.service

Keep in mind that these setting can be set also on a virtual host level within Apache and will override any global setting. So it may be wise to also verify other configuration files for Apache and/or run sslscan against your websites to verify the SSL protocol offered.

Disabling SSLv3 in Postfix

Dark Knight Poodle
Some rights reserved by greg westfall.

The POODLE attack was made public late 2014 and as most vendors have taken action to solve possible issues related to POODLE. The time definitely has come to close SSLv3 in all parts of public facing infrastructure. By default Postfix still only disallows SSLv2 and hopefully this will change in the form of stricter default behaviour in Postfix or distributions/vendors that stop shipping SSLv3 libraries.

For now you can set with the postconf command restrictions which protocols shouldn’t be used by Postfix.

$ sudo postconf -e smtpd_tls_mandatory_protocols=\!SSLv2,\!SSLv3
$ sudo postconf -e smtpd_tls_protocols=\!SSLv2,\!SSLv3
$ sudo postconf -e smtp_tls_mandatory_protocols=\!SSLv2,\!SSLv3
$ sudo postconf -e smtp_tls_protocols=\!SSLv2,\!SSLv3

As this is a change to /etc/postfix/main.cf Postfix can be reloaded to reread the configuration, but it may be smarter to just restart Postfix to make it effective for all connection from the moment Postfix restarts.

$ sudo systemctl restart postfix.service

All encrypted sessions Postfix allows will require TLSv1+. The next step will be to disable the RC4 cipher suite, but will do that in another posting.

Installing SSL-certificates on Debian

Installing and configuring SSL certificates is always an issue as how to create them and where to store them. Most of the time people can find the procedure on how to create them, but they forget all the places where they have placed them. Some initiatives exist to have centralized key stores on systems, but getting applications to use them is still a problem.

Also on Debian is this an issue and key material is all over the system if you’re not careful. Some Debian developers tried to fix it, but it ended in a “stalemate” and for now an additional package called ssl-cert exists to create self-signed certificates. This package also provides a structure for storing commercial certificates and accessing them in a safer way. So for we install the package ssl-cert.

$ sudo apt-get install ssl-cert

After installing the package the different files for the SSL-key can be placed in /etc/ssl/private and have the right permissions as shown in the output below. This to protect the key material from being use by unauthorized processes as most keys don’t have a passphrase.

$ sudo ls -l /etc/ssl/private
-r--r----- 1 root    ssl-cert 2766 Dec 12 13:06 www.example.org_ca.pem
-r--r----- 1 root    ssl-cert 1671 Dec 12 13:06 www.example.org.crt
-r--r----- 1 root    ssl-cert 1070 Dec 12 13:06 www.example.org.csr
-r--r----- 1 root    ssl-cert 6268 Dec 12 13:06 www.example.org_intermediate.pem
-r--r----- 1 root    ssl-cert 1675 Dec 12 13:06 www.example.org.key
-r--r----- 1 root    ssl-cert 3502 Dec 12 13:06 www.example.org.pem

The location and files can only be accessed by the root user or members of the group ssl-cert. Some applications as Apache startup under the root user and access the files before switching to the actual user like www-data on Debian. For those applications nothing is going to change, but for others like ejabberd that run completely under the ejabberd user somethings changes. Those users need to be made member of the group ssl-cert to read the files in /etc/ssl/private. Below two known services are made member of the group ssl-cert to read the certificates.

$ sudo usermod -a -G ssl-cert ejabberd
$ sudo usermod -a -G ssl-cert postgres
$ id -a ejabberd
uid=123(ejabberd) gid=125(ejabberd) groups=105(ssl-cert),125(ejabberd)
$ id -a postgres
uid=105(postgres) gid=108(postgres) groups=105(ssl-cert),108(postgres)

After checking of the modification was in affect as some servers use a Naming Service Caching Daemon the affected services need to be restarted. In this example both ejabberd and PostgreSQL need to restarted before the SSL certificates can be accesses.

HTTPS forceren

Er is veel te doen over HTTP versus HTTPS en met de “gratis” SSL-offloaders in de systemen van Sun Microsystems met de UltraSPARC T1, T2 en T2+ processor wordt het interessant om af te stappen van HTTP. Gelukkig hebben oa Intel-processoren optimalisatie voor oa AES en is met de juiste aanpassing aan het besturingssysteem en middleware zoals Apache mogelijk om SSL-verkeer sneller te laten afhandelen.

Nu kan je in de webapplicatie inbouwen dat dit moet gebeuren, maar als je massaal HTTP-verkeer naar HTTPS wilt migreren is het verstandiger om dit af te dwingen in de webserver. Zo ook voor een webmail-applicatie in dit geval waarbij de configuratie fouten kan opleveren en programmeurs snel fouten kunnen maken.

Door de volgende regels in de .htaccess-file te zetten in de documentroot van de website zal Apache tegen de webbrowser vertellen dat dit moet worden aangeleverd via HTTPS. Elke webbrowser die de HTTP statuscodes begrijpt zal dit vlekkeloos uitvoeren.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Aan deze oplossing zit wel een performance penalty verbonden. De initiale opbouw naar de website kan iets langer duren door de redirect naar de HTTPS-site, maar de grootste penalty zal zitten in de .htaccess-file. Bij productie websites is het dan ook verstandig om dit op te nemen in de virtual host configuratie binnen Apache zelf en de ondersteuning voor .htaccess-files uit te zetten. Hierdoor hoeft we webserver minder de documentroot voor de website af te zoeken naar oa de .htaccess-file.

Vaarwel, port 465

Hoewel de weg al in 1998 was ingezet met RFC2476 om mail te kunnen injecteren via een aparte poort, maar helaas kwam in 1999 ook RFC2487. Deze laatste RFC ging over SMTP over SSL, maar heeft nooit echt een vlucht genomen gelukkig. Sommige mensen zien het wel als een alternatief voor de mail submission oplossing en andere zien het als oplossing om SMTP over SSL te versturen.

Gelukkig heeft TLS sindsdien een vlucht genomen en kan tegenwoordig TLS worden gebruikt voor zowel SMTP-verbindingen als voor Submission-verbindingen. Door de splitsing van server-to-server verkeer over poort 25 en client-to-server verkeer over poort 587 is er een verduidelijking gekomen in de soorten verkeer. TLS afdwingen op client-to-server verkeer is een mogelijkheid geworden en worden username/password combinaties afgeschermd. Het nut van SMTP over SSL is dus verdwenen, maar hoe faseer je het uit?

Je kan gewoon uitzetten in Postfix door het bestand master.cf aan te passen, zodat de regels voor smtps niet meer actief zijn. Simpeler is het gelukkig niet, maar de kans bestaat dat sommige verbindingen ineens stoppen met werken. Helaas is het in logfiles niet te herleiden of er verbindingen over poort 465 lopen ipv poort 25 of 587.

Op platformen zoals Linux, BSD en Solaris zijn packetfilters beschikbaar en kan met behulp van een paar simpele regels toch informatie worden verkregen. Zoals de onderstaande regel voor Netfilter.

iptables -A INPUT_ETH0 -d -p tcp \
--sport 1024:65535 --dport 465 \
-j LOG --log-level DEBUG --log-prefix "SERVICE MONITORING: "

Voor elke verbinding naar de server zal melding worden gemaakt door de kernel naar syslog en deze zijn hierna terug te lezen in bv /var/log/syslog. Door deze opstelling een paar maanden te volgen kan je bepalen of er echt geen verbindingen meer zijn.