Template Servidor Debian: mudanças entre as edições
Sem resumo de edição |
Sem resumo de edição |
||
Linha 45: | Linha 45: | ||
* '''MTA''': essa variável por padrão é '''N''' (não). Quando que essa variável seria um '''Y'''(sim)? Se você tiver montando um '''servidor de correio (MTA server)''', por exemplo: um servidor '''postfix''', '''exim''', '''sendmail''', etc. Na maior parte das vezes montamos diversos servidores e em sua grande maioria não será um '''MTA server'''. Nesse caso precisamos ter um sistema para facilitar o envio das notificações por e-mail. Aqui usaremos os pacotes '''msmtp''' e '''msmtp-mta''' que terão a função de se conectar em um '''MTA server''' de sua escolha e enviar as notificações que precisamos. Eu por exemplo uso o Google para os meus sistemas: crio uma conta no GMail, habilito o 2FA e gero uma senha para "sistemas não confiáveis" e utilizo essa conta para enviar os e-mails a partir dos servidores. | * '''MTA''': essa variável por padrão é '''N''' (não). Quando que essa variável seria um '''Y'''(sim)? Se você tiver montando um '''servidor de correio (MTA server)''', por exemplo: um servidor '''postfix''', '''exim''', '''sendmail''', etc. Na maior parte das vezes montamos diversos servidores e em sua grande maioria não será um '''MTA server'''. Nesse caso precisamos ter um sistema para facilitar o envio das notificações por e-mail. Aqui usaremos os pacotes '''msmtp''' e '''msmtp-mta''' que terão a função de se conectar em um '''MTA server''' de sua escolha e enviar as notificações que precisamos. Eu por exemplo uso o Google para os meus sistemas: crio uma conta no GMail, habilito o 2FA e gero uma senha para "sistemas não confiáveis" e utilizo essa conta para enviar os e-mails a partir dos servidores. | ||
* '''MSMTP_FROM''', '''MSMTP_HOST''', '''MSMTP_USER''' e '''MSMTP_PASS''': essas são as informações que usaremos no msmtp e são bem intuitivas. O '''MSMTP_FROM''' será o e-mail de quem enviará as notificações, por exemplo a conta que criamos no Gmail. O '''MSMTP_HOST''' é o endereço do servidor de e-mail (MTA server) que usaremos e '''MSMTP_USER''' e '''MSMTP_PASS''' formam a credencial de acesso para poder enviar os e-mails. Por padrão a configuração assume que usará a porta '''587/TCP'''. Abaixo um exemplo de como ficaria essa configuração: | * '''MSMTP_FROM''', '''MSMTP_HOST''', '''MSMTP_USER''' e '''MSMTP_PASS''': essas são as informações que usaremos no msmtp e são bem intuitivas. O '''MSMTP_FROM''' será o e-mail de quem enviará as notificações, por exemplo a conta que criamos no Gmail. O '''MSMTP_HOST''' é o endereço do servidor de e-mail (MTA server) que usaremos e '''MSMTP_USER''' e '''MSMTP_PASS''' formam a credencial de acesso para poder enviar os e-mails. Por padrão a configuração assume que usará a porta '''587/TCP'''. Abaixo um exemplo de como ficaria essa configuração: | ||
MTA="N" | |||
MTA="N" | MSMTP_FROM="[email protected]" | ||
MSMTP_HOST="smtp.gmail.com" | |||
MSMTP_FROM="[email protected]" | MSMTP_USER="[email protected]" | ||
MSMTP_PASS="pnxxxxxxxxxxlupw" | |||
MSMTP_HOST="smtp.gmail.com" | |||
MSMTP_USER="[email protected]" | |||
MSMTP_PASS="pnxxxxxxxxxxlupw" | |||
* '''APPARMOR''': por padrão o script desabilita o APPARMOR do sistema para que não cause problemas com algum serviço que você irá configurar posteriormente. Se você for utilizar o APPARMOR mude a variável para '''Y'''(sim) mas saiba que você poderá, em algumas situações, ter que estudar e configurar corretamente este sistema. Muitos artigos na Internet inclusive solicitam que desabilite este serviço para não causar problemas com seus programas. Ele é excelente para a segurança desde que esteja devidamente configurado mas se estiver apenas instalado poderá te causar algumas dores. Vou citar apenas um exemplo: na configuração do '''unbound''' se você não configurar o APPARMOR corretamente, nem o arquivo de log do unbound em '''/var/log/unbound''', ele permitirá ser usado. | * '''APPARMOR''': por padrão o script desabilita o APPARMOR do sistema para que não cause problemas com algum serviço que você irá configurar posteriormente. Se você for utilizar o APPARMOR mude a variável para '''Y'''(sim) mas saiba que você poderá, em algumas situações, ter que estudar e configurar corretamente este sistema. Muitos artigos na Internet inclusive solicitam que desabilite este serviço para não causar problemas com seus programas. Ele é excelente para a segurança desde que esteja devidamente configurado mas se estiver apenas instalado poderá te causar algumas dores. Vou citar apenas um exemplo: na configuração do '''unbound''' se você não configurar o APPARMOR corretamente, nem o arquivo de log do unbound em '''/var/log/unbound''', ele permitirá ser usado. | ||
* '''LANG''', '''LANGUAGE''' e '''DISTRO_NAME''': são variáveis de ambiente do sistema para setar a linguagem e capturar o nome da distribuição Debian que está usando. Se for alterar só altere a '''LANG''' e '''LANGUAGE'''. | * '''LANG''', '''LANGUAGE''' e '''DISTRO_NAME''': são variáveis de ambiente do sistema para setar a linguagem e capturar o nome da distribuição Debian que está usando. Se for alterar só altere a '''LANG''' e '''LANGUAGE'''. | ||
Linha 113: | Linha 107: | ||
# ip route | grep blackhole | # ip route | grep blackhole | ||
Como comentei no início o '''fail2ban''' foi programado por padrão para notificar o contato de abuse responsável do IP banido usando a ação '''[https://abusix.com/xarf/ XARF]''' e encontramos em '''/etc/fail2ban/action.d/xarf-login-attack.conf''' a configuração e texto usado nas notificações. | Como comentei no início o '''fail2ban''' foi programado por padrão para notificar o contato de abuse responsável do IP banido usando a ação '''[https://abusix.com/xarf/ XARF]''' e encontramos em '''/etc/fail2ban/action.d/xarf-login-attack.conf''' a configuração e texto usado nas notificações. | ||
== A instalação do Debian GNU/Linux == | |||
Utilize esse script apenas em sistemas recém instalados, nunca em servidores já configurados e em produção porque ele vai mexer em configurações que talvez você já tenha ajustado. Procure fazer uma instalação limpa do Debian, mantendo apenas o básico. Na seleção de pacotes do Debian deixe apenas esses 2 itens selecionados e o restante desmarcado: | |||
[[Arquivo:Install debian.png|nenhum|commoldura]] | |||
== Prompt do sistema após rodar o script == | |||
O script utiliza um '''prompt''' retirado do programa criado pelo '''Professor Kretcheu''' e disponibilizado aqui '''https://github.com/kretcheu/devel/blob/master/prompt''' o prompt nada mais é que a configuração da variável bash chamada de PS1. Nosso sistema deve ficar assim: | |||
[[Arquivo:Prompt.png|nenhum|commoldura]] | |||
Nele temos as informações de '''user do terminal''' em uso, o '''hostname''', '''diretório atual''' em que se encontra o usuário e o '''horário do sistema'''. | |||
Após terminar de executar o script, reinicie o sistema para fazer valer algumas configurações e até mesmo para testar se tudo está rodando como deveria. | |||
== O script == | |||
Finalmente chegamos no nosso script e é este que se encontra abaixo: | |||
#!/usr/bin/env bash | |||
# Script de preparacao de servidores Debian GNU/Linux para uso em producao | |||
# ATENCAO! Esse script eh para ser usado em servidores recem instalados, que | |||
# nao estejam ainda em producao pois serah re-configurado todo o ambiente. | |||
# Eh uma contribuicao e nao me responsabilizo por quaisquer danos causados | |||
# pelo uso desse script. | |||
# Autor: Marcelo Gondim - gondim at gmail.com | |||
# Data: 21/01/2023 | |||
# Versao: 1.0 | |||
# | |||
# servidor_template.sh is free software; you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation; either version 2 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program; if not, write to the Free Software | |||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
# Variaveis de configuracao: | |||
# E-mail para envio de logs do sistema via logwatch | |||
EMAIL_LOGS="" | |||
# E-mail para envio de avisos de upgrade do sistema via apticron | |||
EMAIL_UPGRADES="" | |||
# Definicao do hostname do servidor | |||
HOSTNAME="" | |||
# Se esse servidor nao for um servidor de correio mantenha o default MTA="N". | |||
# Caso esse servidor vah se tornar um servidor de correio entao mude para MTA="S". | |||
# Se nao sabe o que eh um servidor de correio ou MTA, deixe o defautl. | |||
MTA="N" | |||
# Com excecao da MSMTP_FROM, as variaveis MSMTP_* soh serao usadas se MTA="N" | |||
MSMTP_FROM="" | |||
MSMTP_HOST="" | |||
MSMTP_USER="" | |||
MSMTP_PASS="" | |||
# Por padrao removo o apparmor. Caso queira manter basta mudar para APPARMOR="Y" | |||
APPARMOR="N" | |||
LANG="pt_BR.UTF-8" | |||
LANGUAGE="pt_BR.UTF-8:pt:en" | |||
DISTRO_NAME="`lsb_release -s -c`" | |||
# Para listar os timezones disponiveis execute: timedatectl list-timezones | |||
TIMEZONE="UTC" | |||
# Coloque nessa lista usando espacos os IPs que o fail2ban nao podera bloquear. | |||
# Adicione pelo menos o IP do servidor, IP do gateway, o seu DNS e o IP ou rede que voce | |||
# usara para acessar esse servidor. | |||
F2B_IGNOREIP="127.0.0.1 ::1" | |||
# Tempo de banimento para o fail2ban | |||
F2B_BANTIME="72h" | |||
# Limite de tentativas antes do bloqueio | |||
F2B_MAXRETRY="5" | |||
# Notifica os contatos responsaveis dos IPs que foram banidos. Caso so queira bloquear, mude para N. | |||
F2B_XARF="Y" | |||
if [ "$EMAIL_LOGS" == "" -o "$EMAIL_UPGRADES" == "" ]; then | |||
echo -e "\nVariaveis de EMAIL vazias!" | |||
exit | |||
fi | |||
if [ "$MSMTP_FROM" == "" ]; then | |||
echo -e "\nVariavel MSMTP_FROM vazia!" | |||
exit | |||
fi | |||
if [ "$HOSTNAME" == "" ]; then | |||
echo -e "\nVariavel HOSTNAME vazia!" | |||
exit | |||
fi | |||
echo -e "Configurando repositorios APT em /etc/apt/sources.list..." | |||
cat << EOF > /etc/apt/sources.list | |||
deb <nowiki>http://security.debian.org/debian-security</nowiki> $DISTRO_NAME-security main contrib non-free | |||
deb <nowiki>http://deb.debian.org/debian</nowiki> $DISTRO_NAME main non-free contrib | |||
deb <nowiki>http://deb.debian.org/debian</nowiki> $DISTRO_NAME-updates main contrib non-free | |||
deb <nowiki>http://deb.debian.org/debian</nowiki> $DISTRO_NAME-backports main contrib non-free | |||
EOF | |||
echo -e "Configurando /etc/hostname..." | |||
echo "$HOSTNAME" > /etc/hostname | |||
hostname -F /etc/hostname | |||
echo -e "Configurando /etc/hosts..." | |||
cat << EOF > /etc/hosts | |||
127.0.0.1 localhost | |||
127.0.1.1 $HOSTNAME | |||
# The following lines are desirable for IPv6 capable hosts | |||
::1 localhost ip6-localhost ip6-loopback | |||
ff02::1 ip6-allnodes | |||
ff02::2 ip6-allrouters | |||
EOF | |||
echo -e "Atualizando o sistema e instalando alguns pacotes uteis..." | |||
apt-get update && apt-get -y full-upgrade && apt-get -y install neofetch net-tools nftables htop iotop sipcalc tcpdump vim-nox curl gnupg rsync wget host dnsutils mtr-tiny bmon sudo expect tmux whois ethtool dnstop | |||
echo "syntax on" > /root/.vimrc | |||
echo -e "Setando timezone para $TIMEZONE..." | |||
timedatectl set-timezone "$TIMEZONE" | |||
echo -e "Definindo o locales do sistema..." | |||
update-locale LANG="$LANG" LANGUAGE="$LANGUAGE" | |||
echo -e "Adicionando algumas configuracoes em /etc/sysctl.d/local.conf..." | |||
cat << EOF > /etc/sysctl.d/local.conf | |||
net.core.rmem_max = 2147483647 | |||
net.core.wmem_max = 2147483647 | |||
net.ipv4.tcp_rmem = 4096 87380 2147483647 | |||
net.ipv4.tcp_wmem = 4096 65536 2147483647 | |||
net.netfilter.nf_conntrack_buckets = 512000 | |||
net.netfilter.nf_conntrack_max = 4096000 | |||
vm.swappiness=10 | |||
fs.inotify.max_user_watches=524288 | |||
EOF | |||
echo nf_conntrack >> /etc/modules | |||
modprobe nf_conntrack | |||
sysctl -p /etc/sysctl.d/local.conf | |||
# Agradecimentos ao Kretcheu pelo script dele gerador de PS1: <nowiki>https://github.com/kretcheu/devel/blob/master/prompt</nowiki> | |||
echo -e "Modificando o prompt (PS1) do bash..." | |||
cat << EOF > /root/.bash_profile | |||
PS1='\[\e[1;34m\]\342\224\214\342\224\200\[\e[1;34m\][\[\e[1;36m\]\u\[\e[1;33m\]@\[\e[1;37m\]\h\[\e[1;34m\]]\[\e[1;34m\]\342\224\200\[\e[1;34m\][\[\e[1;33m\]\w\[\e[1;34m\]]\[\e[1;34m\]\342\224\200[\[\e[1;37m\]\t\[\e[1;34m\]]\n\[\e[1;34m\]\342\224\224\342\224\200\342\224\200\342\225\274\[\e[1;32m\] # \[\e[0m\]' | |||
alias l="ls -la --color=auto" | |||
alias rm="rm -i" | |||
alias mv="mv -i" | |||
alias cp="cp -i" | |||
EOF | |||
if [ "$MTA" == "N" -o "$MTA" == "n" ]; then | |||
echo -e "Instalando sistema para envio de e-mails de notificacao..." | |||
apt-get -y install msmtp msmtp-mta bsd-mailx | |||
cat << EOF > /root/.msmtprc | |||
# Set default values for all following accounts. | |||
defaults | |||
port 587 | |||
tls on | |||
tls_trust_file /etc/ssl/certs/ca-certificates.crt | |||
account notificacoes | |||
protocol smtp | |||
host $MSMTP_HOST | |||
from $MSMTP_FROM | |||
auth login | |||
user $MSMTP_USER | |||
password $MSMTP_PASS | |||
# Set a default account | |||
account default : notificacoes | |||
EOF | |||
echo -e "Enviando e-mail de teste..." | |||
echo "Teste de envio de e-mail!" | mailx -s $HOSTNAME $EMAIL_LOGS | |||
fi | |||
echo -e "Instalando apticron e logwatch..." | |||
apt-get -y install apticron logwatch | |||
cat << EOF > /etc/apticron/apticron.conf | |||
EMAIL="$EMAIL_UPGRADES" | |||
DIFF_ONLY="0" | |||
LISTCHANGES_PROFILE="" | |||
ALL_FQDNS="0" | |||
SYSTEM=\$(/bin/hostname -f) | |||
IPADDRESSNUM="1" | |||
IPADDRESSES="" | |||
NOTIFY_HOLDS="0" | |||
NOTIFY_NEW="1" | |||
NOTIFY_NO_UPDATES="0" | |||
GPG_ENCRYPT="0" | |||
EOF | |||
cat << EOF > /etc/logwatch/conf/logwatch.conf | |||
Output = mail | |||
MailTo = $EMAIL_LOGS | |||
MailFrom = $MSMTP_FROM | |||
Detail = 5 | |||
EOF | |||
if [ "$APPARMOR" == "N" -o "$APPARMOR" == "n" ]; then | |||
echo -e "Removendo o APPARMOR. Necessario reboot..." | |||
mkdir -p /etc/default/grub.d | |||
echo 'GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT apparmor=0"' > /etc/default/grub.d/apparmor.cfg | |||
update-grub | |||
fi | |||
echo -e "Instalando IRQBalance..." | |||
apt-get -y install irqbalance | |||
systemctl enable irqbalance | |||
echo -e "Instalando o chrony para atualizacao de data e hora do sistema..." | |||
apt-get -y install chrony | |||
cat << EOF > /etc/chrony/chrony.conf | |||
confdir /etc/chrony/conf.d | |||
sourcedir /run/chrony-dhcp | |||
sourcedir /etc/chrony/sources.d | |||
keyfile /etc/chrony/chrony.keys | |||
driftfile /var/lib/chrony/chrony.drift | |||
ntsdumpdir /var/lib/chrony | |||
logdir /var/log/chrony | |||
maxupdateskew 100.0 | |||
rtcsync | |||
makestep 1 3 | |||
leapsectz right/UTC | |||
EOF | |||
cat << EOF > /etc/chrony/sources.d/nic.sources | |||
server a.st1.ntp.br iburst nts | |||
server b.st1.ntp.br iburst nts | |||
server c.st1.ntp.br iburst nts | |||
server d.st1.ntp.br iburst nts | |||
EOF | |||
systemctl restart chronyd.service | |||
echo -e "Instalando o iWatch para monitorar integridade do File System..." | |||
apt-get -y install iwatch | |||
cat << EOF > /etc/iwatch/iwatch.xml | |||
<?xml version="1.0" ?> | |||
<!DOCTYPE config SYSTEM "/etc/iwatch/iwatch.dtd" > | |||
<config charset="utf-8"> | |||
<guard email="$EMAIL_LOGS" name="iWatch"/> | |||
<watchlist> | |||
<title>Operating System</title> | |||
<contactpoint email="$EMAIL_LOGS" name="Administrator"/> | |||
<path type="single" syslog="off" alert="off" exec="(echo %e %f | mailx -s '$HOSTNAME %p' $EMAIL_LOGS)">/bin</path> | |||
<path type="single" syslog="off" alert="off" exec="(echo %e %f | mailx -s '$HOSTNAME %p' $EMAIL_LOGS)">/sbin</path> | |||
<path type="recursive" syslog="off" alert="off" exec="(echo %e %f | mailx -s '$HOSTNAME %p' $EMAIL_LOGS)">/lib</path> | |||
<path type="single" syslog="off" alert="off" exec="(echo %e %f | mailx -s '$HOSTNAME %p' $EMAIL_LOGS)">/var/spool/cron/crontabs/root</path> | |||
</watchlist> | |||
</config> | |||
EOF | |||
chattr -i /var/spool/cron/crontabs/root | |||
cat << EOF > /var/spool/cron/crontabs/root | |||
# Edit this file to introduce tasks to be run by cron. | |||
# | |||
# Each task to run has to be defined through a single line | |||
# indicating with different fields when the task will be run | |||
# and what command to run for the task | |||
# | |||
# To define the time you can provide concrete values for | |||
# minute (m), hour (h), day of month (dom), month (mon), | |||
# and day of week (dow) or use '*' in these fields (for 'any'). | |||
# | |||
# Notice that tasks will be started based on the cron's system | |||
# daemon's notion of time and timezones. | |||
# | |||
# Output of the crontab jobs (including errors) is sent through | |||
# email to the user the crontab file belongs to (unless redirected). | |||
# | |||
# For example, you can run a backup of all your user accounts | |||
# at 5 a.m every week with: | |||
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ | |||
# | |||
# For more information see the manual pages of crontab(5) and cron(8) | |||
# | |||
# m h dom mon dow command | |||
MAILTO="" | |||
*/1 * * * * (systemctl status iwatch;if [ \$? -ne 0 ]; then echo "iWatch Parou. Verifique!" | mailx -s '$HOSTNAME iWatch' $EMAIL_LOGS; fi) | |||
EOF | |||
crontab -u root /var/spool/cron/crontabs/root | |||
chattr +i /var/spool/cron/crontabs/root | |||
systemctl restart iwatch.service | |||
echo -e "Instalando o fail2ban..." | |||
apt-get -y install fail2ban bind9-utils | |||
if [ "$F2B_XARF" == "Y" ]; then | |||
cat << EOF > /etc/fail2ban/jail.local | |||
[DEFAULT] | |||
ignoreip = $F2B_IGNOREIP | |||
bantime = $F2B_BANTIME | |||
findtime = 1m | |||
maxretry = $F2B_MAXRETRY | |||
banaction = route | |||
banaction_allports = route | |||
sender = $MSMTP_FROM | |||
mta = sendmail | |||
action = %(action_xarf)s | |||
[sshd] | |||
enabled = true | |||
EOF | |||
else | |||
cat << EOF > /etc/fail2ban/jail.local | |||
[DEFAULT] | |||
ignoreip = $F2B_IGNOREIP | |||
bantime = $F2B_BANTIME | |||
findtime = 1m | |||
maxretry = $F2B_MAXRETRY | |||
banaction = route | |||
banaction_allports = route | |||
sender = $MSMTP_FROM | |||
mta = sendmail | |||
action = %(action_)s | |||
[sshd] | |||
enabled = true | |||
EOF | |||
fi | |||
cat << EOF > /etc/fail2ban/action.d/route.local | |||
# Fail2Ban configuration file | |||
# | |||
# Author: Michael Gebetsroither | |||
# | |||
# This is for blocking whole hosts through blackhole routes. | |||
# | |||
# PRO: | |||
# - Works on all kernel versions and as no compatibility problems (back to debian lenny and WAY further). | |||
# - It's FAST for very large numbers of blocked ips. | |||
# - It's FAST because it Blocks traffic before it enters common iptables chains used for filtering. | |||
# - It's per host, ideal as action against ssh password bruteforcing to block further attack attempts. | |||
# - No additional software required beside iproute/iproute2 | |||
# | |||
# CON: | |||
# - Blocking is per IP and NOT per service, but ideal as action against ssh password bruteforcing hosts | |||
[Definition] | |||
actionban = ip route add <blocktype> <ip> | |||
actionunban = ip route del <blocktype> <ip> | |||
actioncheck = | |||
actionstart = | |||
actionstop = | |||
[Init] | |||
# Option: blocktype | |||
# Note: Type can be blackhole, unreachable and prohibit. Unreachable and prohibit correspond to the ICMP reject messages. | |||
# Values: STRING | |||
blocktype = blackhole | |||
EOF | |||
systemctl enable fail2ban.service | |||
systemctl restart fail2ban.service | |||
echo -e "\nServidor configurado. Reinicie o sistema para validar!" | |||
== Finalizando == | |||
O script é livre e pode ser modificado e redistribuído mas sempre mantenha os créditos de quem desenvolveu, é um jeito de você valorizar o trabalho do autor. | |||
Essa documentação foi útil? Compartilhe, divulgue e ajude outras pessoas. Meus contatos podem ser vistos [[Sobre mim|aqui]]. | |||
[[Categoria:Dicas Técnicas]] |
Edição das 17h08min de 22 de janeiro de 2023
Introdução
Certa vez ouvi de um amigo, que todo bom sysadmin é preguiçoso e existe uma certa verdade nisso. Sempre que existe uma tarefa ou processo que se repete inúmeras vezes, tratamos de criar ferramentas para automatizar essas tarefas. Existem diversas ferramentas para automatizar nossa vida com por exemplo o Ansible e containers personalizados em Docker. Enfim, cabe aqui o conhecimento e a criatividade de cada profissional para resolver os problemas e agilizar os processos, mas temos que ter sempre a qualidade e segurança em mente.
Configurar um ou mais serviços de Redes em um servidor pode ser rápido mas às vezes muitos sysadmins pecam em alguns cuidados de segurança como:
- Fazer sempre uma instalação limpa e básica do sistema para começar. Não adicionar nada que não seja realmente necessário para o projeto. Quanto mais coisas rodando em seu servidor, mais chances dele se tornar inseguro em algum momento.
- Não ter bem definido o que precisa e o que não precisa estar público no servidor.
- Deixar de criar um sistema de segurança para o seu servidor e quando digo isso não estou falando somente de um simples filtro de pacotes mas também de outros elementos que monitoram a integridade do sistema de arquivos, as tentativas de invasão, que executam ações de defesa e que nos avisam de que algo está acontecendo. A junção de todos esses elementos forma o que conhecemos como Firewall.
- Não ter nenhum monitoramento do sistema como: serviços, atualizações, logs, etc.
- Não fazer nenhuma atualização ou correção dos sistemas, deixando-os cheios de falhas e vulneráveis. Já ouviu falar sobre Portas de Amplificação DDoS? Elas surgem desses sistemas abandonados, mal configurados e também de dispositivos de Internet, que não tem atualização por parte do fabricante; que são também instalados incorretamente e ficando expostos na Internet.
Fazer tudo isso pode ser trabalhoso e cansativo quando administramos diversos servidores, mas neste artigo vou ajudar a simplificar um pouco a sua vida e trazer mais segurança para a sua Operação. Como sempre trabalhando com sistemas Debian GNU/Linux, estou trazendo aqui um shell script em bash que me ajuda na configuração básica de cada servidor, automatizando algumas tarefas e deixando meu ambiente praticamente pronto para o projeto.
O que o script faz
Esse script vai preparar o básico para o seu servidor, seja ele qual for, vai configurar todo o ambiente para que você tenha:
- Configuração dos repositórios do Debian.
- Configuração de ambiente como: hostname, prompt, lang, sysctl, irqbalance.
- Instalação de algumas ferramentas úteis: neofetch, net-tools, nftables, htop, iotop, sipcalc, tcpdump, vim-nox, curl, gnupg, rsync, wget, host, dnsutils, mtr-tiny, bmon, sudo, expect, tmux, whois, ethtool, dnstop.
- Configurar o timezone do sistema. Eu tenho sempre por preferência e quando posso, escolher o UTC.
- Configurar o MSMTP para enviar as notificações de atualizações e logs do sistema via e-mail. Utilizo ele apenas quando o servidor sendo configurado não é um servidor de e-mail (MTA). Nesse caso ele tem essa função de enviar os e-mails. Por exemplo se você estiver montando um servidor Web, com o MSMTP o sistema pode enviar e-mails mais facilmente. Após a configuração, ele te envia um e-mail de teste para sabermos se está tudo OK com ele.
- Desabilita o APPARMOR. Alguns programas podem necessitar de uma configuração mais aprofundada do APPARMOR para que funcionem 100%. Como é um item de segurança do sistema, no script você pode optar por não remove-lo.
- Instala e configura o chrony para usar os servidores NTP/NTS do NIC.br. É importantíssimo que todo servidor tenha data e hora corretos.
- Instala o iWatch para monitorar em real time o sistema de arquivos e te enviar notificações quando houver alguma mudança nesses locais: /bin, /sbin/ e /lib.
- Instala o fail2ban habilitando pelo menos o monitoramento do ssh. Em caso de detecção o IP do atacante é colocado em blackhole via ip route e o sistema envia um e-mail sobre o incidente para o contato de abuse responsável do IP banido.
- Instala e configura o apticron que envia notificações de atualizações do sistema por e-mail.
- Instala e configura o logwatch que envia diariamente um relatório de diversas coisas que aconteceram no sistema via e-mail.
O que o script não faz
A programação do script não faz algumas coisas como:
- Não cria as regras de filtros de pacote. Isso dependerá muito do que rodará no sistema, se vai usar IPTables ou NFTables por exemplo; quais serviços serão instalados, enfim, essa parte é muito pessoal. Embora não tenha neste artigo, você precisa criar as regras e fechar ao máximo seu sistema.
- Ele não olha os e-mails por você, então crie um hábito de checar regularmente os e-mails e ver se não existe alguma notificação a ser tratada.
- Ele não configura nada que não tenha sido comentado neste artigo. Na dúvida sempre examine o código para tentar entender e adaptar mudanças que te sejam interessantes.
- Como comentei o fail2ban estará configurado para o serviço sshd, mais para frente neste artigo vou comentar sobre os 2 arquivos dele e caso tenha outros serviços abertos na Internet, procure dar uma estudada no fail2ban para monitorá-los. Dê uma lida nesse meu outro artigo "Melhorando a segurança do serviço sshd" para reforçar a segurança desse serviço.
Variáveis do script
Dentro do script coloquei algumas variáveis para que o script possa automatizar as tarefas e procure configurá-las se quiser ter sucesso no uso dele. Vamos conhecê-las:
- EMAIL_LOGS: essa variável é obrigatória porque faz parte do monitoramento do seu sistema de logs, não queremos um servidor zumbi na Internet. Aqui você coloca um e-mail para onde serão enviados os logs sobre o sistema operacional e serviços rodando. Esses e-mails são diários e falam de diversas coisas que aconteceram no sistema como por exemplo: as diversas tentativas de conexão ssh, tentativas de acesso à paginas do seu site que não existem, usuários que se logaram recentemente no seu servidor, espaço em disco e muitas outras informações interessantes que o logwatch proporciona. Aqui estamos falando de informações que vão te fazer perceber que alguém ou algum bot está tentando fazer algo errado com teu servidor ou que teu sistema precisa de alguma atenção.
- EMAIL_UPGRADES: essa também é uma variável obrigatória e pode ser o mesmo valor de EMAIL_LOGS se preferir. Para esse e-mail serão enviadas as notificações que o sistema precisa de atualização e que tipo de atualização para que você possa avaliar se são urgentes ou não.
- HOSTNAME: o próprio nome já sugere o que seja. Todo servidor precisa ter um hostname até mesmo para que você possa identificá-lo no meio das notificações que irá receber. Crie nomes padronizados e que possam te ajudar a identificar onde estão esses equipamentos. Eu sei que é bacana dar nomes do tipo: bart, lisa, burn, homer, mail, ftp, http ou coisas do gênero mas esses nomes não te deixam claro onde que esses sistemas estão localizados certo? Se você tiver por exemplo 2 servidores com o mesmo hostname, quem é quem? Eu fazia assim também no passado e hoje procuro fazer bom uso e sentido dos hostnames. Um exemplo de boa prática para hostname: RJO-DC01-WEBSERVER-01. Nesse exemplo consigo identificar pelo hostname que esse servidor estaria no Rio de Janeiro, no Datacenter 01 e é o servidor Web de número 01. Conseguiu enxergar a diferença? Uma informação tão simples, mas que pode ser muito útil.
- MTA: essa variável por padrão é N (não). Quando que essa variável seria um Y(sim)? Se você tiver montando um servidor de correio (MTA server), por exemplo: um servidor postfix, exim, sendmail, etc. Na maior parte das vezes montamos diversos servidores e em sua grande maioria não será um MTA server. Nesse caso precisamos ter um sistema para facilitar o envio das notificações por e-mail. Aqui usaremos os pacotes msmtp e msmtp-mta que terão a função de se conectar em um MTA server de sua escolha e enviar as notificações que precisamos. Eu por exemplo uso o Google para os meus sistemas: crio uma conta no GMail, habilito o 2FA e gero uma senha para "sistemas não confiáveis" e utilizo essa conta para enviar os e-mails a partir dos servidores.
- MSMTP_FROM, MSMTP_HOST, MSMTP_USER e MSMTP_PASS: essas são as informações que usaremos no msmtp e são bem intuitivas. O MSMTP_FROM será o e-mail de quem enviará as notificações, por exemplo a conta que criamos no Gmail. O MSMTP_HOST é o endereço do servidor de e-mail (MTA server) que usaremos e MSMTP_USER e MSMTP_PASS formam a credencial de acesso para poder enviar os e-mails. Por padrão a configuração assume que usará a porta 587/TCP. Abaixo um exemplo de como ficaria essa configuração:
MTA="N" MSMTP_FROM="[email protected]" MSMTP_HOST="smtp.gmail.com" MSMTP_USER="[email protected]" MSMTP_PASS="pnxxxxxxxxxxlupw"
- APPARMOR: por padrão o script desabilita o APPARMOR do sistema para que não cause problemas com algum serviço que você irá configurar posteriormente. Se você for utilizar o APPARMOR mude a variável para Y(sim) mas saiba que você poderá, em algumas situações, ter que estudar e configurar corretamente este sistema. Muitos artigos na Internet inclusive solicitam que desabilite este serviço para não causar problemas com seus programas. Ele é excelente para a segurança desde que esteja devidamente configurado mas se estiver apenas instalado poderá te causar algumas dores. Vou citar apenas um exemplo: na configuração do unbound se você não configurar o APPARMOR corretamente, nem o arquivo de log do unbound em /var/log/unbound, ele permitirá ser usado.
- LANG, LANGUAGE e DISTRO_NAME: são variáveis de ambiente do sistema para setar a linguagem e capturar o nome da distribuição Debian que está usando. Se for alterar só altere a LANG e LANGUAGE.
- TIMEZONE: como eu havia comentado, costumo usar o padrão em UTC. Imagine que você tem servidores espalhados pelo mundo, fica mais fácil configurar todos para UTC e ter um controle melhor do que cada um com um timezone diferente. Sem falar que a grande maioria das notificações de segurança chegam com logs em horário UTC e isso facilita sua vida. Se quiser mudar utilize o comando: timedatectl list-timezones e veja qual usar na variável.
- F2B_IGNOREIP: essa variável é muito importante para que o fail2ban não bloqueie IPs confiáveis e evitar que algum ataque de spoofing cause um bloqueio indevido de acesso. IPs que costumo colocar nessa variável: 127.0.0.1, ::1, o IPv4 e IPv6 do servidor, o IPv4 e IPv6 do gateway do servidor, IP do DNS usado no servidor e IPs e/ou redes que uso como origem do acesso remoto. Os IPs e prefixos podem ser colocados usando espaço entre eles na variável.
- F2B_BANTIME: tempo de banimento do fail2ban, nesse caso por padrão no script está configurado para 72h mas fique à vontade de alterar.
- F2B_MAXRETRY: número de tentativas para o acionamento do banimento. Também altere como desejar, por padrão está como 5.
- F2B_XARF: por padrão o fail2ban será configurado para notificar os contatos de abuse dos IPs banidos usando o XARF. Caso só queria apenas banir, sem notificar, basta mudar essa variável para N(não).
Estas são as variáveis que o script utiliza para a configuração inicial do seu sistema. O bom é que você poderá deixar sempre pré-configurado e executar nos novos sistemas, agilizando seu processo e deixando o sistema com uma certa condição de segurança e monitoramento.
Etapas e configurações do script
Aqui vou comentar apenas os lugares onde você encontrará informações mais importantes, caso deseje modificar alguma coisa. Procure também dar uma estudada no script e adaptar novas configurações e situações. Aceito contribuições que ajudem a melhorar mais nosso script, só me contactar. Veja como me contactar aqui.
A configuração dos repositórios do Debian é feita aqui: /etc/apt/sources.list.
O hostname é configurado aqui: /etc/hostname.
Os ajustes de sysctl são colocados aqui: /etc/sysctl.d/local.conf detalhe que esse arquivo é lido somente em tempo de boot ou se fizer manualmente sysctl -p /etc/sysctl.d/local.conf.
O prompt do sistema é configurado aqui: /root/.bash_profile.
As configurações do msmtp, que faz a conexão com o MTA server para envio dos e-mails fica aqui: /root/.msmtprc.
O apticron que envia as notificações de atualizações do sistema fica aqui: /etc/apticron/apticron.conf.
O logwatch que envia o log diário sobre as condições do seu sistema fica aqui: /etc/logwatch/conf/logwatch.conf.
A configuração dos servidores NTP/NTS do NIC.br pode ser encontrada aqui: /etc/chrony/sources.d/nic.sources.
O iWatch, que monitora em tempo real seu file system, é configurado em xml e encontra-se aqui: /etc/iwatch/iwatch.xml.
O fail2ban temos 2 arquivos sendo que apenas um pode ser necessário incluir alguma nova configuração: /etc/fail2ban/jail.local. O outro arquivo que não necessita mexer seria esse: /etc/fail2ban/action.d/route.local.
Alguns comandos do fail2ban para administração
Vamos supor que você queira saber quem está bloqueado e de qual serviço ou que queira desbloquear alguém manualmente. Aqui vão alguns comandos:
Para ver o status do fail2ban e quais serviços monitorados:
# fail2ban-client status Status |- Number of jail: 6 `- Jail list: dropbear, nginx-botsearch, nginx-http-auth, php-url-fopen, portsentry, sshd
Para ver um determinado serviço e quem foi bloqueado:
# fail2ban-client status sshd Status for the jail: sshd |- Filter | |- Currently failed: 1 | |- Total failed: 26 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 5.xxx.xxx.115
Para remover do banimento o IP:
# fail2ban-client unban 5.xxx.xxx.115
Uma outra forma de descobrir quem está banido do sistema:
# ip route | grep blackhole
Como comentei no início o fail2ban foi programado por padrão para notificar o contato de abuse responsável do IP banido usando a ação XARF e encontramos em /etc/fail2ban/action.d/xarf-login-attack.conf a configuração e texto usado nas notificações.
A instalação do Debian GNU/Linux
Utilize esse script apenas em sistemas recém instalados, nunca em servidores já configurados e em produção porque ele vai mexer em configurações que talvez você já tenha ajustado. Procure fazer uma instalação limpa do Debian, mantendo apenas o básico. Na seleção de pacotes do Debian deixe apenas esses 2 itens selecionados e o restante desmarcado:
Prompt do sistema após rodar o script
O script utiliza um prompt retirado do programa criado pelo Professor Kretcheu e disponibilizado aqui https://github.com/kretcheu/devel/blob/master/prompt o prompt nada mais é que a configuração da variável bash chamada de PS1. Nosso sistema deve ficar assim:
Nele temos as informações de user do terminal em uso, o hostname, diretório atual em que se encontra o usuário e o horário do sistema.
Após terminar de executar o script, reinicie o sistema para fazer valer algumas configurações e até mesmo para testar se tudo está rodando como deveria.
O script
Finalmente chegamos no nosso script e é este que se encontra abaixo:
#!/usr/bin/env bash # Script de preparacao de servidores Debian GNU/Linux para uso em producao # ATENCAO! Esse script eh para ser usado em servidores recem instalados, que # nao estejam ainda em producao pois serah re-configurado todo o ambiente. # Eh uma contribuicao e nao me responsabilizo por quaisquer danos causados # pelo uso desse script. # Autor: Marcelo Gondim - gondim at gmail.com # Data: 21/01/2023 # Versao: 1.0 # # servidor_template.sh is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Variaveis de configuracao: # E-mail para envio de logs do sistema via logwatch EMAIL_LOGS="" # E-mail para envio de avisos de upgrade do sistema via apticron EMAIL_UPGRADES="" # Definicao do hostname do servidor HOSTNAME="" # Se esse servidor nao for um servidor de correio mantenha o default MTA="N". # Caso esse servidor vah se tornar um servidor de correio entao mude para MTA="S". # Se nao sabe o que eh um servidor de correio ou MTA, deixe o defautl. MTA="N" # Com excecao da MSMTP_FROM, as variaveis MSMTP_* soh serao usadas se MTA="N" MSMTP_FROM="" MSMTP_HOST="" MSMTP_USER="" MSMTP_PASS="" # Por padrao removo o apparmor. Caso queira manter basta mudar para APPARMOR="Y" APPARMOR="N" LANG="pt_BR.UTF-8" LANGUAGE="pt_BR.UTF-8:pt:en" DISTRO_NAME="`lsb_release -s -c`" # Para listar os timezones disponiveis execute: timedatectl list-timezones TIMEZONE="UTC" # Coloque nessa lista usando espacos os IPs que o fail2ban nao podera bloquear. # Adicione pelo menos o IP do servidor, IP do gateway, o seu DNS e o IP ou rede que voce # usara para acessar esse servidor. F2B_IGNOREIP="127.0.0.1 ::1" # Tempo de banimento para o fail2ban F2B_BANTIME="72h" # Limite de tentativas antes do bloqueio F2B_MAXRETRY="5" # Notifica os contatos responsaveis dos IPs que foram banidos. Caso so queira bloquear, mude para N. F2B_XARF="Y" if [ "$EMAIL_LOGS" == "" -o "$EMAIL_UPGRADES" == "" ]; then echo -e "\nVariaveis de EMAIL vazias!" exit fi if [ "$MSMTP_FROM" == "" ]; then echo -e "\nVariavel MSMTP_FROM vazia!" exit fi if [ "$HOSTNAME" == "" ]; then echo -e "\nVariavel HOSTNAME vazia!" exit fi echo -e "Configurando repositorios APT em /etc/apt/sources.list..." cat << EOF > /etc/apt/sources.list deb http://security.debian.org/debian-security $DISTRO_NAME-security main contrib non-free deb http://deb.debian.org/debian $DISTRO_NAME main non-free contrib deb http://deb.debian.org/debian $DISTRO_NAME-updates main contrib non-free deb http://deb.debian.org/debian $DISTRO_NAME-backports main contrib non-free EOF echo -e "Configurando /etc/hostname..." echo "$HOSTNAME" > /etc/hostname hostname -F /etc/hostname echo -e "Configurando /etc/hosts..." cat << EOF > /etc/hosts 127.0.0.1 localhost 127.0.1.1 $HOSTNAME # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters EOF echo -e "Atualizando o sistema e instalando alguns pacotes uteis..." apt-get update && apt-get -y full-upgrade && apt-get -y install neofetch net-tools nftables htop iotop sipcalc tcpdump vim-nox curl gnupg rsync wget host dnsutils mtr-tiny bmon sudo expect tmux whois ethtool dnstop echo "syntax on" > /root/.vimrc echo -e "Setando timezone para $TIMEZONE..." timedatectl set-timezone "$TIMEZONE" echo -e "Definindo o locales do sistema..." update-locale LANG="$LANG" LANGUAGE="$LANGUAGE" echo -e "Adicionando algumas configuracoes em /etc/sysctl.d/local.conf..." cat << EOF > /etc/sysctl.d/local.conf net.core.rmem_max = 2147483647 net.core.wmem_max = 2147483647 net.ipv4.tcp_rmem = 4096 87380 2147483647 net.ipv4.tcp_wmem = 4096 65536 2147483647 net.netfilter.nf_conntrack_buckets = 512000 net.netfilter.nf_conntrack_max = 4096000 vm.swappiness=10 fs.inotify.max_user_watches=524288 EOF echo nf_conntrack >> /etc/modules modprobe nf_conntrack sysctl -p /etc/sysctl.d/local.conf # Agradecimentos ao Kretcheu pelo script dele gerador de PS1: https://github.com/kretcheu/devel/blob/master/prompt echo -e "Modificando o prompt (PS1) do bash..." cat << EOF > /root/.bash_profile PS1='\[\e[1;34m\]\342\224\214\342\224\200\[\e[1;34m\][\[\e[1;36m\]\u\[\e[1;33m\]@\[\e[1;37m\]\h\[\e[1;34m\]]\[\e[1;34m\]\342\224\200\[\e[1;34m\][\[\e[1;33m\]\w\[\e[1;34m\]]\[\e[1;34m\]\342\224\200[\[\e[1;37m\]\t\[\e[1;34m\]]\n\[\e[1;34m\]\342\224\224\342\224\200\342\224\200\342\225\274\[\e[1;32m\] # \[\e[0m\]' alias l="ls -la --color=auto" alias rm="rm -i" alias mv="mv -i" alias cp="cp -i" EOF if [ "$MTA" == "N" -o "$MTA" == "n" ]; then echo -e "Instalando sistema para envio de e-mails de notificacao..." apt-get -y install msmtp msmtp-mta bsd-mailx cat << EOF > /root/.msmtprc # Set default values for all following accounts. defaults port 587 tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt account notificacoes protocol smtp host $MSMTP_HOST from $MSMTP_FROM auth login user $MSMTP_USER password $MSMTP_PASS # Set a default account account default : notificacoes EOF echo -e "Enviando e-mail de teste..." echo "Teste de envio de e-mail!" | mailx -s $HOSTNAME $EMAIL_LOGS fi echo -e "Instalando apticron e logwatch..." apt-get -y install apticron logwatch cat << EOF > /etc/apticron/apticron.conf EMAIL="$EMAIL_UPGRADES" DIFF_ONLY="0" LISTCHANGES_PROFILE="" ALL_FQDNS="0" SYSTEM=\$(/bin/hostname -f) IPADDRESSNUM="1" IPADDRESSES="" NOTIFY_HOLDS="0" NOTIFY_NEW="1" NOTIFY_NO_UPDATES="0" GPG_ENCRYPT="0" EOF cat << EOF > /etc/logwatch/conf/logwatch.conf Output = mail MailTo = $EMAIL_LOGS MailFrom = $MSMTP_FROM Detail = 5 EOF if [ "$APPARMOR" == "N" -o "$APPARMOR" == "n" ]; then echo -e "Removendo o APPARMOR. Necessario reboot..." mkdir -p /etc/default/grub.d echo 'GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT apparmor=0"' > /etc/default/grub.d/apparmor.cfg update-grub fi echo -e "Instalando IRQBalance..." apt-get -y install irqbalance systemctl enable irqbalance echo -e "Instalando o chrony para atualizacao de data e hora do sistema..." apt-get -y install chrony cat << EOF > /etc/chrony/chrony.conf confdir /etc/chrony/conf.d sourcedir /run/chrony-dhcp sourcedir /etc/chrony/sources.d keyfile /etc/chrony/chrony.keys driftfile /var/lib/chrony/chrony.drift ntsdumpdir /var/lib/chrony logdir /var/log/chrony maxupdateskew 100.0 rtcsync makestep 1 3 leapsectz right/UTC EOF cat << EOF > /etc/chrony/sources.d/nic.sources server a.st1.ntp.br iburst nts server b.st1.ntp.br iburst nts server c.st1.ntp.br iburst nts server d.st1.ntp.br iburst nts EOF systemctl restart chronyd.service echo -e "Instalando o iWatch para monitorar integridade do File System..." apt-get -y install iwatch cat << EOF > /etc/iwatch/iwatch.xml <?xml version="1.0" ?> <!DOCTYPE config SYSTEM "/etc/iwatch/iwatch.dtd" > <config charset="utf-8"> <guard email="$EMAIL_LOGS" name="iWatch"/> <watchlist> <title>Operating System</title> <contactpoint email="$EMAIL_LOGS" name="Administrator"/> <path type="single" syslog="off" alert="off" exec="(echo %e %f | mailx -s '$HOSTNAME %p' $EMAIL_LOGS)">/bin</path> <path type="single" syslog="off" alert="off" exec="(echo %e %f | mailx -s '$HOSTNAME %p' $EMAIL_LOGS)">/sbin</path> <path type="recursive" syslog="off" alert="off" exec="(echo %e %f | mailx -s '$HOSTNAME %p' $EMAIL_LOGS)">/lib</path> <path type="single" syslog="off" alert="off" exec="(echo %e %f | mailx -s '$HOSTNAME %p' $EMAIL_LOGS)">/var/spool/cron/crontabs/root</path> </watchlist> </config> EOF chattr -i /var/spool/cron/crontabs/root cat << EOF > /var/spool/cron/crontabs/root # Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any'). # # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command MAILTO="" */1 * * * * (systemctl status iwatch;if [ \$? -ne 0 ]; then echo "iWatch Parou. Verifique!" | mailx -s '$HOSTNAME iWatch' $EMAIL_LOGS; fi) EOF crontab -u root /var/spool/cron/crontabs/root chattr +i /var/spool/cron/crontabs/root systemctl restart iwatch.service echo -e "Instalando o fail2ban..." apt-get -y install fail2ban bind9-utils if [ "$F2B_XARF" == "Y" ]; then cat << EOF > /etc/fail2ban/jail.local [DEFAULT] ignoreip = $F2B_IGNOREIP bantime = $F2B_BANTIME findtime = 1m maxretry = $F2B_MAXRETRY banaction = route banaction_allports = route sender = $MSMTP_FROM mta = sendmail action = %(action_xarf)s [sshd] enabled = true EOF else cat << EOF > /etc/fail2ban/jail.local [DEFAULT] ignoreip = $F2B_IGNOREIP bantime = $F2B_BANTIME findtime = 1m maxretry = $F2B_MAXRETRY banaction = route banaction_allports = route sender = $MSMTP_FROM mta = sendmail action = %(action_)s [sshd] enabled = true EOF fi cat << EOF > /etc/fail2ban/action.d/route.local # Fail2Ban configuration file # # Author: Michael Gebetsroither # # This is for blocking whole hosts through blackhole routes. # # PRO: # - Works on all kernel versions and as no compatibility problems (back to debian lenny and WAY further). # - It's FAST for very large numbers of blocked ips. # - It's FAST because it Blocks traffic before it enters common iptables chains used for filtering. # - It's per host, ideal as action against ssh password bruteforcing to block further attack attempts. # - No additional software required beside iproute/iproute2 # # CON: # - Blocking is per IP and NOT per service, but ideal as action against ssh password bruteforcing hosts [Definition] actionban = ip route add <blocktype> <ip> actionunban = ip route del <blocktype> <ip> actioncheck = actionstart = actionstop = [Init] # Option: blocktype # Note: Type can be blackhole, unreachable and prohibit. Unreachable and prohibit correspond to the ICMP reject messages. # Values: STRING blocktype = blackhole EOF systemctl enable fail2ban.service systemctl restart fail2ban.service echo -e "\nServidor configurado. Reinicie o sistema para validar!"
Finalizando
O script é livre e pode ser modificado e redistribuído mas sempre mantenha os créditos de quem desenvolveu, é um jeito de você valorizar o trabalho do autor.
Essa documentação foi útil? Compartilhe, divulgue e ajude outras pessoas. Meus contatos podem ser vistos aqui.