Files
knowledge-base/docs/servers/index.md
2025-01-25 14:50:10 +03:00

220 lines
7.5 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 <username> 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 nano /etc/hosts
sudo systemctl restart systemd-hostnamed
```
## Настройка конфига 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
```
??? 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>
```
## Настройка фаерволла c UFW
```sh
# Установка UFW
sudo apt update
sudo apt install ufw
# Открываем порт, используемый для 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
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
```
```sh
# Применяем настройки
sudo fail2ban-client reload
```
??? 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
```
## Полезные ссылки
- [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)