10 KiB
Начальная настройка сервера
Первое подключение
Подключаемся к серверу к root по паролю, который должен выдаваться вместе с VDS.
ssh root@<IPv4>
Уже в терминале сервера выполняем.
# Создаём пользователя и наделяем правом использовать `sudo`.
adduser <user>
adduser <user> sudo
# Переключаемся на нового пользователя
su - <user>
# Все файлы, созданные пользователем, по умолчанию будут иметь права 600, а директории - 700.
echo 'umask 0077' >> .bashrc
source ~/.bashrc
# Добавляем свой публичный SSH ключ (cat ~/.ssh/id_rsa.pub), чтобы подключаться к пользователю по SSH напрямую.
mkdir .ssh
echo "<your-id-rsa.pub>" >> .ssh/authorized_keys
# Актуально, только если настройку umask не добавлять в .bashrc
# chmod 700 ~/.ssh
# chmod 600 ~/.ssh/authorized_keys
Теперь можно попробовать подключиться к серверу по SSH-ключу.
ssh <user>@<IPv4>
Желательно обновить все пакеты и перезагрузить сервер.
sudo apt update
sudo apt upgrade
sudo reboot
Можно придумать серверу имя, оно будет отображаться в терминале после <user>@.
sudo nano /etc/hostname
sudo systemctl restart systemd-hostnamed
# В hosts тоже иногда есть строчка вида
# 127.0.1.1 <hostname>
sudo nano /etc/hosts
Настройка конфига SSH
Открываем конфиг SSH.
sudo nano /etc/ssh/sshd_config
Port <ssh-port>- можно поменять со стандартного 22 на какой-нибудь другой. Лучше больше 10000, чтобы уменьшить вероятность конфликтов с другим ПО.PermitRootLogin no- запрещаем авторизацию по SSH подroot.PasswordAuthentication no- запрещаем авторизацию по SSH по паролю.
После внесения изменений в конфиг, необходимо перезагрузить sshd.
# На некоторых системах ssh вместо sshd
sudo systemctl reload sshd
# Иногда дополнительно нужно выполнить
systemctl daemon-reload
systemctl restart ssh.socket
??? question "А что будет, если потерять SSH-ключ?"
Хостинг предоставляет доступ к `VNC` или другие методы подключения к серверу, которые не требуют подключения по SSH. Однако в таком случае будет необходим доступ к личному кабинету хостинга.
На своей машине добавляем сервер в конфиг SSH.
# На Windows надо будет нажать на Tab, чтобы раскрыть `~`.
# code - VS Code
code ~/.ssh/config
Host <host>
HostName <IPv4>
User <user>
Port <ssh-port>
Можно проверить, что подключение проходит без ошибок.
# Если конфиг настроен
ssh <host>
# Без конфига
ssh <user>@<IPv4> -p <ssh-port>
Создание SWAP-файла
Лучше пожертвовать пару гигабайт от объёма диска сервера на SWAP-файл, чтобы уменьшить вероятность того, что в один прекрасный момент сервер крашнется из-за нехватки памяти.
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon --show
# Чтобы swap-файл подключался при перезагрузке сервера
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Чтобы удалить SWAP-файл, нужно выполнить следующие команды.
sudo swapoff /swapfile
# Удаляем строку со swap-файлом
sudo nano /etc/fstab
Настройка фаерволла c UFW
# Установка UFW
sudo apt update
sudo apt install ufw -y
# Открываем порт, используемый для SSH (по умолчанию 22)
sudo ufw allow <ssh-port>/tcp
# Закрываем все входные
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Включаем фаерволл
sudo ufw enable
# Показать состояние ufw и активные правила
sudo ufw status verbose
??? tip "Дополнительные команды ufw"
```sh
# Отключить фаерволл
sudo ufw disable
# Удалить правило (будут применены настройки по умолчанию)
sudo ufw delete allow <port>/<protocol> # удалить разрешение
sudo ufw delete deny <port>/<protocol> # удалить запрет
# Сброс всех правил
sudo ufw reset
# Вывести логи ufw
sudo tail -f -n 100 /var/log/ufw.log
# Изменить уровень логирования
sudo ufw logging <low/medium/high>
# Разрешить доступ ко всем портам с определённого IP-адреса
sudo ufw allow from <IPv4>
# Разрешить доступ к порту с определённого IP-адреса
sudo ufw allow from <IPv4> to any port <port>
```
Некоторые приложения, например `OpenSSH` или `Nginx`, добавляют пресеты с правилами для `ufw`, которые точно так же можно разрешать и запрещать.
```sh
# Вывести список пресетов
sudo ufw app list
# Открыть все соединения, которые нужны Nginx
sudo ufw allow "Nginx Full"
# Удалить правило для пресета
sudo ufw delete allow "Nginx Full"
```
Настройка Fail2Ban
Fail2Ban - базовая защита сервера от brute-force атак.
sudo apt update
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
Теперь нужно правильно настроить Fail2Ban.
# Создаём файл с пользовательскими настройками
sudo nano /etc/fail2ban/jail.local
Настройка защиты SSH сервера.
[sshd]
# Единственный обязательный параметр
enabled = true
# Можно не указывать, если используется стандартный порт
port = <ssh-port>
# Пример настроек. Эти параметры можно не указывать, тогда будут использованы
# значения по умолчанию.
# Если в течении 24 часов
findtime = 86400
# произведено 3 неудачных попытки логина,
maxretry = 3
# то банить IP навсегда.
bantime = -1
!!! tip "Более строгий конфиг для fail2ban"
Если на сервере настроена авторизация по ключу, можно смело использовать такой конфиг.
При авторизации по ключу, бан возможен только в случае указания неправильного имени пользователя, что исключено при использовании корректно настроенного SSH-конфига. В случае случайного бана всегда можно зайти на сервер через личный кабинет хостинга.
```ini
[sshd]
enabled = true
port = <ssh-port>
# Если произведена хотя бы одна неудачная попытка логина,
maxretry = 1
# то банить IP навсегда.
bantime = -1
```
# Применяем настройки
sudo fail2ban-client reload
После установки и первоначальной настройки fail2ban лучше перезагрузить сервер, иначе fail2ban может не заработать.
sudo reboot
??? tip "Дополнительные команды fail2ban"
```sh
# Вывести список активных jail's
sudo fail2ban-client status
# Вывести информацию по конкретному jail, в т. ч. список заблокированных IP
sudo fail2ban-client status <jail-name>
# Разблокировать IP
sudo fail2ban-client set <jail-name> unbanip <IP>
# Вывести логи fail2ban
sudo tail -f -n 100 /var/log/fail2ban.log
```
Дополнительно
# Вывести записи о неудачных попытках входа в систему
sudo lastb | head -n 20
# Очистить записи о неудачных попытках входа в систему
sudo truncate -s 0 /var/log/btmp
# Показывает, кто в системе прямо сейчас
sudo w
# Логи попыток входа
sudo grep "Accepted password" /var/log/auth.log | tail -n 20
sudo grep "Failed password" /var/log/auth.log | tail -n 20
sudo grep "Invalid user" /var/log/auth.log | tail -n 20
# Очистить логи с попытками входа
sudo truncate -s 0 /var/log/auth.log