> For the complete documentation index, see [llms.txt](https://spacecore.gitbook.io/wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://spacecore.gitbook.io/wiki/ua/network-and-security-configuration/how-to-secure-your-server-cybersecurity-basics.md).

# Як захистити свій сервер? Основи кібербезпеки

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

У цій статті ми розглянемо найбільш ефективні способи захисту свого сервера. Почнемо з мінімальних необхідностей і закінчимо розширеним захистом. У першу чергу стаття призначена для новачків, однак будь-який системний адміністратор може використовувати її як чудовий довідник.

{% 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-ключів, а також відключення доступу до сервера за паролем рекомендуємо ознайомитися з нашими статтям

{% content-ref url="/pages/AL2tBct8XwhmS5wGvk74" %}
[Підключення за допомогою SSH ключів](/wiki/ua/os-and-software/connecting-via-ssh-keys.md)
{% endcontent-ref %}

{% content-ref url="/pages/JuyUtFzyyUvLJZuUhJ14" %}
[Відключення доступу до Linux за допомогою пароля](/wiki/ua/os-and-software/disabling-password-access-to-linux.md)
{% endcontent-ref %}

### Зміна порту SSH

Порт 22, стандартний для SSH, вже давно став ціллю для зловмисників. Сканери та боти безперервно «простукують» інтернет у пошуках серверів, відкритих на цьому порту. Їхнє завдання — знайти доступний сервер і почати підбір паролів, використовуючи величезну базу простих і популярних комбінацій.

Результат? Навіть якщо ваш сервер захищений, його логи все одно будуть переповнені великою кількістю повідомлень про невдалі підключення, що може ускладнити аналіз реальних загроз. Зміна порту дозволяє значно зменшити цей «шум» і зробити ваш сервер менш помітним для такого типу атак.

Простим рішенням стане зміна порту 22 на нестандартний, будь-який, який вам до вподоби. Наприклад, 50321.

Спочатку переконайтеся, що порт, який ви хочете використовувати, не зайнятий жодним іншим додатком. Для цього скористайтеся утилітою netstat. Переконайтеся, що встановлений необхідний пакет net-tools:

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

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

Перевірте порт 50321:

{% hint style="info" %}
Зверніть увагу, що порт 50321 обраний всього лише як приклад. У разі необхідності ви можете використати будь-який інший.
{% endhint %}

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

Нічого не вивелося? Отже, порт вільний. Можемо перевірити порт 22 і побачити, що він дійсно зайнятий і використовується.

<figure><img src="/files/uHazuwiy6dvOagcDGAic" alt=""><figcaption></figcaption></figure>

Перейдіть до конфігурації SSH-сервера. Використовуйте текстовий редактор nano:

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

Приберіть `#` у рядку `port` і замість `22` вкажіть бажаний. У нашому випадку — `50321`. Це має виглядати так:

<figure><img src="/files/h3q6ZLOPybsxquLP9mRd" 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`. Якщо вона не встановлена, скористайтеся командою `apt install tar -y` або `yum install tar -y`

```
tar -cvzf /шлях/до/backup.tar.gz /шлях/до/папки
```

{% hint style="info" %}
`/шлях/до/backup.tar.gz` — шлях і назва архіву.\
`/шлях/до/папки` — шлях до папки, яка буде архівована. Ви можете вказати назву конкретного файлу або просто `"*"`, щоб додати в архів усі папки та файли з поточного каталогу.
{% endhint %}

Наприклад, заархівуємо папку `share`, яка знаходиться в кореневому каталозі `/root`.\
Перевіряємо, що ми дійсно в каталозі `/root`:

Використовуємо команду для архівації через `tar`:

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

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

<figure><img src="/files/lKwrFjjnaOFIHSpaovDt" 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
```

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

```
sudo /sbin/iptables-save
```

{% hint style="success" %}
Процес налаштування `iptables` докладно описаний в [окремій статті](https://wiki.spacecore.pro/ua/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 -y

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

Переконайтеся, що служба Fail2Ban запущена, і перевірте її статус:

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

<figure><img src="/files/JAd2hJMNVytX5S4B3p34" 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="/files/6NAt8SLtP94bJXUALhls" alt=""><figcaption></figcaption></figure>

Після внесення змін перезапустіть Fail2Ban:

```
sudo systemctl restart fail2ban
```

Перевірка журналу налагодження:

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

### Двофакторна автентифікація Google (2FA)

Використання двофакторної автентифікації значно підвищує безпеку серверів. Після налаштування під час входу на сервер спочатку запитуватиметься 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 -y

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

Виконайте команду `google-authenticator` від імені користувача, для якого налаштовується 2FA:

```
google-authenticator
```

Вам буде поставлено наступне запитання:

* **Do you want authentication tokens to be time-based (y/n)**: Введіть `y`, щоб використовувати одноразові паролі (TOTP).

Далі відобразиться великий QR-код, дані для ручного додавання і коди відновлення. Збережіть ці дані у безпечному місці, вони знадобляться у випадку втрати доступу до генератора кодів.

<figure><img src="/files/4o6jPsTrgW9e9vEiLyDc" alt="" width="375"><figcaption></figcaption></figure>

Завантажте застосунок Google Authenticator: [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="/files/bwG6YtlRTg5p9MuJBIH7" 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 хвилин між клієнтом і сервером.\
\&#xNAN;**— Введіть 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="/files/d93V6ltXax5Wlm9Tw7DF" alt=""><figcaption></figcaption></figure>

Збережіть і закрийте файл. Далі відкрийте файл конфігурації SSH:

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

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

<figure><img src="/files/n6ffrXJX3w42bxaheppV" 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="/files/ExwO0pPjBRSyYx8ADKTV" alt="" width="363"><figcaption></figcaption></figure>

А потім пароль від сервера. Якщо все налаштовано правильно, підключення буде успішним.

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

Попри те, що операційні системи на базі Linux вважаються більш захищеними, ніж Windows, використання антивірусу може бути корисним. Це особливо важливо, якщо ви часто обмінюєтеся файлами або використовуєте сервер у корпоративному середовищі. Ми розглянемо безкоштовний антивірус ClamAV з відкритим кодом. Він може сканувати систему та виявляти віруси, трояни, шпигунські програми та інші види шкідливого ПЗ.

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

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

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

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

Після установки рекомендується оновити базу даних вірусів. Для цього спершу зупиніть програму, а потім виконайте команду оновлення:

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

Переконайтеся, що служба запущена:

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

**Ручне сканування:**

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

**Сканування всіх файлів системи:**

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


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://spacecore.gitbook.io/wiki/ua/network-and-security-configuration/how-to-secure-your-server-cybersecurity-basics.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
