Безопасная настройка VPS Linux

Vps config.png
Опубликовано
/8 мин. чтения/---

Настройка системы

Обновление системы

Итак, первым делом необходимо обновить ОС и пакеты до последней версии.
После получения данных для доступа к VPS (обычно это root и IP-адрес), подключайся к машине по SSH:

ssh root@your_ip

Далее обновим данные о пакетах, установим обновления и перезагрузим сервер:

Ubuntu / Debian
apt update && apt dist-upgrade -y && reboot
RHEL / CentOS
dnf upgrade -y && reboot

Для автоматизации этого процесса в последующем, настроим автоматическую установку обновлений.

Автоматические обновления для Ubuntu / Debian

Для автоматизации процесса настроим службу unattended-upgrades:

Ubuntu / Debian
apt install unattended-upgrades -y

Запускаем встроенный конфигуратор:

Ubuntu / Debian
dpkg-reconfigure --priority=low unattended-upgrades

Появится синий экран с вопросом:

Ubuntu / Debian
«Automatically download and install stable updates?»

Выбираем Yes и процесс установки завершен. Переходим к настройке.

Открываем основной файл:

Ubuntu / Debian
nano /etc/apt/apt.conf.d/50unattended-upgrades

Ищем раздел:

#Unattended-Upgrade::Allowed-Origins или Unattended-Upgrade::Origins-Pattern
Unattended-Upgrade::Allowed-Origins  
	"${distro_id}:${distro_codename}-security";
//  "${distro_id}:${distro_codename}-updates";
//  "${distro_id}:${distro_codename}-proposed";
//  "${distro_id}:${distro_codename}-backports";
};
  • -security — обязательно оставить, обновления безопасности нам нужны;
  • -updates — можно включить, если хочешь получать обычные исправления;
  • -proposed, -backports — включать не стоит, может содержать нестабильные пакеты.

Чтобы включить updates, просто убери //. Сохраняем и переходим к проверке.

Запускаем отладку:

Ubuntu / Debian
unattended-upgrades --dry-run --debug

Если не получили ошибок, значит настроили все правильно.

Автоматические обновления для RHEL / CentOS

На системах RHEL и CentOS автоматические обновления можно настроить с помощью dnf-automatic.

RHEL / CentOS
dnf install dnf-automatic -y

Открой конфигурационный файл:

RHEL / CentOS
nano /etc/dnf/automatic.conf

Найди и проверь следующие параметры:

RHEL / CentOS
[commands]
upgrade_type = default
 
[apply]
apply_updates = yes

Запусти автоматическое обновление:

RHEL / CentOS
systemctl enable --now dnf-automatic.timer

Создание пользователя

Далее создадим пользователя для работы с правами на sudo.

useradd -m superuser -G sudo -s /bin/bash

Минимально-привилегированного пользователь считается хорошей практикой и поможет избежать многих проблем в будущем.

Изменим конфигурацию sudoers через visudo, разрешим членам группы sudo использовать sudo без ввода пароля:

visudo

Находим раздел %sudo и добавляем NOPASSWD. Должно получить так:

%sudo   ALL=(ALL:ALL) NOPASSWD:ALL

Удалим возможность подключения через отдельный конфиг, для этого удаляем строку:

@includedir /etc/sudoers.d

Сохраняем внесенные изменения и переключаемся на созданного пользователя.

su superuser

Переходим в домашний каталог пользователя для дальнейшей настройки.

cd ~

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

echo 'umask 0077' >> .bashrc

Настройка SSH

Теперь настроим подключение к нашему серверу по SSH.

Настройка авторизации

Для безопасного входа на сервер лучше использовать SSH-ключи, но можно подключаться и по паролю, если он достаточно сложный, и настроил fail2ban.

Для установки пароля используй команду:

sudo passwd superuser

Для установки SSH-ключа:

Если у тебя еще нет своего SSH-ключа, на локальном компьютере создай его командой:

# Локальный компьютер
ssh-keygen -t ed25519

Получишь два ключа в папке ~/.ssh/:

  • публичный .pub, который далее загружаешь на сервер;
  • приватный, используется для подключения.

Копируем содержимое публичного ключа и вставляем его значение на сервер:

# Локальный компьютер
cat ~/.ssh/id_ed25519.pub # Или другое имя, если ты назвал его иначе.
 
# VPS
mkdir -p ~/.ssh
echo 'ssh-ed25519 AAAA...' > /home/superuser/.ssh/id_ed25519.pub

Добавляем созданный публичный ключ в authorized_keys.

# VPS
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chown -R superuser:superuser ~/.ssh

Проверяем, что удачно можем авторизоваться на сервере с помощью пароля или ключа под нашим пользователем:

# Локальный компьютер
 
## С помощью пароля:
ssh superuser@your_ip
 
## С помощью ключа:
ssh -i ~/.ssh/id_rsa superuser@your_ip

Если успешно подключились, переходим к настройке sshd.

Открываем настройки службы sshd

sudo nano /etc/ssh/sshd_config

Меняем порт на нестандартный (очень поможет от ботов)

Port 1920

Запрещаем авторизацию под root, меняя yes на no

PermitRootLogin no

Если планируешь подключение по паролю:

PasswordAuthentication yes
PermitEmptyPasswords no

Если подключаешься по SSH-ключу, то запрещаем авторизацию по паролю, устанавливаем принудительную авторизацию по ключу:

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
PermitEmptyPasswords no
 
PubkeyAuthentication yes
  1. Выходим и сохраняем конфиг, после чего перезапускаем SSH-сервер.
sudo systemctl restart sshd

Подключаемся на сервер и продолжаем настройку.

Установка доп. программ

Для упрощения жизни и работы с сервером, советую установить следующие пакеты:

sudo apt install git ufw net-tools curl
  1. ufw - надстройка над iptables, для настройки файрволла сервера.
  2. git - для загрузки кода с Git-repo.
  3. net-tools - для работы ifconfig и netstat.
  4. curl - для выполнения http запросов из консоли.

Firewall

Теперь настроим Firewall, для минимизации возможности несанкционированных подключений.

Разрешаем подключение по SSH (укажи тот же порт, что в sshd_config, например, 1920):

# Разрешаем подключение по SSH (нестандартный порт)
sudo ufw allow 1920/tcp

Запрещаем все входящие подключения (по умолчанию) и разрешаем все исходящие:

sudo ufw default deny incoming
sudo ufw default allow outgoing

При необходимости — добавляем доступ к другим сервисам (например, HTTPS для веб-сервера):

# Пример: Разрешить HTTPS
sudo ufw allow 443/tcp

Включаем firewall и проверяем его статус:

# Включаем UFW
sudo ufw enable
 
# Проверяем статус и правила
sudo ufw status verbose

Если ты подключаешься по SSH, обязательно убедись, что правило для SSH-порта добавлено до активации ufw, иначе можешь потерять доступ к серверу.

Fail2Ban (Защита от перебора паролей)

Для борьбы с ботами и добавлением защиты от перебора пароля (если оставил пароль), внедрим fail2ban.

Устанавливаем fail2ban:

sudo apt install fail2ban -y

Создаем локальную копию конфига, чтобы не изменять оригинальный файл:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Открываем конфигурацию:

sudo nano /etc/fail2ban/jail.local

Находим или добавляем секцию [sshd] и указываем параметры:

[sshd]
enabled = true
port    = 1920     # Укажи свой SSH-порт, если нестандартный
logpath = %(sshd_log)s
backend = systemd
 
maxretry = 3        # Кол-во неудачных попыток до блокировки
findtime = 10m      # Временной интервал, в течение которого считаются попытки
bantime  = 1h       # Время блокировки IP (можно выставить 24h, 7d)

Сохраняем и перезапускаем службу:

sudo systemctl restart fail2ban

Проверяем статус и активные jail'ы:

sudo fail2ban-client status
sudo fail2ban-client status sshd

Логирование и ротация логов

И заключительным этапом хотелось бы настроить логирование. И добавить ротацию логов, мы же не хотим потерять доступ к машине из-за переполнения диска логами?

Краткая справка:

  • Большинство современных систем используют systemd-journald для логирования системных сообщений.
  • Приложения и сервисы, такие как sshd и fail2ban, могут писать логи в файлы (например, /var/log/auth.log, /var/log/fail2ban.log) или напрямую в системный журнал.
  • Чтобы убедиться, что логи пишутся в нужные файлы, проверь конфигурации сервисов (например, sshd_config, fail2ban.conf) и системных демонов (rsyslog, syslog-ng).

Основные файлы логов:

ЛогОписаниеРасположение
/var/log/auth.logАутентификация и SSHDebian/Ubuntu
/var/log/secureАутентификация и SSHCentOS/RHEL
/var/log/syslogОбщесистемные логиDebian/Ubuntu
/var/log/messagesОбщесистемные логиCentOS/RHEL
/var/log/fail2ban.logЛоги Fail2BanОбычно в /var/log/
/var/log/kern.logЛоги ядраDebian/Ubuntu
/var/log/dpkg.logЛоги установки пакетовDebian/Ubuntu
/var/log/yum.logЛоги установки пакетовCentOS/RHEL

Если используешь systemd-journald, настрой лимит размера журнала в /etc/systemd/journald.conf:

SystemMaxUse=200M
RuntimeMaxUse=100M

После изменений перезапустить:

sudo systemctl restart systemd-journald

Конфигурации ротации находятся в /etc/logrotate.conf и отдельные файлы в /etc/logrotate.d/.

Оставлю просто пример своего logrotate.conf:

# see "man logrotate" for details
# rotate log files weekly
weekly
 
# keep 4 weeks worth of backlogs
rotate 4
 
# create new (empty) log files after rotating old ones
create
 
# compress rotated logs
compress
 
# delay compression of the previous log file to the next rotation cycle
delaycompress
 
# don't rotate log if empty
notifempty
 
# use date as suffix of rotated file
dateext
 
# system-specific logs
include /etc/logrotate.d

Аудит системы

Этот раздел можешь пропустить, но если ты параноик (безопасник), можешь провести маленький аудит своей системы и выяснить:

  • какие службы и сервисы запущены на твоей машине;
  • нет ли чего-то неожиданного, что позволило бы получить доступ к твоим данным.

Автоматический аудит системы

Для автоматической проверки можешь использовать известный в узких кругах скрипт - linPEAS.

curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh

Изучи результаты его работы. Обрати внимание на пункты, которые подсвечены в ручном аудите.

Ручной аудит системы

Для ручной проверки обрати внимание на следующие пункты:

  • Общий список пользователей и список shell-учеток
# Полный список пользователей
cat /etc/passwd
cat /etc/shadow
# Список пользователей с интерактивным входом
awk -F: '$7 !~ /(false|nologin)/' /etc/passwd
  • Авторизованные SSH-ключи
find /home /root -name "authorized_keys" -exec cat {} \;
  • Состав групп sudo и whell
getent group sudo
getent group wheel
  • Автозагрузку сервисов
systemctl list-unit-files --type=service | grep enabled
  • Списки cron-заданий системы и пользователей
for user in $(cut -f1 -d: /etc/passwd); do echo "CRON for $user:"; crontab -u $user -l 2>/dev/null; done
 
ls /etc/cron* /var/spool/cron -R
  • Проверь бинари с setuid и setgid
find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -l {} \; 2>/dev/null
  • Проверь бинари с флагом executable
find /usr/local/bin /opt /tmp -type f -executable -ls
  • Проверь туннели и скрытые соединения
# Открытые соединения
lsof -i
# Слушаемые порты
ss -tulnp
  • Проверь общий список процессов и наличие агентов мониторинга
# Общий список процессов
ps aux
# Проверить наличие агентов мониторинга
ps aux | grep -i agent

Спасибо что дочитал статью, надеюсь она была полезной для тебя

Если есть мысли, чтобы ты еще проверил при проведении аудита, хотел бы более подробное описание процесса аудита, можешь оставить комментарий в канале.