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.