Ubuntu server eerste configuratie: 9 stappen om te beginnen op een vers geïnstalleerde Ubuntu server
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.
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=noninteractiveDe 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 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.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 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.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.serviceAls 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 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' ...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 deploygroups deploydeploy : 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 - deployTo run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.whoamideploysudo whoami[sudo] password for deploy:
rootexitMet 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/.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_keysinstall 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.10whoamideploy4️⃣ 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 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 noInloggen 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_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 nosshd -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.10root@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 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 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 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) 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 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️⃣ 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 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: noAlleen 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-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";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-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";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 --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-securityDit 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.log8️⃣ 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 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
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 09️⃣ 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 -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, 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
SSH-instellingen
SSH-instellingen - functies en instellingen van het bestand /etc/ssh/sshd_config
Behandelt de opties in sshd_config die naast PermitRootLogin vaak worden gewijzigd, en wat ze betekenen.
Swap
Swapgeheugen (Swap Memory) instellen: 2 manieren, partitie & bestand
Behandelt hoe je swap op een partitie maakt in plaats van in een swapbestand, en de opdrachten swapon en mkswap.
Pakketten
[Ubuntu] apt-commando | apt-get-commando: gebruik en verschillen
Behandelt het verschil tussen apt en apt-get, en de opdrachten om pakketten te installeren en te verwijderen.
ℹ️ 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.