Depois de muito tempo fazendo deployment de websites em Joomla! cheguei a conclusão de como instalar o Apache Server de forma correta e simples. Nesse tutorial não vou te ensinar somente como instalar o Apache, mas sim como configurá-lo de deixá-lo pronto para hospedar um website de forma razoavelmente segura. Implementação de segurança de forma efetiva eu estarei ensinando nos meus próximos tutoriais. 😉 E como na maioria das vezes, sempre instalamos Apache para rodar websites em php, já farei a instalação do mesmo.

Primeiro vamos começar pelo Firewall

Eu gosto de trabalhar com o Ubuntu Server e fazer uso do UFW que é uma ferramenta padrão de configuração de firewall do Ubuntu. Eu utilizarei somente os comandos necessários para esse cenário. Para mais informações sobre como utilizar o UFW consulte a documentação padrão do mesmo. E se você quiser saber como realmente proteger um servidor linux, veja o meu vídeo no youtube.

Tudo que estiver após o “#” não será interpretado pelo terminal.

Habilita a porta 80
sudo ufw allow http
#Habilita a porta 443. Você deve usar essa linha se for fazer uso de https.
sudo ufw allow https
#Habilita o Firewall
sudo ufw enable
#Verifica a configuração
sudo ufw status
Status: active
To                   Action         From
--                   ------         ----
80/tcp               ALLOW          Anywhere
443/tcp              ALLOW          Anywhere
80/tcp (v6)          ALLOW          Anywhere (v6)
443/tcp(v6)          ALLOW          Anywhere (v6) 

Instalando os pacotes do Apache Server

sudo apt install apache2 apache2-utils -y

Provavelmente, depois disso o Apache jáSyntax Ok estará funcionando e para confirmar, digite no navegador o IP deste servidor.

Protegendo um pouco o Apache

Se você executar em seu terminal o comando curl -I url_de_um_site, você irá obter informações sobre o servidor no qual o website está hospedado, que aparentemente parece não ser muito importante, mas para um hacker são informações valiosas. Veja um exemplo abaixo:

curl -I 138.68.6.38
HTTP/1.1 301 Moved Permanently
Date: Thu, 09 Jul 2020 01:51:12 GMT
Server: Apache/2.4.29 (Ubuntu)
Location: https://138.68.6.38/
Content-Type: text/html; charset=iso-8859-1

Com esse simples comando conseguimos descobrir:

  • A versão do protocolo http
  • A localização geográfica do servidor, pelo GMT
  • A versão do Apache
  • O sistema operacional

Isso tudo foi possível com um simples comando. Agora, imagine se eu rodar um nmap nesse mesmo alvo, o que mais eu poderei encontrar…? Então, para evitar a divulgação dessas informações, precisamos adicionar os parâmetros abaixo no final do arquivo de configuração do apache. Se você não sabe como utilizar o editor vi aconselho você a dar uma olhada antes.

sudo vi /etc/apache2/apache2.conf

Adicione os parâmetros abaixo ao final do arquivo.

#Remove Server Version
ServerTokens Prod
ServerSignature Off

#Hiding etag
FileETag None

#Disable HTTP Trace Request
TraceEnable off

Se quiser saber mais para que serve esses parâmetros ou se quiser conhecer outros parâmetros, consulte a documentação oficial do Apache.

Depois de salvar e fechar, reinicie o apache e execute o comando curl novamente.

sudo service apache2 restart

O resultado deve ser algo similar a isso.

curl -I bluehat.site
HTTP/1.1 301 Moved Permanently
Date: Thu, 09 Jul 2020 01:51:44 GMT
Server: Apache
Location: https://bluehat.site/
Content-Type: text/html; charset=iso-8859-1

Instalando o PHP

Execute o comando abaixo para instalar php junto com os módulo mínimos necessários para hospedar um websites em Joomla!

sudo apt install php php-common php-gd libapache2-mod-php php-curl php-mbstring php-json php-mysql php-xml php-zip -y

Depois disso, precisamos verificar se o php está funcionando. Para isso, crie um arquivo index.php com o código phpinfo() dentro, no diretório default do Apache Server.

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/index.php

E reinicie o Apache

sudo service apache2 restart

Agora digite o IP/index.php deste servidor no navegador. Será exibida informações detalhadas do seu servidor.

Criando diretórios para hospedar os sites

O que vou mostrar aqui parece ser algo muito simples, mas muitos não dão valor a isso. A organização de diretórios para hospedagem de websites deveria ser sempre seguindo o exemplo que mostro aqui, a menos que haja uma necessidade específica para fazer diferente.

Os websites deveriam ficar hospedados em: /var/www/ seguindo essa estrutura abaixo:
site1
  |___public
  |___logs

site2
  |___public
  |___logs

E assim por diante. Não importa se você vai instalar website ou uma aplicação em um subdomínio, essa estrutura facilita a manutenção e visualização de logs.

Vamos criar o essa estrutura para um website de exemplo chamando BlueHat.

#Para o site BlueHat
sudo mkdir /var/www/bluehat
sudo mkdir /var/www/bluehat/public #Os arquivos do site devem ficar nesse diretório
sudo mkdir /var/www/bluehat/logs #Aqui serão gerados os logs de acesso e erro do seu website

E para ter certeza de que estará funcionando no final, vamos criar um arquivo básico em html.

sudo vi /var/www/bluehat/public/index.html

E adicione o conteúdo abaixo:

<html>
  <head>
     <title>Meu Servidor Web</title>
  </head>
  <body>
    <h1>Sucesso!
    O virtual host está funcionando.</h1>
  </body>
</html>

Definindo a segurança dos diretórios

Altere o dono e grupo da pasta para que o apache possa gerenciar o diretório de forma correta. Para que você entenda o como está a segurança, primeiro execute o ls -l.

ls -l /var/www/bluehat/ #Para ver as permissões de Public e Logs
ls -l /var/www/bluehat/public/ #Para ver a permissão do index.html
#Altera o dono e o grupo do diretório bluehat
sudo chown -R www-data.www-data /var/www/bluehat
#Defina quem pode Ler, Escrever e Executar os arquivos desse diretório.
sudo chmod -R 775 /var/www/bluehat
#Agora, visualize novamente a segurança desse diretório.
ls -l /var/www/bluehat/ #Para ver as permissões de Public e Logs
ls -l /var/www/bluehat/public/ #Para ver a permissão do index.html

Aviso: Todas as vezes que você for criar um diretório ou criar um novo arquivo dentro do diretório do website, repita os comandos de segurança acima.

Criando os VirtualHosts

VirtualHost é a configuração que permite ao Apache Server olhar para um diretório e gerenciar a disponibilização do conteúdo do website. Para criar esse arquivo digite o seguinte comando:

sudo vi /etc/apache2/sites-available/bluehat.site.conf

É muito importante uso da extensão .conf no nome do arquivo. Agora insira o conteúdo abaixo dentro do arquivo:

<VirtualHost *:80>
            ServerAdmin [email protected]

            #Endereço do seu site
            ServerName bluehat.site

            #Endereço do seu site com www
            ServerAlias www.bluehat.site

            #Diretório de arquivos do site
            DocumentRoot /var/www/bluehat/public

            ErrorLog /var/www/bluehat/logs/error.log
            CustomLog /var/www/bluehat/logs/access.log combined

            #Para quando alguem digitar algo errado.
            ErrorDocument 404 /index.php/404        

            <Directory /var/www/bluehat/public/>
                      Options Indexes FollowSymLinks
                      AllowOverride None
                      Order Allow,Deny
                      Allow from all
                      Require all granted
           </Directory>
</VirtualHost>

Salve e feche o arquivo quando você terminar.

Vamos habilitar o website com o comando a2ensite:

sudo a2ensite bluehat.site.conf

E desabilite o website padrão do Apache, definido em 000-default.conf:

sudo a2dissite 000-default.conf

Em seguida, vamos verificar se tudo o que digitado no arquivo bluehat.site.conf está correto:

sudo apache2ctl configtest

Você deve ver o seguinte resultado:

Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

Como podemos ver, a sintaxe do arquivo bluehat.site.conf está correta . Porém, o Apache está avisando que o servidor não tem um nome de domínio totalmente qualificado (fully qualified domain name). Para resolver esse problema digite os comandos abaixo, e o resultado será somente Syntax Ok:

echo "ServerName localhost" | sudo tee -a /etc/apache2/apache2.conf
sudo apache2ctl configtest

Independente da mensagem aciama, reinicie o Apache Server.

sudo service apache2 restart

Pronto, agora digite no navegador o IP do seu servidor e pronto. Repare que não vai aparece o site padrão do Apache, mas sim o conteúdo do arquivo HTML que você criou.

Verificando Logs

Agora que o servidor Apache está configurado, próximo trabalho a ser realizado constantemente é monitoração do seu website. E para fazer isso vou te mostrar os dois comandos que você deve utilizar sempre:

#Mostra em tempo real o acesso do seu website
sudo tail -f /var/www/bluehat/logs/access.log 
#Mostra quando algo de errado está acontecendo com seu servidor.
#Principalmente, tentativas de invasão.
sudo tail -f /var/www/bluehat/logs/error.log 

É desta forma que fiz a configuração básica do meu servidor na DigitalOcean para hospedar o meu blog bluehat.site.

Categorized in: