Skip to content

Monthly Archives: December 2007

Primeiro PHP Day Curitiba

22-Dec-07

Idealizado incialmente pela lista de usuários PHP de Curitiba e com a intenção fomentar a comunidade local, está marcado o primeiro PHP Day Curitiba.

Com entrada gratuita, o evento conta com o apoio da UFPR e será realizado dia 12 de Janeiro de 2008 no Departamento de Informática da UFPR no Centro Politécnico.

Acredito que o evento será bem interessante e com certeza estarei lá. :)

Onde? http://www.inf.ufpr.br/dinf/localendpostal.html
Quando? 12 de janeiro de 2008
Como chegar? http://www.inf.ufpr.br/dinf/localcomochegar.html

Maiores informações: http://gpphp-pr.blogspot.com
Veja também a chamada oficial para o evento

UPDATE: Adicionei uma nova sessão no meu site disponibilizando o material da minha palestra

Utilizando o comando “service” no Ubuntu

20-Dec-07

Uma das coisas legais que existem no Mandriva e que eu sempre senti falta no Ubuntu é o comando service. O comando service não possui uma função propriamente dita, ele serve apenas como alias para o /etc/init.d e no Madriva já vem configurado por default. Pode até ser frescura minha mas, além de tornar mais claro, é melhor manipular os serviços do linux com


$ service apache2 reload

do que o usando o famoso


$ /etc/init.d/apache2 reload

Durante algum tempo eu pensei que esse comando nem existia no Ubuntu/Debian e cheguei inclusive a criar um shell script que fazia a mesma coisa. Essa semana eu descobri que esse comando existe sim, só que não vem instalado por padrão e para habilitá-lo você precisa instalar o pacote sysvconfig


$ aptitude install sysvconfig

O mais impressionante disso tudo é a simplicidade do script, ao melhor estilo KISS


$ vim /usr/bin/service
#!/bin/sh
set -e
/etc/init.d/$1 $2 $3

Configurando PHP5 sobre FastCGI no Apache

11-Dec-07

Eu trabalhei por mais de 3 anos como desenvolvedor PHP e durante todo esse tempo uma das coisas que sempre notei foi a facilidade em driblar a segurança de quase todos os servidores web por onde passei. Quase todas as empresas (sem citar nomes) se preocupam muito com a segurança externa de suas redes, mas a segurança interna de seus servidores (quando há) é extremamente falha.

O que pretendo mostrar nesse post, é um modelo de configuração para servidores Apache e PHP que trate todos os problemas de segurança com os quais EU já me deparei e comentar um pouquinho o porquê de cada coisa. Se você tiver alguma outra idéia, crítica ou sugestão que possa enriquecer o modelo proposto aqui, sinta-se à vontade para faze-lo. :)

Como eu geralmente utilizo distribuições Debian ou Ubuntu, os comandos apresentados abaixo estarão no formato padrão para essas duas distribuições, porém você conseguirá adequar facilmente o conteúdo deste post para qualquer outro “sabor” de Linux.

Por que utilizar o FastCGI?

Ok, então vamos começar explicando um pouco do porquê rodar o PHP sobre o FastCGI ao invés de utiliza-lo como um módulo normal do Apache.

O FastCGI é um módulo do Apache que, juntamente com o SuEXEC, permite especificar ao servidor qual usuário utilizar para executar os scripts CGI, ou seja, você consegue criar um usuário Unix para cada site rodando no seu servidor e forçar o apache a executar esses scripts sempre sob um mesmo usuário. Dessa forma, além da segurança tradicional proporcionada pelo Apache e PHP, você ainda tem a segurança do Unix restringindo as ações desse usuário dentro do sistema. Portanto a partir de agora esqueça os antigos usuários globais www-data, apache, etc.

Instalação dos pacotes

A primeira coisa a ser feita é instalar os pacotes necessários pelo servidor, que nesse caso são basicamente três: Apache, FastCGI e PHP5. Também é interessante instalar o pacote php5-suhosin que propociona algumas configurações de segurança adicionais ao PHP. Apesar do módulo suEXEC estar contido no pacote libapache2-mod-fcgid, ele não será habilitado no Apache e isso terá que ser feito manualmente, como segue abaixo:


$ aptitude install apache2 libapache2-mod-fcgid php5-cgi php5-suhosin
$ a2enmod suexec
$ /etc/init.d/apache2 reload

Configurando um novo site (Passo 1/3)

Como todos os sites terão seu próprio usuário Unix, o primeiro passo da configuração de um novo site consiste na criação deste usuário. Como a única função deste usuário será acessar o site e executar o PHP via CGI, podemos colocar os arquivos do site dentro do seu diretório home e ainda (por questões de segurança) remover o seu shell, assim como mostrado abaixo:

* Por motivos didáticos, irei utilizar como exemplo meu próprio site.


$ useradd --home /var/www/arthurfurlan.org --shell /bin/false --create-home arthurfurlan

Depois de criado o usuário arthurfurlan, precisamos criar os diretórios que serão utilizados pelo Apache e PHP, que são basicamente 4 diretórios:

  • o diretório html que armazenará o conteúdo do site.
  • o diretório session que armazenará os arquivos de sessão do site.
  • o diretório tmp que armazenará os arquivos temporários do site (uploads).
  • o diretório log que armazenará os arquivos de logs do site.

Segue abaixo o comando utilizado para a criação dos diretórios:


$ cd /var/www/arthurfurlan.org
$ mkdir -p html/www session tmp log
$ chown -R arthurfurlan: html/www session tmp log
$ cd -

A principal questão a ser levantada aqui é a separação do diretório de armazenamento sessões para cada site. Isso raramente é feito e possibilita que um usuário acesse os arquivos de sessão dos demais sites que estão na mesma máquina, dessa forma se torna fácil criar um script que procure por sessões contendo senhas de usuários, de administração, etc. dos outros sites. Essa separação (juntamente com outras configurações do php) previne esse tipo de ataque.

Configurando o PHP (Passo 2/3)

Outra funcionalidade legal do FastCGI é possibilidade de se utilizar um arquivo de configuração do PHP específico para cada site, o que proporciona um maior nível de segurança. EU, particularmente, gosto de renomear o arquivo php.ini para seguir o padrão do Linux de arquivos que configuração (.*rc), porém se preferir manter o nome padrão do arquivo php.ini, sinta-se á vontade.

Vamos copiar o arquivo de configuração default do PHP:


$ cp /etc/php5/cgi/php.ini /var/www/arthurfurlan.org/.php5rc

E aplicar as seguintes configurações:

  • safe_mode para on
  • safe_mode_include_dir para on
  • disable_functions para escapeshellarg, escapeshellcmd, exec, shell_exec, curl_exec, system, passthru, popen, proc_open, proc_close, dl, ini_alter, parse_ini_file, show_source, highlight_file
  • enable_dl para off
  • open_basedir para /var/www/arthurfurlan.org/html/www:/var/www/arthurfurlan.org/tmp:/var/www/arthurfurlan.org/session
  • upload_tmp_dir para /var/www/arthurfurlan.org/tmp
  • session.save_path para /var/www/arthurfurlan.org/session

* Eu não pretendo comentar o porquê de cada uma das configurações acima, senão o post vai acabar muito mais longo (e chato) do que já está! Caso você queira entender melhor alguma das delas, pergunte na sessão de comentários abaixo. :)

Devido à uma restrição do FastCGI, o arquivo que irá efetivamente executar o arquivo PHP através do CGI precisa pertencer ao mesmo usuário que está executando o CGI, no nosso caso, precisa pertencer ao usuário arthurfurlan. Esse arquivo precisar ser um shell script com permissão de execução, como mostrado abaixo:


$ cd /var/www/arthurfurlan.org
$ touch .php5cgi
$ chmod 755 .php5cgi
$ chown arthurfurlan: .php5cgi
$ cd -

Contendo o sequinte conteúdo:


$ vim /var/www/arthurfurlan.org/.php5cgi
#!/bin/sh
export PHPRC=/var/www/arthurfurlan.org/.php5rc
exec /usr/bin/php5-cgi "$@"

* Se você nomeou o arquivo de configuração do PHP com outro nome, você deve alterá-lo na variável de ambiente PHPRC do script acima.

Agora toda a parte de configuração do PHP do novo site já está configurada, e fica faltando somente criar o VirtualHost e habilitá-lo.

Configurando o VirtualHost do Apache (Passo 3/3)

Eu irei instalar o site em localhost, sobre o IP de loopback normal 127.0.0.1 mas caso você esteja configurando um site com para acesso externo basta alterar os locais correspondentes para o IP que desejar.

Vamos criar o NameVirtualHost para o novo site.
Abra o arquivo /etc/apache2/sites-available/default e adicione a linha abaixo, caso ainda não exista:


NameVirtualHost 127.0.0.1

Se você está configurando um site para rodar em localhost, você precisará configurar a sua máquina para que ela saiba que ela deve responder pelo domínio seu novo domínio, e isso pode ser feito adicionando no arquivo /etc/hosts a seguinte linha:


127.0.0.1 arthurfurlan.org

Caso esteja utilizando um IP para acesso externo, você precisará configurar o seu servidor de DNS para que aponte o seu novo domínio para o seu host.
Agora criaremos o VirtualHost como mostrado abaixo:


$ vim /etc/apache2/sites-available/arthurfurlan.org
<Virtualhost 127.0.0.1>
    ServerName arthurfurlan.org
    ServerAlias www.arthurfurlan.org
    ServerAdmin webmaster@arthurfurlan.org

    PHP_Fix_Pathinfo_Enable 1
    DocumentRoot /var/www/arthurfurlan.org/html/www
    SuexecUserGroup arthurfurlan arthurfurlan

    <Directory /var/www/arthurfurlan.org/html/www>
        Options +ExecCGI
        AddHandler fcgid-script .php
        FCGIWrapper /var/www/arthurfurlan.org/.php5cgi .php
    </Directory>

    ErrorLog /var/www/arthurfurlan.org/log/error.log
    CustomLog /var/www/arthurfurlan.org/log/access.log combined
</Virtualhost>

E agora sim, tudo terminado! Basta habilitar o recém-criado VirtualHost como mostrado abaixo para ter o seu novo site rodando sob o seu próprio usuário. :)


$ a2ensite arthurfurlan.org
$ /etc/init.d/apache2 reload

Engenharia social

05-Dec-07

Conversa com um amigo que cursa Ciência da Computação na UFPR junto comigo:

Amigo: cara
Amigo: c manja aonde configura a parada de abrir pdf no firefox?
Arthur Furlan: o que você quer configurar?
Amigo: tipo
Amigo: eu clico num pdf
Amigo: ele abre no browser
Amigo: mas não aparece nada
Arthur Furlan: é porque ele ainda não terminou de baixar o arquivo
Amigo: se eu esperar infinito n abre tbm
Amigo: se eu pegar e for em abrir arquivo e abrir um local aqui n abre tbm
Arthur Furlan: então é problema do plugin
Arthur Furlan: você usa windows?
Amigo: aham
Arthur Furlan: então é esse o problema
Arthur Furlan: hahaha… brincadeira!
Arthur Furlan: tenta desinstalar o plugin e reinstalar
Amigo: esse eh o problema, nem sei qual o plugin que faz isso
Arthur Furlan: digita isso na barra de endereços: about:plugins
Amigo: ok
Amigo: qq eu faço agora?
Arthur Furlan: vai em: Iniciar > Executar e dae digita: cmd
Amigo: ok
Arthur Furlan: agora digita: format \q C:
Amigo: ok
Amigo: caralho
Amigo: tah aparecendo aqui uma msg de que vai formatar o meu pc
Amigo: tah certo isso?
Arthur Furlan: ¬¬
Arthur Furlan: não cara…. eu tava te zuando
Amigo: =D

Casa própria

03-Dec-07

É isso ae… Depois de um longo tempo morando de favor no host do Danilo eu resolvi alugar um servidor para mim! Peguei uma daquelas contas gigantescas da Bluehost e junto com a mudança de servidor decidi também alterar o meu domínio, que era uma outra coisa que eu tinha vontade de fazer já há algum tempo. Portanto, agora vocês podem acessar esse blog tanto por http://arthurfurlan.org/blog como por http://arthurfurlan.com.br/blog, mas a idéia é desativar o .com.br com o passar do tempo.

Eu pretendo voltar a postar assim que acabarem as minhas provas da faculdade. Já tenho bastantes posts engavetados para escrever nas férias e ainda algumas outras coisas interessantes para acontecer que prometem render mais alguns posts.

Como não poderia deixar de faltar, ficam aqui meus agradecimentos ao Danilo que durante muito tempo me hospedou generosamente no seu host. :)