Ubuntu/Debian: Como instalar Nginx / Postfix / Dovecot a usar LibreSSL

LibreSSLVamos supor que tens um servidor Ubuntu ou Debian, a usar um ou mais entre o Nginx, Postfix e Dovecot, e queres “linká-los” ao LibreSSL em vez do OpenSSL default do sistema. (As razões podem ser várias: talvez porque a distro que usas ainda só inclui o OpenSSL 1.0.x, que é antigo (“estável”, do ponto de vista conservador) e não suporta cifras modernas como a ChaCha20, ou porque confias mais nos developers do OpenBSD (que fazem o LibreSSL) do que nos do OpenSSL, ou — e não há nada de errado com isso, é assim que se evolui — apenas pela piada da coisa. Podias também usar o OpenSSL 1.1.x, a ser abordado num post futuro.)

Segue-se, então, uma forma relativamente simples de o fazer, que não muda o OpenSSL default do sistema (o que não seria boa ideia, a não ser que recompilasses tudo, e estivesses disposto a ter muito trabalho):

Instalar dependências:

apt-get install build-essential
apt-get build-dep openssl nginx dovecot postfix

Instalar o LibreSSL:

  • faz o download da última versão do código fonte portável1 em www.libressl.org
  • compila e instala, fazendo:
./configure --prefix=/usr/local/libressl --with-openssldir=/usr/local/libressl && make && make install

Instala o Nginx:

rm -rf /usr/local/src/nginx-libressl
mkdir /usr/local/src/nginx-libressl
cd /usr/local/src/nginx-libressl
apt-get source nginx # ignora o erro de permissões no fim
  • edita o ficheiro nginx-<versão>/debian/rules:  adiciona
-I/usr/local/libressl/include

à linha que começa por “debian_cflags:=“, e:

-L/usr/local/libressl/lib

à linha que começa por “debian_ldflags:“. De seguida, entra na directoria nginx-<versão> e compila os pacotes com o comando:

debuild -uc -us -b
  • Instala os pacotes recém-criados na directoria anterior com o comando “dpkg -i <pacotes>” (sugestão: faz “dpkg -l | grep nginx” para ver que pacotes já tinhas instalados; tipicamente queres substituir esses pelas versões acabadas de compilar);
  • E, por último:
apt-mark hold nginx* # para impedir que actualizações do Ubuntu / Debian substituam as versões compiladas

Feito! Podes agora usar o Guia de TLS da Mozilla para adicionar suporte a cifras modernas à tua configuração de Nginx, e a Ferramenta de teste de servidores TLS da SSLLabs para verificar se estão correctamente configuradas.

Instalar o Postfix:

O processo é igual ao Nginx (substituindo “nginx” por “postfix” em cada comando / nome de directoria, obviamente), excepto que as alterações ao ficheiro debian/rules são as seguintes:

  • encontra  a linha com -DHAS_SSL, adiciona -I/usr/include/libressl/include/openssl à frenre;
  • encontra AUXLIBS += , acrescenta -L/usr/local/libressl/lib à frente;
  • encontra a linha com dh_shlibdeps -a, adiciona –dpkg-shlibdeps-params=–ignore-missing-info no fim;
  • não esquecer o apt-mark hold postfix* após a instalação dos novos pacotes.

Instalar o Dovecot:

Mais uma vez, adapta as instruções para o Nginx, uando “dovecot” em vez de “nginx” em cada sítio, excepto que as alterações ao debian/rules devem ser:

  • após a linha:
export DEB_BUILD_MAINT_OPTIONS=hardening=+all

adiciona:

export SSL_CFLAGS=-I/usr/local/libressl/include
export SSL_LIBS=-L/usr/local/libressl/lib -lssl -lcrypto
  • após a secção:
override_dh_makeshlibs:
# Do not add an ldconfig trigger; none of the dovecot shared libraries
# are public.
        dh_makeshlibs -n

acrescenta:

override_dh_shlibdeps:
        dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info

NOTA: a indentação na segunda linha tem de ser um tab; não utilizes espaços.

Uma vez mais, não esquecer o “apt-mark hold dovecot*” após a instalação.

Como verificar se as tuas novas instalações do Nginx, Postfix e/ou Dovecot estão a usar o LibreSSL em vez do OpenSSL default do sistema? Poderias usar o comando ldd para ver para que libraries de SSL/TLS os binários estão “linkados”, mas a melhor forma é provavelmente usar uma ferramenta como o sslscan, que permite ver que cifras os serviços de HTTPS, SMTP, IMAP, etc. suportam (incluindo através do STARTTLS). Se vires nessa lista a cifra ChaCha20, está tudo bem. A não ser, claro, quando eventualmente o Debian e o Ubuntu passarem a usar o OpenSSL 1.1.x por default (ainda não o fizeram, à data deste post), caso esse em que a cifra já estará lá à partida; nesse caso o melhor é mesmo usar o ldd.

Para voltar às versões “normais” destes serviços, basta fazer apt-mark unhold nginx* (por exemplo).

Adicionei também /usr/local/libressl/bin ao início da minha variável de ambiente PATH, de forma a que os binários do LibreSSL sejam usados por default (ex. para gerar chaves, CSRs, etc.), se bem que isto não é necessário para o Nginx, etc. funcionarem.