Segurança em Aplicações Web com GNU/Linux Erick dos Santos Alves CAOS / TIC / - 2016
Roteiro Motivações Conheça sua aplicação O agente HTTP chown e chmod: importantes aliados Hardening no servidor HTTP (ex.: PHP) Automação com crontab e Shell Script Considerações Finais
Motivações Implementar mais uma camada de segurança à aplicação. Necessário pouco conhecimento em sistemas operacionais GNU/Linux Garantir maior proteção a brechas de segurança que a aplicação web pode possuir.
Conheça sua aplicação Questionamentos Em qual diretório ficam os arquivos temporários? Qual diretório é reservado para uploads? E para o cache e os logs? Quais arquivos ou diretórios serão alterados ao lançar uma nova release?
Agente HTTP Usuário do sistema que representa o serviço HTTP (daemon) Debian: www-data (Apache) / nginx CentOS: apache (Apache) / nginx Por padrão, uploads e atualizações de arquivos através do protocolo HTTP são criados com o ownership do agente Nesta apresentação utilizaremos um nome genérico: http rwxr xr x 10 http http 4,0K Mar 20 2013 index.html
chown e chmod: Importantes Aliados (1) Permissões do Usuário (owner) Permissões do Grupo (owner_group) Permissões para todos os Outros OWNERSHIP rwxr xr x 10 owner owner_group 4,0K Mar 20 2013 myfile.txt u g o r = Read (4pt) w = Write (2pt) x = execution (1pt) Total: 7pt DAC Discretionary Access Control chmod [-R] [u g o][+/-][r w x] myfile.txt Grupo dono do arquivo Usuário dono do arquivo chown [-R] owner:owner_group myfile.txt -R utilizado em diretórios (recursividade)
chown e chmod: Importantes Aliados (2) Passo 1 (adduser) Criação de um usuário administrativo ( admin ) # adduser admin
chown e chmod: Importantes Aliados (3) Passo 2 (chown) Usuário administrativo como dono de TODOS os arquivos e diretórios da aplicação. Porém o agente HTTP permanece como grupo-dono dos arquivos e diretórios. # chown R admin:http /var/www/app
chown e chmod: Importantes Aliados (4) Passos 3, 4 e 5 (chmod) Retire todas as permissões para outros usuários Retire a escrita de grupo de todos os diretórios e arquivos da aplicação Devolver a escrita do grupo nos diretórios de upload e de trânsito constante de arquivos (cache e temporários). # chmod R o rwx /var/www/app # chmod R g w /var/www/app # chmod R g+w /var/www/app/{upload,cache,tmp}
Hardening no Apache e/ou Nginx (1) Bloqueie a execução de PHP nos diretórios onde a permissão de escrita for mantida para o agente HTTP para evitar que arquivos maliciosos enviados para este diretório sejam executados via web. Apache <DirectoryMatch "(uploads logs)\/"> <filesmatch "\.php$"> Order deny,allow deny from all </filesmatch> </DirectoryMatch> Nginx location ~ (uploads logs)\/ { deny all; }
Hardening no Apache e/ou Nginx (2) Crie um VirtualHost para cada aplicação web que existir no servidor: Apache <VirtualHost *:80> ServerName app.exemplo.br DocumentRoot /var/www/app AllowOverride None AllowOverrideList None <DirectoryMatch "(uploads logs)\/"> <filesmatch "\.php$"> Order deny,allow deny from all </filesmatch> </DirectoryMatch> </VirtualHost> Nginx server { server_name app.exemplo.br listen 80; index index.html index.php; location / { root /var/www/app } } location ~ (uploads logs)\/ { deny all; } location ~ ^.+\.php$ { diretivas para o PHP-FPM }
Automatizando com crontab e Shell Script (1) O Shell Script pode ser utilizado para automatizar o processo de desbloqueio e bloqueio de aplicativos que necessitem de atualizações periódicas. Para isso pode ser utilizado uma sequência de comandos chown e chmod (passos 2 a 5). # lock app s /var/www/app Aplicativo /var/www/app BLOQUEADO # lock app n /var/www/app Aplicativo /var/www/app DESBLOQUEADO
Automatizando com crontab e Shell Script (2) Exemplo de Shell Script (comando lock-app $1 $2): #!/bin/sh case $1 h) # < HELP echo Aqui descrevo o help do comando... ;; s) # < BLOQUEIO chown R admin:http $2 chmod R o rwx $2 chmod R g w $2 # WHITE LIST chmod R g+w $2/upload $2/tmp $2/cache # (e outros...) echo Aplicacao $2 BLOQUEADA ;; n) # < DESBLOQUEIO chmod R g+w $2 echo Aplicacao $2 DESBLOQUEADA ;; *) # < outros valores de $1 que não interessam echo Opção inválida! ;;
Automatizando com crontab e Shell Script (3) Execução periódica de Shell Script para alteração/correção de permissões de arquivos provenientes de uploads ou logs para prevenção de exclusões acidentais e/ou intencionais # m h DoM mon DoW user command 0 */1 * * * root /path/lock app s /var/www/app
Próximo passo: Estude SELinux O SELinux utiliza um conjunto de regras para autorização ou proibição de operações, oferecendo uma camada adicional de segurança a um sistema GNU/Linux. No CentOS já vem instalado, porém no Debian é necessário instalar: # apt get install selinux basics selinux policy default Para listar as regras SELinux utilize o comando ls -Z rw r r. user user system_u:object_r:admin_home_t:s0 arquivo.txt
Considerações Finais Estes procedimentos não resolverão todas as vulnerabilidades, mas oferecem uma barreira adicional para garantir uma maior proteção à sua aplicação web. THERE'S NO
Dúvidas??? # man palestra # palestra help
# whoami Erick dos Santos Alves E-mail: erick_sa@ufrj.br