Configuração inicial do servidor Ubuntu: 9 passos para começar em um servidor Ubuntu recém-instalado
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.
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=noninteractiveOs 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 updateHit: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 upgradeCalculating 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 upgrade26 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.serviceQuando 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 deployinfo: 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 deploygroups deploydeploy : 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 - deployTo run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.whoamideploysudo whoami[sudo] password for deploy:
rootexitCom 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/.sshinstall -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keysls -la /home/deploy/.sshtotal 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_keysO 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.10whoamideploy4️⃣ 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 nosudo 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 noO 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_config42:PermitRootLogin yessudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_configsudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config42:PermitRootLogin no🔲 systemctl reload ssh
sudo sshd -tsudo systemctl reload sshsudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) 'permitrootlogin no
passwordauthentication noO 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.10root@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 verboseStatus: inactive🔲 ufw allow OpenSSH
sudo ufw app listAvailable applications:
OpenSSHsudo ufw allow OpenSSHRules updated
Rules updated (v6)sudo ufw allow 80/tcpRules updated
Rules updated (v6)sudo ufw allow 443/tcpRules updated
Rules updated (v6)sudo ufw show addedAdded user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcpOpenSSH é 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 enableCommand may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupsudo ufw status verboseStatus: 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 numberedStatus: 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 SingaporeAsia/Singapore🔲 timedatectl set-timezone
sudo timedatectl set-timezone Asia/Singaporetimedatectl 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: noSó 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-upgradesunattended-upgrades 2.9.1+nmu4ubuntu1systemctl is-enabled unattended-upgrades apt-daily.timer apt-daily-upgrade.timerenabled
enabled
enabled🔲 cat 20auto-upgrades
cat /etc/apt/apt.conf.d/20auto-upgradesAPT::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-upgradesUnattended-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 --debugStarting 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-securitySã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.log8️⃣ 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 0Bdf -h /Filesystem Size Used Avail Use% Mounted on
/dev/vda1 24G 2.0G 22G 9% /🔲 fallocate -l 2G /swapfile
sudo fallocate -l 2G /swapfilesudo chmod 600 /swapfilels -lh /swapfile-rw------- 1 root root 2.0G Nov 5 20:04 /swapfile🔲 mkswap /swapfile
sudo mkswap /swapfileSetting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=0b43ccd8-5b4a-4048-9b84-eee12667b387🔲 swapon /swapfile
sudo swapon /swapfileswapon --showNAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2free -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 09️⃣ 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 -pup 2 minutesswapon --showNAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) 'permitrootlogin no
passwordauthentication nosudo ufw status verboseStatus: 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.socketactive
activeSwap, 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
Configurações do SSH
Configurações do SSH - funções e configurações do arquivo /etc/ssh/sshd_config
Trata das opções do sshd_config que costumam ser alteradas além do PermitRootLogin, e do que elas significam.
Swap
Configuração da memória swap (Swap Memory): 2 formas, partição & arquivo
Trata de como criar swap em uma partição em vez de um arquivo swap, e dos comandos swapon e mkswap.
Pacotes
[Ubuntu] Comando apt | comando apt-get: uso e diferenças
Trata da diferença entre apt e apt-get, e dos comandos para instalar e remover pacotes.
ℹ️ 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.