Ubuntu server eerste configuratie: 9 stappen om te beginnen op een vers geïnstalleerde Ubuntu server

TestomgevingDebian-familieUbuntu 24.04.5 LTSroot · gewoon gebruikersaccount
Eerste configuratie van de Ubuntu server gecontroleerd

Als je een nieuwe server krijgt, doorloop je eenmaal de eerste configuratie van de Ubuntu server voordat je er diensten op zet. Op een Ubuntu 24.04 server die bij DigitalOcean is aangemaakt, hebben we als root verbinding gemaakt en alles op volgorde ingesteld, van pakketupdates tot een sudo-gebruiker, inloggen met een sleutel, de firewall, de tijdzone, automatische beveiligingsupdates en swap, en gecontroleerd dat de instellingen ook na een herstart bleven staan.

De resultaatvakken hieronder zijn de uitvoer van de opdrachten in deze volgorde. Het server-IP 203.0.113.10 is een voorbeeldwaarde, en de nieuwe gewone gebruiker heet deploy.

🎯 Kernpunten
Pakketupdates en controle of een herstart nodig is
sudo ingeschakeld voor de gewone gebruiker deploy
deploy (inloggen met sleutel gecontroleerd), daarna root (inloggen geblokkeerd)
ufw staat alleen SSH, 80 en 443 toe
Tijdzone wijzigen en automatische beveiligingsupdates controleren
Swapbestand van 2GB en instellingen na herstart gecontroleerd
Vereisten
Verbindingroot-login met SSH-sleutel en een Ubuntu 24.04 server

1️⃣ Ubuntu pakketupdate

Ook op een net aangemaakte server staan updates klaar om te installeren. Haal eerst een verse pakketlijst op en controleer wat er verandert voordat je echt iets installeert.

🔲 apt-get update

export DEBIAN_FRONTEND=noninteractive

De apt-get-opdrachten hieronder zijn uitgevoerd nadat deze waarde eerst was ingesteld. Daarmee verschijnen er tijdens de installatie van pakketten geen vensters met vragen en gelden de standaardantwoorden.

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.

De optie -s is een proefrun die alleen het resultaat berekent zonder iets te installeren. Op deze server stonden 26 pakketten klaar voor een upgrade, en libsqlite3-0 viel buiten deze upgrade als [deferred due to phasing]. Het aantal verschilt per server, afhankelijk van wanneer de server is aangemaakt en welke image is gebruikt.

🔲 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.

Na de installatie volgt een lijst met opnieuw gestarte diensten.

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

Als er een update wordt geïnstalleerd die een herstart nodig heeft, ontstaat het bestand /var/run/reboot-required. Deze keer verscheen [Running kernel seems to be up-to-date.] en werd het bestand niet aangemaakt, dus gingen we zonder herstart door naar de volgende stap.

2️⃣ Ubuntu gebruiker toevoegen en sudo-rechten

Het dagelijkse werk doe je als gewone gebruiker, en alleen beheeropdrachten voer je uit met sudo. sudo verhoogt de rechten met je eigen wachtwoord in plaats van het root-wachtwoord, zodat vastligt wie welke opdracht heeft uitgevoerd.

🔲 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' ...

adduser is een schil om useradd; het maakt de thuismap en de groep aan en vraagt daarna om het wachtwoord en de gebruikersgegevens. Het wachtwoord verschijnt niet op het scherm terwijl je typt, en gegevens zoals naam en telefoonnummer kun je met Enter leeg laten.

🔲 usermod -aG sudo deploy

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

🔲 su

Gebruikers in de groep sudo kunnen beheeropdrachten uitvoeren met sudo. Schakel met su over naar het account deploy en controleer de rechten.

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

Met sudo wordt om het wachtwoord van deploy gevraagd, en als het klopt, draait de opdracht met root-rechten.

3️⃣ SSH-sleutel voor de nieuwe gebruiker registreren

In het begin is alleen voor root een SSH-sleutel geregistreerd, dus inloggen met een sleutel werkt niet voor deploy. Kopieer de authorized_keys van root naar de thuismap van 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

install maakt de map aan, kopieert het bestand en stelt eigenaar en rechten in één keer in. sshd controleert de rechten en de eigenaar van de gebruikersbestanden voordat een login wordt geaccepteerd (StrictModes), dus zet je de map .ssh op 700 en authorized_keys op 600.

🔲 ssh deploy@203.0.113.10

Sluit het geopende root-venster niet, maar controleer eerst in een nieuw terminalvenster of je als deploy verbinding kunt maken.

ssh deploy@203.0.113.10
whoami
deploy
🧭 Een volgorde waarmee je jezelf niet buitensluit
Uitlegdiagram
🧭 Stappen
🔑① Sleutel kopiërenroot-sleutel naar deploy
➜
🪟② Nieuw venster controlerenroot-venster blijft open
➜
⛔③ root-login blokkerenPermitRootLogin no
➜
🪟④ Nieuw venster controlerendeploy-login blijft werken
✅⑤ SSH toestaanufw allow OpenSSH
➜
🧱⑥ ufw inschakelenAlleen toegestane poorten open
➜
🪟⑦ Nieuw venster controlerenLogin blijft werken
Kopieer de authorized_keys van root naar de thuismap van deploy.
Sluit het geopende root-venster niet, maar controleer in een nieuw terminalvenster of inloggen met een sleutel als deploy werkt.
Blokkeer de root-login pas als de deploy-login is bevestigd. Lukt de verbinding in het nieuwe venster niet, draai de wijziging dan terug in het venster dat je open hebt gelaten.
Laad de SSH-instellingen opnieuw en controleer in een nieuw venster of de deploy-login nog werkt.
Voeg eerst de regel toe die SSH toestaat voordat je de firewall inschakelt.
Zodra hij is ingeschakeld, wordt elke niet-toegestane verbinding geblokkeerd, dus moet de SSH-regel er al staan.
Controleer na het inschakelen van de firewall in een nieuw venster of je weer als deploy verbinding kunt maken.

4️⃣ SSH root-login blokkeren

In Ubuntu 24.04 laadt de Include-regel bovenaan sshd_config eerst de bestanden in de map /etc/ssh/sshd_config.d/, en bij dezelfde instelling geldt de waarde die als eerste wordt gelezen. Controleer daarom voor je iets wijzigt welke waarde nu geldt en in welk bestand die staat.

/etc/ssh└─ sshd_config  bovenaan: 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 regel 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

Inloggen met een wachtwoord staat al uit in twee bestanden in sshd_config.d; het enige wat je verandert is de root-loginregel in het hoofdbestand.

🔲 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

sshd -t controleert de syntaxis van de configuratie, en als er niets wordt getoond, zijn er geen fouten. Controleer na het herladen in een nieuw venster of de deploy-login nog werkt, en maak daarna als root verbinding om te zien dat die wordt geweigerd.

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

Ook met de juiste sleutel kom je als root niet binnen; beheerwerk doe je door als deploy verbinding te maken en sudo te gebruiken.

5️⃣ Ubuntu firewall ufw

ufw is het standaard firewallprogramma van Ubuntu, maar staat in het begin uit. Zodra het is ingeschakeld, wordt elke niet-toegestane verbinding geblokkeerd, dus voeg je eerst de SSH-regel toe en schakel je het als laatste in.

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 is een profiel dat poort 22 opent, en 80 en 443 zijn de poorten voor een webserver. De regels gelden zowel voor IPv4 als voor IPv6.

🔲 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)             

Inkomende verbindingen worden standaard geblokkeerd, alleen de drie toegestane poorten zijn open, en de firewall start ook bij het opstarten. Maak na het inschakelen in een nieuw venster opnieuw verbinding als deploy en controleer de regelnummers.

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️⃣ Ubuntu tijdzone instellen

De begintijdzone is Etc/UTC. Om de tijden in logs en geplande taken af te stemmen op de regio van de server, is deze server, aangemaakt in de regio Singapore, ingesteld op 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

Alleen de regels Local time en Time zone veranderen; de kloksynchronisatie (NTP) en de UTC-tijd blijven gelijk.

7️⃣ unattended upgrades: automatische beveiligingsupdates

Ubuntu installeert beveiligingsupdates automatisch met het pakket unattended-upgrades, dat vanaf het begin is geïnstalleerd en ingeschakeld. In deze stap controleer je daarom of het aan staat en wat het automatisch installeert.

🔲 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";

De 1 in beide waarden betekent eenmaal per dag, en met 0 schakel je automatische updates uit. Wat er wordt geïnstalleerd, bepaalt het bestand 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";

Bij de toegestane bronnen staat -security wel en -updates niet, dus gewone updates worden niet automatisch geïnstalleerd, alleen beveiligingsupdates. Wil je ook gewone updates automatisch ontvangen, haal dan in dit bestand het commentaarteken voor de regel -updates weg.

🔲 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

Dit zijn de laatste twee regels van dezelfde run.

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.

--dry-run berekent alleen wat de automatische update zou doen, zonder iets te installeren. Omdat de pakketupdates al waren gedaan, meldde het dat er geen pakketten automatisch te installeren waren. De logs van echte runs staan in de map /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️⃣ Ubuntu swapgeheugen instellen

Deze server heeft 1GB geheugen en in het begin geen swap. Maak voordat je er apps op zet een swapbestand van 2GB aan en zet het in /etc/fstab, zodat het ook na een herstart aan staat.

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

swapon zet het alleen voor nu aan; om het ook na een herstart aan te hebben, voeg je een regel toe aan fstab.

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

9️⃣ Ubuntu server eerste configuratie controleren

Als je hebt gecontroleerd dat de instellingen een herstart overleven, is de eerste configuratie van Ubuntu klaar.

🔲 systemctl reboot

sudo systemctl reboot

🔲 uptime -p

Maak na de herstart opnieuw verbinding als 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, SSH-instellingen, firewall, tijdzone en automatische updates zijn allemaal hetzelfde als voor de herstart. Hierna komt er op deze server een Node.js-app met PM2 en Nginx.

🔢 FAQ & aanbevolen content

Je kunt het zo laten. Een pakket dat als [deferred due to phasing] wordt overgeslagen, is een update in een gefaseerde uitrol. Ubuntu brengt sommige updates eerst alleen naar een deel van de servers uit en breidt de uitrol uit naar alle servers als er geen problemen zijn. Beveiligingsupdates worden niet gefaseerd uitgerold, en het overgeslagen pakket wordt bij de volgende upgrade meegeïnstalleerd zodra de uitrol breder is.

De automatische updatetaak draait eenmaal per dag, en de twee timers apt-daily.timer en apt-daily-upgrade.timer starten die met een willekeurige vertraging na een vast tijdstip. Op deze server stond de volgende run van apt-daily-upgrade.timer gepland voor de volgende dag om 06:27:59 (+08). Als de server uit staat en dat tijdstip mist, kan de taak meteen bij de volgende start draaien, waardoor apt-taken vlak na het opstarten soms even wachten.

Met de standaardinstellingen niet. De standaardwaarde van Automatic-Reboot in 50unattended-upgrades is false, en ook in de instellingen van deze server staat die regel niet aan. Als er een update wordt geïnstalleerd die een herstart nodig heeft, ontstaat het bestand /var/run/reboot-required; start de server zelf opnieuw op als dat bestand er is.

ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Laat zien dat je geen machine bent: 3   +   10   =