Захист Linux-сервера. Що зробити насамперед

Захист Linux-сервера. Що зробити насамперед
Habib M'henni / Wikimedia Commons, CC BY-SA

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

Зміст

Нерутовий користувач

Насамперед необхідно завести собі нерутового користувача. Справа в тому, що у користувача root абсолютні привілеї в системі, а якщо дозволити йому віддалене адміністрування, то ви зробите половину роботи для хакера, залишивши для нього валідний username.

Тому необхідно завести іншого користувача, а для рута відключити віддалене адміністрування по SSH.

Новий користувач заводиться командою useradd:

useradd [options] <username>

Потім до нього додається пароль командою passwd:

passwd <username>

Зрештою, цього користувача потрібно додати до групи, яка має право виконувати команди з підвищенням привілеїв. sudo. Залежно від дитрибутива Linux це можуть бути різні групи. Наприклад, в CentOS і Red Hat користувача додають до групи wheel:

usermod -aG wheel <username>

У Ubuntu він додається до групи sudo:

usermod -aG sudo <username>

Ключі замість паролів SSH

Брутфорс або витік паролів — стандартний вектор атаки, так що аутентифікацію за паролями в SSH (Secure Shell) краще відключити, а замість неї використовувати аутентифікацію за ключами.

Існують різні програми для реалізації протоколу SSH, такі як лш и КрапляАле найпопулярнішою є OpenSSH. Встановлення клієнта OpenSSH на Ubuntu:

sudo apt install openssh-client

Встановлення на сервері:

sudo apt install openssh-server

Запуск демона SSH (sshd) на сервері під Ubuntu:

sudo systemctl start sshd

Автоматичний запуск демона при кожному завантаженні:

sudo systemctl enable sshd

Слід зазначити, що серверна частина OpenSSH включає клієнтську. Тобто через openssh-server можна підключатися до інших серверів. Більше того, зі своєї клієнтської машини ви можете запустити SSH-тунель з віддаленого сервера на сторонній хост, і тоді сторонній хост вважатиме віддалений сервер джерелом запитів. Дуже зручна функція для маскування власної системи. Детальніше див. «Практичні поради, приклади та тунелі SSH».

На клієнтській машині зазвичай немає сенсу ставити повноцінний сервер, щоб не допускати можливість віддаленого підключення до комп'ютера (з метою безпеки).

Отже, для свого нового користувача спочатку необхідно згенерувати ключі SSH на комп'ютері, з якого ви заходитимете на сервер:

ssh-keygen -t rsa

Публічний ключ зберігається у файлі .pub і виглядає як рядок випадкових символів, які починаються з ssh-rsa.

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ3GIJzTX7J6zsCrywcjAM/7Kq3O9ZIvDw2OFOSXAFVqilSFNkHlefm1iMtPeqsIBp2t9cbGUf55xNDULz/bD/4BCV43yZ5lh0cUYuXALg9NI29ui7PEGReXjSpNwUD6ceN/78YOK41KAcecq+SS0bJ4b4amKZIJG3JWm49NWvoo0hdM71sblF956IXY3cRLcTjPlQ84mChKL1X7+D645c7O4Z1N3KtL7l5nVKSG81ejkeZsGFzJFNqvr5DuHdDL5FAudW23me3BDmrM9ifUmt1a00mWci/1qUlaVFft085yvVq7KZbF2OP2NQACUkwfwh+iSTP username@hostname

Потім з-під рута створити на сервері директорію SSH у домашньому каталозі користувача та додати публічний ключ SSH у файл authorized_keys, використовуючи текстовий редактор на кшталт Vim:

mkdir -p /home/user_name/.ssh && touch /home/user_name/.ssh/authorized_keys

vim /home/user_name/.ssh/authorized_keys

Нарешті встановити коректні дозволи для файлу:

chmod 700 /home/user_name/.ssh && chmod 600 /home/user_name/.ssh/authorized_keys

і змінити володіння цього користувача:

chown -R username:username /home/username/.ssh

На стороні клієнта потрібно вказати розташування секретного ключа для аутентифікації:

ssh-add DIR_PATH/keylocation

Тепер можна залогінитися на сервер під ім'ям користувача за цим ключем:

ssh [username]@hostname

Після авторизації можна використовувати команду scp для копіювання файлів, утиліту sshfs для віддаленого встановлення файлової системи або директорій.

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

Як згадувалося вище, в SSH необхідно відключити автентифікацію для рута (тому ми і заводили нового користувача).

На CentOS/Red Hat знаходимо рядок PermitRootLogin yes у конфігураційному файлі /etc/ssh/sshd_config і змінюємо її:

PermitRootLogin no

На Ubuntu додаємо рядок PermitRootLogin no у конфігураційний файл 10-my-sshd-settings.conf:

sudo echo "PermitRootLogin no" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.conf

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

На CentOS/Red Hat знаходимо рядок PasswordAuthentication yes у конфігураційному файлі /etc/ssh/sshd_config і змінюємо її так:

PasswordAuthentication no

На Ubuntu додаємо рядок PasswordAuthentication no у файл 10-my-sshd-settings.conf:

sudo echo "PasswordAuthentication no" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.conf

Інструкцію з підключення двофакторної аутентифікації SSH див. тут.

Файрвол

Файрвол гарантує, що на сервер піде лише той трафік по тих портах, які ви дозволили. Це захищає від експлуатації портів, які випадково увімкнулися з іншими сервісами, тобто сильно зменшує поверхню атаки.

Перед встановленням файрвола потрібно переконатися, що SSH внесений до списку винятків і блокуватиметься. Інакше після запуску файрвола ми зможемо підключитися до серверу.

З дистрибутивом Ubuntu йде Uncomplicated Firewall (UFW), а з CentOS/Red Hat - брандмауер.

Дозвіл SSH у файрволі на Ubuntu:

sudo ufw allow ssh

На CentOS/Red Hat використовуємо команду firewall-cmd:

sudo firewall-cmd --zone=public --add-service=ssh --permanent

Після цієї процедури можна запустити файрвол.

На CentOS/Red Hat запускаємо сервіс systemd для firewalld:

sudo systemctl start firewalld
sudo systemctl enable firewalld

На Ubuntu використовуємо таку команду:

sudo ufw enable

Fail2Ban

Сервіс Fail2Ban аналізує логи на сервері та підраховує кількість спроб доступу з кожної IP-адреси. У налаштуваннях вказано правила, скільки спроб доступу дозволено за певний інтервал - після чого ця IP-адреса блокується на заданий відрізок часу. Наприклад, дозволяємо 5 невдалих спроб аутентифікації SSH в проміжок 2 години, після чого блокуємо дану IP-адресу на 12 годин.

Установка Fail2Ban на CentOS та Red Hat:

sudo yum install fail2ban

Установка на Ubuntu та Debian:

sudo apt install fail2ban

запуск:

systemctl start fail2ban
systemctl enable fail2ban

У програмі два конфігураційних файли: /etc/fail2ban/fail2ban.conf и /etc/fail2ban/jail.conf. Обмеження для бана вказуються у другому файлі.

Джейл SSH включений за замовчуванням з дефолтними налаштуваннями (5 спроб, інтервал 10 хвилин, бан на 10 хвилин).

[DEFAULT] ignorecommand = bantime = 10m findtime = 10m maxretry = 5

Крім SSH, Fail2Ban може захищати інші сервіси на веб-сервері nginx або Apache.

Автоматичні оновлення безпеки

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

На сервері Ubuntu у конфігурації за замовчуванням включені автоматичні оновлення безпеки, тому додаткових дій не потрібно.

На CentOS/Red Hat потрібно встановити програму dnf-автоматичний та включити таймер:

sudo dnf upgrade
sudo dnf install dnf-automatic -y
sudo systemctl enable --now dnf-automatic.timer

Перевірка таймера:

sudo systemctl status dnf-automatic.timer

Зміна портів за замовчуванням

SSH був розроблений у 1995 році для заміни telnet (порт 23) та ftp (порт 21), тому автор програми Тату Ілтонен вибрав порт 22 за замовчуванням, та його затвердили в IANA.

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

Зміна стандартних портів – обфускація – у кілька разів скорочує обсяг сміттєвого трафіку, розмір логів та навантаження на сервер, а також скорочує поверхню атаки. Хоча деякі критикують такий метод «захисту через неясність» (Security through obscurity). Причина в тому, що ця техніка протиставляється фундаментальною. архітектурний захист. Тому, наприклад, Національний інститут стандартів та технологій США в «Посібник з безпеки сервера» вказує необхідність відкритої серверної архітектури: «Безпека системи має покладатися на скритність реалізації її компонентів», — сказано у документі.

Теоретично зміна портів за умовчанням суперечить практиці відкритої архітектури. Але на практиці обсяг шкідливого трафіку дійсно скорочується, так що це простий та ефективний захід.

Номер порту можна настроїти, змінивши директиву Port 22 у файлі конфігурації / etc / ssh / sshd_config. Він також вказується параметром -p <port> в SSHD. Клієнт SSH та програми sftp теж підтримують параметр -p <port>.

Параметр -p <port> можна використовувати для вказівки номера порту при підключенні за допомогою команди ssh у Linux. У sftp и scp використовується параметр -P <port> (Заголовна P). Вказівка ​​командного рядка перевизначає будь-яке значення у файлах конфігурації.

Якщо серверів багато, майже всі ці дії захисту Linux-сервера можна автоматизувати в скрипті. Але якщо сервер лише один, то краще вручну контролювати процес.

На правах реклами

Замов і одразу працюй! Створення VDS будь-якої конфігурації та з будь-якою операційною системою протягом хвилини. Максимальна конфігурація дозволить відірватися на повну – 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe. Епічненько 🙂

Захист Linux-сервера. Що зробити насамперед

Джерело: habr.com