Apache + PHP + MySQL + OpenSSL em chroot

O servidor web Apache é parte integrante da instalação base do OpenBSD e por defeito já corre em ambiente chroot. No entanto, se quisermos podemos facilmente usar o Apache fora desse ambiente, obviamente com um decréscimo considerável de segurança. Assim, visto que o Apache já vem chrooted por defeito a maior parte do nosso trabalho já está feita e resta-nos activar o Apache, já que este vem desactivado na instalação por defeito.

O objectivo deste documento é "correr" um servidor web o mais seguro possível fazendo uso de um ambiente chroot. Assim, o primeiro requesito para seguir este documento é actualizar o sistema, se não o fizermos não vale a pena seguir o documento.

A instalação pode ser feita via ports ou packages, qualquer hipótese é viável ainda que a instalação via ports seja mais fácil, ainda que bem mais demorada, até porque a maioria dos packages apresentados a seguir são dependências para outros packages. Convém notar que se pretendemos uma máquina com um elevado padrão de segurança não devemos ter compiladores e ferramentas de desenvolvimento na mesma, visto que estas são ferramentas que agradarão bastante a um possível intruso.

Se optarmos pelos packages a lista que se apresenta mais abaixo são os necessários, convém notar que as versões destes packages são as mais recentes à data da escrita deste documento e para a arquitectura i386 podem ser encontrados em ftp://ftp1.openbsd-pt.org/pub/OpenBSD/3.5/packages/i386/

Talvez também seja importante referir que se optarmos pelos ports chegaremos ao fim com mais packages instalados do que se optassemos pelos packages. Porquê? Porque visto que vamos optar por compilar todos os packages, serão necessários packages adicionais para essa tarefa, como o "gmake" por exemplo. Além disso, se não tivermos cuidado com os "flavors" vamos acabar com um sistema muito mais "populado" do que o desejado.

autoconf-2.59.tgz
gettext-0.10.40p1.tgz
libiconv-1.9.1.tgz
mysql-client-4.0.18.tgz
mysql-server-4.0.18.tgz
p5-DBD-mysql-2.90.03.tgz
p5-DBI-1.38.tgz
p5-Net-Daemon-0.38.tgz
p5-PlRPC-0.2017.tgz
php4-core-4.3.5RC3.tgz
php4-mysql-4.3.5RC3.tgz
php4-pear-4.3.5RC3.tgz
recode-3.6p1.tgz

O primeiro passo é gerar o certificado e chave do nosso servidor usando o OpenSSL

# openssl genrsa -des3 -out /etc/ssl/private/server.key 1024

Nota: Se não queremos entrar com passphrase quando arrancamos o servidor omitir "-des3".

Geramos o CSR (Certificate Signing Request):

# openssl req -new -key /etc/ssl/private/server.key -out /etc/ssl/private/server.csr

Geramos uma chave RSA para o nosso CA (Certificate Authority):

# openssl genrsa -des3 -out /etc/ssl/private/ca.key 1024

Geramos um certificado x.509 para o nosso CA:

# openssl req -new -x509 -days 365 -key /etc/ssl/private/ca.key -out \
/etc/ssl/private/ca.crt

Por fim, assinamos o nosso CSR:

# openssl x509 -req -days 365 -in /etc/ssl/private/server.csr \
-signkey /etc/ssl/private/server.key -out /etc/ssl/server.crt

Em seguida activamos o apache com suporte SSL.

# $EDITOR /etc/rc.conf

e mudamos a linha:

httpd_flags=NO
para
httpd_flags="-DSSL"

Continuamos com o MySQL client, se optamos pelos ports não vamos precisar de nos preocupar com o mysql-client pois ele será automaticamente instalado mais à frente, portanto passamos à frente.

Se optarmos pelos packages, vamos à directoria local onde se encontram os packages e começamos por instalar uns quantos:

# pkg_add -v autoconf-2.59.tgz
# pkg_add -v mysql-client-4.0.10.tgz

por agora deixamos o mysql e vamos ao PHP
pelos ports,

# cd /usr/ports/www/php4/core
# make install clean

pelos packages seria:

# pkg_add -v libiconv-1.9.1.tgz
# pkg_add -v gettext-0.10.40p1.tgz
# pkg_add -v recode-3.6p1.tgz
# pkg_add -v php4-core-4.3.5RC3.tgz

continuamos com:

# /usr/local/sbin/phpxs -s
# cp /usr/local/share/doc/php4/php.ini-recommended /var/www/conf/php.ini
# mkdir /var/www/tmp
# $EDITOR /var/www/conf/httpd.conf

e descomentamos a linha:
AddType application/x-httpd-php .php

e mudamos a linha:
DirectoryIndex index.html
para
DirectoryIndex index.html index.php

Continuamos com as extensões do php (pelos ports), note-se que o exemplo que uso abaixo poderá não ser o mais indicado dependendo do que se pretende vir a fazer com o PHP. Para o uso que costumo dar ao PHP serve perfeitamente, no entanto, é conveniente analizar os "flavors" disponíveis e optar pelo que lhe interessar.

# cd /usr/ports/www/php4/extensions
# env FLAVOR="no_x11 no_curl no_dba no_dbase no_dbx no_domxml no_filepro no_gd \
no_gmp no_imap no_ldap no_mcrypt no_mhash no_ncurses no_odbc no_pdf no_pgsql \ 
no_shmop no_snmp no_pspell no_sybase_ct no_xslt" make install clean
# cd /usr/ports/packages/i386/all
# pkg_add -v php4-pear-4.3.5RC3.tgz
# pkg_add -v php4-mysql-4.3.5RC3.tgz

activamos o mysql no php.ini

# /usr/local/sbin/phpxs -a mysql

se optarmos pelos packages:

# pkg_add -v php4-pear-4.3.5RC3.tgz
# pkg_add -v php4-mysql-4.3.5RC3.tgz
# /usr/local/sbin/phpxs -a mysql

Colocamos as bibliotecas Pear num local em que o apache em chroot as possa ver:

# mkdir -p /var/www/php/includes
# cp -pR /usr/local/lib/php/* /var/www/php/includes

Editamos o php.ini para alterarmos o PATH:

# $EDITOR /var/www/conf/php.ini

onde temos:

; UNIX: "/path1:/path2"
include_path = ".:pear/lib:/var/www/pear/lib"

deve ficar:

; UNIX: "/path1:/path2"
include_path = ".:/php/includes"

O Apache também precisa de acesso às bibliotecas mod_php:

# mkdir -p /var/www/var/libdata/
# cp -pR /usr/local/libdata/perl5 /var/www/var/libdata/

Terminamos a instalação do MySQL

# echo "mysql=YES" >> /etc/rc.conf.local
# cd /usr/ports/databases/p5-DBD-mysql
# make install clean
# cd /usr/ports/packages/i386/all
# pkg_add mysql-server-4.0.18.tgz

Se fosse via packages:

# pkg_add -v p5-DBI-1.38.tgz
# pkg_add -v p5-Net-Daemon-0.38.tgz
# pkg_add -v p5-PlRPC-0.2017.tgz
# pkg_add -v p5-DBD-mysql-2.90.03.tgz
# pkg_add -v mysql-server-4.0.18p1.tgz

continuamos com a configuração do mysql

# cd /usr/local/share/mysql
# cp my-medium.cnf /etc/my.cnf
# $EDITOR /etc/rc.conf

e alteramos a linha

shlib_dirs=

para

shlib_dirs="/usr/local/lib/mysql"
# mkdir /var/run/mysql
# chown _mysql /var/run/mysql
# chmod 755 /usr/local/share/mysql/mysql.server
# mysql_install_db

adicionamos o seguinte ao /etc/rc.local

if [ X"${mysql}" == X"YES" -a -x /usr/local/bin/mysqld_safe ]; then
echo -n "mysqld starting\n"; /usr/local/share/mysql/mysql.server start
/bin/sleep 1
fi

reeniciamos a máquina ou arrancamos o mysql à mão:

# /usr/local/share/mysql/mysql.server start

Definimos uma password para a nossa DB:

# /usr/local/bin/mysqladmin -u root password 'novapassword'

Convém notar que o método que acabamos de usar para definir uma password para o utilizador root apesar de ser o sugerido quando terminamos a instalação do MySQL tem um problema. A password que definimos ficará guardada em "clear text" na nossa "shell history" e poderá ser vista por outro utilizador usando o comando "ps" enquanto o nosso comando é executado. Obviamente este problema não se põe ser formos o único utilizador do sistema. Então, qual a melhor forma de definir uma password? O melhor é usar o MySQL monitor:

$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.0.18-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SET password=PASSWORD('novapassword');
Query OK, 0 rows affected (0.15 sec)

mysql> quit

Verificamos se conseguimos fazer login na DB:

# mysql -u root -p mysql

Para dar-mos uma vista de olhos na nossa configuração e vermos se está tudo a funcionar:

# cd /var/www/htdocs

e criamos um script php chamado, por exemplo, "phpinfo.php" com a seguinte função:

<?php
phpinfo();
?>

É altura de reiniciar a máquina e carregar o script via browser e se tudo correu bem veremos toda a informação relacionada com PHP e MySQL, entre outra, listada.

Por fim, convém dar uns retoques nas configurações. Os documentos seguintes são um bom ponto de partida:
Securing Apache: Step-by-Step
Securing PHP: Step-by-step
Securing MySQL: step-by-step

Copyright (C) 2004, Rui Reis. Permitidas a cópia e distribuição literal do artigo, na íntegra, em qualquer meio, desde que este aviso de copyright seja preservado.

$Id: index.xml,v 1.1.1.1 2007/07/28 13:27:09 morgadinho Exp $
Copyright © 2001-2008 OpenBSD .PT. Todos os direitos reservados.
Os artigos são da responsabilidade exclusiva e copyright dos seus respectivos autores, sendo que ao submetê-los autoriza a sua publicação.