813 слов
4 минуты

Настройка VPS на примере Ubuntu — расширенное руководство

Краткий брифинг#

Это руководство поможет сделать новый VPS безопасным и удобным для повседневной работы. Мы настраиваем сервер с чистого Ubuntu и превращаем его в рабочую среду для запуска проектов, Docker-контейнеров и удалённой разработки.

Что и для чего делается:

  • Смена root-входа на отдельного пользователя — чтобы не работать постоянно под root и ограничить возможный ущерб при компрометации.
  • SSH-ключ вместо пароля — защищает от брутфорса и убирает необходимость вводить пароль при подключении.
  • Отключение входа root и парольной аутентификации — закрывает самые частые векторы атаки по SSH.
  • UFW — ограничивает входящие соединения только теми портами, которые действительно нужны.
  • Docker и Compose — упрощают запуск и обновление приложений в изолированных контейнерах.
  • Zsh, Oh My Posh и Homebrew — делают терминал удобнее и дают доступ к дополнительным инструментам.
  • Neofetch в MOTD — показывает наглядную информацию о системе сразу после входа по SSH.

В результате мы получаем VPS, который безопасно принимает подключения, готов к деплою проектов и удобен для работы в терминале.

Соглашения об этом руководстве#

  • Команды выполняются в оболочке root после ssh root@VPS_IP, если не указано иное.
  • Если вы уже работаете от имени обычного пользователя с правами sudo, добавляйте sudo к системным командам.
  • <...> означает значение, которое нужно подставить самостоятельно.
  • Перед отключением пароля проверьте вход по SSH-ключу в отдельном окне.

Исходная подготовка сервера#

Обновите систему и установите базовые утилиты:

apt update
apt full-upgrade -y
apt install -y ca-certificates curl gnupg lsb-release ufw apt-transport-https

При желании задайте часовой пояс:

timedatectl set-timezone Europe/Moscow

Пользователь и доступ по SSH#

  1. Создайте нового пользователя:
adduser --gecos "" newuser
usermod -aG sudo newuser
  1. Создайте каталог .ssh с правильным владельцем и правами:
install -d -m 700 -o newuser -g newuser /home/newuser/.ssh
  1. Добавьте открытый ключ нового пользователя:
printf '%s\n' 'ssh-ed25519 AAAA... ваш_ключ' > /home/newuser/.ssh/authorized_keys
chown newuser:newuser /home/newuser/.ssh/authorized_keys
chmod 600 /home/newuser/.ssh/authorized_keys
WARNING

Не удаляйте парольный вход до того, как отдельно проверите вход по ключу.

  1. Проверьте вход по ключу в другом терминале:
ssh newuser@VPS_IP

Только после успешной проверки переходите к настройке sshd.

  1. Изучите, нет ли уже настроек в drop-in-файлах:
grep -RniE 'PermitRootLogin|PasswordAuthentication|PubkeyAuthentication|KbdInteractiveAuthentication' \
  /etc/ssh/sshd_config /etc/ssh/sshd_config.d 2>/dev/null || true
  1. Откройте основной конфиг:
nano /etc/ssh/sshd_config

Если Include /etc/ssh/sshd_config.d/*.conf находится в начале файла, параметры из drop-in-файлов имеют приоритет. В таком случае либо удалите конфликтующий Include, либо исправьте нужные значения в файле из sshd_config.d.

  1. Установите безопасные значения:
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
  1. Проверьте синтаксис и перезагрузите демон:
sshd -t
systemctl reload ssh
TIP

systemctl reload ssh не обрывает уже открытые сессии, поэтому его можно выполнять, не закрывая текущее подключение.

  1. Если исходный пользователь больше не нужен, удалите его вместе с домашним каталогом:
deluser --remove-home ubuntu
WARNING

Запускайте эту команду только после того, как убедились, что вход под newuser работает. Имя ubuntu замените на реального исходного пользователя, если оно другое.

Файрвол UFW#

Разрешите SSH и включите UFW:

ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw enable
ufw status verbose

Если используете нестандартный порт SSH, замените 22/tcp на нужный порт до ufw enable.

Docker и Docker Compose#

  1. Удалите конфликтующие старые пакеты:
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
  apt remove -y "$pkg" 2>/dev/null || true
done
  1. Добавьте официальный репозиторий Docker:
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
  > /etc/apt/sources.list.d/docker.list
  1. Установите Docker Engine и Compose plugin:
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. Проверьте установку:
docker --version
docker compose version
  1. Разрешите newuser запускать Docker без sudo и проверьте отдельной оболочкой:
usermod -aG docker newuser
runuser -l newuser -c 'docker run --rm hello-world'

Zsh#

  1. Установите Zsh:
apt install -y zsh
  1. Сделайте Zsh оболочкой по умолчанию для newuser:
chsh -s "$(command -v zsh)" newuser
  1. Зайдите в новую сессию или переключитесь:
su - newuser

Homebrew#

Homebrew нельзя устанавливать от root, поэтому выполняйте установку от целевого пользователя.

  1. Установите Homebrew:
sudo -u newuser -H bash -c \
  '/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"'
  1. Добавьте инициализацию в ~/.zshrc один раз:
runuser -l newuser -c '
  test -f "$HOME/.zshrc" || touch "$HOME/.zshrc"
  grep -q "linuxbrew/.linuxbrew/bin/brew shellenv" "$HOME/.zshrc" || \
    printf '\''eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"\n'\'' >> "$HOME/.zshrc"
'

Oh My Posh#

  1. Установите Oh My Posh для пользователя:
sudo -u newuser -H bash -c \
  'curl -s https://ohmyposh.dev/install.sh | bash -s'
  1. Добавьте инициализацию в ~/.zshrc один раз:
runuser -l newuser -c '
  test -f "$HOME/.zshrc" || touch "$HOME/.zshrc"
  grep -q "oh-my-posh init zsh" "$HOME/.zshrc" || \
    printf '\''eval "$(oh-my-posh init zsh --config amro)"\n'\'' >> "$HOME/.zshrc"
'
NOTE

eval "$(oh-my-posh init zsh --config amro)" должен встречаться один раз. Двойной eval не нужен.

  1. Откройте новую сессию Zsh или перезайдите:
exec zsh -l

Neofetch#

Neofetch — инструмент для вывода информации о системе. Я использую его для красивой заставки в MOTD после подключения по SSH.

  1. Установите Neofetch:
apt install -y neofetch
NOTE

В Ubuntu 24.04 Neofetch находится в репозитории universe. Если пакет не найден, подключите репозиторий: add-apt-repository universe и повторите apt update.

  1. Создайте MOTD-скрипт:
cat > /etc/update-motd.d/99-neofetch <<'EOF'
#!/bin/sh
neofetch
EOF
chmod 0755 /etc/update-motd.d/99-neofetch
  1. Проверьте вывод MOTD:
run-parts /etc/update-motd.d

Проверка после настройки#

Выполните финальную проверку от имени newuser:

runuser -l newuser -c '
  id
  groups
  docker --version
  docker compose version
  zsh --version
  command -v oh-my-posh || true
  neofetch | head -n 5
'

Проверьте статус SSH и файрвола:

systemctl is-active ssh
ufw status verbose
ss -tulpn | grep ":22" || true

Чек-лист безопасности#

  • Вход по паролю отключён.
  • Вход root по SSH отключён.
  • SSH-ключ проверен в отдельном окне.
  • UFW включён и разрешает нужный SSH-порт.
  • Обычный пользователь входит без sudo только там, где это действительно нужно.
  • Docker проверен от имени обычного пользователя.
  • Есть резервная копия или snapshot VPS перед существенными изменениями.
Настройка VPS на примере Ubuntu — расширенное руководство
https://blog.guilliman.ru/posts/vps_setup/
Автор
Guilliman
Опубликовано
14.10.2026
Лицензия
CC BY-NC-SA 4.0

Поделиться

Похожие записи