Настройка 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
- Создайте нового пользователя:
adduser --gecos "" newuser
usermod -aG sudo newuser- Создайте каталог
.sshс правильным владельцем и правами:
install -d -m 700 -o newuser -g newuser /home/newuser/.ssh- Добавьте открытый ключ нового пользователя:
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_keysWARNINGНе удаляйте парольный вход до того, как отдельно проверите вход по ключу.
- Проверьте вход по ключу в другом терминале:
ssh newuser@VPS_IPТолько после успешной проверки переходите к настройке sshd.
- Изучите, нет ли уже настроек в drop-in-файлах:
grep -RniE 'PermitRootLogin|PasswordAuthentication|PubkeyAuthentication|KbdInteractiveAuthentication' \
/etc/ssh/sshd_config /etc/ssh/sshd_config.d 2>/dev/null || true- Откройте основной конфиг:
nano /etc/ssh/sshd_configЕсли Include /etc/ssh/sshd_config.d/*.conf находится в начале файла, параметры из drop-in-файлов имеют приоритет. В таком случае либо удалите конфликтующий Include, либо исправьте нужные значения в файле из sshd_config.d.
- Установите безопасные значения:
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no- Проверьте синтаксис и перезагрузите демон:
sshd -t
systemctl reload sshTIP
systemctl reload sshне обрывает уже открытые сессии, поэтому его можно выполнять, не закрывая текущее подключение.
- Если исходный пользователь больше не нужен, удалите его вместе с домашним каталогом:
deluser --remove-home ubuntuWARNINGЗапускайте эту команду только после того, как убедились, что вход под
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
- Удалите конфликтующие старые пакеты:
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- Добавьте официальный репозиторий 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- Установите Docker Engine и Compose plugin:
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin- Проверьте установку:
docker --version
docker compose version- Разрешите
newuserзапускать Docker безsudoи проверьте отдельной оболочкой:
usermod -aG docker newuser
runuser -l newuser -c 'docker run --rm hello-world'Zsh
- Установите Zsh:
apt install -y zsh- Сделайте Zsh оболочкой по умолчанию для
newuser:
chsh -s "$(command -v zsh)" newuser- Зайдите в новую сессию или переключитесь:
su - newuserHomebrew
Homebrew нельзя устанавливать от root, поэтому выполняйте установку от целевого пользователя.
- Установите Homebrew:
sudo -u newuser -H bash -c \
'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"'- Добавьте инициализацию в
~/.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
- Установите Oh My Posh для пользователя:
sudo -u newuser -H bash -c \
'curl -s https://ohmyposh.dev/install.sh | bash -s'- Добавьте инициализацию в
~/.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не нужен.
- Откройте новую сессию Zsh или перезайдите:
exec zsh -lNeofetch
Neofetch — инструмент для вывода информации о системе. Я использую его для красивой заставки в MOTD после подключения по SSH.
- Установите Neofetch:
apt install -y neofetchNOTEВ Ubuntu 24.04 Neofetch находится в репозитории
universe. Если пакет не найден, подключите репозиторий:add-apt-repository universeи повторитеapt update.
- Создайте MOTD-скрипт:
cat > /etc/update-motd.d/99-neofetch <<'EOF'
#!/bin/sh
neofetch
EOF
chmod 0755 /etc/update-motd.d/99-neofetch- Проверьте вывод 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 перед существенными изменениями.