Re: [FUGSPBR] PHP + Segurança
Luiz Rodrigues Maia Neto
maianeto em inf.ufsc.br
Sáb Abr 5 21:59:26 BRT 2003
Ronan,
A permissao padrao do /etc somente permite a escrita do usario root
e/ou do grupo wheel. Alterar suas permissoes de acordo com sua
sugestao equivale a montar esta particao, para os demais usuarios,
como "read-only" (ro), acredito eu. Isto significa que, por exemplo,
nenhum usuario podera obter os dados armazenados na base de dados de
usuarios, shell e home, por exemplo. Quaisquer outras informacoes,
como descobrir quem eh o resolver do DNS neste servidor nao podera
ser obtido por seus usuarios. Nao tenho certeza se um usuario comum
conseguiria trocar de senha. Acho que esta eh uma opcao valida (a
utilizo frequentemente) para obter maior confiabilidade em servidores
cuja base de usuarios e configuracoes raramente sao alteradas.
Montando a particao raiz (/) como read-only obtemos um filesystem
imune (virtualmente) a problemas logicos. Se este fosse um servidor
cuja base de usuarios nao sofre-se alteracoes, acredito que esta
seria uma opcao razoavel. Como, acredito eu, sua expectativa eh que
sua base de clientes aumente a ponto de voce necessitar, rapidamente,
de um segundo servidor, um terceiro... :)
Todavia, nao garante limites e/ou retricoes aos scripts que forem
executados no servidor Apache.
Supondo que voce esta utilizando o Apache, hospedando dominios
atraves de VirtualHosts, com PHP instalado na forma de um modulo, uma
opcao eh determinar os parametros de ambiente que podem e/ou devem
ser impostos aos seus usuarios. Pode experimentar estas opcoes para
impor certas restricoes a seus usuarios.
<IfModule mod_php4.c>
php_value include_path ".:/usr/local/lib/php"
php_admin_flag safe_mode on
</IfModule>
<IfModule mod_php3.c>
php3_include_path ".:/usr/local/lib/php"
php3_safe_mode on
</IfModule>
Tambem nao eh aconselhado que o seu php.ini habilite a execucao de
extensoes ext/posix em um ambiente onde seguranca eh um dos
objetivos. Estas restricoes podem ser complementadas por uma classe
especifica de login, ajustada para, entre outros aspectos,
estabelecer o valor da variavel coredumpsize como zero. Uma serie de
tecnicas de acesso nao autorizado podem ser consideravelmente
prejudicadas atraves deste artificio.
Tambem eh possivel adicionar a sua configuracao de VirtualHost uma
diretiva do tipo open_basedir, estabelecendo que cada script PHP seja
executado em um ambiente chroot que toma por base a localizacao
indicada na variavel DocumentRoot.
<VirtualHost www.exemplo.com.br>
ServerName www.exemplo.com.br
DocumentRoot /www/exemplo
[...]
<Location />
php_admin_value open_basedir \ "/www-
home/exemple.com/:/usr/lib/php/"
</Location>
</VirtualHost>
Esta configuracao, somada a variavel "safe_mode on", restringe a
utilizacao de binarios aos diretorios indicados. De outra forma o PHP
pode ser configurado para cada VirtualHost indicando diretorios
especificos (php_admin_value open_basedir "/home/username/"),
restringindo o acesso de cada usuario a apenas a seus arquivos.
executando o Apache como o usuario www, por exemplo, e tornando este
usuario membro de todos os grupos definidos para cada VirtualHost,
nenhum diretorio necessita de premissoes de leitura amplas. Desta
forma usuarios nao podem ler scripts php atraves de scripts cgi ou
atraves de um acesso shell. Lembre-se que a intrucao safe_mode on
inibe certas funcionalidades do PHP, ocasionando erros quando
instrucoes PHP como backticks (``), system(), exec(), passthru() sao
utilizadas..
Outro jogo de bola completamente diferente eh observado quando
utilizamos o PHP para executar CGIs no servidor Apache. Uma opcao
para este modelo de execucao eh compilar o Apache com suporte a opcao
SuExec. Desta forma eh possivel determinar o usuario que executa os
scripts e a hierarquia de diretoios onde estes estao armazenados e os
diretorios acessiveis aos scripts, previnindo acessos nao autorizados
a areas restritas. Outro caminho possivel eh impor o redirecionamento
de CGIs no Apache. As diretivas abaixo podem realizar esta operacao:
Action php-script /cgi-bin/php.cgi
AddHandler php-script .php
Esta opcao indica ao seu servidor que, ao receber uma requisicao como
a URL abaixo:
http;//exemplo.com.br/minhapagina/teste.html
a reescreva na forma abaixo:
http://exemplo.com.br/cgi-bin/php/minhapagina/teste.html
Para que esta operacao seja possivel compile seu binario PHP com a
opcao "--enable-force-cgi-redirect" e estabeleca valores aprorpiados
para a as variaveis doc_root euser_dir no arquivo php.ini.
Tambem eh possivel determinar o montante de recursos que podem ser
utilizados por cada VirtualHost, dificultando a execucao de
determinados tipos de exploits, atraves das instrucoes abaixo,
ajustando a carga que um VirtualHost pode "empurrar" para o servidor
Apache.
LimitRequestBody 4096
RLimitCPU 5 15
RLimitMEM 8192 16384
RLimitNPROC 10 15
Lembre-se tambem que estes scripts sao ativos, mas estao restritos a
arvore determinada pela diretiva DocumentRoot do Apache. A inclusao
da opcao "SymLinksIfOwnerMatch" determina que links simbolicos
somente serao seguidos se existir correspondencia entre os "donos" da
origem e do destino. A nao inclusao da opcao Indexes inibe a
capacidade de obter uma lista dos arquivos de um diretorio que nao
apresente um arquivo index valido.
Recomendo o livro Professional Apache Security. Emprestei-o semana
passada a um amigo e nao me recordo de todas as opcoes indicadas
pelos autores. Outra opcao eh o livro Apache Administrator's
Handbook. Entretanto, todas as opcoes mencionadas e inumeras outras
estao documentadas na Internet. Uma busca no Google deve retornar a
documentacao necessaria para uma investigacao mais acurada. Aqui, no
RExLab, adotamos estas restricoes na execucao do PHP sem grandes
transtornos, apenas uma pequena adequacao dos desenvolvedores eh
necessaria, indicando claramente as restricoes em vigor.
[]'s
Luiz Maia
Windows: "Where do you want to go tomorrow?"
Linux: "Where do you want to go today?"
FreeBSD: "Are you, guys, comming or what?"
-------------- Próxima Parte ----------
_______________________________________________________________
Sair da Lista: http://www2.fugspbr.org/mailman/listinfo/fugspbr
Historico: http://www4.fugspbr.org/lista/html/FUG-BR/
Mais detalhes sobre a lista de discussão freebsd