Files
knowledge-base/docs/servers/setup.md
Arity-T 974646161d
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 54s
Про swap файл
2025-12-05 12:19:42 +03:00

292 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Начальная настройка сервера
## Первое подключение
Подключаемся к серверу к `root` по паролю, который должен выдаваться вместе с VDS.
```sh
ssh root@<IPv4>
```
Уже в терминале сервера выполняем.
```sh { .code-wrap }
# Создаём пользователя и наделяем правом использовать `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-ключу.
```sh
ssh <user>@<IPv4>
```
Желательно обновить все пакеты и перезагрузить сервер.
```sh
sudo apt update
sudo apt upgrade
sudo reboot
```
Можно придумать серверу имя, оно будет отображаться в терминале после `<user>@`.
```sh
sudo nano /etc/hostname
sudo systemctl restart systemd-hostnamed
# В hosts тоже иногда есть строчка вида
# 127.0.1.1 <hostname>
sudo nano /etc/hosts
```
## Настройка конфига SSH
Открываем конфиг SSH.
```sh
sudo nano /etc/ssh/sshd_config
```
- `Port <ssh-port>` - можно поменять со стандартного 22 на какой-нибудь другой. Лучше больше 10000, чтобы уменьшить вероятность конфликтов с другим ПО.
- `PermitRootLogin no` - запрещаем авторизацию по SSH под `root`.
- `PasswordAuthentication no` - запрещаем авторизацию по SSH по паролю.
После внесения изменений в конфиг, необходимо перезагрузить `sshd`.
```sh
# На некоторых системах ssh вместо sshd
sudo systemctl reload sshd
# Иногда дополнительно нужно выполнить
systemctl daemon-reload
systemctl restart ssh.socket
```
??? question "А что будет, если потерять SSH-ключ?"
Хостинг предоставляет доступ к `VNC` или другие методы подключения к серверу, которые не требуют подключения по SSH. Однако в таком случае будет необходим доступ к личному кабинету хостинга.
На своей машине добавляем сервер в конфиг SSH.
```sh
# На Windows надо будет нажать на Tab, чтобы раскрыть `~`.
# code - VS Code
code ~/.ssh/config
```
```
Host <host>
HostName <IPv4>
User <user>
Port <ssh-port>
```
Можно проверить, что подключение проходит без ошибок.
```sh
# Если конфиг настроен
ssh <host>
```
```sh
# Без конфига
ssh <user>@<IPv4> -p <ssh-port>
```
## Создание SWAP-файла
Лучше пожертвовать пару гигабайт от объёма диска сервера на SWAP-файл, чтобы уменьшить вероятность того, что в один прекрасный момент сервер крашнется из-за нехватки памяти.
```sh
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-файл, нужно выполнить следующие команды.
```sh
sudo swapoff /swapfile
# Удаляем строку со swap-файлом
sudo nano /etc/fstab
```
## Настройка фаерволла c UFW
```sh
# Установка 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](https://github.com/fail2ban/fail2ban) - базовая защита сервера от brute-force атак.
```sh
sudo apt update
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
```
Теперь нужно [правильно настроить Fail2Ban](https://github.com/fail2ban/fail2ban/wiki/Proper-fail2ban-configuration).
```sh
# Создаём файл с пользовательскими настройками
sudo nano /etc/fail2ban/jail.local
```
Настройка защиты SSH сервера.
```ini
[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
```
```sh
# Применяем настройки
sudo fail2ban-client reload
```
После установки и первоначальной настройки `fail2ban` лучше перезагрузить сервер, иначе `fail2ban` может не заработать.
```sh
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
```
## Дополнительно
```sh
# Вывести записи о неудачных попытках входа в систему
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
```
## Полезные ссылки
- [Initial Server Setup with Ubuntu 20.04](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-20-04)
- [UFW Essentials: Common Firewall Rules and Commands](https://www.digitalocean.com/community/tutorials/ufw-essentials-common-firewall-rules-and-commands)
- [VPS cheatsheet](https://habr.com/ru/articles/756804/)
- [Fail2Ban](https://github.com/fail2ban/fail2ban)