Configuração inicial do servidor Ubuntu: 9 passos para começar em um servidor Ubuntu recém-instalado

Ambiente de testeFamília DebianUbuntu 24.04.5 LTSroot · conta de usuário comum
Tarefas de configuração inicial do servidor Ubuntu verificadas

Quando você recebe um servidor novo, faz uma vez a configuração inicial do servidor Ubuntu antes de colocar qualquer serviço nele. Em um servidor Ubuntu 24.04 criado na DigitalOcean, conectamos como root e configuramos em ordem desde a atualização de pacotes até um usuário sudo, login por chave, firewall, fuso horário, atualizações de segurança automáticas e swap, e verificamos que as configurações continuavam no lugar depois de reiniciar.

As caixas de resultado abaixo são a saída dos comandos executados nesta ordem. O IP do servidor 203.0.113.10 é um valor de exemplo, e o novo usuário comum se chama deploy.

🎯 Pontos principais
Atualização de pacotes e verificação de reinicialização necessária
sudo liberado para o usuário comum deploy
deploy (login por chave verificado) e depois root (login bloqueado)
ufw libera apenas SSH, 80 e 443
Mudança de fuso horário e verificação das atualizações de segurança automáticas
Arquivo swap de 2GB e configurações mantidas após reiniciar
Pré-requisitos
Conexãoroot: chave SSH para conectar e um servidor Ubuntu 24.04

1️⃣ Atualização de pacotes do Ubuntu

Mesmo um servidor recém-criado tem atualizações esperando para serem instaladas. Depois de baixar uma lista de pacotes nova, verifique o que vai mudar antes de instalar qualquer coisa.

🔲 apt-get update

export DEBIAN_FRONTEND=noninteractive

Os comandos apt-get abaixo foram executados depois de definir este valor primeiro. Com ele, nenhuma janela pede configurações durante a instalação dos pacotes e as respostas padrão são aplicadas.

apt-get update
Hit:1 http://mirrors.digitalocean.com/ubuntu noble InRelease
Hit:2 http://mirrors.digitalocean.com/ubuntu noble-updates InRelease
Hit:3 http://mirrors.digitalocean.com/ubuntu noble-backports InRelease
Hit:4 https://repos-droplet.digitalocean.com/apt/droplet-agent main InRelease
Hit:5 http://security.ubuntu.com/ubuntu noble-security InRelease
Reading package lists...

🔲 apt-get -s upgrade

apt-get -s upgrade
Calculating upgrade...
The following upgrades have been deferred due to phasing:
  libsqlite3-0
The following packages will be upgraded:
  apt apt-transport-https apt-utils bind9-dnsutils bind9-host bind9-libs
  cloud-init distro-info-data gir1.2-glib-2.0 git git-man libapt-pkg6.0t64
  libbrotli1 libglib2.0-0t64 libglib2.0-bin libglib2.0-data liblzma5
  libmspack0t64 libpcre2-8-0 python3-jwt python3-twisted tmux
  ubuntu-pro-client ubuntu-pro-client-l10n xz-utils zlib1g
26 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

A opção -s é uma execução simulada que só calcula o resultado sem instalar nada. Neste servidor havia 26 pacotes para atualizar, e o libsqlite3-0 ficou de fora desta atualização como [deferred due to phasing]. O número de pacotes varia de servidor para servidor, conforme a data de criação do servidor e a imagem usada.

🔲 apt-get -y upgrade

apt-get -y upgrade
26 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Need to get 15.4 MB of archives.
After this operation, 398 kB of additional disk space will be used.

Quando a instalação termina, aparece em seguida a lista de serviços reiniciados.

Running kernel seems to be up-to-date.

Restarting services...
 /etc/needrestart/restart.d/systemd-manager
 systemctl restart cron.service fwupd.service multipathd.service packagekit.service polkit.service ssh.service systemd-journald.service systemd-networkd.service systemd-resolved.service systemd-timesyncd.service systemd-udevd.service udisks2.service

Service restarts being deferred:
 systemctl restart ModemManager.service
 /etc/needrestart/restart.d/dbus.service
 systemctl restart systemd-logind.service
 systemctl restart unattended-upgrades.service

Quando uma atualização que exige reinicialização é instalada, o arquivo /var/run/reboot-required é criado. Desta vez apareceu [Running kernel seems to be up-to-date.] e o arquivo não foi criado, então passamos para o próximo passo sem reiniciar.

2️⃣ Adicionar usuário no Ubuntu e privilégios sudo

O trabalho do dia a dia é feito com um usuário comum, e só os comandos de administração são executados com sudo. O sudo eleva os privilégios com a sua própria senha em vez da senha de root, então fica registrado quem executou cada comando.

🔲 adduser deploy

adduser deploy
info: Adding user `deploy' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `deploy' (1000) ...
info: Adding new user `deploy' (1000) with group `deploy (1000)' ...
info: Creating home directory `/home/deploy' ...
info: Copying files from `/etc/skel' ...
New password: 
Retype new password: 
passwd: password updated successfully
Changing the user information for deploy
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] Y
info: Adding new user `deploy' to supplemental / extra groups `users' ...
info: Adding user `deploy' to group `users' ...

O adduser envolve o useradd; ele cria a pasta pessoal e o grupo e depois pede a senha e as informações do usuário, uma por uma. A senha não aparece na tela enquanto você digita, e informações como nome e telefone podem ficar em branco com Enter.

🔲 usermod -aG sudo deploy

usermod -aG sudo deploy
groups deploy
deploy : deploy sudo users

🔲 su

Usuários do grupo sudo podem executar comandos de administração com sudo. Mude para a conta deploy com su e verifique os privilégios.

su - deploy
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
whoami
deploy
sudo whoami
[sudo] password for deploy: 
root
exit

Com sudo, a senha de deploy é pedida e, se estiver correta, o comando é executado com privilégios de root.

3️⃣ Registrar a chave SSH do novo usuário

No início, só o root tem uma chave SSH registrada, então o login por chave não funciona para deploy. Copie o authorized_keys do root para a pasta pessoal de deploy.

🔲 install -o deploy -g deploy

install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
install -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys
ls -la /home/deploy/.ssh
total 12
drwx------ 2 deploy deploy 4096 Nov  5 11:48 .
drwxr-x--- 3 deploy deploy 4096 Nov  5 11:48 ..
-rw------- 1 deploy deploy  100 Nov  5 11:48 authorized_keys

O install cria a pasta, copia o arquivo e define o dono e as permissões de uma vez. O sshd verifica as permissões e o dono dos arquivos do usuário antes de aceitar um login (StrictModes), então deixe a pasta .ssh em 700 e o authorized_keys em 600.

🔲 ssh deploy@203.0.113.10

Não feche a janela do root que está aberta; primeiro verifique em uma nova janela de terminal se você consegue conectar como deploy.

ssh deploy@203.0.113.10
whoami
deploy
🧭 Uma ordem de configuração que não deixa você trancado do lado de fora
Diagrama explicativo
🧭 Passos
🔑① Copiar chaveChave do root para deploy
➜
🪟② Verificar em nova janelaJanela do root aberta
➜
⛔③ Bloquear login rootPermitRootLogin no
➜
🪟④ Verificar em nova janelaConexão de deploy mantida
✅⑤ Liberar SSHufw allow OpenSSH
➜
🧱⑥ Ativar ufwSó as portas liberadas abertas
➜
🪟⑦ Verificar em nova janelaConexão mantida
Copie o authorized_keys do root para a pasta pessoal de deploy.
Não feche a janela do root que está aberta; verifique em uma nova janela de terminal se o login por chave funciona como deploy.
Bloqueie o login do root só depois de confirmar a conexão de deploy. Se não conseguir conectar na nova janela, desfaça a mudança na janela que você deixou aberta.
Depois de recarregar as configurações do SSH, verifique em uma nova janela se a conexão de deploy continua funcionando.
Antes de ativar o firewall, adicione primeiro a regra que libera o SSH.
Assim que ele é ativado, qualquer conexão não liberada é bloqueada, então a regra que libera o SSH precisa estar lá antes.
Depois de ativar o firewall, verifique em uma nova janela se você consegue conectar de novo como deploy.

4️⃣ Bloquear o login root por SSH

No Ubuntu 24.04, a linha Include no topo do sshd_config carrega primeiro os arquivos da pasta /etc/ssh/sshd_config.d/, e para a mesma configuração vale o valor lido primeiro. Por isso, antes de mudar algo, verifique o valor aplicado agora e o arquivo que o contém.

/etc/ssh└─ sshd_config  no topo: Include /etc/ssh/sshd_config.d/*.conf   ├─ ① sshd_config.d/50-cloud-init.conf         PasswordAuthentication no   ├─ ② sshd_config.d/60-cloudimg-settings.conf  PasswordAuthentication no   └─ ③ sshd_config linha 42                     PermitRootLogin yes → no

🔲 sshd -T

sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) '
permitrootlogin yes
passwordauthentication no
sudo grep -rn 'PasswordAuthentication' /etc/ssh/sshd_config.d/
/etc/ssh/sshd_config.d/60-cloudimg-settings.conf:1:PasswordAuthentication no
/etc/ssh/sshd_config.d/50-cloud-init.conf:1:PasswordAuthentication no

O login por senha já está desativado em dois arquivos dentro de sshd_config.d; a única mudança é a linha de login do root no arquivo principal.

🔲 sed -i PermitRootLogin

sudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config
42:PermitRootLogin yes
sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config
42:PermitRootLogin no

🔲 systemctl reload ssh

sudo sshd -t
sudo systemctl reload ssh
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) '
permitrootlogin no
passwordauthentication no

O sshd -t verifica a sintaxe da configuração e, se nada aparecer, não há erros. Depois de recarregar, confirme em uma nova janela que a conexão de deploy continua funcionando e então conecte como root para ver que ela é recusada.

ssh root@203.0.113.10
root@203.0.113.10: Permission denied (publickey).

Mesmo com a chave certa, não dá para entrar como root; o trabalho de administração é feito conectando como deploy e usando sudo.

5️⃣ Firewall do Ubuntu ufw

O ufw é a ferramenta de firewall padrão do Ubuntu, mas no início fica desativado. Assim que ele é ativado, qualquer conexão não liberada é bloqueada, então adicione primeiro a regra que libera o SSH e ative-o por último.

sudo ufw status verbose
Status: inactive

🔲 ufw allow OpenSSH

sudo ufw app list
Available applications:
  OpenSSH
sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)
sudo ufw allow 80/tcp
Rules updated
Rules updated (v6)
sudo ufw allow 443/tcp
Rules updated
Rules updated (v6)
sudo ufw show added
Added user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp

OpenSSH é um perfil que abre a porta 22, e 80 e 443 são as portas usadas por um servidor web. As regras são adicionadas para IPv4 e IPv6 juntos.

🔲 ufw enable

sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere                  
80/tcp                     ALLOW IN    Anywhere                  
443/tcp                    ALLOW IN    Anywhere                  
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)             
80/tcp (v6)                ALLOW IN    Anywhere (v6)             
443/tcp (v6)               ALLOW IN    Anywhere (v6)             

As conexões de entrada são bloqueadas por padrão, só as três portas liberadas ficam abertas, e o firewall também é ativado na inicialização. Depois de ativar, conecte de novo como deploy em uma nova janela e verifique os números das regras.

sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere                  
[ 2] 80/tcp                     ALLOW IN    Anywhere                  
[ 3] 443/tcp                    ALLOW IN    Anywhere                  
[ 4] OpenSSH (v6)               ALLOW IN    Anywhere (v6)             
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)             
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)             

6️⃣ Configuração do fuso horário no Ubuntu

O fuso horário inicial é Etc/UTC. Para ajustar o horário dos logs e das tarefas agendadas à região do servidor, este servidor, criado na região de Singapura, foi configurado como Asia/Singapore.

timedatectl
               Local time: Thu 2026-11-05 12:00:31 UTC
           Universal time: Thu 2026-11-05 12:00:31 UTC
                 RTC time: Thu 2026-11-05 12:00:31
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

🔲 timedatectl list-timezones

timedatectl list-timezones | grep Singapore
Asia/Singapore

🔲 timedatectl set-timezone

sudo timedatectl set-timezone Asia/Singapore
timedatectl
               Local time: Thu 2026-11-05 20:00:32 +08
           Universal time: Thu 2026-11-05 12:00:32 UTC
                 RTC time: Thu 2026-11-05 12:00:32
                Time zone: Asia/Singapore (+08, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Só mudam as linhas Local time e Time zone; a sincronização do relógio (NTP) e o horário UTC continuam iguais.

7️⃣ unattended upgrades: atualizações de segurança automáticas

O Ubuntu instala as atualizações de segurança automaticamente com o pacote unattended-upgrades, que já vem instalado e ativado. Por isso, neste passo você verifica se ele está ativado e o que ele instala automaticamente.

🔲 dpkg-query -W

dpkg-query -W unattended-upgrades
unattended-upgrades	2.9.1+nmu4ubuntu1
systemctl is-enabled unattended-upgrades apt-daily.timer apt-daily-upgrade.timer
enabled
enabled
enabled

🔲 cat 20auto-upgrades

cat /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

O 1 nos dois valores significa uma vez por dia, e mudar para 0 desativa as atualizações automáticas. O que é instalado é definido pelo arquivo 50unattended-upgrades.

grep -vE '^[[:space:]]*(//|$)' /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
	"${distro_id}:${distro_codename}";
	"${distro_id}:${distro_codename}-security";
	"${distro_id}ESMApps:${distro_codename}-apps-security";
	"${distro_id}ESM:${distro_codename}-infra-security";
};
Unattended-Upgrade::Package-Blacklist {
};
Unattended-Upgrade::DevRelease "auto";

Entre as origens permitidas está -security, mas não -updates, então as atualizações comuns não são instaladas automaticamente e só as de segurança são. Para receber também as atualizações comuns automaticamente, descomente a linha -updates neste arquivo.

🔲 unattended-upgrade

sudo unattended-upgrade --dry-run --debug
Starting unattended upgrades script
Allowed origins are: o=Ubuntu,a=noble, o=Ubuntu,a=noble-security, o=UbuntuESMApps,a=noble-apps-security, o=UbuntuESM,a=noble-infra-security

São as duas últimas linhas da mesma execução.

No packages found that can be upgraded unattended and no pending auto-removals
The list of kept packages can't be calculated in dry-run mode.

O --dry-run só calcula o que a atualização automática faria, sem instalar nada. Como as atualizações de pacotes já tinham sido feitas, ele mostrou que não havia pacotes para instalar automaticamente. Os registros das execuções reais ficam na pasta /var/log/unattended-upgrades/.

sudo ls -l /var/log/unattended-upgrades/
total 32
-rw-r--r-- 1 root root     0 Nov  5 20:00 unattended-upgrades-dpkg.log
-rw-r--r-- 1 root root     0 Nov  5 17:34 unattended-upgrades-shutdown.log
-rw-r--r-- 1 root root 29093 Nov  5 20:04 unattended-upgrades.log

8️⃣ Configuração da memória swap no Ubuntu

Este servidor tem 1GB de memória e nenhum swap no início. Antes de instalar aplicativos nele, crie um arquivo swap de 2GB e registre-o em /etc/fstab para que ele também seja ativado depois de reiniciar.

free -h
               total        used        free      shared  buff/cache   available
Mem:           961Mi       328Mi       161Mi       4.0Mi       631Mi       633Mi
Swap:             0B          0B          0B
df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        24G  2.0G   22G   9% /

🔲 fallocate -l 2G /swapfile

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
ls -lh /swapfile
-rw------- 1 root root 2.0G Nov  5 20:04 /swapfile

🔲 mkswap /swapfile

sudo mkswap /swapfile
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=0b43ccd8-5b4a-4048-9b84-eee12667b387

🔲 swapon /swapfile

sudo swapon /swapfile
swapon --show
NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2
free -h
               total        used        free      shared  buff/cache   available
Mem:           961Mi       328Mi       160Mi       4.0Mi       632Mi       632Mi
Swap:          2.0Gi          0B       2.0Gi

🔲 tee -a /etc/fstab

O swapon só ativa por agora; para que ele também fique ativo depois de reiniciar, adicione uma linha ao fstab.

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
/swapfile none swap sw 0 0

9️⃣ Verificação da configuração inicial do servidor Ubuntu

Quando você confirma que as configurações continuam depois de reiniciar, a configuração inicial do Ubuntu está concluída.

🔲 systemctl reboot

sudo systemctl reboot

🔲 uptime -p

Depois de reiniciar, conecte de novo como deploy.

uptime -p
up 2 minutes
swapon --show
NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) '
permitrootlogin no
passwordauthentication no
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere                  
80/tcp                     ALLOW IN    Anywhere                  
443/tcp                    ALLOW IN    Anywhere                  
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)             
80/tcp (v6)                ALLOW IN    Anywhere (v6)             
443/tcp (v6)               ALLOW IN    Anywhere (v6)             
timedatectl | head -n 4
               Local time: Thu 2026-11-05 20:06:35 +08
           Universal time: Thu 2026-11-05 12:06:35 UTC
                 RTC time: Thu 2026-11-05 12:06:35
                Time zone: Asia/Singapore (+08, +0800)
systemctl is-active unattended-upgrades ssh.socket
active
active

Swap, configurações do SSH, firewall, fuso horário e atualizações automáticas estão todos iguais a antes de reiniciar. Em seguida, este servidor recebe um aplicativo Node.js com PM2 e Nginx.

🔢 FAQ & conteúdo recomendado

Pode deixar como está. Um pacote que fica de fora como [deferred due to phasing] é uma atualização em distribuição gradual. O Ubuntu libera algumas atualizações primeiro só para parte dos servidores e, se não houver problemas, amplia a distribuição para todos. As atualizações de segurança não são distribuídas gradualmente, e o pacote que ficou de fora é instalado na próxima atualização quando a distribuição for ampliada.

A tarefa de atualização automática roda uma vez por dia, e os dois temporizadores apt-daily.timer e apt-daily-upgrade.timer a iniciam com um atraso aleatório depois de um horário fixo. Neste servidor, a próxima execução do apt-daily-upgrade.timer estava marcada para o dia seguinte às 06:27:59 (+08). Se o servidor estiver desligado e perder esse horário, a tarefa pode rodar logo na próxima inicialização, por isso as tarefas do apt às vezes esperam um pouco logo depois de iniciar.

Com as configurações padrão, não. O valor padrão de Automatic-Reboot no 50unattended-upgrades é false, e nas configurações deste servidor essa linha também não está ativada. Quando uma atualização que exige reinicialização é instalada, o arquivo /var/run/reboot-required é criado; reinicie você mesmo quando esse arquivo existir.

ℹ️ Aviso de afiliados
O conteúdo deste site contém links de afiliados. Quando um visitante compra um produto ou serviço por meio de um desses links, o site recebe uma comissão do vendedor. O valor que o comprador paga (em promoções, ele diminui ↓) não aumenta por causa disso. Preços, descontos e informações de estoque valem para o momento em que o texto foi escrito e podem ter mudado, por isso confirme com o vendedor antes de comprar. Os produtos são escolhidos e avaliados por critérios próprios, e o recebimento de comissão não influencia a ordem de apresentação nem o conteúdo das avaliações.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Demonstre sua humanidade: 8   +   3   =