Wstępna konfiguracja serwera Ubuntu: 9 kroków na start na świeżo zainstalowanym serwerze Ubuntu

Środowisko testoweRodzina DebianUbuntu 24.04.5 LTSroot · zwykłe konto użytkownika
Prace wstępnej konfiguracji serwera Ubuntu sprawdzone

Gdy dostajesz nowy serwer, przed uruchomieniem na nim usług raz przechodzisz wstępną konfigurację serwera Ubuntu. Na serwerze Ubuntu 24.04 utworzonym w DigitalOcean połączyliśmy się jako root i po kolei ustawiliśmy wszystko, od aktualizacji pakietów przez użytkownika sudo, logowanie kluczem, zaporę, strefę czasową i automatyczne aktualizacje bezpieczeństwa aż po swap, a potem sprawdziliśmy, że ustawienia zostają po ponownym uruchomieniu.

Poniższe ramki z wynikami to wyjście poleceń uruchomionych w tej kolejności. IP serwera 203.0.113.10 to wartość przykładowa, a nowy zwykły użytkownik nazywa się deploy.

🎯 Najważniejsze
Aktualizacja pakietów i sprawdzenie, czy trzeba ponownie uruchomić
sudo włączone dla zwykłego użytkownika deploy
deploy (logowanie kluczem sprawdzone), potem root (logowanie zablokowane)
ufw przepuszcza tylko SSH, 80 i 443
Zmiana strefy czasowej i sprawdzenie automatycznych aktualizacji bezpieczeństwa
Plik swap 2GB i ustawienia zachowane po ponownym uruchomieniu
Wymagania
Przeczytaj najpierwssh-keygenssh Polecenie
Połączenieroot: klucz SSH do połączenia i serwer Ubuntu 24.04

1️⃣ Aktualizacja pakietów Ubuntu

Nawet na nowo utworzonym serwerze czekają aktualizacje do zainstalowania. Po pobraniu świeżej listy pakietów sprawdź, co się zmieni, zanim cokolwiek zainstalujesz.

🔲 apt-get update

export DEBIAN_FRONTEND=noninteractive

Poniższe polecenia apt-get zostały uruchomione po wcześniejszym ustawieniu tej wartości. Dzięki niej podczas instalacji pakietów nie pojawiają się okna z pytaniami o ustawienia i stosowane są odpowiedzi domyślne.

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.

Opcja -s to próbne uruchomienie, które tylko oblicza wynik, niczego nie instalując. Na tym serwerze do aktualizacji było 26 pakietów, a libsqlite3-0 został pominięty w tej aktualizacji jako [deferred due to phasing]. Liczba pakietów różni się między serwerami w zależności od tego, kiedy serwer utworzono i jakiego obrazu użyto.

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

Po zakończeniu instalacji pojawia się lista ponownie uruchomionych usług.

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

Gdy zostaje zainstalowana aktualizacja wymagająca ponownego uruchomienia, powstaje plik /var/run/reboot-required. Tym razem pojawił się komunikat [Running kernel seems to be up-to-date.], a plik nie powstał, więc przeszliśmy do następnego kroku bez ponownego uruchamiania.

2️⃣ Ubuntu: dodanie użytkownika i uprawnienia sudo

Codzienną pracę wykonujesz jako zwykły użytkownik, a tylko polecenia administracyjne uruchamiasz przez sudo. sudo podnosi uprawnienia twoim własnym hasłem zamiast hasła root, więc zostaje ślad, kto uruchomił które polecenie.

🔲 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 to nakładka na useradd; tworzy katalog domowy i grupę, a potem po kolei pyta o hasło i dane użytkownika. Hasło nie pojawia się na ekranie podczas wpisywania, a dane takie jak imię czy numer telefonu można zostawić puste klawiszem Enter.

🔲 usermod -aG sudo deploy

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

🔲 su

Użytkownicy z grupy sudo mogą uruchamiać polecenia administracyjne przez sudo. Przełącz się na konto deploy za pomocą su i sprawdź uprawnienia.

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

Z sudo pojawia się pytanie o hasło użytkownika deploy, a jeśli jest poprawne, polecenie działa z uprawnieniami root.

3️⃣ Rejestracja klucza SSH dla nowego użytkownika

Na początku klucz SSH jest zarejestrowany tylko dla root, więc logowanie kluczem jako deploy nie działa. Skopiuj authorized_keys użytkownika root do katalogu domowego 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 za jednym razem tworzy katalog, kopiuje plik i ustawia właściciela oraz uprawnienia. sshd przed przyjęciem logowania sprawdza uprawnienia i właściciela plików użytkownika (StrictModes), dlatego ustaw katalog .ssh na 700, a authorized_keys na 600.

🔲 ssh deploy@203.0.113.10

Nie zamykaj otwartego okna root; najpierw sprawdź w nowym oknie terminala, czy możesz połączyć się jako deploy.

ssh deploy@203.0.113.10
whoami
deploy
🧭 Kolejność ustawień, która cię nie zablokuje
Diagram objaśniający
🧭 Kroki
🔑① Kopiuj kluczKlucz root dla deploy
➜
🪟② Sprawdź w nowym oknieOkno root zostaje otwarte
➜
⛔③ Zablokuj rootPermitRootLogin no
➜
🪟④ Sprawdź w nowym oknieLogowanie deploy działa
✅⑤ Zezwól na SSHufw allow OpenSSH
➜
🧱⑥ Włącz ufwOtwarte tylko dozwolone porty
➜
🪟⑦ Sprawdź w nowym oknieLogowanie działa
Skopiuj authorized_keys użytkownika root do katalogu domowego deploy.
Nie zamykaj otwartego okna root; sprawdź w nowym oknie terminala, czy logowanie kluczem działa jako deploy.
Zablokuj logowanie root dopiero po potwierdzeniu logowania deploy. Jeśli w nowym oknie nie możesz się połączyć, cofnij zmianę w oknie, które pozostało otwarte.
Po ponownym wczytaniu ustawień SSH sprawdź w nowym oknie, czy logowanie deploy nadal działa.
Zanim włączysz zaporę, najpierw dodaj regułę zezwalającą na SSH.
W chwili włączenia każde niedozwolone połączenie zostaje zablokowane, więc reguła zezwalająca na SSH musi być dodana wcześniej.
Po włączeniu zapory sprawdź w nowym oknie, czy możesz ponownie połączyć się jako deploy.

4️⃣ Blokada logowania root przez SSH

W Ubuntu 24.04 wiersz Include na początku sshd_config najpierw wczytuje pliki z katalogu /etc/ssh/sshd_config.d/, a dla tego samego ustawienia obowiązuje wartość wczytana jako pierwsza. Dlatego przed zmianą sprawdź, jaka wartość obowiązuje teraz i w którym pliku się znajduje.

/etc/ssh└─ sshd_config  na górze: 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 wiersz 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

Logowanie hasłem jest już wyłączone w dwóch plikach w sshd_config.d; zmienić trzeba tylko wiersz logowania root w głównym pliku.

🔲 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 sprawdza składnię konfiguracji, a jeśli nic nie wyświetli, błędów nie ma. Po ponownym wczytaniu potwierdź w nowym oknie, że logowanie deploy nadal działa, a potem połącz się jako root i zobacz, że połączenie zostaje odrzucone.

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

Nawet z właściwym kluczem nie wejdziesz jako root; prace administracyjne wykonujesz, łącząc się jako deploy i używając sudo.

5️⃣ Zapora Ubuntu ufw

ufw to domyślne narzędzie zapory w Ubuntu, ale na początku jest wyłączone. W chwili włączenia każde niedozwolone połączenie zostaje zablokowane, dlatego najpierw dodaj regułę zezwalającą na SSH, a włącz je na końcu.

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 to profil otwierający port 22, a 80 i 443 to porty używane przez serwer WWW. Reguły dodawane są jednocześnie dla IPv4 i 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)             

Połączenia przychodzące są domyślnie blokowane, otwarte zostają tylko trzy dozwolone porty, a zapora włącza się także przy starcie. Po włączeniu połącz się ponownie jako deploy w nowym oknie i sprawdź numery reguł.

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️⃣ Ustawienie strefy czasowej w Ubuntu

Początkowa strefa czasowa to Etc/UTC. Aby dopasować czas w logach i zaplanowanych zadaniach do regionu serwera, ten serwer, utworzony w regionie Singapur, ustawiono na 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

Zmieniają się tylko wiersze Local time i Time zone; synchronizacja zegara (NTP) i czas UTC pozostają bez zmian.

7️⃣ unattended upgrades: automatyczne aktualizacje bezpieczeństwa

Ubuntu instaluje aktualizacje bezpieczeństwa automatycznie za pomocą pakietu unattended-upgrades, który od początku jest zainstalowany i włączony. Dlatego w tym kroku sprawdzasz, czy jest włączony i co instaluje automatycznie.

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

1 w obu wartościach oznacza raz dziennie, a zmiana na 0 wyłącza automatyczne aktualizacje. O tym, co jest instalowane, decyduje plik 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";

Wśród dozwolonych źródeł jest -security, ale nie ma -updates, więc zwykłe aktualizacje nie instalują się automatycznie, a instalują się tylko aktualizacje bezpieczeństwa. Aby automatycznie dostawać także zwykłe aktualizacje, odkomentuj w tym pliku wiersz -updates.

🔲 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

To ostatnie dwa wiersze tego samego uruchomienia.

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 tylko oblicza, co zrobiłaby automatyczna aktualizacja, niczego nie instalując. Ponieważ aktualizacja pakietów była już zrobiona, pokazał, że nie ma pakietów do automatycznej instalacji. Zapisy prawdziwych uruchomień zostają w katalogu /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️⃣ Ustawienie pamięci swap w Ubuntu

Ten serwer ma 1GB pamięci i na początku zero swapu. Zanim uruchomisz na nim aplikacje, utwórz plik swap 2GB i dopisz go do /etc/fstab, aby włączał się także po ponownym uruchomieniu.

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 włącza go tylko teraz; aby był włączony także po ponownym uruchomieniu, dodaj jeden wiersz do fstab.

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

9️⃣ Sprawdzenie wstępnej konfiguracji serwera Ubuntu

Gdy sprawdzisz, że ustawienia przetrwały ponowne uruchomienie, wstępna konfiguracja Ubuntu jest gotowa.

🔲 systemctl reboot

sudo systemctl reboot

🔲 uptime -p

Po ponownym uruchomieniu połącz się ponownie jako 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, ustawienia SSH, zapora, strefa czasowa i automatyczne aktualizacje są takie same jak przed ponownym uruchomieniem. Następnie na ten serwer trafia aplikacja Node.js z PM2 i Nginx.

🔢 FAQ & polecane treści

Możesz go tak zostawić. Pakiet pominięty jako [deferred due to phasing] to aktualizacja we wdrażaniu etapowym. Ubuntu najpierw udostępnia niektóre aktualizacje tylko części serwerów, a jeśli nie ma problemów, rozszerza wdrożenie na wszystkie. Aktualizacje bezpieczeństwa nie są wdrażane etapami, a pominięty pakiet instaluje się przy następnej aktualizacji, gdy wdrożenie się rozszerzy.

Zadanie automatycznej aktualizacji działa raz dziennie, a dwa timery apt-daily.timer i apt-daily-upgrade.timer uruchamiają je z losowym opóźnieniem po ustalonej godzinie. Na tym serwerze następne uruchomienie apt-daily-upgrade.timer zaplanowano na następny dzień na 06:27:59 (+08). Jeśli serwer jest wyłączony i przegapi tę godzinę, zadanie może ruszyć od razu przy następnym starcie, dlatego zadania apt czasem chwilę czekają tuż po uruchomieniu.

Przy ustawieniach domyślnych nie. Domyślna wartość Automatic-Reboot w 50unattended-upgrades to false, a w ustawieniach tego serwera ten wiersz też nie jest włączony. Gdy zostaje zainstalowana aktualizacja wymagająca ponownego uruchomienia, powstaje plik /var/run/reboot-required; jeśli ten plik istnieje, uruchom serwer ponownie samodzielnie.

ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 0   +   6   =