Начальная настройка сервера Ubuntu: 9 шагов для начала работы на только что установленном сервере Ubuntu

Тестовая средаСемейство DebianUbuntu 24.04.5 LTSroot · обычная учётная запись
Работы по начальной настройке сервера Ubuntu проверены

Получив новый сервер, вы один раз проходите начальную настройку сервера Ubuntu, прежде чем запускать на нём какие-либо сервисы. На сервере Ubuntu 24.04, созданном в DigitalOcean, мы подключились как root и по порядку настроили всё — от обновления пакетов до пользователя sudo, входа по ключу, брандмауэра, часового пояса, автоматических обновлений безопасности и swap, а затем проверили, что настройки сохраняются после перезагрузки.

Блоки с результатами ниже — это вывод команд, выполненных в этом порядке. IP сервера 203.0.113.10 — пример, а новый обычный пользователь назван deploy.

🎯 Главное
Обновление пакетов и проверка необходимости перезагрузки
sudo включён для обычного пользователя deploy
deploy (вход по ключу проверен), затем root (вход заблокирован)
ufw пропускает только SSH, 80 и 443
Смена часового пояса и проверка автоматических обновлений безопасности
Файл swap на 2GB и сохранение настроек после перезагрузки
Предварительные условия
Сначала прочитайтеssh-keygenssh Команда
Подключениеroot: SSH-ключ для подключения и сервер Ubuntu 24.04

1️⃣ Обновление пакетов Ubuntu

Даже на только что созданном сервере ждут установки обновления. Получив свежий список пакетов, сначала проверьте, что изменится, прежде чем что-либо устанавливать.

🔲 apt-get update

export DEBIAN_FRONTEND=noninteractive

Команды apt-get ниже выполнялись после того, как сначала было задано это значение. С ним во время установки пакетов не появляются окна с вопросами о настройках и применяются ответы по умолчанию.

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.

Опция -s — это пробный запуск, который только рассчитывает результат, ничего не устанавливая. На этом сервере к обновлению было 26 пакетов, а libsqlite3-0 не попал в это обновление с пометкой [deferred due to phasing]. Число пакетов отличается от сервера к серверу в зависимости от времени создания сервера и использованного образа.

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

После завершения установки следует список перезапущенных служб.

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

Когда устанавливается обновление, требующее перезагрузки, создаётся файл /var/run/reboot-required. В этот раз появилось [Running kernel seems to be up-to-date.], и файл не создался, поэтому мы перешли к следующему шагу без перезагрузки.

2️⃣ Добавление пользователя в Ubuntu и права sudo

Повседневную работу выполняйте под обычным пользователем, а через sudo запускайте только команды администрирования. sudo повышает права с вашим собственным паролем вместо пароля root, поэтому остаётся запись о том, кто какую команду выполнил.

🔲 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 — это обёртка над useradd: она создаёт домашнюю папку и группу, а затем по очереди запрашивает пароль и данные пользователя. Пароль при вводе не отображается на экране, а такие данные, как имя и номер телефона, можно оставить пустыми клавишей Enter.

🔲 usermod -aG sudo deploy

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

🔲 su

Пользователи группы sudo могут выполнять команды администрирования через sudo. Переключитесь на учётную запись deploy с помощью su и проверьте права.

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

С sudo запрашивается пароль deploy, и если он верный, команда выполняется с правами root.

3️⃣ Регистрация SSH-ключа для нового пользователя

Сначала SSH-ключ зарегистрирован только для root, поэтому вход по ключу под deploy не работает. Скопируйте authorized_keys пользователя root в домашнюю папку 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 за один раз создаёт папку, копирует файл и задаёт владельца и права. sshd перед приёмом входа проверяет права и владельца файлов пользователя (StrictModes), поэтому задайте папке .ssh права 700, а authorized_keys — 600.

🔲 ssh deploy@203.0.113.10

Не закрывайте открытое окно root; сначала проверьте в новом окне терминала, что можете подключиться как deploy.

ssh deploy@203.0.113.10
whoami
deploy
🧭 Порядок настройки, при котором вы не потеряете доступ
Поясняющая схема
🧭 Шаги
🔑① Копировать ключКлюч root для deploy
➜
🪟② Проверить в новом окнеОкно root остаётся открытым
➜
⛔③ Запретить вход rootPermitRootLogin no
➜
🪟④ Проверить в новом окнеВход deploy работает
✅⑤ Разрешить SSHufw allow OpenSSH
➜
🧱⑥ Включить ufwОткрыты только разрешённые порты
➜
🪟⑦ Проверить в новом окнеВход работает
Скопируйте authorized_keys пользователя root в домашнюю папку deploy.
Не закрывайте открытое окно root; проверьте в новом окне терминала, что вход по ключу работает под deploy.
Запрещайте вход root только после того, как подтвердите вход deploy. Если в новом окне подключиться не удаётся, отмените изменение в окне, которое осталось открытым.
Перечитав настройки SSH, проверьте в новом окне, что вход deploy по-прежнему работает.
Перед включением брандмауэра сначала добавьте правило, разрешающее SSH.
Как только он включается, все неразрешённые подключения блокируются, поэтому правило, разрешающее SSH, должно быть добавлено заранее.
После включения брандмауэра проверьте в новом окне, что снова можете подключиться как deploy.

4️⃣ Запрет входа root по SSH

В Ubuntu 24.04 строка Include в начале sshd_config сначала загружает файлы из папки /etc/ssh/sshd_config.d/, а для одной и той же настройки действует значение, прочитанное первым. Поэтому перед изменением проверьте, какое значение действует сейчас и в каком файле оно записано.

/etc/ssh└─ sshd_config  в начале: 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 строка 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

Вход по паролю уже отключён в двух файлах внутри sshd_config.d, поэтому менять нужно только строку входа root в основном файле.

🔲 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 проверяет синтаксис настроек, и если ничего не выводится, ошибок нет. После перечитывания убедитесь в новом окне, что вход deploy по-прежнему работает, а затем подключитесь как root и посмотрите, что вход отклонён.

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

Даже с правильным ключом войти как root нельзя; администрирование выполняется после подключения как deploy с помощью sudo.

5️⃣ Брандмауэр Ubuntu ufw

ufw — стандартный инструмент брандмауэра в Ubuntu, но вначале он выключен. Как только он включается, все неразрешённые подключения блокируются, поэтому сначала добавьте правило, разрешающее SSH, а включите его последним.

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 — это профиль, открывающий порт 22, а 80 и 443 — порты веб-сервера. Правила добавляются сразу для IPv4 и 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)             

Входящие подключения по умолчанию блокируются, открыты только три разрешённых порта, и брандмауэр включается также при загрузке. После включения снова подключитесь как deploy в новом окне и проверьте номера правил.

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

Изначальный часовой пояс — Etc/UTC. Чтобы время в журналах и запланированных задачах соответствовало региону сервера, этот сервер, созданный в регионе Сингапур, был настроен на 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

Меняются только строки Local time и Time zone; синхронизация часов (NTP) и время UTC остаются прежними.

7️⃣ unattended upgrades: автоматические обновления безопасности

Ubuntu автоматически устанавливает обновления безопасности с помощью пакета unattended-upgrades, который установлен и включён с самого начала. Поэтому на этом шаге вы проверяете, включён ли он и что он устанавливает автоматически.

🔲 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 в обоих параметрах означает раз в сутки, а если заменить его на 0, автоматические обновления выключатся. Что устанавливать, определяет файл 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";

Среди разрешённых источников есть -security, но нет -updates, поэтому обычные обновления не устанавливаются автоматически, устанавливаются только обновления безопасности. Чтобы автоматически получать и обычные обновления, раскомментируйте в этом файле строку -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

Это последние две строки того же запуска.

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 только рассчитывает, что сделало бы автоматическое обновление, ничего не устанавливая. Поскольку обновление пакетов уже было выполнено, оно показало, что пакетов для автоматической установки нет. Журналы реальных запусков хранятся в папке /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️⃣ Настройка памяти swap в Ubuntu

У этого сервера 1GB памяти и вначале нет swap. Прежде чем запускать приложения, создайте файл swap на 2GB и пропишите его в /etc/fstab, чтобы он включался и после перезагрузки.

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 включает его только сейчас; чтобы он включался и после перезагрузки, добавьте одну строку в fstab.

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

9️⃣ Проверка начальной настройки сервера Ubuntu

Когда вы проверили, что настройки сохраняются после перезагрузки, начальная настройка Ubuntu завершена.

🔲 systemctl reboot

sudo systemctl reboot

🔲 uptime -p

После перезагрузки снова подключитесь как 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, брандмауэр, часовой пояс и автоматические обновления — всё как до перезагрузки. Дальше на этот сервер устанавливается приложение Node.js с PM2 и Nginx.

🔢 FAQ & рекомендуемые материалы

Можно оставить как есть. Пакет, пропущенный с пометкой [deferred due to phasing], — это обновление в поэтапном развёртывании. Ubuntu сначала выпускает некоторые обновления только для части серверов и, если проблем нет, расширяет развёртывание на все серверы. Обновления безопасности поэтапно не развёртываются, а пропущенный пакет установится при следующем обновлении, когда охват развёртывания расширится.

Задача автоматического обновления запускается раз в сутки, и два таймера apt-daily.timer и apt-daily-upgrade.timer запускают её со случайной задержкой после заданного времени. На этом сервере следующий запуск apt-daily-upgrade.timer был назначен на следующий день на 06:27:59 (+08). Если сервер выключен и пропускает это время, задача может запуститься сразу при следующей загрузке, поэтому задачи apt иногда немного ждут сразу после загрузки.

С настройками по умолчанию — нет. Значение Automatic-Reboot по умолчанию в 50unattended-upgrades — false, и в настройках этого сервера эта строка тоже не включена. Когда устанавливается обновление, требующее перезагрузки, создаётся файл /var/run/reboot-required; если этот файл есть, перезагрузите сервер сами.

ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Докажите, что вы человек: 2   +   7   =