У наш час підняти сервер на хостингу - справа кількох хвилин і кількох клацань миші. Але одразу після запуску він потрапляє у вороже середовище, бо відкритий для всього інтернету як безневинна дівчина на дискеті рокерської. Його швидко намацають сканери та виявлять тисячі автоматично скриптових ботів, які нишпорять по мережі в пошуках уразливостей та неправильних конфігурацій. Є кілька речей, які слід зробити одразу після запуску, щоб забезпечити базовий захист.
Насамперед необхідно завести собі нерутового користувача. Справа в тому, що у користувача 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 у домашньому каталозі користувача та додати публічний ключ SSH у файл authorized_keys, використовуючи текстовий редактор на кшталт Vim:
На стороні клієнта потрібно вказати розташування секретного ключа для аутентифікації:
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:
Після перевірки, що новий користувач проходить автентифікацію за своїм ключем, можна відключити автентифікацію по паролю, щоб унеможливити ризик його витоку чи брутфорсу. Тепер для доступу на сервер зловмиснику необхідно дістати приватний ключ.
На CentOS/Red Hat знаходимо рядок PasswordAuthentication yes у конфігураційному файлі /etc/ssh/sshd_config і змінюємо її так:
PasswordAuthentication no
На Ubuntu додаємо рядок PasswordAuthentication no у файл 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:
Сервіс Fail2Ban аналізує логи на сервері та підраховує кількість спроб доступу з кожної IP-адреси. У налаштуваннях вказано правила, скільки спроб доступу дозволено за певний інтервал - після чого ця IP-адреса блокується на заданий відрізок часу. Наприклад, дозволяємо 5 невдалих спроб аутентифікації SSH в проміжок 2 години, після чого блокуємо дану IP-адресу на 12 годин.
Крім SSH, Fail2Ban може захищати інші сервіси на веб-сервері nginx або Apache.
Автоматичні оновлення безпеки
Як відомо, у всіх програмах постійно знаходять нові вразливості. Після публікації інформації експлоїти додаються до популярних експлоїт-паків, які масово використовуються хакерами та підлітками при скануванні всіх серверів поспіль. Тому дуже важливо встановлювати оновлення безпеки, як тільки вони з'являються.
На сервері Ubuntu у конфігурації за замовчуванням включені автоматичні оновлення безпеки, тому додаткових дій не потрібно.
На CentOS/Red Hat потрібно встановити програму dnf-автоматичний та включити таймер:
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. Епічненько 🙂