Instalação e Configuração do Apache em Chroot + PostgreSQL + PHP + SSL no OpenBSD 5.1

E ai galera, aqui eu vou abordar a instalação e configuração do Apache trabalhando em modo chroot no OpenBSD 5.1 trabalhando em conjunto com o PostgreSQL e PHP.

Vamos setar o endereço do nosso repositório

export PKG_PATH=ftp://openbsd.locaweb.com.br/pub/OpenBSD/5.1/packages/`machine -a`/

Agora vamos mandar instalar o PHP e o PostgreSQL server

Primeiro precisamos descobrir a versão da biblioteca php-pgsql

pkg_add php-pgsql
Ambiguous: php-pgsql could be php-pgsql-5.2.17p5 php-pgsql-5.3.10

Pronto aqui temos que a versão da nossa biblioteca PHP é php-pgsql-5.3.10 vamos instalar ela e o PostgreSQL server

pkg_add -v php-pgsql-5.3.10 postgresql-server postgresql-client postgresql-docs

Agora precisamos acertar o link do php para o Apache

ln -s /var/www/conf/modules.sample/php-5.3.conf \
        /var/www/conf/modules/php.conf

Agora precisamos acertar o link do PostgreSQL para o PHP

ln -fs /etc/php-5.3.sample/pgsql.ini \
        /etc/php-5.3/pgsql.ini

Agora vamos acertar a configuração do PostgreSQL

Vamos mandar setar uma senha para o postgres

passwd _postgresql
Changing local password for _postgresql.
New password: #S3Nh4
Retype new password: #S3Nh4

Agora vamos logar com o Postgres

su - _postgresql

Agora vamos criar o diretório que vai armazenar os dados do Postgres

mkdir /var/postgresql/data

Agora vamos inicializar o banco e setar uma senha para o usuário postgres interno do Banco

initdb -D /var/postgresql/data -U postgres -A md5 -W
The files belonging to this database system will be owned by user "_postgresql".
This user must also own the server process.

The database cluster will be initialized with locale C.
The default database encoding has accordingly been set to SQL_ASCII.
The default text search configuration will be set to "english".

fixing permissions on existing directory /var/postgresql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 40
selecting default shared_buffers ... 24MB
creating configuration files ... ok
creating template1 database in /var/postgresql/data/base/1 ... ok
initializing pg_authid ... ok
Enter new superuser password: #S3Nh4
Enter it again: #S3Nh4
setting password ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... not supported on this platform
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

Success. You can now start the database server using:

    postgres -D /var/postgresql/data
or
    pg_ctl -D /var/postgresql/data -l logfile start

Agora vamos sair do usuário postgres

exit

Vamos agora à algumas configurações básicas, vamos começar liberando acesso ao PostgreSQL para as máquinas.

Aqui vamos configurar em qual endereço ip o servidor vai escutar vamos colocar * para ele escutar em todas as interfaces disponíveis.

vim /var/postgresql/data/postgresql.conf
[...]
listen_address = '*'
[...]

Agora precisamos liberar o acesso no postgresql para que os clientes consigam se conectar nele, então vamos liberar a maquina do programador por exemplo que tem o ip 10.0.0.20

vim /var/postgresql/data/pg_hba.conf
[...]
#no final do arquivo adicione a seguinte linha
host    all         all         10.101.0.0/24             md5

Aqui no exemplo acima estamos liberando acesso para as máquinas da rede 10.101.0.0/24

Agora vamos reiniciar o nosso postgreSQL

/etc/rc.d/postgresql restart

Agora vamos verificar se ele esta escutando

netstat -na | egrep 5432
tcp          0      0  *.5432                 *.*                    LISTEN
tcp6         0      0  *.5432                 *.*                    LISTEN
0xfffffe801de05778 stream      0      0 0xfffffe801d70fbc0                0x0                0x0                0x0 /tmp/.s.PGSQL.5432

Agora vamos acessar o nosso postgres para ver se está tudo ok

psql -h localhost -U postgres -W
Password for user postgres: 
psql (9.1.2)
Type "help" for help.

postgres=# \q

Agora vamos acertar as permissões do tmp da jaula do Apache

chmod 1777 /var/www/tmp

Agora vamos acertar o rc.conf para inicializar o Apache e o PostgreSQL

vim /etc/rc.conf
[...]
#Deixar o httpd_flags como abaixo
httpd_flags=""          # for normal use: "" (or "-DSSL" after reading ssl(8))
#Deixar o pkg_scripts como abaixo
pkg_scripts="postgresql"

Agora vamos criar um arquivo para testarmos o php

echo "<?php phpinfo(); ?>" > /var/www/htdocs/phpinfo.php

Agora vamos criar um arquivo para testarmos o php com o PostgreSQL

vim /var/www/htdocs/pgsql.php
<?php
$link = pg_connect("host=localhost port=5432 user=postgres password=S3Nh4");
if (!$link) {
    die('Could not connect: ' . pg_last_error($link));
}
echo 'Connected successfully';
pg_close($link);
?>

Agora vamos mandar reiniciar o nosso servidor para recarregarmos todas as novas configurações

shutdown -r now

Agora vamos testar o php acessando http://ip_servidor/phpinfo.php

Agora vamos testar o PostgreSQL acessando http://ip_servidor/pgsql.php

Habilitando o https

Vamos criar a primeira chave do servidor

openssl genrsa -des3 -out /etc/ssl/private/server.key 1024
Generating RSA private key, 1024 bit long modulus
..........................................++++++
...++++++
e is 65537 (0x10001)
Enter pass phrase for /etc/ssl/private/server.key:
Verifying - Enter pass phrase for /etc/ssl/private/server.key:

Agora vamos gerar um pedido de assinatura do nosso certificado

openssl req -new -key /etc/ssl/private/server.key -out /etc/ssl/private/server.csr
Enter pass phrase for /etc/ssl/private/server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:BR
State or Province Name (full name) []:Parana
Locality Name (eg, city) []:Curitiba
Organization Name (eg, company) []:Douglas
Organizational Unit Name (eg, section) []:TI
Common Name (eg, fully qualified host name) []:openbsd.douglasqsantos.com.br
Email Address []:douglas.q.santos@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Douglas

Agora vamos assinar o nosso certificado

openssl x509 -req -days 365 -in /etc/ssl/private/server.csr -signkey /etc/ssl/private/server.key -out /etc/ssl/server.crt
Signature ok
subject=/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=TI/CN=openbsd.douglasqsantos.com.br/emailAddress=douglas.q.santos@gmail.com
Getting Private key
Enter pass phrase for /etc/ssl/private/server.key:

Agora vamos tirar a senha do certificado pois senão a cada vez que iniciarmos o apache ele vai solicitar a senha

cd /etc/ssl/private
cp server.key server.key.orig
openssl rsa -in server.key.orig -out server.key
Enter pass phrase for server.key.orig:
writing RSA key

Agora vamos acertar o /etc/rc.conf para o apache reconhecer o https

vim /etc/rc.conf
[...]
httpd_flags="-DSSL"

Agora vamos parar o apache

apachectl stop
/usr/sbin/apachectl stop: httpd stopped

Agora vamos inicializar ele com o suporte a ssl

apachectl startssl
/usr/sbin/apachectl startssl: httpd started

Agora já podemos testar o apache em:

Agora vamos testar o php acessando https://ip_servidor/phpinfo.php

Agora vamos testar o PostgreSQL acessando https://ip_servidor/pgsql.php

Referências