Neste artigo irei discutir algumas dicas de segurança que você pode aplicar em seu servidor web, o
Apache, numa instalação em um
Ubuntu Server 20.04 LTS. Antes de iniciar este material você precisa ter algumas noções básicas relativas ao servidor Apache:
- Diretório root: /var/www/html
- Arquivo principal de configurações: /etc/apache2/apache2.conf
- Porta padrão HTTP: 80 TCP
- Porta padrão HTTPS: 443 TCP
- Como testar seus arquivos de configuração: httpd -t
- Arquivos de log de acesso do servidor web: /var/log/http/access_log
- Arquivos de log de erros do servidor web: /var/log/http/error_log
Como esconder a versão do Apache e o sistema operacional nas páginas de erro
Quando você instala o Apache utilizando o código fonte, ou o gerenciador de pacotes apt, ele exibe a versão do Apache, além do sistema operacional quando uma página de erro é retornada ao usuário final. Outras informações que também podem ser exibidas, são as relativas aos módulos instalados em seu servidor.
Na imagem acima, você pode ver que o Apache está exibindo a versão dele, além de qual o sistema operacional utilizado no servidor. Esta pode ser uma falha de segurança na sua infraestrutura e no seu servidor, disponibilizando informações para quem deseja conseguir um acesso indevido ao equipamento. Para prevenir o Apache de mostrar essas informações, devemos realizar algumas configurações nos arquivos de configurações.
Abra seu arquivo de configurações utilizando o editor de textos preferido e procure por
ServerSignature, sendo que ele está definido por padrão com On. Defina como "Off" essa configuração, além disso, a próxima linha
ServerTokens Prod diz para o Apache retornar como um produto apenas no cabeçalho de resposta ao servidor, omitindo assim a exibição do sistema operacional e suas versões.
# vim /etc/apache2/apache2.conf
Configurações:
ServerSignature Off
ServerTokens Prod
Reiniciar o Apache:
# systemctl restart apache2
Desabilitar a listagem de diretórios
Por padrão o Apache lista todo o conteúdo dos diretórios que não possuam um arquivo de índice, como o index.html, index.htm, index.php, dentre outros. Observe a listagem na próxima imagem.
Podemos desabilitar essa listagem utilizando a diretiva
Options no arquivo de configuração para um diretório especifico que desejarmos. Para isso, devemos alterar o arquivo
apache2.conf da seguinte forma:
<Directory /var/www/html>
Options -Indexes
</Directory>
Continue atualizando seu Apache regularmente
A comunidade do Apache trabalha continuamente nos problemas de segurança, disponibilizando atualizações e novas versões, possuindo elas novas opções de segurança. Portanto, é altamente recomendado que seja utilizada a última versão do Apache no seu servidor.
Para checar a versão do seu apache, utilize:
# httpd -v
Server version: Apache/2.2.15 (Unix)
Server built: Aug 13 2013 17:29:28
Para atualizar, use o comando apt.
# apt install apache2
Não esqueça de atualizar também seu Kernel e sua distribuição
Linux, com as últimas versões estáveis, a não ser que você esteja executando uma aplicação que precise de uma versão especifica do Kernel.
Desabilite os módulos desnecessários
É sempre bom minimizar as chances de ser vítima de qualquer ataque na web. Então é recomendado que sejam desabilitados todos os módulos que não estejam sendo realmente utilizados.
Para listar todos os módulos compilados no seu servidor web, utilize o seguinte comando:
# grep LoadModule /etc/httpd/conf/httpd.conf
# have to place corresponding `LoadModule' lines at this location so the
# LoadModule foo_module modules/mod_foo.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
LoadModule ext_filter_module modules/mod_ext_filter.so
...
Na lista acima de módulos do meu servidor web que estão ativos por padrão, mas não são necessários, são: mod_imap, mod_include, mod_info, mod_userdir, mod_autoindex. Para desabilitá-los, devo inserir o caractere # no início de cada linha, e depois, reiniciar o serviço do Apache.
Execute o Apache em um Usuário e um Grupo separado
Na instalação padrão o processo do Apache é executado com o usuário nobody ou daemon. Por razões de segurança, recomenda-se que ele seja executado em uma conta própria sem privilégios, como por exemplo: http-web.
Nos próximos comandos, iremos criar um novo usuário e um novo grupo no servidor.
# groupadd http-web
# useradd -d /var/www/ -g http-web -s /bin/nologin http-web
Agora que o usuário foi criado, você precisa informar ao Apache que ele deve ser executado com ele. Para isso, precisa alterar o arquivo
/etc/httpd/conf/httpd.conf, e depois reiniciar o serviço do Apache.
Abra o arquivo
/etc/httpd/conf/httpd.conf com seu editor de textos e procure pelas palavras "User" e "Group", onde você precisa agora especificar os novos username e groupname.
User http-web
Group http-web
Utilize Allow e Deny para restringir o acesso aos diretórios
Podemos restringir o acesso aos diretórios com as opções "Allow" e "Deny" no arquivo de configuração httpd.conf. No exemplo abaixo, estamos atribuindo segurança no diretório raiz, definindo as seguintes configurações no httpd.conf:
<Directory />
Options None
Order deny,allow
Deny from all
</Directory>
Neste exemplo, temos:
- Options None: esta opção desabilita os usuários de ativar configurações adicionais.
- Order deny, allow: nesta ordem, as diretivas Deny e Allow serão processadas. Portanto, primeiro a negação (deny) e depois a permissão (allow).
- Deny from all: aqui negamos o acesso ao diretório raiz da aplicação para todos, ou seja, nenhum usuário poderá acessar esse diretório.
Utilize os módulos mod_security e mod_evasive na segurança do Apache
Estes dos módulos,
mod_security e
mod_evasive, são muito populares em termos de segurança para o Apache.
Mod_security
O
mod_security atua como um firewall para suas aplicações web e viabiliza que você monitore o tráfego em tempo real. Estas funcionalidades permitem que você possa proteger seus websites, ou seu servidor web, de atraques de força bruta (brute force attacks). Você pode simplesmente instalar o
mod_security com os gerenciadores de pacotes, como o apt no Ubuntu.
sudo apt install libapache2-modsecurity
sudo a2enmod mod-security
sudo /etc/init.d/apache2 force-reload
Mod_evasive
O
mod_evasive funciona de forma muito eficiente, trabalhando nas requisições que são enviadas para o servidor web. Ele previne que ataques DDOS consigam causar muitos danos na conexão do servidor, além de cuidar de ataques como HTTP brute force e DOS.
A instalação pode ser realizada através do seu código fonte. Caso você tenha interesse no processo de instalação, segue o material que recomendo a leitura:
Protect Apache Against Brute Force or DDoS Attacks Using Mod_Security and Mod_evasive Modules
Desabilitar que o Apache siga os links simbólicos
Por padrão, o Apache segue os links simbólicos (symlinks), mas podemos desabilitar essa configuração com opção
FollowSymLinks na diretiva
Options. Para isso, devemos realizar essa alteração no arquivo de configuração principal do Apache.
Options -FollowSymLinks
Caso um usuário, ou website, precise utilizar os links simbólicos, você pode escrever uma regra no arquivo
.htaccess deste site.
# Enable symbolic links
Options +FollowSymLinks
Para habilitar as regras de reescrita no
.htaccess, devemos ter
AllowOverride All no arquivo de configuração global.
Desabilitar a execução de CGI e Server Side Includes
Podemos desabilitar a execução de server side includes (mod_include) e de CGIs, caso não sejam necessários no seu servidor web, através de uma pequena alteração no arquivo de configuração do Apache.
Options -Includes
Options -ExecCGI
Caso você queira desabilitar apenas em um determinado diretório, como /var/www/html/web1, esta configuração também pode ser feita, da seguinte forma:
<Directory "/var/www/html/web1">
Options -Includes -ExecCGI
</Directory>
Seguem alguns valores que podem ser utilizados, para habilitar ou desabilitar, na diretiva Options:
- Options All: para habilitar todas as opções de uma única vez. Esse é o valor padrão, caso você não deseje especificar algum valor especifico no arquivo de configuração ou no .htaccess.
- Options IncludesNOEXEC: esta opção habilita os server side includes, porém inviabilizando a execução dos arquivos CGI.
- Options MultiViews: permite a negociação do conteúdo multiviews com o módulo mod_negotiation.
- Options SymLinksIfOwnerMatch: é similar ao FollowSymLinks, embora neste caso, o link será seguido apenas se o dono dele for, o mesmo do link e do diretório original.
Limite o tamanho da requisição Request
Por padrão, o Apache não possui um limite no tamanho total da requisição HTTP Request, ou seja, o tamanho é ilimitado! Esta configuração é perigosa, pois permite que sejam realizadas requisições muito grandes e você seja vitima de um ataque Denial of service. Podemos limitar esse tamanho utilizando a diretiva do Apache
LimitRequestBody na configuração de diretórios.
Nessa configuração, podemos definir um valor em bytes de 0 (ilimitado) até 2147483647 (2GB), que será permitido em uma requisição de request. Você pode limitar esse valor de acordo com as necessidades de seu site, como por exemplo, imagine que você liberou o upload de arquivos no seu site, mas deseja definir o tamanho máximo desses arquivos.
Neste exemplo, configuro que os arquivos que serão enviados pelos usuários finais, no diretório user_uploads, possuem um limite de 500K.
<Directory "/var/www/myweb1/user_uploads">
LimitRequestBody 512000
</Directory>
Proteção de ataques DDOS
Não podemos realmente proteger completamente seu website de um ataque DDOS, mas temos várias diretivas de configuração do Apache que podem te ajudar a controlar esse tipo de situação.
- TimeOut: essa diretiva permite que você defina o limite de tempo que o servidor irá esperar para que certos eventos aconteçam, antes de falar. O valor padrão é de 300 segundos, embora seja bom manter esse valor mais baixo para prevenir ataques DDOS. Este valor depende muito do tipo de requisição que será executada em seu site.
- MaxClients: define o limite de conexões que serão disponibilizadas simultaneamente. Toda nova conexão será empilhada e ficará aguardando, após esse limite ser atingido. Essa diretiva está disponível nas MPMs Prefork e Worker, sendo o valor padrão de 256.
- KeepAliveTimeout: quantidade de tempo que o servidor irá aguardar por uma próxima requisição, antes de fechar a conexão atual. O valor padrão é de 5 segundos.
- LimitRequestFields: nos ajuda a definir o limite no número de requisições HTTP que serão aceitas dos clientes. Por padrão esse valor é 100, sendo recomendado diminuir para um valor aceitável ao seu website, caso ataques DDOS estejam acontecendo como o resultado de muitas conexões HTTP.
- LimitRequestFieldSize: define o tamanho máximo dos cabeçalhos das requisições HTTP.
Habilitar o logging do Apache
O Apache habilita que você crie logs independentes ao do sistema operacional. É aconselhável habilitar o logging do Apache, pois ele provê mais informações, como por exemplo, os comandos utilizados pelos usuários que interagiram com seu servidor web.
Para realizar essa configuração você deve incluir o módulo mod_log_config, sendo que, existem três principais diretivas de logging utilizadas pelo Apache.
- TransferLog: criar arquivos de log.
- LogFormat: especificar um formato diferente.
- CustomLog: criar e formatar um arquivo de log.
Você pode também utilizar as configurações de log para um website especifico, quando está utilizando o Virtual hosting. No exemplo abaixo, mostro como configurar os logs para um site específico.
<VirtualHost *:80>
DocumentRoot /var/www/html/example.com/
ServerName www.example.com
DirectoryIndex index.htm index.html index.php
ServerAlias example.com
ErrorDocument 404 /story.php
ErrorLog /var/log/httpd/example.com_error_log
CustomLog /var/log/httpd/example.com_access_log combined
</VirtualHost>
Segurança do Apache com certificados SSL
Por último, mas não menos importante, iremos falar dos certificados SSL. Eles viabilizam a comunicação segura e criptografada do seu website! Suponhamos que você possua um site que possui um formulário de login, onde o usuário final precisa digitar as credenciais (usuário/senha) para acessá-lo, ou que você possua um e-commerce, onde devemos prover informações muito sensíveis, como dados bancários ou detalhes do cartão de crédito. Caso o servidor web trabalhe na forma padrão, todas essas informações serão enviadas como um texto puro através da internet! Ao utilizar um certificado SSL e o protocolo HTTPS, o Apache envia toda a informação de forma segura, através de um texto criptografado.
Você pode comprar certificados SSL de diferentes provedores, como Comodo, NameCheap, DigiCert, dentre outros. Caso esteja disponibilizando um servidor empresarial pequeno e não queira investir em um certificado SSL, pode criar um certificado auto assinado para seu website. Outra opção também é utilizar um certificado Let´s Encrypt, que é gratuito e vale por 90 dias, podendo ser renovado quantas vezes forem necessárias. Caso tenha interesse em utilizar o Let´s Encrypt, busque informações adicionais na internet, pois o processo de criação e instalação dele é muito simples.
Conclusões
Espero que as informações apresentadas nesse material te ajudem a deixar seu servidor web mais seguro! Você usa esse tipo de configuração em seu servidor? Ou utiliza outra configuração?