Debian: Ajustes finos

Saudações. Nesse tutorial vamos tratar dos principais ajustes em um servidor ou VPS rodando Debian.

O Debian é um sistema muito estável e rápido, mas carece de ajustes para integrá-lo melhor com o monitoramento e a administração. Coloquei aqui todos os ajustes mais comuns para você operá-lo com agilidade.

Requisitos

  • Instalar o Debian Linux;

Softwares utilizados nesse artigo

  • Linux Debian 12 ou versão mais nova;

Download do Debian

Para baixar o Debian, acesse o site https://www.debian.org – Link direto da pasta com imagem ISO:

O arquivo indicado se chama debian-V.S.R-amd64-netinst.iso onde V=versão, S=sub-versão, R=release (normalmente zero).

Caso deseje se adiantar nos estudos das novas versões, o diretorio para download das compilações de teste é https://cdimage.debian.org/cdimage/weekly-builds/amd64/iso-cd/

1 – Nome do servidor, DNS, reverso e arquivos hosts

É muito importante que todos servidor ou VPS tenha seu nome sincronizado com o endereço IP e o reverso desses IPs. A resolução de nomes é uma etapa vital em todos os programas que usam redes e se estiverem mal configurados pode causar lentidão extrema até mesmo na execução de programas simples.

Supondo que seu servidor/VPS terá o nome srv101.exemplo.com.br e receberá o endereço IPv4 45.255.128.2 e IPv6 2804:cafe:beba:c0ca::2 (substituia pelo seu IPv4 e IPv6 real, vou usar esses 3 valores de exemplo no conteúdo abaixo).

As configurações corretas de nome e endereços serão:

  • Se o nome do servidor será srv101.exemplo.com.br, garanta que esse nome está configurado no DNS do domínio exemplo.com.br assim:
    • srv101 IN A 45.255.128.2
    • srv101 IN AAAA 2804:cafe:beba:c0ca::2
  • Solicite a hospedagem (provedor de internet ou datacenter) que faça o mapeamento do DNS REVERSO dos IPs para o nome:
    • 45.255.128.2 mapeado (PTR) para srv101.exemplo.com.br:
      • 2.128.255.45.in-addr.arpa. IN PTR srv01.exemplo.com.br.
    • 2804:cafe:beba:c0ca::2 mapeado (PTR) para srv101.exemplo.com.br:
      • 2. (..) a.c.0.c.a.b.e.b.e.f.a.c.4.0.8.2.ip6.arpa. IN PTR srv01.exemplo.com.br.

Com essa configuração sincronizada (nome para IPs, IPs para o mesmo nome), seu servidor estará apto a fazer uso de protocolos que fazem verificação de endereço IP reverso (sistema de e-mails por exemplo).

Configurando nome principal (hostname) no Debian:

Bash
# Definindo nome do servidor:
hostnamectl set-hostname srv101.exemplo.com.br;

# Conferindo:
hostname -f;
cat /proc/sys/kernel/hostname;

Visualizando todas as informações:

Bash
# Informações completas do nome e ambiente: 
hostnamectl;
         Static hostname: srv101.exemplo.com.br
               Icon name: computer-vm
                 Chassis: vm 🖴
              Machine ID: 5393c014a0db497995e8c5097b8c1b9c
                 Boot ID: 914a211d86084bedb3570266e6f34cb9
          Virtualization: vmware
        Operating System: Debian GNU/Linux 12 (bookworm)  
                  Kernel: Linux 6.1.0-30-amd64
            Architecture: x86-64
         Hardware Vendor: VMware, Inc.
          Hardware Model: VMware Virtual Platform
        Firmware Version: 6.00

Tabela de hosts estáticos e consulta a DNS

Todo sistema ou sub-sistema Linux (host, containers) gerencia a relação entre nomes e endereços IP usando a sequência definida no /etc/host.conf, que por padrão define a busca por nomes na sequência:

  • 1 – hosts: o nome usado será procurado em /etc/hosts
    • Esse arquivo /etc/hosts mapeia os IPs e seus respectivos nomes, com uma entrada por linha, a primeira palavra deve ser o endereço IPv4 ou IPv6 seguido dos nomes dados a esse IP, todas as palavras da linha separadas por espaços ou TAB, exemplo:
      127.0.0.1 localhost
      ::1 localhost

      45.255.128.2 srv101 srv101.exemplo.com.br
  • 2 – bind: o nome usado será procurado em /etc/resolv.conf
    • Esse arquivo declara o nome padrão do domínio (search) e os servidores DNS usados para, exemplo:
      search exemplo.com.br
      nameserver 8.8.8.8

Assim, procure configurar seu /etc/hosts e seu /etc/resolv.conf corretamente.

Bash
# Preenchendo /etc/hosts com configuração correta:
(
    echo '127.0.0.1  localhost';
    echo '::1        localhost';
    echo;
    echo 'ff02::1  ip6-allnodes';
    echo 'ff02::2  ip6-allrouters';
    echo;
    echo '45.255.128.2            srv101.exemplo.com.br';
    echo '2804:cafe:beba:c0ca::2  srv101.exemplo.com.br';
    echo
) > /etc/hosts;

# Preenchendo o /etc/resolv.conf com os servidores DNS e domínio padrão:
(
    echo 'nameserver 8.8.8.8';
    echo 'nameserver 1.1.1.1';
) > /etc/resolv.conf;

Ao executar qualquer programa de acesso a rede, a consulta do nome utilizado é feito no arquivo hosts, e se não for encontrado ele é consultado via DNS nos IPs declarados no resolv.conf, observe com esse teste:

Bash
# Ping para um nome declarado no hosts:
ping -4 -c 2 localhost;
    #PING  (127.0.0.1) 56(84) bytes of data.
    #64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.015 ms
    #64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.020 ms

    #---  ping statistics ---
    #2 packets transmitted, 2 received, 0% packet loss, time 1000ms
    #rtt min/avg/max/mdev = 0.015/0.017/0.020/0.002 ms

ping -6 -c 2 localhost;
    #PING localhost(localhost (::1)) 56 data bytes
    #64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.018 ms
    #64 bytes from localhost (::1): icmp_seq=2 ttl=64 time=0.029 ms

    #--- localhost ping statistics ---
    #2 packets transmitted, 2 received, 0% packet loss, time 1046ms
    #rtt min/avg/max/mdev = 0.018/0.023/0.029/0.005 ms


# Ping para um nome de Internet:
ping -4 -c 2 google.com;
    #PING  (142.250.79.14) 56(84) bytes of data.
    #64 bytes from sp07.1e100.net (142.250.79.14): icmp_seq=1 ttl=117 time=1.39 ms
    #64 bytes from sp07.1e100.net (142.250.79.14): icmp_seq=2 ttl=117 time=1.41 ms

    #---  ping statistics ---
    #2 packets transmitted, 2 received, 0% packet loss, time 1697ms
    #rtt min/avg/max/mdev = 1.393/1.402/1.412/0.009 ms

ping -6 -c 2 google.com;
    #PING google.com(2800:3f0::200e (2800:3f0::200e)) 56 data bytes
    #64 bytes from 2800:3f0::200e (2800:3f0::200e): icmp_seq=1 ttl=118 time=1.46 ms
    #64 bytes from 2800:3f0::200e (2800:3f0::200e): icmp_seq=2 ttl=118 time=1.39 ms

    #--- google.com ping statistics ---
    #2 packets transmitted, 2 received, 0% packet loss, time 1002ms
    #rtt min/avg/max/mdev = 1.388/1.423/1.458/0.035 ms

Nota: ping não é comando de teste DNS respeitável. Teste a resolução de nomes DNS pontualmente com o comando host, informando o nome que deseja resolver e opcionalmente o IP de servidor DNS que deseja testar:

Bash
# Teste de DNS, usando DNS do sistema (/etc/resolv.conf)
host google.com;
host -t a     google.com;
host -t aaaa  google.com;
host -t mx    google.com;
host -t txt   google.com;

# Teste de DNS informando o IP do servidor DNS a ser testado:
host google.com  1.0.0.1;
host -t a     google.com  1.0.0.1;
host -t aaaa  google.com  1.0.0.1;
host -t mx    google.com  1.0.0.1;
host -t txt   google.com  1.0.0.1;

2 – Data/hora, timezone e NTP

A data/hora de todos os computadores do mundo é definida pelo relógio universal (UTC = Universal Time Clock) e todos devem estar sincronizados com ele. No Brasil a diferença da data/hora para o UTC é de normalmente -3 horas.

Como nos interessa o relógio local, então nosso timezone é UTC menos 3 horas, ou UTC-3, padrão America/Sao_Paulo

O timezone é a configuração do sistema que define a diferença de tempo para o UTC e as variações locais (horário de verão e demais leis locais que definem). Definindo:

Bash
# Conferindo data/hora local:
date;

# Conferindo data/hora no UTC:
date -u;

# Definindo como America/Sao_Paulo (UTC-3):
timedatectl set-timezone America/Sao_Paulo;

# Consultando configuração:
timedatectl;
    #                   Local time: Fri 2025-01-31 16:31:26 -03
    #               Universal time: Fri 2025-01-31 19:31:26 UTC
    #                     RTC time: Fri 2025-01-31 19:31:26
    #                    Time zone: America/Sao_Paulo (-03, -0300)
    #    System clock synchronized: yes
    #                  NTP service: active
    #              RTC in local TZ: no

# Instalar pacote de sincronismo NTP via systemd (costuma vir instalado)
apt-get -y install systemd-timesyncd;

# Conferindo servidores NTP em uso:
timedatectl show-timesync;
timedatectl show-timesync --all;
    #LinkNTPServers=
    #SystemNTPServers=
    #RuntimeNTPServers=
    #FallbackNTPServers=0.debian.pool.ntp.org 1.debian.pool.ntp.org ...
    #ServerName=2.debian.pool.ntp.org
    #ServerAddress=119.8.229.131
    #RootDistanceMaxUSec=5s
    #PollIntervalMinUSec=32s
    #PollIntervalMaxUSec=34min 8s
    #PollIntervalUSec=34min 8s
    #NTPMessage=
    #    {
    #    Leap=0, Version=4, Mode=4, Stratum=2,
    #    Precision=-24, RootDelay=233.627ms, RootDispersion=30.700ms, 
    #    Reference=C0248F96,
    #    OriginateTimestamp=Fri 2025-01-31 16:51:35 -03,
    #    ReceiveTimestamp=Fri 2025-01-31 16:51:35 -03,
    #    TransmitTimestamp=Fri 2025-01-31 16:51:35 -03,
    #    DestinationTimestamp=Fri 2025-01-31 16:51:35 -03,
    #    Ignored=yes, PacketCount=7, Jitter=13.308ms
    #    }
    #Frequency=974891

systemctl status systemd-timesyncd;
    #● systemd-timesyncd.service - Network Time Synchronization
    #Loaded: loaded (
    # /lib/systemd/system/systemd-timesyncd.service; enabled; preset: enabled)
    #     Active: active (running) since Fri 2025-01-31 15:43:51 -03; 1h 16min ago
    #       Docs: man:systemd-timesyncd.service(8)
    #   Main PID: 363 (systemd-timesyn)
    #     Status: "Contacted time server 119.8.229.131:123 (2.debian.pool.ntp.org)."
    #      Tasks: 2 (limit: 9412)
    #     Memory: 1.8M
    #        CPU: 55ms
    #     CGroup: /system.slice/systemd-timesyncd.service
    #             └─363 /lib/systemd/systemd-timesyncd

    #jan 31 15:43:51 debian systemd[1]:
    #   Starting systemd-timesyncd.service
    #    - Network Time Synchronization...
    #jan 31 15:43:51 debian systemd[1]:
    #   Started systemd-timesyncd.service - Network Time Synchronization.
    #jan 31 15:44:21 debian systemd-timesyncd[363]:
    #   Contacted time server 119.8.229.131:123 (2.debian.pool.ntp.org).
    #jan 31 15:44:21 debian systemd-timesyncd[363]:
    #   Initial clock synchronization to Fri 2025-01-31 15:44:21.906985 -03.

journalctl -u systemd-timesyncd --no-pager | grep -i 'server';
    #jan 31 15:44:21 debian systemd-timesyncd[363]:
    #    Contacted time server 119.8.229.131:123 (2.debian.pool.ntp.org).

cat /etc/systemd/timesyncd.conf;

Especificando manualmente servidores NTP do Brasil usando o endereço IP para que o sincronismo de NTP ocorra mesmo quando houver falha de DNS:

Bash
# Consultando IPs dos servidores NTP do Brasil:
host a.ntp.br;
    # a.ntp.br has address 200.160.0.8
    # a.ntp.br has IPv6 address 2001:12ff::8
host b.ntp.br;
    # b.ntp.br has address 200.189.40.8
    # b.ntp.br has IPv6 address 2001:12f8:9:1::8

# IPs dos servidores NTP do Observatorio Nacional
# Divisão de Serviços da Hora Legal Brasileira do Observatório Nacional (DISHO/ON)
# - 200.20.186.75 porta 123 UDP
# - 200.20.186.94 porta 123 UDP
# - 200.20.224.100 porta 123 UDP
# - 200.20.224.101 porta 123 UDP

# Configurando manualmente:
(
    echo;
    echo '[Time]';
    echo 'NTP=200.160.0.8 200.189.40.8 2001:12ff::8 2001:12f8:9:1::8';
    echo 'FallbackNTP=200.20.186.75 200.20.186.94 200.20.224.100 200.20.224.101';
    echo 'RootDistanceMaxSec=5';
    echo 'PollIntervalMinSec=32';
    echo 'PollIntervalMaxSec=2048';
    echo 'ConnectionRetrySec=30';
    echo 'SaveIntervalSec=60';
    echo
) >  /etc/systemd/timesyncd.conf;

# Reiniciando o servico de timesync:
systemctl restart systemd-timesyncd;

O sincronismo exato com servidores NTP é vital para o funcionamento de centenas de protocolos, principalmente sistemas de criptografia.

3 – Repositórios principais e updates

O Debian é baseado no gerenciador de pacotes APT, que define o formato dos pacotes de instalação dos programas e suas dependências, resolvendo tudo automáticamente.

Garantir que o Debian tenha acesso ao repositório de pacotes oficiais é vital, e isso pode falhar se faltar Internet durante a instalação minimalista (netinst). Garanta que os repositórios estão presentes.

Repositórios principais vitais para o Debian – comandos de restauração:

Bash
# Backup de seguranca:
cp /etc/apt/sources.list /root/etc-apt-sources.list;

# Populando repositórios principais:
(
    . /etc/os-release;
    DIST="$VERSION_CODENAME";
    BASE="http://deb.debian.org";
    SECB="http://security.debian.org";
    echo;
    echo "deb $BASE/debian/ $DIST main non-free-firmware";
    echo "deb-src $BASE/debian/ $DIST main non-free-firmware";
    echo;
    echo "deb $SECB/debian-security $DIST-security main non-free-firmware";
    echo "deb-src $SECB/debian-security $DIST-security main non-free-firmware";
    echo;
    echo "deb $BASE/debian/ $DIST-updates main non-free-firmware";
    echo "deb-src $BASE/debian/ $DIST-updates main non-free-firmware";
    echo;
) > /etc/apt/sources.list;

# Sincronizando índice:
apt -y update;

# Atualizar pacotes
apt -y upgrade;

# Atualizar pacotes centrais:
apt -y dist-upgrade;

# Limpar pacotes desnecessarios:
apt -y autoremove;

# Se houver atualizacao do '/boot/initrd****', reinicie, comando: reboot

4 – Pacotes de comandos básicos

O Debian instalado de maneira minimalista (principalmente em VPSs) carecem de muitos comandos básicos. Segue alguns programas recomendados:

Bash
# Caso precise forcar o uso de IPv4 no apt, use esse alias (retire o #):
# alias apt-get='apt-get -o Acquire::ForceIPv4=true'
# alias apt-get='apt-get -y -o Acquire::ForceIPv4=true'

# Pacotes nativos do Debian, mas que devem estar presentes,
# rode esse comando para garantir que nao faltou nenhum pacote basico:
apt-get -y install \
    bash  bind9-dnsutils  bind9-host bsdextrautils \
    bsdutils busybox bzip2 ca-certificates coreutils \
    cpio cron cron-daemon-common debianutils dmidecode dmsetup \
    e2fsprogs eject ethtool fdisk file findutils \
    firmware-linux-free fuse3 grep gzip \
    hostname iproute2 iputils-ping \
    kmod less locales logrotate lsof \
    mawk mount nano \
    nftables openssh-client openssh-server openssh-sftp-server openssl \
    pci.ids pciutils procps \
    sed tar traceroute \
    tzdata unzip util-linux wget \
    whiptail xz-utils zstd;

# Programas de compressao
apt-get -y install tar;
apt-get -y install zstd;
apt-get -y install xz-utils;
apt-get -y install zip;

# Pacote com comando curl, vital para testes de HTTP e chamadas de API REST
apt-get -y install curl;

# Lista de CAs root para certificados SSL/TLS
apt-get -y install ca-certificates;

# Ferramentas de criptografia basica:
apt-get -y install gnupg2 openssl;

# Servidor SSH para acesso remoto
apt-get -y install openssh-client openssh-server rsync;
systemctl enable ssh;
systemctl start  ssh;

# Comando ip (ip addr show, ip route show, ip rule show, ip nei show)
apt-get -y install iproute2;

# Comandos de rede: mtr, traceroute, ping, fping, whois
apt-get -y install mtr traceroute iputils-ping fping whois;

# Comando para sniffer de rede e analise de pacotes
# ex.: tcpdump -pnevas0 -i eth0
apt-get -y install tcpdump;

# Editor: mcedit
apt-get -y install mc;

# Comandos para conferir uso de CPU/RAM: htop
apt-get -y install htop psmisc;

# Monitor de consumo de I/O
apt-get -y install iotop;

# Programa de firewall
# - nftables.: nft list ruleset
# - conntrack: conntrack -L
apt-get -y install nftables conntrack;

# Gerador de UUID personalizado ( uuidgen -t,  uuidgen -r, ...)
apt-get -y install uuid uuid-runtime;

# Suporte a VLANs (vconfig, vlans 802.1q, 802.1ad)
apt-get -y install vlan;

5 – Agentes de máquinas virtuais

Quando o Linux é executado em uma máquina virtual, a comunicação entre o hypervisor (sistema rodando no hardware) e sua máquina virtual deve ocorrer por meio de canais especiais para sinalizar desligamento suave, economia de memória ociosa, entre outras sinalizações.

O software de agente do hypervisor é responsável por isso e deve ser instalado:

  • Para ambientes VMware: open-vm-tools;
  • Para ambientes Q-EMU/KVM (Proxmox, EVE-NG, RedHat, …): qemu-guest-agent;

Apenas cole os comandos abaixo, eles irão detectar a plataforma e instalar o agente correto:

Bash
# Instalar agente de virtualização adequado:

# Agent de VMWARE, instalar somente se for virtualizado no vmware
hostnamectl | grep -qi vmware && {
    apt-get -y install open-vm-tools;
    systemctl enable open-vm-tools;
    systemctl start  open-vm-tools;
}

# Agent de KVM, instalar somente se for virtualizado no kvm
hostnamectl | grep -qi kvm && {
    apt-get -y install qemu-guest-agent;
    systemctl enable qemu-guest-agent;
    systemctl start  qemu-guest-agent;
}

6 – Monitorando o Debian via SNMP

O SNMP é um protocolo de consulta de recursos de um sistema, por ele um NMS (Network Manager System). Softwares NMS mais comuns: Zabbix, PTRG, RaviMonitor, Observium, Beeping, etc…).

Por meio do SNMP, o NMS pode monitorar o consumo de rede, CPU, RAM e demais recursos do seu Debian e criar alarmes para detectar problemas e esgotamento de recursos.

Instalando e configurando o servidor SNMP no Debian:

Bash
# Instalar
apt -y install snmp snmpd;

# Ativar no boot:
systemctl enable snmpd;

# Backup da config inicial:
cp /etc/snmp/snmpd.conf /etc/snmp/orig-snmpd.conf;

# Configuracao inicial - personalize as variaveis abaixo antes de colar:
ADMIN="Patolino Silva";
COMMUNITY="Nao-use-public";
GPSLOCATION="-19.84784,-43.99129";
PORT=161;
(
    echo;
    echo 'master agentx';
    echo 'agentXPerms 0777 0777';
    echo 'smuxpeer .1.3.6.1.2.1.83';
    echo 'smuxpeer .1.3.6.1.2.1.157';
    echo 'smuxsocket localhost';
    echo;
    echo "rocommunity $COMMUNITY";
    echo "rocommunity6 $COMMUNITY";
    echo;
    echo "syscontact \"$ADMIN\"";
    echo "syslocation $GPSLOCATION";
    echo "sysName $(hostname)";
    echo "SysDescr Debian-$(hostname)";
    echo;
    P=$PORT;
    echo "agentaddress unix:/run/snmpd.socket,udp:$P,udp6:$P,tcp6:$P,tcp:$P";
    echo;
    RS1='linkUpTrap linkUp ifIndex ifDescr ifType ifAdminStatus ifOperStatus';
    RS2='linkDownTrap linkDown ifIndex ifDescr ifType ifAdminStatus ifOperStatus';
    echo "notificationEvent $RS1";
    echo "notificationEvent $RS2";
    echo;
    echo 'monitor -r 10 -e linkUpTrap "Generate linkUp" ifOperStatus != 2';
    echo 'monitor -r 10 -e linkDownTrap "Generate linkDown" ifOperStatus == 2';
    echo;
    echo "com2sec notConfigUser  default       $COMMUNITY";
    echo 'group notConfigGroup v1 notConfigUser';
    echo 'group notConfigGroup v2c notConfigUser';
    echo;
    echo 'view    systemview           included      .1';
    echo;
    echo 'access notConfigGroup "" any noauth exact systemview none none';
    echo 'defaultMonitors yes';
    echo 'linkUpDownNotifications yes';
    echo;
) > /etc/snmp/snmpd.conf;

# Reiniciar:
systemctl restart snmpd;

# Testando (usando community da variavel acima):
snmpwalk -v2c -c $COMMUNITY  127.0.0.1:$PORT  .1.3.6.1.2.1.31.1.1.1.1;
      

7 – CRON para execução de scripts periódicos

O Debian não implementa bem a configuração inicial do CRON por motivos de segurança, vamos criar pastas para armazenar scripts que serão executados periodicamente, de acordo com a pasta escolhida:

  • de 1 em 1 minuto: /etc/cron.1min/
  • de 5 em 5 minutos: /etc/cron.5min/
  • de 10 em 10 minutos: /etc/cron.10min/
  • de 15 em 15 minutos: /etc/cron.15min/
  • de 30 em 30 minutos: /etc/cron.30min/
  • A cada hora: /etc/cron.hourly/
  • A cada 24 horas (uma vez por dia): /etc/cron.daily/
  • A cada 7 dias (uma vez por semana): /etc/cron.weekly/
  • Para cada dia da semana: /etc/cron.[sunday,monday,…]

Comandos:

Bash
# Criar diretorios dos scripts periodicos:
# - intervalos curtos
mkdir -p /etc/cron.1min;
mkdir -p /etc/cron.5min;
mkdir -p /etc/cron.10min;
mkdir -p /etc/cron.15min;
mkdir -p /etc/cron.30min;
# - intervalos basicos
mkdir -p /etc/cron.hourly;
mkdir -p /etc/cron.daily;
mkdir -p /etc/cron.weekly;
mkdir -p /etc/cron.monthly;
# - agendadores de dias da semana
mkdir -p /etc/cron.monday;
mkdir -p /etc/cron.tuesday;
mkdir -p /etc/cron.wednesday;
mkdir -p /etc/cron.thursday;
mkdir -p /etc/cron.friday;
mkdir -p /etc/cron.saturday;
mkdir -p /etc/cron.sunday;

# Criar config de contrab
(
   echo "PATH=/usr/sbin:/usr/bin:/sbin:/bin";
   echo "0  *  *  *  *  run-parts --regex '.*' /etc/cron.hourly";
   echo "0  2  *  *  *  run-parts --regex '.*' /etc/cron.daily";
   echo "0  3  *  *  6  run-parts --regex '.*' /etc/cron.weekly";
   echo "0  5  1  *  *  run-parts --regex '.*' /etc/cron.monthly";
   for min in 1 5 10 15 30; do
      echo "*/$min  *  *  *  *  run-parts --regex '.*' /etc/cron.${min}min";
   done;
   echo "0  0  *  *  0  run-parts --regex '.*' /etc/cron.sunday";
   echo "0  0  *  *  1  run-parts --regex '.*' /etc/cron.monday";
   echo "0  0  *  *  2  run-parts --regex '.*' /etc/cron.tuesday";
   echo "0  0  *  *  3  run-parts --regex '.*' /etc/cron.wednesday";
   echo "0  0  *  *  4  run-parts --regex '.*' /etc/cron.thursday";
   echo "0  0  *  *  5  run-parts --regex '.*' /etc/cron.friday";
   echo "0  0  *  *  6  run-parts --regex '.*' /etc/cron.saturday";
) > /tmp/cron-list;

# Registrar no crontab:
cat /tmp/cron-list | crontab -;

# Conferir se instalou agendadores:
crontab -l;

8 – Ajustes finos no Kernel Linux

Acesse o artigo sobre Ajustes Finos no Kernel para proteger seu Debian de “sabotagens” das configurações originais, link do artigo:

9 – Configuração de rede

Para configurar IP, DHCP, VLAN e interfaces de rede, tuneis, VPNs e PBR no Debian é preciso realizar as configurações iniciando pelo arquivo /etc/network/interfaces, você pode fazer isso de duas formas:

  • Colocar tudo no /etc/network/interfaces, o que é melhor para sistemas pequenos;
  • Modularizar a configuração por meio de arquivos incluídos, assim cada configuração terá seu arquivo particular em /etc/network/interfaces.d/, esse método é melhor para empacotamento de soluções prontas, VPS, VPNs, etc…

Arquivo: /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

Você pode escrever qualquer configuração no final desse arquivo, mas observe a linha source /etc/network/interfaces.d/*

Ela instrui o NetConfig a entrar no diretório /etc/network/interfaces.d/ e ler todos os arquivos como se eles estivessem dentro do arquivo interfaces. Por conta disso, você pode optar por colocar a configuração editando o arquivo principal ou apenas criar um arquivo para cada interface no diretório interfaces.d. Exemplo: para a interface ens192, crie o arquivo /etc/network/interfaces.d/ens192 e coloque a configuração dentro dele.

Exemplo de como colocar a interface ens192 ativa mas sem configuração IP:

# Detectar presença e configurar
auto ens192
allow-hotplug ens192

# Apenas colocar UP
iface ens192 inet manual

Exemplo de como colocar a interface ens192 em DHCP-Client (obter IP automaticamente):

# Detectar presença e configurar
auto ens192
allow-hotplug ens192

# Configurar IP:
# - DHCP IPv4
iface ens192 inet dhcp

# - Slaac IPv6
iface ens192 inet6 auto

# - DHCP IPv6
iface ens192 inet6 dhcp

Exemplo de como colocar a interface ens192 com IP fixo:

# Detectar presença e configurar
auto ens192
allow-hotplug ens192

# Configurar IPv4 fixo:
iface ens192 inet static
	address 45.255.128.2/27
	gateway 45.255.128.1
	dns-nameservers 8.8.8.8
	dns-search exemplo.com.br

# Configurar IPv6 fixo:
iface ens192 inet6 static
	address 2804:cafe:beba:c0ca::2/64
	gateway 2804:cafe:beba:c0ca::1

Para colocar múltiplos IPs fixos (alias) na mesma interface, crie um sufixo “:N” (um número único para cada alias), exemplo:

# Detectar presença e configurar
auto ens192
allow-hotplug ens192

# Configurar IPv4 fixo principal:
iface ens192 inet static
    address 45.255.128.2/27
    gateway 45.255.128.1
    dns-nameservers 8.8.8.8
    dns-search exemplo.com.br

# Configurar IPv6 fixo principal:
iface ens192 inet6 static
    address 2804:cafe:beba:c0ca::2/64
    gateway 2804:cafe:beba:c0ca::1


# Alias 1
#--------------------------------------------
auto ens192:1
# Alias 1 - IPv4
iface ens192:1 inet static
    address 172.27.1.2/24

# Alias 1 - IPv6
iface ens192:1 inet6 static
    address 2001:db8:ffff:abcd::2/64


# Alias 2
#--------------------------------------------
auto ens192:2
# Alias 2 - IPv4
iface ens192:2 inet static
    address 10.191.14.3/27

# Alias 2 - IPv6
iface ens192:2 inet6 static
    address fa14::3/64

Criando interface com VLAN (IEEE 802.1q):

# Vlan 2901 na ens192
# - IP fixo e gateway (internet pela VLAN)
auto ens192.2901
iface ens192.2901 inet static
    vlan-raw-device ens192
    address 172.20.0.8
    netmask 255.255.255.0
    gateway 172.20.0.1

Criar interface tipo dummy (descarta o que não for capturado por software):

auto lo0
iface lo0 inet static
    address 100.127.255.254
    netmask 255.255.255.255
    pre-up ip link add lo0 type dummy && true
    post-down ip link del lo0 && true

Criar uma interface que dependerá de um script externo para construção completa:

auto ovpn1401
iface ovpn1401 inet manual
    pre-up    /etc/network/ovpn1401.sh pre-up
    up        /etc/network/ovpn1401.sh up
    down      /etc/network/ovpn1401.sh down
    post-down /etc/network/ovpn1401.sh post-down

Após definir a configuração da interface, aplique-a com esses comandos:

Bash
# Aplicar configuração da interface:
if-up  ens192;

# Forcar aplicação:
if-up -force  ens192;

# Desconfigurar interface (cuidado para não perder acesso):
if-down ens192;

Agora escolha como deseja montar seu sistema de rede e crie os arquivos!

10 – Interfaces de rede com nome eth

Antigamente os nomes das interfaces de rede eram “eth0”, “eth1”, etc…

O Linux (todos eles) adotaram então um padrão chamado Predictable Network Interface Names (Nomes de Interfaces de Rede Previsíveis), onde o nome das interfaces é fixo baseado na localização de hardware. Principais prefixos:

  • eno: Interfaces de hardware onboard;
  • ens: Interfaces PCI simples;
  • enp: Interfaces PCI independentes (com offload e várias portas);
  • eth: Nome tradicional de interfaces de rede criadas por software, ainda usada para máquinas virtuais, containers e modo legado;
  • wl: Wireless LAN, todas as interfaces wireless para uso em LAN (wifi);
  • ww: Wireless WAN, todas as interfaces wireless de média ou longa distância (3G/4G, LTE, …);

Cada driver faz a proposta de nomes e o kernel se encarrega de escolher. O software UDEV do pacote SystemD é responsável por essa nomeação em user-space.

Caso você deseje voltar para os nomes antigos (modo legado), você precisará passar os argumentos “net.ifnames=0 biosdevname=0” para o kernel durante o carregamento.

Configure no arquivo /etc/default/grub a variável GRUB_CMDLINE_LINUX para adicionar esses dois parâmetros acima, se houverem mais parâmetros, separe-os por um espaço e adicione no final. Exemplo:

#...

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

#...

Após inserir os argumentos na variável acima, aplique os novos ajustes no GRUB:

Bash
# Atualizar bootloader GRUB:
grub-mkconfig -o /boot/grub/grub.cfg;

É necessário reiniciar o sistema inteiro para que a configuração seja aplicada. Antes de fazer isso, lembre-se que o nome da interface atual (enoX, ensX, …) desaparecerá e passará a ser eth0, eth1, … então você deve ir no arquivo /etc/network/interfaces ou nas configurações em /etc/network/interfaces.d/ e alterar do nome atual para o novo nome “eth“.

Você pode enfrentar problemas de nomes que são trocados durante o boot pela presença de múltiplas interfaces (como uma X710 de 4 portas por exemplo). A cada boot elas podem mudar de nome e isso acaba por colocar o IP/VLAN em portas diferentes.

Para fixar o nome das interfaces pelo MAC, use o seguinte exemplo e expanda, arquivo exemplo: /etc/systemd/network/10-custom-eth0.link

[Match]
MACAddress=00:1a:2b:3c:4d:5e

[Link]
Name=eth0

Reinicie (reboot) e teste até acertar tudo sem esquecer de ajustar o NetConfig.

11 – Personalização do servidor SSH

O acesso por SSH é a base da administração do Debian. Personalizar parâmetros de maneira segura e pontual permite o backup e restauração simplificada dos atributos.

No Servidor OpenSSH, personalizar o arquivo /etc/ssh/sshd_config não é uma boa estratégia pois os updates não gosta de diferenças nesse arquivo. A melhor forma é usar o diretório /etc/ssh/sshd_config.d/ para criar os arquivos com suas personalizações.

Configurações recomendadas:

Bash
# Abrir porta padrao 22:
echo "Port                    22" > /etc/ssh/sshd_config.d/inc-port-main.conf;

# Abrir porta adicional
echo "Port                 22022" > /etc/ssh/sshd_config.d/inc-port-alt.conf;

# Abrir portas em IPv4 e IPv6
echo "AddressFamily         any"  > /etc/ssh/sshd_config.d/inc-addr-family.conf;

# Endereço IPv4 de escuta, 0.0.0.0 = todos os IPv4 do servidor
echo "ListenAddress     0.0.0.0"  > /etc/ssh/sshd_config.d/inc-listen-ipv4.conf;

# Endereço IPv6 de escuta, :: = todos os IPv6 do servidor
echo "ListenAddress          ::"  > /etc/ssh/sshd_config.d/inc-listen-ipv6.conf;

# Desativar exibição do motd do OpenSSH, ainda mantem o /etc/motd do bash
echo "PrintMotd              no"  > /etc/ssh/sshd_config.d/inc-motd.conf;

# Flags de cabeçalho IP para tratamento QoS diferenciado
echo "IPQoS  lowdelay throughput" > /etc/ssh/sshd_config.d/inc-ipv4-qos.conf;

# Ativar keep-alive de TCP (camada 4)
echo "TCPKeepAlive            yes" > /etc/ssh/sshd_config.d/inc-tcp-alive.conf;

# Ativar keep-alive de SSH (camada 5)
echo "ClientAliveInterval       3" >  /etc/ssh/sshd_config.d/inc-ssh-alive.conf;
echo "ClientAliveCountMax      15" >> /etc/ssh/sshd_config.d/inc-ssh-alive.conf;

# Ativar autenticacao com uso de senha digitavel
echo "PasswordAuthentication  yes" > /etc/ssh/sshd_config.d/inc-pass-auth.conf;

# Não permitir login de usuarios sem senha
echo "PermitEmptyPasswords     no" > /etc/ssh/sshd_config.d/inc-pass-empty.conf;

# Permitir encaminhamento pelo ssh-agent
echo "AllowAgentForwarding   yes" > /etc/ssh/sshd_config.d/inc-agent-forward.conf;

# Permitir encaminhamento de porta remota
echo "AllowTcpForwarding      yes" > /etc/ssh/sshd_config.d/inc-tcp-forward.conf;

# Permitir encaminhamento de servidor X11 por meio de conexao SHS
echo "X11Forwarding           yes" > /etc/ssh/sshd_config.d/inc-x11.conf;

# Permitir que o cliente especifique ips e portas para encaminhamento
echo "GatewayPorts clientspecified" > /etc/ssh/sshd_config.d/inc-gateway-ports.conf;

# Permitir que o cliente especifique IPs a escutar em portas remotas
echo "PermitListen            any" > /etc/ssh/sshd_config.d/inc-permit-listen.conf;

# Permitir abertura de terminal (necessario para usuario conseguir um shell)
echo "PermitTTY               yes" > /etc/ssh/sshd_config.d/inc-tty.conf;

# Permitir usar o SSH para fazer VPN
echo "PermitTunnel            yes" > /etc/ssh/sshd_config.d/inc-tunnel.conf;

# Permitir variaveis do shell do usuário transferidas para o lado servidor
echo "PermitUserEnvironment    no" > /etc/ssh/sshd_config.d/inc-user-env.conf;

# Nao exibir o ultimo login do usuario ao entrar no shell via SSH
echo "PrintLastLog             no" > /etc/ssh/sshd_config.d/inc-lastlog.conf;

# Desativar compressão de dados (shell mais responsivo)
echo "Compression              no" > /etc/ssh/sshd_config.d/inc-compression.conf;

# Nao consultar DNS reverso do ip do usuário no inicio da conexão
echo "UseDNS                   no" > /etc/ssh/sshd_config.d/inc-dns.conf;

# Especificar fingerprint de versão
echo "VersionAddendum    OpenSSH_10" >> /etc/ssh/sshd_config.d/inc-version.conf;

# Permitir que o root faça login usando senha
echo "PermitRootLogin          yes" >  /etc/ssh/sshd_config.d/inc-permit-root.conf;

# Permitir autenticação usando chave publica
echo "PubkeyAuthentication     yes" >  /etc/ssh/sshd_config.d/inc-pubkey.conf;

# Renegociar chaves simetricas a cada 1G transferido ou a cada 1h de sessão
echo "RekeyLimit              1G 1h" >  /etc/ssh/sshd_config.d/inc-rekey.conf;

# Tamanho ma­nimo da chave RSA aceita:
echo "RequiredRSASize          2048" >  /etc/ssh/sshd_config.d/inc-rsa-size.conf;

# Opcoes muito perigosas e sensiveis:
#echo "LoginGraceTime             1m" >  /etc/ssh/sshd_config.d/inc-login-time.conf
#echo "MaxAuthTries                2" >  /etc/ssh/sshd_config.d/inc-max-auth.conf
#echo "MaxSessions               128" >  /etc/ssh/sshd_config.d/inc-max-sessions.conf
#echo "MaxStartups         16:32:100" >  /etc/ssh/sshd_config.d/inc-max-startups.conf
#echo "PerSourceMaxStartups       16" >  /etc/ssh/sshd_config.d/inc-ip-startups.conf
#echo "PerSourceNetBlockSize   22:32" >  /etc/ssh/sshd_config.d/inc-net-size.conf
#echo "PermitUserRC              yes" >  /etc/ssh/sshd_config.d/inc-permit-rc.conf
#AM="publickey password";
#echo "AuthenticationMethods $AM" >/etc/ssh/sshd_config.d/inc-auths.conf
# Suportar todas as cifras (criptografia simetrica):
#echo -n > /etc/ssh/sshd_config.d/inc-ciphers.conf
#for opt in $(ssh -Q cipher); do
#    echo "Ciphers +$opt" >> /etc/ssh/sshd_config.d/inc-ciphers.conf
#done
# Suportar todos os hashes de autenticação de mensagens:
#echo -n > /etc/ssh/sshd_config.d/inc-macs.conf
#for opt in $(ssh -Q mac); do
#    echo "MACs +$opt" >> /etc/ssh/sshd_config.d/inc-macs.conf
#done
# Suportar todos os tipos de chaves efêmeras:
#echo -n > /etc/ssh/sshd_config.d/inc-kex.conf
#for opt in $(ssh -Q kex); do
#    echo "KexAlgorithms +$opt" >> /etc/ssh/sshd_config.d/inc-kex.conf
#done

# Testar configuracao:
sshd -t -f /etc/ssh/sshd_config && { echo; echo CONFIG SSHD OK; echo; }

# Reiniciar servidor ssh para aplicar:
service ssh restart;

12 – Scripts rodando no boot e reboot/shutdown

Para executar um scripts durante o carregamento do Debian, você precisará registrá-lo em algum ponto do carregamento do SystemD, vamos criar:

  • /etc/rc.local-up para subir após todos os programas do SystemD durante o boot;
  • /etc/rc.local-down para subir quando o reboot/shutdown/poweroff for acionado de forma graciosa (não funciona quando há queda de energia ou desligamento forçado);

Criando os scripts e arquivos de registro no SystemD::

Bash
# Criar script para chamadas durante o boot:
touch /etc/rc.local-up;   chmod +x /etc/rc.local-up;
touch /etc/rc.local-down; chmod +x /etc/rc.local-down;

# Diretorios para colocar os scripts que serao acionados
mkdir -p /etc/local-up.d;
mkdir -p /etc/local-down.d;

# Conteudo de exemplo:
# - script de boot
(
    echo '#!/bin/sh';
    echo;
    echo 'echo "$(date) - Boot registrado" >> /var/log/local-up.log';
    echo "run-parts --regex '.*' /etc/local-up.d";
    echo;
    echo 'exit 0';
) > /etc/rc.local-up;

# - script de desligamento
(
    echo '#!/bin/sh';
    echo;
    echo 'echo "$(date) - Desligamento registrado" >> /var/log/local-down.log';
    echo "run-parts --regex '.*' /etc/local-down.d";
    echo;
    echo 'exit 0';
) > /etc/rc.local-down;

# Servico de local-up
(
    echo '[Unit]';
    echo 'Description=Boot script entrypoint';
    echo 'After=multi-user.target network-online.target';
    echo 'Wants=network-online.target';
    echo;
    echo '[Service]';
    echo 'Type=oneshot';
    echo 'ExecStart=/etc/rc.local-up';
    echo 'RemainAfterExit=yes';
    echo;
    echo '[Install]';
    echo 'WantedBy=multi-user.target';
    echo;
) > /etc/systemd/system/rc-local-up.service;

# Servico de local-down
(
    echo '[Unit]';
    echo 'Description=Shutdown script entrypoint';
    echo 'Before=shutdown.target reboot.target halt.target';
    echo 'DefaultDependencies=no';
    echo;
    echo '[Service]';
    echo 'Type=oneshot';
    echo 'ExecStart=/etc/rc.local-down';
    echo 'RemainAfterExit=yes';
    echo;
    echo '[Install]';
    echo 'WantedBy=halt.target reboot.target shutdown.target';
    echo;
) > /etc/systemd/system/rc-local-down.service;

# Atualizar SystemD para ele detectar as novas units
systemctl daemon-reload;

# Ativar servicos rc-local-up e rc-local-down
systemctl enable rc-local-up;
systemctl enable rc-local-down;

Agora basta colocar seus scripts nos diretórios:

  • /etc/local-up.d para scripts que devem rodar no boot;
  • /etc/local-down.d para scripts que devem rodar antes do desligamento ou reboot;

13 – Apparmor

O Apparmor (armadura de aplicação) é um recurso do kernel que cria uma política de “aprisionamento” de aplicativos, impedindo que eles acessem arquivos, diretórios ou recursos fora do escopo para o qual foram programados/configurados e impede que sejam usados de maneira maliciosa.

O problema é que o Apparmor acaba avacalhando o dia-a-dia de muita gente que deseja usar o Debian livremente.

Você tem duas opções: aprender sobre esse recurso e configurá-lo corretamente ou desativá-lo, se isso não representar nenhum risco (se você roda programas em Docker, o Docker serve como melhor opção de isolamento).

Bash
# Desativando Apparmor

# Conferir status:
apparmor_status;

# Desativar:
systemctl stop apparmor;
systemctl disable apparmor;

# Remover do sistema:
apt remove --assume-yes --purge apparmor;
apt -y autoremove;

14 – Limpeza de Cache/Buffer

A limpeza de cache/buffer ajuda o sistema operacional a não usar memória desnecessária. Coloque o script em uma rotina agendada pelo Cron (capítulo anterior sobre crontab).

Bash
# Criar script de limpeza de cache
(
    echo '#!/bin/bash';
    echo;
    echo '# Limpar cache/buffer de ram';
    echo 'echo 1 > /proc/sys/vm/drop_caches;';
    echo 'echo 2 > /proc/sys/vm/drop_caches;';
    echo 'echo 3 > /proc/sys/vm/drop_caches;';
    echo;
    echo 'BLIST=$(lsblk -d -n -o NAME | sed "s/^/\/dev\//");';
    echo 'for bdev in $BLIST; do';
    echo '    blockdev --flushbufs $bdev;';
    echo 'done';
    echo;
    echo '# Sincronizar escrita atrasada no disco';
    echo 'sync;';
    echo;
) > /usr/share/drop-cache.sh;
chmod +x /usr/share/drop-cache.sh;

# Colocar para rodar de hora em hora:
cp -rav /usr/share/drop-cache.sh /etc/cron.hourly/drop-cache;

# ou

# Colocar para rodar todo dia:
# - para ambientes com muita carga de I/O (banco de dados) o cache faz bem
cp -rav /usr/share/drop-cache.sh /etc/cron.daily/drop-cache;

15 – Ajustes de embelezamento

Banner de login

Embora seja um recurso estético, eu recomendo que você personalize o /etc/motd para sempre que entrar no servidor você saber onde está se metendo.

Link para gerar texto ASCII:
https://patorjk.com/software/taag/#p=display&f=Colossal&t=%20SRV101

Exemplo de definição do banner:

Bash
# Apagar motd:
echo -n > /etc/motd;

# Preencher motd com arte ASCII (copie do cat até o EOF e cole no terminal):
(
    echo;
    echo '       .d8888b.  8888888b.  888     888    d888   .d8888b.   d888';
    echo '      d88P  Y88b 888   Y88b 888     888   d8888  d88P  Y88b d8888';
    echo '      Y88b.      888    888 888     888     888  888    888   888';
    echo '       "Y888b.   888   d88P Y88b   d88P     888  888    888   888';
    echo '          "Y88b. 8888888P"   Y88b d88P      888  888    888   888';
    echo '            "888 888 T88b     Y88o88P       888  888    888   888';
    echo '      Y88b  d88P 888  T88b     Y888P        888  Y88b  d88P   888';
    echo '       "Y8888P"  888   T88b     Y8P       8888888 "Y8888P"  8888888';
    echo;
) > /etc/motd;

Shell com prompt colorido

A variável $PS1 é usada pelo bash/sh para colorir o terminal e personalizar o prompt, você pode alterar essa variável para testar novos formatos. Execute os comandos que definem o PS1 e teste até achar um que gosta mais. Exemplos (escolha o que te agradar mais, execute um a um e compare):

Bash
# Padrão Debian:
export PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ';

# Padrão Debian com diretorio completo (apenas troca o '~' pelo caminho):
export PS1='${debian_chroot:+($debian_chroot)}\u@\h:$(pwd)\$ ';

# Padrão Debian com data/hora:
export PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w [$(date +%k:%M:%S)] \$ ';

# Azul e verde (tudo em uma unica linha):
export PS1='\[\033[0;99m\][\[\033[0;96m\]\u\[\033[0;99m\]@\[\033[0;92m\]\h\[\033[0;99m\]] \[\033[1;38m\]\w\[\033[0;99m\] \$\[\033[0m\] ';

# Verde e amarelo:
export PS1='\[\033[0;99m\][\[\033[0;92m\]\u\[\033[0;99m\]@\[\033[0;93m\]\h\[\033[0;99m\]] \[\033[1;38m\]\w\[\033[0;99m\] \$\[\033[0m\] ';

# Vermelho e amarelo:
export PS1='\[\033[0;99m\][\[\033[0;91m\]\u\[\033[0;99m\]@\[\033[0;93m\]\h\[\033[0;99m\]] \[\033[1;38m\]\w\[\033[0;99m\] \$\[\033[0m\] ';

# Azul claro e amarelo:
export PS1='\[\033[0;99m\][\[\033[0;96m\]\u\[\033[0;99m\]@\[\033[0;93m\]\h\[\033[0;99m\]] \[\033[1;38m\]\w\[\033[0;99m\] \$\[\033[0m\] ';

# Busybox mode 1
export PS1='\u@\h \w> ';

# Busybox mode 2 (+data/hora)
export PS1='\u@\h [$(date +%k:%M:%S)]> ';

# Busybox mode 3 (apenas hora no inicio)
export PS1='[\@] \u@\h> ';

Para tornar a personalização definitiva, preencha a linha do “export PS1=…” no final do script /etc/profile.d/ps1.sh (será executado pelo /etc/profile). Exemplo:

Bash
# Azul claro e amarelo:
export PS1='\[\033[0;99m\][\[\033[0;96m\]\u\[\033[0;99m\]@\[\033[0;93m\]\h\[\033[0;99m\]] \[\033[1;38m\]\w\[\033[0;99m\] \$\[\033[0m\] ';

# Colocar personalizacao sempre que iniciar um novo shell:
echo "export PS1='$PS1';" > /etc/profile.d/ps1.sh;

# Tornar script executável:
chmod +x /etc/profile.d/ps1.sh;

Conclusão

Sempre crie um relatório próprio dos servidores que você instala para que no futuro você possa reconstruir o sistema de maneira rápida e sem erros!

Terminamos por hoje, isso deve ter te economizado muito tempo!

Patrick Brandão, patrickbrandao@gmail.com