# Как защитить свой сервер? Основы кибербезопасности

Безопасность сервера — это основа качественной работы любого бизнеса, стартапа или простого веб-сайта. В 99% случаев нарушения на наших клиентских серверах происходят по причине взлома. А взлом, в свою очередь, из-за недостаточной безопасности сервера.

В статье мы разберем наиболее эффективные способы защиты своего сервера. Начнем с минимальных необходимостей и закончим продвинутой защитой. В первую очередь статья предназначена для новичков, тем не менее любой системный администратор может использовать ее как отличную памятку.&#x20;

{% hint style="success" %}
Каждая инструкция максимально упрощена. Даже если вы подключаетесь к серверу впервые, не переживайте — вы разберетесь!
{% endhint %}

## Linux (базовые настройки)

{% hint style="warning" %}
Обратите внимание, что по умолчанию команда `sudo` может не выполняться на ОС Debian. Может потребоваться установка пакета sudo через команду `apt install sudo`, либо просто удаление sudo из используемых команд.

Прежде чем начать, используйте команду `sudo apt install nano` (Ubuntu / Debian) или `yum install nano` (CentOS) для проверки, что утилита nano действительно есть в вашей системе.
{% endhint %}

### Регулярные обновления системы

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

{% tabs %}
{% tab title="Ubuntu / Debian" %}
sudo apt update && sudo apt upgrade -y
{% endtab %}

{% tab title="CentOS" %}
sudo yum update -y
{% endtab %}
{% endtabs %}

### Использование SSH-ключей

Благодаря SSH-ключам процесс подбора пароля становится попросту нереалистичным. Представьте, существует `2**2048` комбинаций ключа.

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

### Изменение порта SSH

Порт 22, стандартный для SSH, давно стал мишенью для злоумышленников. Сканеры и боты непрерывно «простукивают» интернет в поисках серверов, открытых на этом порту. Их задача найти доступный сервер, а затем начать перебор паролей, используя огромную базу простых и популярных комбинаций.

Результат? Даже если ваш сервер защищен, его логи все равно будут переполнены огромным количеством сообщений о неуспешных подключениях, что может затруднять анализ реальных угроз.  Смена порта позволяет значительно сократить этот «шум» и сделать ваш сервер менее заметным для такого типа атак.

Простым решением станет смена порта 22 на нестандартный, любой, какой вам нравится. Например 50321.

Для начала проверьте, что порт, который вы хотите использовать, не занят никаким другим приложением. Для этого воспользуемся утилитой netstat. Убедитесь, что необходимый пакет net-tools установлен.

{% tabs %}
{% tab title="Ubuntu / Debian" %}
sudo apt install net-tools
{% endtab %}

{% tab title="CentOS" %}
sudo yum install net-tools
{% endtab %}
{% endtabs %}

Проверяем порт 50321.

{% hint style="info" %}
Обратите внимание, что порт 50321 выбран всего лишь в качестве примера. В случае необходимости вы можете использовать любой другой.
{% endhint %}

```
sudo netstat -tuln | grep 50321
```

Ничего не вывелось? — Значит порт не занят. Можем проверить порт 22 и увидеть, что он действительно занят и используется.

<figure><img src="https://1206415929-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXbCSSBR0J1rX84BjWO%2Fuploads%2FiGKkswlFoCTXhUbqF2OI%2FTermius_fR1TW4ooJ7.png?alt=media&#x26;token=a6dfd0af-3542-4fa7-99b0-3e916511ca07" alt=""><figcaption></figcaption></figure>

Перейдите в конфиг SSH-сервера. Используем текстовый редактор nano

```
nano /etc/ssh/sshd_config
```

Уберите "#" в строке port и вместо 22 укажите желаемый. В нашем случае — 50321. Выглядеть это должно так.

<figure><img src="https://1206415929-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXbCSSBR0J1rX84BjWO%2Fuploads%2FVvmqy1BUahZd9hinTIWQ%2FTermius_MTRxEnLos6.png?alt=media&#x26;token=14afe6b0-5183-4490-b3cb-4dc79ed8f30c" alt=""><figcaption></figcaption></figure>

Переключите раскладку на английский язык и нажмите CTRL+X , далее Y, затем Enter для сохранения файла.

Перезапустите сервис SSH.

{% tabs %}
{% tab title="Ubuntu / Debian" %}
sudo systemctl restart ssh
{% endtab %}

{% tab title="CentOS" %}
sudo systemctl restart sshd
{% endtab %}
{% endtabs %}

После перезапуска не торопитесь закрывать текущее окно сервера. Временно оставьте его открытым. Если что-то пойдет не так, то можно будет откатить изменения.

Попробуйте в новом окне подключиться к серверу, используя указанный порт.

### Резервное копирование данных

**На этих трех пунктах можно было бы завершить базовые настройки безопасности**. **Регулярные обновления, SSH-ключи и нестандартный порт SSH в совокупности дают огромный эффект**. Соблюдение этих пунктов снизит возможность взлома на 90-95% по сравнению со стандартными настройками. Если вы неопытный пользователь и не размещаете на сервере сверхконфиденциальные данные, то этого будет более чем достаточно.

Тем не менее, никогда нельзя забывать про копии данных. Это отличное правило, которое поможет вам не только при работе с серверами, но и в собственных проектах. Ни один хостинг-провайдер не может гарантировать 100% сохранности ваших данных. Бывают самые разные случаи: от банального сбоя дисков, до больших инцидентов в дата-центре. Несмотря на то, что такие случаи являются редкостью, не стоит испытывать судьбу. Потратьте некоторое время на создание копии важных данных и более не беспокойтесь о  возможных потерях.

Разберемся на практике. Для ОС Ubuntu, Debian, CentOS можно использовать встроенную утилиту tar.

```
tar -cvzf /путь/к/backup.tar.gz /путь/к/папке
```

{% hint style="info" %}
/путь/к/backup.tar.gz — путь и название архива.

/путь/к/папке — путь к папке, которая будет заархивирована. Можно указать название конкретного файла или просто " \* " , чтобы добавить в архив все папки и файлы из текущего каталога.
{% endhint %}

Например, заархивируем папку share, которая находится в корневом каталоге /root\
Проверяем, что мы действительно в /root — `cd /root`

Используем команду для архивации через tar

```
tar -cvzf backup.tar.gz share
```

После завершения архивации используйте команду `ls` для проверки, что файл действительно создался.

<figure><img src="https://1206415929-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXbCSSBR0J1rX84BjWO%2Fuploads%2F3mPCdMYE13pPQYIBbqwX%2FTermius_0GpJy5D1Ca.png?alt=media&#x26;token=9b7ab073-52b5-4000-88d0-c9824742047c" alt=""><figcaption></figcaption></figure>

Далее существует масса вариантов действий с данным архивом. Вы можете выгрузить его на свой компьютер через sFTP или на облачное хранилище. Создания ручной копии раз в 2 недели будет вполне достаточно (тем не менее, это зависит от типа вашего проекта).

Можно сделать автоматическое создание архива через Cron и последующую выгрузку на внешнее хранилище — даже с интервалом в 24 часа. Но это уже для особо крупных проектов.

## Linux (для продвинутых)

### Настройка брандмауэра

Воспользуемся утилитой Iptables (встроена в Ubuntu, Debian, CentOS). Проверить актуальные правила можно так:

```
sudo iptables -L -v -n
```

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

```
sudo iptables -A INPUT -p tcp --dport 50321 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
```

Далее предоставляем список часто используемых команд в Iptables. Рекомендуем вам в индивидуальном порядке рассматривать использование тех или иных конфигураций файрволла.

Запретить весь трафик от конкретного адреса. Где в аргументе `-s` указывается исходящий адрес.

```
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
```

Запретить входящий трафик по определённому порту. Где `--dport` — это блокируемый порт.

```
sudo iptables -A INPUT -p tcp --dport 8080 -j DROP
```

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

{% tabs %}
{% tab title="Ubuntu / Debian" %}
sudo /sbin/iptables-save
{% endtab %}

{% tab title="CentOS" %}
sudo /sbin/service iptables save
{% endtab %}
{% endtabs %}

{% hint style="success" %}
Процесс настройки Iptables подробно описан в [отдельной статье](https://wiki.spacecore.pro/network-and-security-configuration/iptables-configuration). Рекомендуем к ознакомлению.
{% endhint %}

### Fail2Ban — блокировка брутфорсеров

Это эффективный инструмент для повышения безопасности серверов, которые отслеживает логи системных служб и автоматически блокирует IP-адреса, совершающие многократные неудачные попытки входа на сервер. Такой метод блокировки защищает сервер от взлома посредством перебора паролей и в целом разгружает логи от ненужных данных.

**Установка**

{% tabs %}
{% tab title="Ubuntu / Debian" %}
sudo apt install fail2ban -y
{% endtab %}

{% tab title="CentOS" %}
sudo yum install epel-release

sudo yum install fail2ban
{% endtab %}
{% endtabs %}

Убеждаемся, что служба Fail2Ban действительно запущена и проверяем статус.

```
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
sudo systemctl status fail2ban
```

<figure><img src="https://1206415929-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXbCSSBR0J1rX84BjWO%2Fuploads%2FrOf8WLPMkoTZw7RaaPQk%2FTermius_FUjjPFTiED.png?alt=media&#x26;token=22175a9f-bf8d-46a5-97c3-e60b2d6dbfac" alt=""><figcaption></figcaption></figure>

Рекомендуется не изменять напрямую файлы конфигурации `/etc/fail2ban/fail2ban.conf` и `/etc/fail2ban/jail.conf`, так как они могут быть перезаписаны при обновлениях. Вместо этого создайте их копии с расширением `.local` для внесения изменений:

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

Откройте файл в текстовом редакторе.

<pre><code><strong>nano /etc/fail2ban/jail.local
</strong></code></pre>

Основные настройки:

```
[DEFAULT]
# Игнорируемые IP-адреса (например, ваш IP).
ignoreip = 127.0.0.1/8 ::1

# Время блокировки IP-адреса.
bantime = 10m

# IP-адрес блокируется, если он выполняет "maxretry" попыток в течение "findtime".
findtime = 10m

# Максимальное количество попыток до блокировки.
maxretry = 5
```

Вы можете установить свои значения. Например, вот такие (как на скриншоте) для более строгих блокировок. Обратите внимание, что при таких настройках адреса нарушителей будут блокироваться навсегда. Это эффективный метод борьбы с ботами, но его следует применять с осторожностью, чтобы избежать блокировки доверенных пользователей.

<figure><img src="https://1206415929-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXbCSSBR0J1rX84BjWO%2Fuploads%2F1RSQkXgGVn0vgoKrZUQI%2FTermius_0sG83Lth3u.png?alt=media&#x26;token=c02ced3e-e9d1-4881-927a-5043ad6f8fc8" alt=""><figcaption></figcaption></figure>

После внесения изменений перезапустите Fail2Ban.

```
sudo systemctl restart fail2ban
```

Проверка журнала отладки:

```
sudo tail -f /var/log/fail2ban.log
```

### 2FA Google — двойная аутентификация

Использование двухфакторной аутентификации значительно повышает безопасность на серверах. После установки при входе на сервер сначала будет запрашиваться OTP-код (обновляется каждые 30 секунд), а после пароль от самого сервера. Обратите внимание, что для авторизации на сервере будет необходимо каждый раз доставать телефон.

Установим модуль PAM для Google Authenticator

{% tabs %}
{% tab title="Ubuntu / Debian" %}
sudo apt install libpam-google-authenticator
{% endtab %}

{% tab title="CentOS" %}
sudo yum install epel-release

sudo yum install google-authenticator
{% endtab %}
{% endtabs %}

Выполните команду `google-authenticator` от имени пользователя, для которого настраивается 2FA:

```
google-authenticator
```

Вам будет задан следующий вопрос

* **Do you want authentication tokens to be time-based (y/n)**: Введите `y` для использования одноразовых паролей (TOTP).

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

<figure><img src="https://1206415929-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXbCSSBR0J1rX84BjWO%2Fuploads%2FX6PpAGbocUqn5hL3m1sm%2FTermius_pTzPspnyS2.png?alt=media&#x26;token=d9c8eb1c-c58e-4b67-91d1-1c9e259ede2e" alt="" width="375"><figcaption></figcaption></figure>

Загрузите приложение аутентификатора Google. [Android](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\&hl=en) | [IOS](https://apps.apple.com/us/app/google-authenticator/id388497605)

Отсканируйте предоставленный код. После чего аккаунт добавится в ваше приложение.

<figure><img src="https://1206415929-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXbCSSBR0J1rX84BjWO%2Fuploads%2FYjiVgAUbkJhRbzbWwHUy%2Fimage.png?alt=media&#x26;token=8731f010-68da-4d39-9c29-add466297b8f" alt="" width="563"><figcaption></figcaption></figure>

* **Update the .google\_authenticator file (y/n)**: Введите `y` для сохранения настроек.
* **Do you want to disallow multiple uses of the same authentication token? (y/n)**: Рекомендуется ввести `y` для предотвращения повторного использования одного и того же токена.

{% hint style="info" %}
**По умолчанию новое значение одноразового токена генерируется мобильным приложением каждые 30 секунд**. Для компенсации возможного рассинхрона времени между клиентом и сервером предусмотрено использование дополнительных токенов до и после текущего времени. Это позволяет допускать рассинхрон времени до 30 секунд между сервером аутентификации и клиентом.

Если вы сталкиваетесь с проблемами из-за низкой точности синхронизации времени, вы можете увеличить временное окно с его стандартного размера (3 разрешённых токена: предыдущий, текущий и следующий) до 17 разрешённых токенов (8 предыдущих, текущий и 8 следующих). Это обеспечит допуск рассинхрона времени до 4 минут между клиентом и сервером.

— **Введите** `y` **для увеличения временного окна, что может быть полезно при рассинхронизации времени.**
{% endhint %}

* **Enable rate-limiting (y/n)**: Введите `y` для ограничения частоты попыток аутентификации, чтобы предотвратить атаки перебором.

Откройте файл конфигурации PAM для SSH:

```
sudo nano /etc/pam.d/sshd
```

Добавьте следующую строку в начало файла. Это указывает системе использовать модуль `pam_google_authenticator` для аутентификации.

```
auth required pam_google_authenticator.so
```

<figure><img src="https://1206415929-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXbCSSBR0J1rX84BjWO%2Fuploads%2FcV5cx0W1JmfOt6qkO8h5%2FTermius_GRwtgT5Wd6.png?alt=media&#x26;token=e0beb1c9-316a-4f9a-a343-70ef10940fcf" alt=""><figcaption></figcaption></figure>

Сохраните и закройте файл. Далее откройте файл конфигурации SSH:

```
sudo nano /etc/ssh/sshd_config
```

Установите значение `yes` для параметра `ChallengeResponseAuthentication`. Эти настройки включают использование PAM и требуют как публичного ключа, так и одноразового пароля для аутентификации.

<figure><img src="https://1206415929-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXbCSSBR0J1rX84BjWO%2Fuploads%2FNK6kx3SmKUI26EyqjB6z%2FTermius_107ITUNaHg.png?alt=media&#x26;token=4b9ad4c5-560a-4cfd-9985-f4e10f79977a" alt=""><figcaption></figcaption></figure>

Сохраняем файл и закрываем. После внесения изменений перезапустите службу SSH для применения новых настроек:

{% tabs %}
{% tab title="Ubuntu / Debian" %}
sudo systemctl restart ssh
{% endtab %}

{% tab title="Second Tab" %}
sudo systemctl restart sshd
{% endtab %}
{% endtabs %}

Попробуйте подключиться к серверу. Сначала будет запрошен код аутентификатора. Введите его.

<figure><img src="https://1206415929-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXbCSSBR0J1rX84BjWO%2Fuploads%2FsOVlzV9aEo89wi2jfoeb%2FTermius_BcVDolRzbn.png?alt=media&#x26;token=20d8348c-5900-465f-8b7c-33f00fb4830a" alt="" width="363"><figcaption></figcaption></figure>

Затем пароль от вашего сервера. Подключение выполнено успешно!

### Антивирус ClamAV

Несмотря на то, что операционные системы на базе Linux, считаются более защищенными, чем Windows, использование антивируса может быть полезным. Это особенно важно, когда вы часто обмениваетесь файлами или используете сервер в корпоративной среде. Мы рассмотрим бесплатный антивирус **ClamAV** с открытым исходным кодом. Он умеет сканировать систему и выявлять вирусы, трояны, шпионские программы и другие виды вредоносного ПО.

**Установка**

{% tabs %}
{% tab title="Ubuntu / Debian" %}
sudo apt install clamav -y
{% endtab %}

{% tab title="CentOS" %}
sudo yum install epel-release

sudo yum install clamav clamav-update
{% endtab %}
{% endtabs %}

После установки рекомендуем обновить базу данных вирусов. Для этого сначала остановите программу, а затем выполните команду обновления.

```
sudo systemctl stop clamav-freshclam
sudo freshclam
```

Убедимся, что служба запущена.

```
sudo systemctl start clamav-freshclam
```

**Ручное сканирование**

```
clamscan -r /путь/к/папке
```

**Сканирование всех файлов системы**

```
sudo clamscan -r -i /
```
