# Начальная настройка сервера ## Первое подключение Подключаемся к серверу к `root` по паролю, который должен выдаваться вместе с VDS. ```sh ssh root@ ``` Уже в терминале сервера выполняем. ```sh { .code-wrap } # Создаём пользователя и наделяем правом использовать `sudo`. adduser adduser sudo # Переключаемся на нового пользователя su - # Все файлы, созданные пользователем, по умолчанию будут иметь права 600, а директории - 700. echo 'umask 0077' >> .bashrc source ~/.bashrc # Добавляем свой публичный SSH ключ (cat ~/.ssh/id_rsa.pub), чтобы подключаться к пользователю по SSH напрямую. mkdir .ssh echo "" >> .ssh/authorized_keys # Актуально, только если настройку umask не добавлять в .bashrc # chmod 700 ~/.ssh # chmod 600 ~/.ssh/authorized_keys ``` Теперь можно попробовать подключиться к серверу по SSH-ключу. ```sh ssh @ ``` Желательно обновить все пакеты и перезагрузить сервер. ```sh sudo apt update sudo apt upgrade sudo reboot ``` Можно придумать серверу имя, оно будет отображаться в терминале после `@`. ```sh sudo nano /etc/hostname sudo systemctl restart systemd-hostnamed # В hosts тоже иногда есть строчка вида # 127.0.1.1 sudo nano /etc/hosts ``` ## Настройка конфига SSH Открываем конфиг SSH. ```sh sudo nano /etc/ssh/sshd_config ``` - `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 HostName User Port ``` Можно проверить, что подключение проходит без ошибок. ```sh # Если конфиг настроен ssh ``` ```sh # Без конфига ssh @ -p ``` ## Настройка фаерволла c UFW ```sh # Установка UFW sudo apt update sudo apt install ufw -y # Открываем порт, используемый для SSH (по умолчанию 22) sudo ufw allow /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 / # удалить разрешение sudo ufw delete deny / # удалить запрет # Сброс всех правил sudo ufw reset # Вывести логи ufw sudo tail -f -n 100 /var/log/ufw.log # Изменить уровень логирования sudo ufw logging # Разрешить доступ ко всем портам с определённого IP-адреса sudo ufw allow from # Разрешить доступ к порту с определённого IP-адреса sudo ufw allow from to any 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 = # Пример настроек. Эти параметры можно не указывать, тогда будут использованы # значения по умолчанию. # Если в течении 24 часов findtime = 86400 # произведено 3 неудачных попытки логина, maxretry = 3 # то банить IP навсегда. bantime = -1 ``` !!! tip "Более строгий конфиг для `fail2ban`" Если на сервере настроена авторизация по ключу, можно смело использовать такой конфиг. При авторизации по ключу, бан возможен только в случае указания неправильного имени пользователя, что исключено при использовании корректно настроенного SSH-конфига. В случае случайного бана всегда можно зайти на сервер через личный кабинет хостинга. ```ini [sshd] enabled = true 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 # Разблокировать IP sudo fail2ban-client set unbanip # Вывести логи 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)